summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/bytecode/CodeOrigin.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/bytecode/CodeOrigin.h')
-rw-r--r--Source/JavaScriptCore/bytecode/CodeOrigin.h88
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 {