summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/dfg/DFGAbstractInterpreter.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-05-24 08:28:08 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-05-24 08:28:08 +0000
commita4e969f4965059196ca948db781e52f7cfebf19e (patch)
tree6ca352808c8fdc52006a0f33f6ae3c593b23867d /Source/JavaScriptCore/dfg/DFGAbstractInterpreter.h
parent41386e9cb918eed93b3f13648cbef387e371e451 (diff)
downloadWebKitGtk-tarball-a4e969f4965059196ca948db781e52f7cfebf19e.tar.gz
webkitgtk-2.12.3webkitgtk-2.12.3
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGAbstractInterpreter.h')
-rw-r--r--Source/JavaScriptCore/dfg/DFGAbstractInterpreter.h74
1 files changed, 43 insertions, 31 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGAbstractInterpreter.h b/Source/JavaScriptCore/dfg/DFGAbstractInterpreter.h
index eb4e5219f..e1969179e 100644
--- a/Source/JavaScriptCore/dfg/DFGAbstractInterpreter.h
+++ b/Source/JavaScriptCore/dfg/DFGAbstractInterpreter.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2013-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
@@ -26,21 +26,20 @@
#ifndef DFGAbstractInterpreter_h
#define DFGAbstractInterpreter_h
-#include <wtf/Platform.h>
-
#if ENABLE(DFG_JIT)
#include "DFGAbstractValue.h"
#include "DFGBranchDirection.h"
#include "DFGGraph.h"
#include "DFGNode.h"
+#include "DFGPhiChildren.h"
namespace JSC { namespace DFG {
template<typename AbstractStateType>
class AbstractInterpreter {
public:
- AbstractInterpreter(Graph&, AbstractStateType& state);
+ AbstractInterpreter(Graph&, AbstractStateType&);
~AbstractInterpreter();
AbstractValue& forNode(Node* node)
@@ -82,22 +81,15 @@ public:
//
// This is guaranteed to be equivalent to doing:
//
- // if (state.startExecuting(index)) {
- // state.executeEdges(index);
- // result = state.executeEffects(index);
- // } else
- // result = true;
+ // state.startExecuting()
+ // state.executeEdges(index);
+ // result = state.executeEffects(index);
bool execute(unsigned indexInBlock);
bool execute(Node*);
- // Indicate the start of execution of the node. It resets any state in the node,
- // that is progressively built up by executeEdges() and executeEffects(). In
- // particular, this resets canExit(), so if you want to "know" between calls of
- // startExecuting() and executeEdges()/Effects() whether the last run of the
- // analysis concluded that the node can exit, you should probably set that
- // information aside prior to calling startExecuting().
- bool startExecuting(Node*);
- bool startExecuting(unsigned indexInBlock);
+ // Indicate the start of execution of a node. It resets any state in the node
+ // that is progressively built up by executeEdges() and executeEffects().
+ void startExecuting();
// Abstractly execute the edges of the given node. This runs filterEdgeByUse()
// on all edges of the node. You can skip this step, if you have already used
@@ -105,10 +97,14 @@ public:
void executeEdges(Node*);
void executeEdges(unsigned indexInBlock);
- ALWAYS_INLINE void filterEdgeByUse(Node* node, Edge& edge)
+ ALWAYS_INLINE void filterEdgeByUse(Edge& edge)
{
ASSERT(mayHaveTypeCheck(edge.useKind()) || !needsTypeCheck(edge));
- filterByType(node, edge, typeFilterFor(edge.useKind()));
+ filterByType(edge, typeFilterFor(edge.useKind()));
+ }
+ ALWAYS_INLINE void filterEdgeByUse(Node*, Edge& edge)
+ {
+ filterEdgeByUse(edge);
}
// Abstractly execute the effects of the given node. This changes the abstract
@@ -116,12 +112,13 @@ public:
bool executeEffects(unsigned indexInBlock);
bool executeEffects(unsigned clobberLimit, Node*);
+ void dump(PrintStream& out) const;
void dump(PrintStream& out);
template<typename T>
- FiltrationResult filter(T node, const StructureSet& set)
+ FiltrationResult filter(T node, const StructureSet& set, SpeculatedType admittedTypes = SpecNone)
{
- return filter(forNode(node), set);
+ return filter(forNode(node), set, admittedTypes);
}
template<typename T>
@@ -137,20 +134,28 @@ public:
}
template<typename T>
- FiltrationResult filterByValue(T node, JSValue value)
+ FiltrationResult filterByValue(T node, FrozenValue value)
{
return filterByValue(forNode(node), value);
}
- FiltrationResult filter(AbstractValue&, const StructureSet&);
+ FiltrationResult filter(AbstractValue&, const StructureSet&, SpeculatedType admittedTypes = SpecNone);
FiltrationResult filterArrayModes(AbstractValue&, ArrayModes);
FiltrationResult filter(AbstractValue&, SpeculatedType);
- FiltrationResult filterByValue(AbstractValue&, JSValue);
+ FiltrationResult filterByValue(AbstractValue&, FrozenValue);
+
+ PhiChildren* phiChildren() { return m_phiChildren.get(); }
private:
void clobberWorld(const CodeOrigin&, unsigned indexInBlock);
- void clobberCapturedVars(const CodeOrigin&);
+
+ template<typename Functor>
+ void forAllValues(unsigned indexInBlock, Functor&);
+
void clobberStructures(unsigned indexInBlock);
+ void observeTransition(unsigned indexInBlock, Structure* from, Structure* to);
+ void observeTransitions(unsigned indexInBlock, const TransitionVector&);
+ void setDidClobber();
enum BooleanResult {
UnknownBooleanResult,
@@ -159,19 +164,25 @@ private:
};
BooleanResult booleanResult(Node*, AbstractValue&);
- void setConstant(Node* node, JSValue value)
+ void setBuiltInConstant(Node* node, FrozenValue value)
+ {
+ AbstractValue& abstractValue = forNode(node);
+ abstractValue.set(m_graph, value, m_state.structureClobberState());
+ abstractValue.fixTypeForRepresentation(m_graph, node);
+ }
+
+ void setConstant(Node* node, FrozenValue value)
{
- forNode(node).set(m_graph, value);
+ setBuiltInConstant(node, value);
m_state.setFoundConstants(true);
}
- ALWAYS_INLINE void filterByType(Node* node, Edge& edge, SpeculatedType type)
+ ALWAYS_INLINE void filterByType(Edge& edge, SpeculatedType type)
{
AbstractValue& value = forNode(edge);
- if (!value.isType(type)) {
- node->setCanExit(true);
+ if (!value.isType(type))
edge.setProofStatus(NeedsCheck);
- } else
+ else
edge.setProofStatus(IsProved);
filter(value, type);
@@ -183,6 +194,7 @@ private:
CodeBlock* m_codeBlock;
Graph& m_graph;
AbstractStateType& m_state;
+ std::unique_ptr<PhiChildren> m_phiChildren;
};
} } // namespace JSC::DFG