void ion::HandleException(ResumeFromException *rfe) { AssertCanGC(); JSContext *cx = GetIonContext()->cx; IonSpew(IonSpew_Invalidate, "handling exception"); // Immediately remove any bailout frame guard that might be left over from // an error in between ConvertFrames and ThunkToInterpreter. js_delete(cx->runtime->ionActivation->maybeTakeBailout()); IonFrameIterator iter(cx->runtime->ionTop); while (!iter.isEntry()) { if (iter.isScripted()) { // Search each inlined frame for live iterator objects, and close // them. InlineFrameIterator frames(&iter); for (;;) { CloseLiveIterators(cx, frames); // When profiling, each frame popped needs a notification that // the function has exited, so invoke the probe that a function // is exiting. AutoAssertNoGC nogc; RawScript script = frames.script(); Probes::exitScript(cx, script, script->function(), NULL); if (!frames.more()) break; ++frames; } IonScript *ionScript; if (iter.checkInvalidation(&ionScript)) ionScript->decref(cx->runtime->defaultFreeOp()); } ++iter; } // Clear any Ion return override that's been set. // This may happen if a callVM function causes an invalidation (setting the // override), and then fails, bypassing the bailout handlers that would // otherwise clear the return override. if (cx->runtime->hasIonReturnOverride()) cx->runtime->takeIonReturnOverride(); rfe->stackPointer = iter.fp(); }