X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/93a3786624b2768d89bfa27e46598dc64e2fb70a..ed1e77d3adeb83d26fd1dfb16dd84cabdcefd250:/jit/JITExceptions.cpp diff --git a/jit/JITExceptions.cpp b/jit/JITExceptions.cpp index 46f59a3..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,44 +29,47 @@ #include "CallFrame.h" #include "CodeBlock.h" #include "Interpreter.h" +#include "JITStubs.h" #include "JSCJSValue.h" +#include "LLIntData.h" +#include "LLIntOpcode.h" +#include "LLIntThunks.h" +#include "Opcode.h" +#include "JSCInlines.h" #include "VM.h" -#include "Operations.h" - -#if ENABLE(JIT) || ENABLE(LLINT) namespace JSC { -ExceptionHandler genericThrow(VM* vm, ExecState* callFrame, JSValue exceptionValue, unsigned vPCIndex) +void genericUnwind(VM* vm, ExecState* callFrame) { - RELEASE_ASSERT(exceptionValue); + if (Options::breakOnThrow()) { + dataLog("In call frame ", RawPointer(callFrame), " for code block ", *callFrame->codeBlock(), "\n"); + CRASH(); + } - vm->exception = JSValue(); - HandlerInfo* handler = vm->interpreter->throwException(callFrame, exceptionValue, vPCIndex); // This may update callFrame & exceptionValue! - vm->exception = exceptionValue; + 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) { catchPCForInterpreter = &callFrame->codeBlock()->instructions()[handler->target]; - catchRoutine = ExecutableBase::catchRoutineFor(handler, catchPCForInterpreter); +#if ENABLE(JIT) + catchRoutine = handler->nativeCode.executableAddress(); +#else + catchRoutine = catchPCForInterpreter->u.pointer; +#endif } else - catchRoutine = FunctionPtr(LLInt::getCodePtr(ctiOpThrowNotCaught)).value(); + catchRoutine = LLInt::getCodePtr(handleUncaughtException); + vm->vmEntryFrameForThrow = vmEntryFrame; vm->callFrameForThrow = callFrame; vm->targetMachinePCForThrow = catchRoutine; vm->targetInterpreterPCForThrow = catchPCForInterpreter; RELEASE_ASSERT(catchRoutine); - ExceptionHandler exceptionHandler = { catchRoutine, callFrame }; - return exceptionHandler; -} - -ExceptionHandler jitThrow(VM* vm, ExecState* callFrame, JSValue exceptionValue, ReturnAddressPtr faultLocation) -{ - return genericThrow(vm, callFrame, exceptionValue, callFrame->codeBlock()->bytecodeOffset(callFrame, faultLocation)); -} - } -#endif +} // namespace JSC