JITHandlerEncoded JIT_OPERATION lookupExceptionHandler(ExecState* exec) { VM* vm = &exec->vm(); NativeCallFrameTracer tracer(vm, exec); JSValue exceptionValue = exec->exception(); ASSERT(exceptionValue); ExceptionHandler handler = genericUnwind(vm, exec, exceptionValue); ASSERT(handler.catchRoutine); return dfgHandlerEncoded(handler.callFrame, handler.catchRoutine); }
DFGHandlerEncoded DFG_OPERATION lookupExceptionHandler(ExecState* exec, uint32_t callIndex) { JSValue exceptionValue = exec->exception(); ASSERT(exceptionValue); unsigned vPCIndex = exec->codeBlock()->bytecodeOffsetForCallAtIndex(callIndex); HandlerInfo* handler = exec->globalData().interpreter->throwException(exec, exceptionValue, vPCIndex); void* catchRoutine = handler ? handler->nativeCode.executableAddress() : (void*)ctiOpThrowNotCaught; ASSERT(catchRoutine); return dfgHandlerEncoded(exec, catchRoutine); }
DFGHandlerEncoded DFG_OPERATION lookupExceptionHandlerInStub(ExecState* exec, StructureStubInfo* stubInfo) { JSGlobalData* globalData = &exec->globalData(); NativeCallFrameTracer tracer(globalData, exec); JSValue exceptionValue = exec->exception(); ASSERT(exceptionValue); CodeOrigin codeOrigin = stubInfo->codeOrigin; while (codeOrigin.inlineCallFrame) codeOrigin = codeOrigin.inlineCallFrame->caller; HandlerInfo* handler = exec->globalData().interpreter->throwException(exec, exceptionValue, codeOrigin.bytecodeIndex); void* catchRoutine = handler ? handler->nativeCode.executableAddress() : (void*)ctiOpThrowNotCaught; ASSERT(catchRoutine); return dfgHandlerEncoded(exec, catchRoutine); }