X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/81345200c95645a1b0d2635520f96ad55dfde63f..refs/heads/master:/bytecode/CodeOrigin.cpp diff --git a/bytecode/CodeOrigin.cpp b/bytecode/CodeOrigin.cpp index 7ec1ce2..15f7591 100644 --- a/bytecode/CodeOrigin.cpp +++ b/bytecode/CodeOrigin.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012, 2013 Apple Inc. All rights reserved. + * Copyright (C) 2012-2015 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -74,7 +74,7 @@ bool CodeOrigin::isApproximatelyEqualTo(const CodeOrigin& other) const if (!a.inlineCallFrame) return true; - if (a.inlineCallFrame->executable != b.inlineCallFrame->executable) + if (a.inlineCallFrame->executable.get() != b.inlineCallFrame->executable.get()) return false; a = a.inlineCallFrame->caller; @@ -141,6 +141,27 @@ void CodeOrigin::dumpInContext(PrintStream& out, DumpContext*) const dump(out); } +JSFunction* InlineCallFrame::calleeConstant() const +{ + if (calleeRecovery.isConstant()) + return jsCast(calleeRecovery.constant()); + return nullptr; +} + +void InlineCallFrame::visitAggregate(SlotVisitor& visitor) +{ + // FIXME: This is an antipattern for two reasons. References introduced by the DFG + // that aren't in the original CodeBlock being compiled should be weakly referenced. + // Inline call frames aren't in the original CodeBlock, so they qualify as weak. Also, + // those weak references should already be tracked in the DFG as weak FrozenValues. So, + // there is probably no need for this. We already have assertions that this should be + // unnecessary. Finally, just marking the executable and not anything else in the inline + // call frame is almost certainly insufficient for what this method thought it was going + // to accomplish. + // https://bugs.webkit.org/show_bug.cgi?id=146613 + visitor.append(&executable); +} + JSFunction* InlineCallFrame::calleeForCallFrame(ExecState* exec) const { return jsCast(calleeRecovery.recover(exec)); @@ -178,14 +199,14 @@ void InlineCallFrame::dumpInContext(PrintStream& out, DumpContext* context) cons out.print(briefFunctionInformation(), ":<", RawPointer(executable.get())); if (executable->isStrictMode()) out.print(" (StrictMode)"); - out.print(", bc#", caller.bytecodeIndex, ", ", specializationKind()); + out.print(", bc#", caller.bytecodeIndex, ", ", kind); if (isClosureCall) out.print(", closure call"); else out.print(", known callee: ", inContext(calleeRecovery.constant(), context)); out.print(", numArgs+this = ", arguments.size()); - out.print(", stack < loc", VirtualRegister(stackOffset).toLocal()); - out.print(">"); + out.print(", stackOffset = ", stackOffset); + out.print(" (", virtualRegisterForLocal(0), " maps to ", virtualRegisterForLocal(0) + stackOffset, ")>"); } void InlineCallFrame::dump(PrintStream& out) const @@ -195,3 +216,32 @@ void InlineCallFrame::dump(PrintStream& out) const } // namespace JSC +namespace WTF { + +void printInternal(PrintStream& out, JSC::InlineCallFrame::Kind kind) +{ + switch (kind) { + case JSC::InlineCallFrame::Call: + out.print("Call"); + return; + case JSC::InlineCallFrame::Construct: + out.print("Construct"); + return; + case JSC::InlineCallFrame::CallVarargs: + out.print("CallVarargs"); + return; + case JSC::InlineCallFrame::ConstructVarargs: + out.print("ConstructVarargs"); + return; + case JSC::InlineCallFrame::GetterCall: + out.print("GetterCall"); + return; + case JSC::InlineCallFrame::SetterCall: + out.print("SetterCall"); + return; + } + RELEASE_ASSERT_NOT_REACHED(); +} + +} // namespace WTF +