summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/bytecode/CodeOrigin.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/bytecode/CodeOrigin.h
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/JavaScriptCore/bytecode/CodeOrigin.h')
-rw-r--r--Source/JavaScriptCore/bytecode/CodeOrigin.h102
1 files changed, 27 insertions, 75 deletions
diff --git a/Source/JavaScriptCore/bytecode/CodeOrigin.h b/Source/JavaScriptCore/bytecode/CodeOrigin.h
index ed660c247..38712f964 100644
--- a/Source/JavaScriptCore/bytecode/CodeOrigin.h
+++ b/Source/JavaScriptCore/bytecode/CodeOrigin.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011, 2012, 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2011-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
@@ -23,15 +23,12 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef CodeOrigin_h
-#define CodeOrigin_h
+#pragma once
+#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>
#include <wtf/PrintStream.h>
#include <wtf/StdLibExtras.h>
@@ -39,10 +36,9 @@
namespace JSC {
+class CodeBlock;
+struct DumpContext;
struct InlineCallFrame;
-class ExecState;
-class ScriptExecutable;
-class JSFunction;
struct CodeOrigin {
static const unsigned invalidBytecodeIndex = UINT_MAX;
@@ -63,7 +59,7 @@ struct CodeOrigin {
CodeOrigin(WTF::HashTableDeletedValueType)
: bytecodeIndex(invalidBytecodeIndex)
- , inlineCallFrame(bitwise_cast<InlineCallFrame*>(static_cast<uintptr_t>(1)))
+ , inlineCallFrame(deletedMarker())
{
}
@@ -75,6 +71,7 @@ struct CodeOrigin {
}
bool isSet() const { return bytecodeIndex != invalidBytecodeIndex; }
+ explicit operator bool() const { return isSet(); }
bool isHashTableDeletedValue() const
{
@@ -87,7 +84,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.
- ScriptExecutable* codeOriginOwner() const;
+ CodeBlock* codeOriginOwner() const;
int stackOffset() const;
@@ -97,69 +94,28 @@ 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;
+ JS_EXPORT_PRIVATE void dump(PrintStream&) const;
void dumpInContext(PrintStream&, DumpContext*) const;
-};
-
-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)
- {
- }
-
- CodeSpecializationKind specializationKind() const { return specializationFromIsCall(isCall); }
- JSFunction* calleeConstant() const
+private:
+ static InlineCallFrame* deletedMarker()
{
- if (calleeRecovery.isConstant())
- return jsCast<JSFunction*>(calleeRecovery.constant());
- return 0;
+ return bitwise_cast<InlineCallFrame*>(static_cast<uintptr_t>(1));
}
-
- // 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) +
@@ -171,13 +127,6 @@ 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(); }
@@ -185,6 +134,12 @@ 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 {
@@ -200,6 +155,3 @@ template<> struct HashTraits<JSC::CodeOrigin> : SimpleClassHashTraits<JSC::CodeO
};
} // namespace WTF
-
-#endif // CodeOrigin_h
-