X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/93a3786624b2768d89bfa27e46598dc64e2fb70a..81345200c95645a1b0d2635520f96ad55dfde63f:/bytecode/CodeOrigin.cpp?ds=sidebyside diff --git a/bytecode/CodeOrigin.cpp b/bytecode/CodeOrigin.cpp index 52bc2bf..7ec1ce2 100644 --- a/bytecode/CodeOrigin.cpp +++ b/bytecode/CodeOrigin.cpp @@ -29,7 +29,7 @@ #include "CallFrame.h" #include "CodeBlock.h" #include "Executable.h" -#include "Operations.h" +#include "JSCInlines.h" namespace JSC { @@ -45,7 +45,64 @@ unsigned CodeOrigin::inlineDepth() const { return inlineDepthForCallFrame(inlineCallFrame); } + +bool CodeOrigin::isApproximatelyEqualTo(const CodeOrigin& other) const +{ + CodeOrigin a = *this; + CodeOrigin b = other; + + if (!a.isSet()) + return !b.isSet(); + if (!b.isSet()) + return false; + + if (a.isHashTableDeletedValue()) + return b.isHashTableDeletedValue(); + if (b.isHashTableDeletedValue()) + return false; + + for (;;) { + ASSERT(a.isSet()); + ASSERT(b.isSet()); + + if (a.bytecodeIndex != b.bytecodeIndex) + return false; + + if ((!!a.inlineCallFrame) != (!!b.inlineCallFrame)) + return false; + + if (!a.inlineCallFrame) + return true; + + if (a.inlineCallFrame->executable != b.inlineCallFrame->executable) + return false; + + a = a.inlineCallFrame->caller; + b = b.inlineCallFrame->caller; + } +} + +unsigned CodeOrigin::approximateHash() const +{ + if (!isSet()) + return 0; + if (isHashTableDeletedValue()) + return 1; + unsigned result = 2; + CodeOrigin codeOrigin = *this; + for (;;) { + result += codeOrigin.bytecodeIndex; + + if (!codeOrigin.inlineCallFrame) + return result; + + result += WTF::PtrHash::hash(codeOrigin.inlineCallFrame->executable.get()); + + codeOrigin = codeOrigin.inlineCallFrame->caller; + } +} + Vector CodeOrigin::inlineStack() const { Vector result(inlineDepth()); @@ -59,6 +116,11 @@ Vector CodeOrigin::inlineStack() const void CodeOrigin::dump(PrintStream& out) const { + if (!isSet()) { + out.print(""); + return; + } + Vector stack = inlineStack(); for (unsigned i = 0; i < stack.size(); ++i) { if (i) @@ -66,7 +128,7 @@ void CodeOrigin::dump(PrintStream& out) const if (InlineCallFrame* frame = stack[i].inlineCallFrame) { out.print(frame->briefFunctionInformation(), ":<", RawPointer(frame->executable.get()), "> "); - if (frame->isClosureCall()) + if (frame->isClosureCall) out.print("(closure) "); } @@ -74,22 +136,31 @@ void CodeOrigin::dump(PrintStream& out) const } } +void CodeOrigin::dumpInContext(PrintStream& out, DumpContext*) const +{ + dump(out); +} + JSFunction* InlineCallFrame::calleeForCallFrame(ExecState* exec) const { - if (!isClosureCall()) - return callee.get(); - - return jsCast((exec + stackOffset)->callee()); + return jsCast(calleeRecovery.recover(exec)); } CodeBlockHash InlineCallFrame::hash() const { - return executable->hashFor(specializationKind()); + return jsCast(executable.get())->codeBlockFor( + specializationKind())->hash(); +} + +CString InlineCallFrame::hashAsStringIfPossible() const +{ + return jsCast(executable.get())->codeBlockFor( + specializationKind())->hashAsStringIfPossible(); } -String InlineCallFrame::inferredName() const +CString InlineCallFrame::inferredName() const { - return jsCast(executable.get())->inferredName().string(); + return jsCast(executable.get())->inferredName().utf8(); } CodeBlock* InlineCallFrame::baselineCodeBlock() const @@ -99,20 +170,28 @@ CodeBlock* InlineCallFrame::baselineCodeBlock() const void InlineCallFrame::dumpBriefFunctionInformation(PrintStream& out) const { - out.print(inferredName(), "#", hash()); + out.print(inferredName(), "#", hashAsStringIfPossible()); } -void InlineCallFrame::dump(PrintStream& out) const +void InlineCallFrame::dumpInContext(PrintStream& out, DumpContext* context) const { - out.print(briefFunctionInformation(), ":<", RawPointer(executable.get()), ", bc#", caller.bytecodeIndex, ", ", specializationKind()); - if (callee) - out.print(", known callee: ", JSValue(callee.get())); - else + out.print(briefFunctionInformation(), ":<", RawPointer(executable.get())); + if (executable->isStrictMode()) + out.print(" (StrictMode)"); + out.print(", bc#", caller.bytecodeIndex, ", ", specializationKind()); + if (isClosureCall) out.print(", closure call"); + else + out.print(", known callee: ", inContext(calleeRecovery.constant(), context)); out.print(", numArgs+this = ", arguments.size()); - out.print(", stack >= r", stackOffset); + out.print(", stack < loc", VirtualRegister(stackOffset).toLocal()); out.print(">"); } +void InlineCallFrame::dump(PrintStream& out) const +{ + dumpInContext(out, 0); +} + } // namespace JSC