X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/6fe7ccc865dc7d7541b93c5bcaf6368d2c98a174..ed1e77d3adeb83d26fd1dfb16dd84cabdcefd250:/llint/LLIntThunks.cpp?ds=inline diff --git a/llint/LLIntThunks.cpp b/llint/LLIntThunks.cpp index b4d0264..8ab96b3 100644 --- a/llint/LLIntThunks.cpp +++ b/llint/LLIntThunks.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 @@ -26,58 +26,95 @@ #include "config.h" #include "LLIntThunks.h" -#if ENABLE(LLINT) - +#include "CallData.h" +#include "ExceptionHelpers.h" +#include "Interpreter.h" +#include "JSCJSValueInlines.h" #include "JSInterfaceJIT.h" #include "JSObject.h" +#include "JSStackInlines.h" +#include "LLIntCLoop.h" #include "LinkBuffer.h" #include "LowLevelInterpreter.h" -#include "ScopeChain.h" +#include "ProtoCallFrame.h" +#include "StackAlignment.h" +#include "VM.h" + +namespace JSC { -namespace JSC { namespace LLInt { +#if ENABLE(JIT) -static MacroAssemblerCodeRef generateThunkWithJumpTo(JSGlobalData* globalData, void (*target)()) +namespace LLInt { + +static MacroAssemblerCodeRef generateThunkWithJumpTo(VM* vm, void (*target)(), const char *thunkKind) { - JSInterfaceJIT jit; + JSInterfaceJIT jit(vm); // FIXME: there's probably a better way to do it on X86, but I'm not sure I care. jit.move(JSInterfaceJIT::TrustedImmPtr(bitwise_cast(target)), JSInterfaceJIT::regT0); jit.jump(JSInterfaceJIT::regT0); - LinkBuffer patchBuffer(*globalData, &jit, GLOBAL_THUNK_ID); - return patchBuffer.finalizeCode(); + LinkBuffer patchBuffer(*vm, jit, GLOBAL_THUNK_ID); + return FINALIZE_CODE(patchBuffer, ("LLInt %s prologue thunk", thunkKind)); +} + +MacroAssemblerCodeRef functionForCallEntryThunkGenerator(VM* vm) +{ + return generateThunkWithJumpTo(vm, LLInt::getCodeFunctionPtr(llint_function_for_call_prologue), "function for call"); +} + +MacroAssemblerCodeRef functionForConstructEntryThunkGenerator(VM* vm) +{ + return generateThunkWithJumpTo(vm, LLInt::getCodeFunctionPtr(llint_function_for_construct_prologue), "function for construct"); +} + +MacroAssemblerCodeRef functionForCallArityCheckThunkGenerator(VM* vm) +{ + return generateThunkWithJumpTo(vm, LLInt::getCodeFunctionPtr(llint_function_for_call_arity_check), "function for call with arity check"); } -MacroAssemblerCodeRef functionForCallEntryThunkGenerator(JSGlobalData* globalData) +MacroAssemblerCodeRef functionForConstructArityCheckThunkGenerator(VM* vm) { - return generateThunkWithJumpTo(globalData, llint_function_for_call_prologue); + return generateThunkWithJumpTo(vm, LLInt::getCodeFunctionPtr(llint_function_for_construct_arity_check), "function for construct with arity check"); } -MacroAssemblerCodeRef functionForConstructEntryThunkGenerator(JSGlobalData* globalData) +MacroAssemblerCodeRef evalEntryThunkGenerator(VM* vm) { - return generateThunkWithJumpTo(globalData, llint_function_for_construct_prologue); + return generateThunkWithJumpTo(vm, LLInt::getCodeFunctionPtr(llint_eval_prologue), "eval"); } -MacroAssemblerCodeRef functionForCallArityCheckThunkGenerator(JSGlobalData* globalData) +MacroAssemblerCodeRef programEntryThunkGenerator(VM* vm) { - return generateThunkWithJumpTo(globalData, llint_function_for_call_arity_check); + return generateThunkWithJumpTo(vm, LLInt::getCodeFunctionPtr(llint_program_prologue), "program"); } -MacroAssemblerCodeRef functionForConstructArityCheckThunkGenerator(JSGlobalData* globalData) +} // namespace LLInt + +#else // ENABLE(JIT) + +// Non-JIT (i.e. C Loop LLINT) case: + +EncodedJSValue vmEntryToJavaScript(void* executableAddress, VM* vm, ProtoCallFrame* protoCallFrame) { - return generateThunkWithJumpTo(globalData, llint_function_for_construct_arity_check); + JSValue result = CLoop::execute(llint_vm_entry_to_javascript, executableAddress, vm, protoCallFrame); + return JSValue::encode(result); } -MacroAssemblerCodeRef evalEntryThunkGenerator(JSGlobalData* globalData) +EncodedJSValue vmEntryToNative(void* executableAddress, VM* vm, ProtoCallFrame* protoCallFrame) { - return generateThunkWithJumpTo(globalData, llint_eval_prologue); + JSValue result = CLoop::execute(llint_vm_entry_to_native, executableAddress, vm, protoCallFrame); + return JSValue::encode(result); } -MacroAssemblerCodeRef programEntryThunkGenerator(JSGlobalData* globalData) +extern "C" VMEntryRecord* vmEntryRecord(VMEntryFrame* entryFrame) { - return generateThunkWithJumpTo(globalData, llint_program_prologue); + // The C Loop doesn't have any callee save registers, so the VMEntryRecord is allocated at the base of the frame. + intptr_t stackAlignment = stackAlignmentBytes(); + intptr_t VMEntryTotalFrameSize = (sizeof(VMEntryRecord) + (stackAlignment - 1)) & ~(stackAlignment - 1); + return reinterpret_cast(static_cast(entryFrame) - VMEntryTotalFrameSize); } -} } // namespace JSC::LLInt -#endif // ENABLE(LLINT) +#endif // ENABLE(JIT) + +} // namespace JSC