diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
commit | 32761a6cee1d0dee366b885b7b9c777e67885688 (patch) | |
tree | d6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/interpreter/CallFrame.cpp | |
parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
download | WebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz |
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/JavaScriptCore/interpreter/CallFrame.cpp')
-rw-r--r-- | Source/JavaScriptCore/interpreter/CallFrame.cpp | 228 |
1 files changed, 44 insertions, 184 deletions
diff --git a/Source/JavaScriptCore/interpreter/CallFrame.cpp b/Source/JavaScriptCore/interpreter/CallFrame.cpp index 3d3897b6b..a226e9848 100644 --- a/Source/JavaScriptCore/interpreter/CallFrame.cpp +++ b/Source/JavaScriptCore/interpreter/CallFrame.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008, 2013, 2014 Apple Inc. All Rights Reserved. + * Copyright (C) 2008, 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,74 +26,14 @@ #include "config.h" #include "CallFrame.h" +#include "CallFrameInlines.h" #include "CodeBlock.h" -#include "InlineCallFrame.h" #include "Interpreter.h" -#include "JSLexicalEnvironment.h" -#include "JSCInlines.h" +#include "Operations.h" #include "VMEntryScope.h" -#include <wtf/StringPrintStream.h> namespace JSC { -bool CallFrame::callSiteBitsAreBytecodeOffset() const -{ - ASSERT(codeBlock()); - switch (codeBlock()->jitType()) { - case JITCode::InterpreterThunk: - case JITCode::BaselineJIT: - return true; - case JITCode::None: - case JITCode::HostCallThunk: - RELEASE_ASSERT_NOT_REACHED(); - return false; - default: - return false; - } - - RELEASE_ASSERT_NOT_REACHED(); - return false; -} - -bool CallFrame::callSiteBitsAreCodeOriginIndex() const -{ - ASSERT(codeBlock()); - switch (codeBlock()->jitType()) { - case JITCode::DFGJIT: - case JITCode::FTLJIT: - return true; - case JITCode::None: - case JITCode::HostCallThunk: - RELEASE_ASSERT_NOT_REACHED(); - return false; - default: - return false; - } - - RELEASE_ASSERT_NOT_REACHED(); - return false; -} - -unsigned CallFrame::callSiteAsRawBits() const -{ - return this[JSStack::ArgumentCount].tag(); -} - -SUPPRESS_ASAN unsigned CallFrame::unsafeCallSiteAsRawBits() const -{ - return this[JSStack::ArgumentCount].unsafeTag(); -} - -CallSiteIndex CallFrame::callSiteIndex() const -{ - return CallSiteIndex(callSiteAsRawBits()); -} - -SUPPRESS_ASAN CallSiteIndex CallFrame::unsafeCallSiteIndex() const -{ - return CallSiteIndex(unsafeCallSiteAsRawBits()); -} - #ifndef NDEBUG JSStack* CallFrame::stack() { @@ -103,63 +43,63 @@ JSStack* CallFrame::stack() #endif #if USE(JSVALUE32_64) -Instruction* CallFrame::currentVPC() const +unsigned CallFrame::locationAsBytecodeOffset() const { - return bitwise_cast<Instruction*>(callSiteIndex().bits()); -} - -void CallFrame::setCurrentVPC(Instruction* vpc) -{ - CallSiteIndex callSite(vpc); - this[JSStack::ArgumentCount].tag() = callSite.bits(); + ASSERT(codeBlock()); + ASSERT(hasLocationAsBytecodeOffset()); + return currentVPC() - codeBlock()->instructions().begin(); } -unsigned CallFrame::callSiteBitsAsBytecodeOffset() const +void CallFrame::setLocationAsBytecodeOffset(unsigned offset) { ASSERT(codeBlock()); - ASSERT(callSiteBitsAreBytecodeOffset()); - return currentVPC() - codeBlock()->instructions().begin(); + setCurrentVPC(codeBlock()->instructions().begin() + offset); + ASSERT(hasLocationAsBytecodeOffset()); } - -#else // USE(JSVALUE32_64) +#else Instruction* CallFrame::currentVPC() const { - ASSERT(callSiteBitsAreBytecodeOffset()); - return codeBlock()->instructions().begin() + callSiteBitsAsBytecodeOffset(); + return codeBlock()->instructions().begin() + locationAsBytecodeOffset(); } - void CallFrame::setCurrentVPC(Instruction* vpc) { - CallSiteIndex callSite(vpc - codeBlock()->instructions().begin()); - this[JSStack::ArgumentCount].tag() = static_cast<int32_t>(callSite.bits()); + setLocationAsBytecodeOffset(vpc - codeBlock()->instructions().begin()); } - -unsigned CallFrame::callSiteBitsAsBytecodeOffset() const +#endif + +#if ENABLE(DFG_JIT) +unsigned CallFrame::bytecodeOffsetFromCodeOriginIndex() { - ASSERT(codeBlock()); - ASSERT(callSiteBitsAreBytecodeOffset()); - return callSiteIndex().bits(); + ASSERT(hasLocationAsCodeOriginIndex()); + CodeBlock* codeBlock = this->codeBlock(); + ASSERT(codeBlock); + + CodeOrigin codeOrigin; + unsigned index = locationAsCodeOriginIndex(); + ASSERT(codeBlock->canGetCodeOrigin(index)); + codeOrigin = codeBlock->codeOrigin(index); + + for (InlineCallFrame* inlineCallFrame = codeOrigin.inlineCallFrame; inlineCallFrame;) { + if (inlineCallFrame->baselineCodeBlock() == codeBlock) + return codeOrigin.bytecodeIndex; + + codeOrigin = inlineCallFrame->caller; + inlineCallFrame = codeOrigin.inlineCallFrame; + } + return codeOrigin.bytecodeIndex; } -#endif - +#endif // ENABLE(DFG_JIT) + unsigned CallFrame::bytecodeOffset() { if (!codeBlock()) return 0; #if ENABLE(DFG_JIT) - if (callSiteBitsAreCodeOriginIndex()) { - ASSERT(codeBlock()); - CodeOrigin codeOrigin = this->codeOrigin(); - for (InlineCallFrame* inlineCallFrame = codeOrigin.inlineCallFrame; inlineCallFrame;) { - codeOrigin = inlineCallFrame->directCaller; - inlineCallFrame = codeOrigin.inlineCallFrame; - } - return codeOrigin.bytecodeIndex; - } + if (hasLocationAsCodeOriginIndex()) + return bytecodeOffsetFromCodeOriginIndex(); #endif - ASSERT(callSiteBitsAreBytecodeOffset()); - return callSiteBitsAsBytecodeOffset(); + return locationAsBytecodeOffset(); } CodeOrigin CallFrame::codeOrigin() @@ -167,20 +107,20 @@ CodeOrigin CallFrame::codeOrigin() if (!codeBlock()) return CodeOrigin(0); #if ENABLE(DFG_JIT) - if (callSiteBitsAreCodeOriginIndex()) { - CallSiteIndex index = callSiteIndex(); + if (hasLocationAsCodeOriginIndex()) { + unsigned index = locationAsCodeOriginIndex(); ASSERT(codeBlock()->canGetCodeOrigin(index)); return codeBlock()->codeOrigin(index); } #endif - return CodeOrigin(callSiteBitsAsBytecodeOffset()); + return CodeOrigin(locationAsBytecodeOffset()); } -Register* CallFrame::topOfFrameInternal() +Register* CallFrame::frameExtentInternal() { CodeBlock* codeBlock = this->codeBlock(); ASSERT(codeBlock); - return registers() + codeBlock->stackPointerOffset(); + return registers() + virtualRegisterForLocal(codeBlock->frameRegisterCount()).offset(); } JSGlobalObject* CallFrame::vmEntryGlobalObject() @@ -194,84 +134,4 @@ JSGlobalObject* CallFrame::vmEntryGlobalObject() return vm().entryScope->globalObject(); } -CallFrame* CallFrame::callerFrame(VMEntryFrame*& currVMEntryFrame) -{ - if (callerFrameOrVMEntryFrame() == currVMEntryFrame) { - VMEntryRecord* currVMEntryRecord = vmEntryRecord(currVMEntryFrame); - currVMEntryFrame = currVMEntryRecord->prevTopVMEntryFrame(); - return currVMEntryRecord->prevTopCallFrame(); - } - return static_cast<CallFrame*>(callerFrameOrVMEntryFrame()); -} - -SUPPRESS_ASAN CallFrame* CallFrame::unsafeCallerFrame(VMEntryFrame*& currVMEntryFrame) -{ - if (unsafeCallerFrameOrVMEntryFrame() == currVMEntryFrame) { - VMEntryRecord* currVMEntryRecord = vmEntryRecord(currVMEntryFrame); - currVMEntryFrame = currVMEntryRecord->unsafePrevTopVMEntryFrame(); - return currVMEntryRecord->unsafePrevTopCallFrame(); - } - return static_cast<CallFrame*>(unsafeCallerFrameOrVMEntryFrame()); -} - -String CallFrame::friendlyFunctionName() -{ - CodeBlock* codeBlock = this->codeBlock(); - if (!codeBlock) - return emptyString(); - - switch (codeBlock->codeType()) { - case EvalCode: - return ASCIILiteral("eval code"); - case ModuleCode: - return ASCIILiteral("module code"); - case GlobalCode: - return ASCIILiteral("global code"); - case FunctionCode: - if (callee()) - return getCalculatedDisplayName(this, callee()); - return emptyString(); - } - - ASSERT_NOT_REACHED(); - return emptyString(); -} - -void CallFrame::dump(PrintStream& out) -{ - if (CodeBlock* codeBlock = this->codeBlock()) { - out.print(codeBlock->inferredName(), "#", codeBlock->hashAsStringIfPossible(), " [", codeBlock->jitType(), "]"); - - out.print("("); - thisValue().dumpForBacktrace(out); - - for (size_t i = 0; i < argumentCount(); ++i) { - out.print(", "); - JSValue value = argument(i); - value.dumpForBacktrace(out); - } - - out.print(")"); - - return; - } - - out.print(returnPC()); -} - -const char* CallFrame::describeFrame() -{ - const size_t bufferSize = 200; - static char buffer[bufferSize + 1]; - - WTF::StringPrintStream stringStream; - - dump(stringStream); - - strncpy(buffer, stringStream.toCString().data(), bufferSize); - buffer[bufferSize] = '\0'; - - return buffer; -} - } // namespace JSC |