summaryrefslogtreecommitdiffstats
path: root/Source/JavaScriptCore/dfg/DFGGraph.h
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2011-06-02 12:07:03 +0100
committerBen Murdoch <benm@google.com>2011-06-10 10:47:21 +0100
commit2daae5fd11344eaa88a0d92b0f6d65f8d2255c00 (patch)
treee4964fbd1cb70599f7718ff03e50ea1dab33890b /Source/JavaScriptCore/dfg/DFGGraph.h
parent87bdf0060a247bfbe668342b87e0874182e0ffa9 (diff)
downloadexternal_webkit-2daae5fd11344eaa88a0d92b0f6d65f8d2255c00.zip
external_webkit-2daae5fd11344eaa88a0d92b0f6d65f8d2255c00.tar.gz
external_webkit-2daae5fd11344eaa88a0d92b0f6d65f8d2255c00.tar.bz2
Merge WebKit at r84325: Initial merge by git.
Change-Id: Ic1a909300ecc0a13ddc6b4e784371d2ac6e3d59b
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGGraph.h')
-rw-r--r--Source/JavaScriptCore/dfg/DFGGraph.h48
1 files changed, 45 insertions, 3 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGGraph.h b/Source/JavaScriptCore/dfg/DFGGraph.h
index c02110e..c6bc7df 100644
--- a/Source/JavaScriptCore/dfg/DFGGraph.h
+++ b/Source/JavaScriptCore/dfg/DFGGraph.h
@@ -30,6 +30,7 @@
#include <dfg/DFGNode.h>
#include <wtf/Vector.h>
+#include <wtf/StdLibExtras.h>
namespace JSC {
@@ -37,6 +38,26 @@ class CodeBlock;
namespace DFG {
+typedef uint32_t BlockIndex;
+
+struct BasicBlock {
+ BasicBlock(unsigned bytecodeBegin, NodeIndex begin, NodeIndex end)
+ : bytecodeBegin(bytecodeBegin)
+ , begin(begin)
+ , end(end)
+ {
+ }
+
+ static inline BlockIndex getBytecodeBegin(BasicBlock* block)
+ {
+ return block->bytecodeBegin;
+ }
+
+ unsigned bytecodeBegin;
+ NodeIndex begin;
+ NodeIndex end;
+};
+
//
// === Graph ===
//
@@ -48,19 +69,40 @@ public:
// Mark a node as being referenced.
void ref(NodeIndex nodeIndex)
{
- // If the value (before incrementing) was at reCount zero then we need to ref its children.
- if (!at(nodeIndex).refCount++)
+ Node& node = at(nodeIndex);
+ // If the value (before incrementing) was at refCount zero then we need to ref its children.
+ if (!node.refCount++)
refChildren(nodeIndex);
}
+ void deref(NodeIndex nodeIndex)
+ {
+ Node& node = at(nodeIndex);
+ ASSERT(node.refCount);
+ // If the value (after decrementing) becomes refCount zero then we need to deref its children.
+ if (!--node.refCount)
+ derefChildren(nodeIndex);
+ }
#ifndef NDEBUG
// CodeBlock is optional, but may allow additional information to be dumped (e.g. Identifier names).
void dump(CodeBlock* = 0);
+ void dump(NodeIndex, CodeBlock* = 0);
#endif
+ Vector<BasicBlock> m_blocks;
+
+ BlockIndex blockIndexForBytecodeOffset(unsigned bytecodeBegin)
+ {
+ BasicBlock* begin = m_blocks.begin();
+ BasicBlock* block = binarySearch<BasicBlock, unsigned, BasicBlock::getBytecodeBegin>(begin, m_blocks.size(), bytecodeBegin);
+ ASSERT(block >= m_blocks.begin() && block < m_blocks.end());
+ return static_cast<BlockIndex>(block - begin);
+ }
+
private:
- // When a node's refCount goes from 0 to 1, it must (logically) recursively ref all of its children.
+ // When a node's refCount goes from 0 to 1, it must (logically) recursively ref all of its children, and vice versa.
void refChildren(NodeIndex);
+ void derefChildren(NodeIndex);
};
} } // namespace JSC::DFG