X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/6fe7ccc865dc7d7541b93c5bcaf6368d2c98a174..ed1e77d3adeb83d26fd1dfb16dd84cabdcefd250:/jit/JITExceptions.cpp?ds=sidebyside diff --git a/jit/JITExceptions.cpp b/jit/JITExceptions.cpp index 2955fac..4f6d9e8 100644 --- a/jit/JITExceptions.cpp +++ b/jit/JITExceptions.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 Apple Inc. All rights reserved. + * Copyright (C) 2012, 2013 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -29,43 +29,47 @@ #include "CallFrame.h" #include "CodeBlock.h" #include "Interpreter.h" -#include "JSGlobalData.h" -#include "JSValue.h" - -#if ENABLE(JIT) +#include "JITStubs.h" +#include "JSCJSValue.h" +#include "LLIntData.h" +#include "LLIntOpcode.h" +#include "LLIntThunks.h" +#include "Opcode.h" +#include "JSCInlines.h" +#include "VM.h" namespace JSC { -ExceptionHandler genericThrow(JSGlobalData* globalData, ExecState* callFrame, JSValue exceptionValue, unsigned vPCIndex) +void genericUnwind(VM* vm, ExecState* callFrame) { - ASSERT(exceptionValue); - - globalData->exception = JSValue(); - HandlerInfo* handler = globalData->interpreter->throwException(callFrame, exceptionValue, vPCIndex); // This may update callFrame & exceptionValue! - globalData->exception = exceptionValue; + if (Options::breakOnThrow()) { + dataLog("In call frame ", RawPointer(callFrame), " for code block ", *callFrame->codeBlock(), "\n"); + CRASH(); + } + + Exception* exception = vm->exception(); + RELEASE_ASSERT(exception); + VMEntryFrame* vmEntryFrame = vm->topVMEntryFrame; + HandlerInfo* handler = vm->interpreter->unwind(vmEntryFrame, callFrame, exception); // This may update vmEntryFrame and callFrame. void* catchRoutine; Instruction* catchPCForInterpreter = 0; if (handler) { - catchRoutine = handler->nativeCode.executableAddress(); catchPCForInterpreter = &callFrame->codeBlock()->instructions()[handler->target]; +#if ENABLE(JIT) + catchRoutine = handler->nativeCode.executableAddress(); +#else + catchRoutine = catchPCForInterpreter->u.pointer; +#endif } else - catchRoutine = FunctionPtr(ctiOpThrowNotCaught).value(); + catchRoutine = LLInt::getCodePtr(handleUncaughtException); - globalData->callFrameForThrow = callFrame; - globalData->targetMachinePCForThrow = catchRoutine; - globalData->targetInterpreterPCForThrow = catchPCForInterpreter; + vm->vmEntryFrameForThrow = vmEntryFrame; + vm->callFrameForThrow = callFrame; + vm->targetMachinePCForThrow = catchRoutine; + vm->targetInterpreterPCForThrow = catchPCForInterpreter; - ASSERT(catchRoutine); - ExceptionHandler exceptionHandler = { catchRoutine, callFrame }; - return exceptionHandler; -} - -ExceptionHandler jitThrow(JSGlobalData* globalData, ExecState* callFrame, JSValue exceptionValue, ReturnAddressPtr faultLocation) -{ - return genericThrow(globalData, callFrame, exceptionValue, callFrame->codeBlock()->bytecodeOffset(callFrame, faultLocation)); + RELEASE_ASSERT(catchRoutine); } -} - -#endif +} // namespace JSC