[SCM] WebKit Debian packaging branch, webkit-1.3, updated. upstream/1.3.7-4207-g178b198
msaboff at apple.com
msaboff at apple.com
Sun Feb 20 22:57:36 UTC 2011
The following commit has been merged in the webkit-1.3 branch:
commit 0fcfa8d1ec7c181a0419ec2ebe8401795c03e56d
Author: msaboff at apple.com <msaboff at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Fri Jan 14 16:02:51 2011 +0000
2011-01-14 Michael Saboff <msaboff at apple.com>
Reviewed by Oliver Hunt.
Incorrect backtracking for nested alternatives
https://bugs.webkit.org/show_bug.cgi?id=52387
Added tests to verfiy backtracking of alternatives following
parenthesis.
* fast/regex/parentheses-expected.txt:
* fast/regex/script-tests/parentheses.js:
2011-01-14 Michael Saboff <msaboff at apple.com>
Reviewed by Oliver Hunt.
Incorrect backtracking for nested alternatives
https://bugs.webkit.org/show_bug.cgi?id=52387
In the process of propigating a datalabel it wasn't getting connected
to a destination when the destination was an indirect jump. Added
code to recognize a direct backtrack destination that was an indirect
jump and added mechanism to associate DataLabelPtrs with indirect
jump entries.
Removed dead method
BacktrackDestination::linkDataLabelToHereIfExists()
* yarr/YarrJIT.cpp:
(JSC::Yarr::YarrGenerator::IndirectJumpEntry::IndirectJumpEntry):
(JSC::Yarr::YarrGenerator::IndirectJumpEntry::addDataLabel):
(JSC::Yarr::YarrGenerator::GenerationState::addIndirectJumpEntry):
(JSC::Yarr::YarrGenerator::GenerationState::emitIndirectJumpTable):
Changes to link indirect jumps with DataLabelPtr's.
(JSC::Yarr::YarrGenerator::BacktrackDestination::clearSubDataLabelPtr):
(JSC::Yarr::YarrGenerator::TermGenerationState::linkDataLabelToBacktrackIfExists):
Updated to handle immediate linking of indirect jumps to
DataLabelPtr.
(JSC::Yarr::YarrGenerator::generateParenthesesDisjunction): Changed to
reflect updated linkDataLabelToBacktrackIfExists().
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@75796 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 5551206..e74d2f4 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,16 @@
+2011-01-14 Michael Saboff <msaboff at apple.com>
+
+ Reviewed by Oliver Hunt.
+
+ Incorrect backtracking for nested alternatives
+ https://bugs.webkit.org/show_bug.cgi?id=52387
+
+ Added tests to verfiy backtracking of alternatives following
+ parenthesis.
+
+ * fast/regex/parentheses-expected.txt:
+ * fast/regex/script-tests/parentheses.js:
+
2011-01-14 Pavel Feldman <pfeldman at chromium.org>
Web Inspector: do not use this as protocol message
diff --git a/LayoutTests/fast/regex/parentheses-expected.txt b/LayoutTests/fast/regex/parentheses-expected.txt
index e6915f7..c086d36 100644
--- a/LayoutTests/fast/regex/parentheses-expected.txt
+++ b/LayoutTests/fast/regex/parentheses-expected.txt
@@ -43,6 +43,21 @@ PASS regexp34.exec('btn-abc') is ['btn-abc']
PASS regexp34.exec('btn- abc') is null
PASS regexp34.exec('XXbtn-abc') is null
PASS regexp34.exec('XX btn-abc') is ['btn-abc']
+PASS regexp35.exec('ax') is ['ax','ax','a','x']
+PASS regexp35.exec('axx') is null
+PASS regexp35.exec('axxx') is ['axxx','axxx','a','xxx']
+PASS regexp35.exec('bx') is ['bx','bx','b','x']
+PASS regexp35.exec('bxx') is null
+PASS regexp35.exec('bxxx') is ['bxxx','bxxx','b','xxx']
+PASS regexp36.exec('/2011') is ['/2011','/2011','/','2011']
+PASS regexp36.exec('/11') is ['/11','/11','/','11']
+PASS regexp36.exec('/123') is null
+PASS regexp37.exec('7/4/1776') is ['7/4/1776','7','/','4','/1776','/','1776']
+PASS regexp37.exec('07-04-1776') is ['07-04-1776','07','-','04','-1776','-','1776']
+PASS regexp38.exec('xx') is ['xx','xx','xx']
+PASS regexp38.exec('b') is ['b','b',undefined]
+PASS regexp38.exec('z') is ['z','z',undefined]
+PASS regexp38.exec('') is ['','',undefined]
PASS 'Hi Bob'.match(/(Rob)|(Bob)|(Robert)|(Bobby)/) is ['Bob',undefined,'Bob',undefined,undefined]
PASS successfullyParsed is true
diff --git a/LayoutTests/fast/regex/script-tests/parentheses.js b/LayoutTests/fast/regex/script-tests/parentheses.js
index 3f0017c..ea4fff3 100644
--- a/LayoutTests/fast/regex/script-tests/parentheses.js
+++ b/LayoutTests/fast/regex/script-tests/parentheses.js
@@ -147,6 +147,29 @@ shouldBeNull("regexp34.exec('btn- abc')");
shouldBeNull("regexp34.exec('XXbtn-abc')");
shouldBe("regexp34.exec('XX btn-abc')","['btn-abc']");
+var regexp35 = /^((a|b)(x|xxx)|)$/;
+shouldBe("regexp35.exec('ax')", "['ax','ax','a','x']");
+shouldBeNull("regexp35.exec('axx')");
+shouldBe("regexp35.exec('axxx')", "['axxx','axxx','a','xxx']");
+shouldBe("regexp35.exec('bx')", "['bx','bx','b','x']");
+shouldBeNull("regexp35.exec('bxx')");
+shouldBe("regexp35.exec('bxxx')", "['bxxx','bxxx','b','xxx']");
+
+var regexp36 = /^((\/|\.|\-)(\d\d|\d\d\d\d)|)$/;
+shouldBe("regexp36.exec('/2011')", "['/2011','/2011','/','2011']");
+shouldBe("regexp36.exec('/11')", "['/11','/11','/','11']");
+shouldBeNull("regexp36.exec('/123')");
+
+var regexp37 = /^([1][0-2]|[0]\d|\d)(\/|\.|\-)([0-2]\d|[3][0-1]|\d)((\/|\.|\-)(\d\d|\d\d\d\d)|)$/;
+shouldBe("regexp37.exec('7/4/1776')", "['7/4/1776','7','/','4','/1776','/','1776']");
+shouldBe("regexp37.exec('07-04-1776')", "['07-04-1776','07','-','04','-1776','-','1776']");
+
+var regexp38 = /^(z|(x|xx)|b|)$/;
+shouldBe("regexp38.exec('xx')", "['xx','xx','xx']");
+shouldBe("regexp38.exec('b')", "['b','b',undefined]");
+shouldBe("regexp38.exec('z')", "['z','z',undefined]");
+shouldBe("regexp38.exec('')", "['','',undefined]");
+
shouldBe("'Hi Bob'.match(/(Rob)|(Bob)|(Robert)|(Bobby)/)", "['Bob',undefined,'Bob',undefined,undefined]");
var successfullyParsed = true;
diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog
index eb8c885..cd4aff8 100644
--- a/Source/JavaScriptCore/ChangeLog
+++ b/Source/JavaScriptCore/ChangeLog
@@ -1,3 +1,31 @@
+2011-01-14 Michael Saboff <msaboff at apple.com>
+
+ Reviewed by Oliver Hunt.
+
+ Incorrect backtracking for nested alternatives
+ https://bugs.webkit.org/show_bug.cgi?id=52387
+
+ In the process of propigating a datalabel it wasn't getting connected
+ to a destination when the destination was an indirect jump. Added
+ code to recognize a direct backtrack destination that was an indirect
+ jump and added mechanism to associate DataLabelPtrs with indirect
+ jump entries.
+ Removed dead method
+ BacktrackDestination::linkDataLabelToHereIfExists()
+
+ * yarr/YarrJIT.cpp:
+ (JSC::Yarr::YarrGenerator::IndirectJumpEntry::IndirectJumpEntry):
+ (JSC::Yarr::YarrGenerator::IndirectJumpEntry::addDataLabel):
+ (JSC::Yarr::YarrGenerator::GenerationState::addIndirectJumpEntry):
+ (JSC::Yarr::YarrGenerator::GenerationState::emitIndirectJumpTable):
+ Changes to link indirect jumps with DataLabelPtr's.
+ (JSC::Yarr::YarrGenerator::BacktrackDestination::clearSubDataLabelPtr):
+ (JSC::Yarr::YarrGenerator::TermGenerationState::linkDataLabelToBacktrackIfExists):
+ Updated to handle immediate linking of indirect jumps to
+ DataLabelPtr.
+ (JSC::Yarr::YarrGenerator::generateParenthesesDisjunction): Changed to
+ reflect updated linkDataLabelToBacktrackIfExists().
+
2011-01-14 Pavel Podivilov <podivilov at chromium.org>
Reviewed by Yury Semikhatsky.
diff --git a/Source/JavaScriptCore/yarr/YarrJIT.cpp b/Source/JavaScriptCore/yarr/YarrJIT.cpp
index ae3cdf2..2556531 100644
--- a/Source/JavaScriptCore/yarr/YarrJIT.cpp
+++ b/Source/JavaScriptCore/yarr/YarrJIT.cpp
@@ -299,13 +299,25 @@ class YarrGenerator : private MacroAssembler {
addJump(jump);
}
+ IndirectJumpEntry(int32_t stackOffset, DataLabelPtr dataLabel)
+ : m_stackOffset(stackOffset)
+ {
+ addDataLabel(dataLabel);
+ }
+
void addJump(Jump jump)
{
m_relJumps.append(jump);
}
+
+ void addDataLabel(DataLabelPtr dataLabel)
+ {
+ m_dataLabelPtrVector.append(dataLabel);
+ }
int32_t m_stackOffset;
JumpList m_relJumps;
+ Vector<DataLabelPtr, 16> m_dataLabelPtrVector;
};
struct AlternativeBacktrackRecord {
@@ -354,10 +366,31 @@ class YarrGenerator : private MacroAssembler {
jumps.empty();
}
+ void addIndirectJumpEntry(int32_t stackOffset, DataLabelPtr dataLabel)
+ {
+ IndirectJumpHashMap::iterator result = m_indirectJumpMap.find(stackOffset);
+
+ ASSERT(stackOffset >= 0);
+
+ uint32_t offset = static_cast<uint32_t>(stackOffset);
+
+ if (result == m_indirectJumpMap.end())
+ m_indirectJumpMap.add(offset, new IndirectJumpEntry(stackOffset, dataLabel));
+ else
+ result->second->addDataLabel(dataLabel);
+ }
+
void emitIndirectJumpTable(MacroAssembler* masm)
{
for (IndirectJumpHashMap::iterator iter = m_indirectJumpMap.begin(); iter != m_indirectJumpMap.end(); ++iter) {
IndirectJumpEntry* indJumpEntry = iter->second;
+ size_t size = indJumpEntry->m_dataLabelPtrVector.size();
+ if (size) {
+ // Link any associated DataLabelPtr's with indirect jump via label
+ Label hereLabel = masm->label();
+ for (size_t i = 0; i < size; ++i)
+ m_backtrackRecords.append(AlternativeBacktrackRecord(indJumpEntry->m_dataLabelPtrVector[i], hereLabel));
+ }
indJumpEntry->m_relJumps.link(masm);
masm->jump(Address(stackPointerRegister, indJumpEntry->m_stackOffset));
delete indJumpEntry;
@@ -605,6 +638,11 @@ class YarrGenerator : private MacroAssembler {
m_dataLabelPtr = dp;
}
+ void clearSubDataLabelPtr()
+ {
+ m_subDataLabelPtr = 0;
+ }
+
void setSubDataLabelPtr(DataLabelPtr* subDataLabelPtr)
{
m_subDataLabelPtr = subDataLabelPtr;
@@ -682,17 +720,6 @@ class YarrGenerator : private MacroAssembler {
m_backTrackJumps.append(jumps);
}
- bool linkDataLabelToHereIfExists(YarrGenerator* generator)
- {
- if (hasDataLabel()) {
- generator->m_expressionState.m_backtrackRecords.append(AlternativeBacktrackRecord(getDataLabel(), generator->label()));
- clearDataLabel();
- return true;
- }
-
- return false;
- }
-
bool plantJumpToBacktrackIfExists(YarrGenerator* generator)
{
if (isJumpList()) {
@@ -892,12 +919,21 @@ class YarrGenerator : private MacroAssembler {
return m_backtrack.plantJumpToBacktrackIfExists(generator);
}
- bool linkDataLabelToBacktrackIfExists(YarrGenerator* generator)
+ bool linkDataLabelToBacktrackIfExists(YarrGenerator* generator, DataLabelPtr 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 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;
+ }
}
return false;
@@ -1565,11 +1601,9 @@ class YarrGenerator : private MacroAssembler {
// Alternative did not match.
- state.setBacktrackDataLabel(dataLabel);
-
// Do we have a backtrack destination?
// if so, link the data label to it.
- state.linkDataLabelToBacktrackIfExists(this);
+ state.linkDataLabelToBacktrackIfExists(this, dataLabel);
if (!state.isLastAlternative() || countToCheck)
state.linkAlternativeBacktracks(this);
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list