diff options
author | Ben Murdoch <benm@google.com> | 2011-05-16 16:25:10 +0100 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2011-05-23 18:54:14 +0100 |
commit | ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddb (patch) | |
tree | db769fadd053248f85db67434a5b275224defef7 /Source/JavaScriptCore/yarr | |
parent | 52e2557aeb8477967e97fd24f20f8f407a10fa15 (diff) | |
download | external_webkit-ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddb.zip external_webkit-ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddb.tar.gz external_webkit-ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddb.tar.bz2 |
Merge WebKit at r76408: Initial merge by git.
Change-Id: I5b91decbd693ccbf5c1b8354b37cd68cc9a1ea53
Diffstat (limited to 'Source/JavaScriptCore/yarr')
-rw-r--r-- | Source/JavaScriptCore/yarr/YarrInterpreter.h | 7 | ||||
-rw-r--r-- | Source/JavaScriptCore/yarr/YarrJIT.cpp | 49 | ||||
-rw-r--r-- | Source/JavaScriptCore/yarr/YarrPattern.h | 12 |
3 files changed, 47 insertions, 21 deletions
diff --git a/Source/JavaScriptCore/yarr/YarrInterpreter.h b/Source/JavaScriptCore/yarr/YarrInterpreter.h index be703a9..eea5266 100644 --- a/Source/JavaScriptCore/yarr/YarrInterpreter.h +++ b/Source/JavaScriptCore/yarr/YarrInterpreter.h @@ -299,7 +299,8 @@ struct ByteTerm { } }; -class ByteDisjunction : public FastAllocBase { +class ByteDisjunction { + WTF_MAKE_FAST_ALLOCATED; public: ByteDisjunction(unsigned numSubpatterns, unsigned frameSize) : m_numSubpatterns(numSubpatterns) @@ -312,7 +313,9 @@ public: unsigned m_frameSize; }; -struct BytecodePattern : FastAllocBase { +struct BytecodePattern { + WTF_MAKE_FAST_ALLOCATED; +public: BytecodePattern(PassOwnPtr<ByteDisjunction> body, Vector<ByteDisjunction*> allParenthesesInfo, YarrPattern& pattern, BumpPointerAllocator* allocator) : m_body(body) , m_ignoreCase(pattern.m_ignoreCase) diff --git a/Source/JavaScriptCore/yarr/YarrJIT.cpp b/Source/JavaScriptCore/yarr/YarrJIT.cpp index ae59cba..9d13d45 100644 --- a/Source/JavaScriptCore/yarr/YarrJIT.cpp +++ b/Source/JavaScriptCore/yarr/YarrJIT.cpp @@ -606,9 +606,9 @@ class YarrGenerator : private MacroAssembler { m_nextBacktrack->setLabel(label); } - void copyBacktrackToLabel(BacktrackDestination& rhs) + void propagateBacktrackToLabel(const BacktrackDestination& rhs) { - if (rhs.m_backtrackToLabel) + if (!m_backtrackToLabel && rhs.m_backtrackToLabel) m_backtrackToLabel = rhs.m_backtrackToLabel; } @@ -618,6 +618,11 @@ class YarrGenerator : private MacroAssembler { m_backtrackToLabel = backtrackToLabel; } + bool hasBacktrackToLabel() + { + return m_backtrackToLabel; + } + void setBacktrackJumpList(JumpList* jumpList) { m_backtrackType = BacktrackJumpList; @@ -634,8 +639,10 @@ class YarrGenerator : private MacroAssembler { if (m_subDataLabelPtr) { *m_subDataLabelPtr = dp; m_subDataLabelPtr = 0; - } else + } else { + ASSERT(!hasDataLabel()); m_dataLabelPtr = dp; + } } void clearSubDataLabelPtr() @@ -748,6 +755,12 @@ class YarrGenerator : private MacroAssembler { return false; } + void linkBacktrackToLabel(Label backtrackLabel) + { + if (m_backtrackToLabel) + *m_backtrackToLabel = backtrackLabel; + } + void linkAlternativeBacktracks(YarrGenerator* generator, bool nextIteration = false) { Label hereLabel = generator->label(); @@ -919,24 +932,19 @@ class YarrGenerator : private MacroAssembler { return m_backtrack.plantJumpToBacktrackIfExists(generator); } - bool linkDataLabelToBacktrackIfExists(YarrGenerator* generator, DataLabelPtr dataLabel) + void linkDataLabelToBacktrackIfExists(YarrGenerator* generator, DataLabelPtr dataLabel) { // If we have a stack offset backtrack destination, use it directly if (m_backtrack.isStackOffset()) { generator->m_expressionState.addIndirectJumpEntry(m_backtrack.getStackOffset(), dataLabel); m_backtrack.clearSubDataLabelPtr(); } else { - // Otherwise set the data label (which may be linked) - setBacktrackDataLabel(dataLabel); - - if ((m_backtrack.isLabel()) && (m_backtrack.hasDataLabel())) { - generator->m_expressionState.m_backtrackRecords.append(AlternativeBacktrackRecord(m_backtrack.getDataLabel(), m_backtrack.getLabel())); - m_backtrack.clearDataLabel(); - return true; - } + // If we have a backtrack label, connect the datalabel to it directly. + if (m_backtrack.isLabel()) + generator->m_expressionState.m_backtrackRecords.append(AlternativeBacktrackRecord(dataLabel, m_backtrack.getLabel())); + else + setBacktrackDataLabel(dataLabel); } - - return false; } void addBacktrackJump(Jump jump) @@ -990,6 +998,10 @@ class YarrGenerator : private MacroAssembler { { if (doJump) m_backtrack.jumpToBacktrack(generator, backtrack.getBacktrackJumps()); + + if (m_backtrack.isLabel() && backtrack.hasBacktrackToLabel()) + backtrack.linkBacktrackToLabel(m_backtrack.getLabel()); + if (backtrack.hasDestination()) { if (m_backtrack.hasDataLabel()) generator->m_expressionState.addDataLabelToNextIteration(m_backtrack.getDataLabel()); @@ -1007,7 +1019,6 @@ class YarrGenerator : private MacroAssembler { BacktrackDestination m_backtrack; BacktrackDestination* m_linkedBacktrack; ParenthesesTail* m_parenthesesTail; - }; struct ParenthesesTail { @@ -1638,13 +1649,19 @@ class YarrGenerator : private MacroAssembler { m_expressionState.incrementParenNestingLevel(); TermGenerationState parenthesesState(disjunction, state.checkedTotal); + + // Use the current paren Tail to connect the nested parentheses. + parenthesesState.setParenthesesTail(state.getParenthesesTail()); + generateParenthesesDisjunction(state.term(), parenthesesState, alternativeFrameLocation); // this expects that any backtracks back out of the parentheses will be in the // parenthesesState's m_backTrackJumps vector, and that if they need backtracking // they will have set an entry point on the parenthesesState's m_backtrackLabel. BacktrackDestination& parenthesesBacktrack = parenthesesState.getBacktrackDestination(); + BacktrackDestination& stateBacktrack = state.getBacktrackDestination(); + state.propagateBacktrackingFrom(this, parenthesesBacktrack); - state.getBacktrackDestination().copyBacktrackToLabel(parenthesesBacktrack); + stateBacktrack.propagateBacktrackToLabel(parenthesesBacktrack); m_expressionState.decrementParenNestingLevel(); } else { diff --git a/Source/JavaScriptCore/yarr/YarrPattern.h b/Source/JavaScriptCore/yarr/YarrPattern.h index 2172dda..d80f692 100644 --- a/Source/JavaScriptCore/yarr/YarrPattern.h +++ b/Source/JavaScriptCore/yarr/YarrPattern.h @@ -63,7 +63,9 @@ private: } }; -struct CharacterClass : FastAllocBase { +struct CharacterClass { + WTF_MAKE_FAST_ALLOCATED; +public: // All CharacterClass instances have to have the full set of matches and ranges, // they may have an optional table for faster lookups (which must match the // specified matches and ranges) @@ -204,7 +206,9 @@ struct PatternTerm { } }; -struct PatternAlternative : FastAllocBase { +struct PatternAlternative { + WTF_MAKE_FAST_ALLOCATED; +public: PatternAlternative(PatternDisjunction* disjunction) : m_parent(disjunction) , m_onceThrough(false) @@ -245,7 +249,9 @@ struct PatternAlternative : FastAllocBase { bool m_containsBOL : 1; }; -struct PatternDisjunction : FastAllocBase { +struct PatternDisjunction { + WTF_MAKE_FAST_ALLOCATED; +public: PatternDisjunction(PatternAlternative* parent = 0) : m_parent(parent) , m_hasFixedSize(false) |