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/bytecode/CodeOrigin.h | |
parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
download | WebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz |
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/JavaScriptCore/bytecode/CodeOrigin.h')
-rw-r--r-- | Source/JavaScriptCore/bytecode/CodeOrigin.h | 88 |
1 files changed, 65 insertions, 23 deletions
diff --git a/Source/JavaScriptCore/bytecode/CodeOrigin.h b/Source/JavaScriptCore/bytecode/CodeOrigin.h index 66ab42724..ed660c247 100644 --- a/Source/JavaScriptCore/bytecode/CodeOrigin.h +++ b/Source/JavaScriptCore/bytecode/CodeOrigin.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2015 Apple Inc. All rights reserved. + * Copyright (C) 2011, 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,9 +26,10 @@ #ifndef CodeOrigin_h #define CodeOrigin_h -#include "CallMode.h" #include "CodeBlockHash.h" #include "CodeSpecializationKind.h" +#include "JSFunction.h" +#include "ValueRecovery.h" #include "WriteBarrier.h" #include <wtf/BitVector.h> #include <wtf/HashMap.h> @@ -62,7 +63,7 @@ struct CodeOrigin { CodeOrigin(WTF::HashTableDeletedValueType) : bytecodeIndex(invalidBytecodeIndex) - , inlineCallFrame(deletedMarker()) + , inlineCallFrame(bitwise_cast<InlineCallFrame*>(static_cast<uintptr_t>(1))) { } @@ -74,7 +75,6 @@ struct CodeOrigin { } bool isSet() const { return bytecodeIndex != invalidBytecodeIndex; } - explicit operator bool() const { return isSet(); } bool isHashTableDeletedValue() const { @@ -87,7 +87,7 @@ struct CodeOrigin { // If the code origin corresponds to inlined code, gives you the heap object that // would have owned the code if it had not been inlined. Otherwise returns 0. - CodeBlock* codeOriginOwner() const; + ScriptExecutable* codeOriginOwner() const; int stackOffset() const; @@ -97,28 +97,69 @@ struct CodeOrigin { bool operator==(const CodeOrigin& other) const; bool operator!=(const CodeOrigin& other) const { return !(*this == other); } - // This checks if the two code origins correspond to the same stack trace snippets, - // but ignore whether the InlineCallFrame's are identical. - bool isApproximatelyEqualTo(const CodeOrigin& other) const; - - unsigned approximateHash() const; - - template <typename Function> - void walkUpInlineStack(const Function&); - // Get the inline stack. This is slow, and is intended for debugging only. Vector<CodeOrigin> inlineStack() const; void dump(PrintStream&) const; void dumpInContext(PrintStream&, DumpContext*) const; +}; -private: - static InlineCallFrame* deletedMarker() +struct InlineCallFrame { + Vector<ValueRecovery> arguments; + WriteBarrier<ScriptExecutable> executable; + ValueRecovery calleeRecovery; + CodeOrigin caller; + BitVector capturedVars; // Indexed by the machine call frame's variable numbering. + signed stackOffset : 30; + bool isCall : 1; + bool isClosureCall : 1; // If false then we know that callee/scope are constants and the DFG won't treat them as variables, i.e. they have to be recovered manually. + VirtualRegister argumentsRegister; // This is only set if the code uses arguments. The unmodified arguments register follows the unmodifiedArgumentsRegister() convention (see CodeBlock.h). + + // There is really no good notion of a "default" set of values for + // InlineCallFrame's fields. This constructor is here just to reduce confusion if + // we forgot to initialize explicitly. + InlineCallFrame() + : stackOffset(0) + , isCall(false) + , isClosureCall(false) { - return bitwise_cast<InlineCallFrame*>(static_cast<uintptr_t>(1)); } + + CodeSpecializationKind specializationKind() const { return specializationFromIsCall(isCall); } + + JSFunction* calleeConstant() const + { + if (calleeRecovery.isConstant()) + return jsCast<JSFunction*>(calleeRecovery.constant()); + return 0; + } + + // Get the callee given a machine call frame to which this InlineCallFrame belongs. + JSFunction* calleeForCallFrame(ExecState*) const; + + CString inferredName() const; + CodeBlockHash hash() const; + + CodeBlock* baselineCodeBlock() const; + + ptrdiff_t callerFrameOffset() const { return stackOffset * sizeof(Register) + CallFrame::callerFrameOffset(); } + ptrdiff_t returnPCOffset() const { return stackOffset * sizeof(Register) + CallFrame::returnPCOffset(); } + + void dumpBriefFunctionInformation(PrintStream&) const; + void dump(PrintStream&) const; + void dumpInContext(PrintStream&, DumpContext*) const; + + MAKE_PRINT_METHOD(InlineCallFrame, dumpBriefFunctionInformation, briefFunctionInformation); }; +inline int CodeOrigin::stackOffset() const +{ + if (!inlineCallFrame) + return 0; + + return inlineCallFrame->stackOffset; +} + inline unsigned CodeOrigin::hash() const { return WTF::IntHash<unsigned>::hash(bytecodeIndex) + @@ -130,6 +171,13 @@ inline bool CodeOrigin::operator==(const CodeOrigin& other) const return bytecodeIndex == other.bytecodeIndex && inlineCallFrame == other.inlineCallFrame; } + +inline ScriptExecutable* CodeOrigin::codeOriginOwner() const +{ + if (!inlineCallFrame) + return 0; + return inlineCallFrame->executable.get(); +} struct CodeOriginHash { static unsigned hash(const CodeOrigin& key) { return key.hash(); } @@ -137,12 +185,6 @@ struct CodeOriginHash { static const bool safeToCompareToEmptyOrDeleted = true; }; -struct CodeOriginApproximateHash { - static unsigned hash(const CodeOrigin& key) { return key.approximateHash(); } - static bool equal(const CodeOrigin& a, const CodeOrigin& b) { return a.isApproximatelyEqualTo(b); } - static const bool safeToCompareToEmptyOrDeleted = true; -}; - } // namespace JSC namespace WTF { |