Revision: 4322
Author: [email protected]
Date: Tue Mar 30 06:26:13 2010
Log: Fix bug in string replace with nonparticipating captures.
Review URL: http://codereview.chromium.org/1565004
http://code.google.com/p/v8/source/detail?r=4322
Modified:
/branches/bleeding_edge/src/runtime.cc
/branches/bleeding_edge/test/mjsunit/string-replace.js
=======================================
--- /branches/bleeding_edge/src/runtime.cc Fri Mar 26 07:19:47 2010
+++ /branches/bleeding_edge/src/runtime.cc Tue Mar 30 06:26:13 2010
@@ -3357,11 +3357,16 @@
match_start,
match_end));
for (int i = 1; i <= capture_count; i++) {
- Handle<String> substring =
- Factory::NewSubString(subject,
- register_vector[i * 2],
- register_vector[i * 2 + 1]);
- elements->set(i, *substring);
+ int start = register_vector[i * 2];
+ if (start >= 0) {
+ int end = register_vector[i * 2 + 1];
+ ASSERT(start <= end);
+ Handle<String> substring = Factory::NewSubString(subject,
start, end);
+ elements->set(i, *substring);
+ } else {
+ ASSERT(register_vector[i * 2 + 1] < 0);
+ elements->set(i, Heap::undefined_value());
+ }
}
elements->set(capture_count + 1, Smi::FromInt(match_start));
elements->set(capture_count + 2, *subject);
=======================================
--- /branches/bleeding_edge/test/mjsunit/string-replace.js Mon Mar 29
14:12:54 2010
+++ /branches/bleeding_edge/test/mjsunit/string-replace.js Tue Mar 30
06:26:13 2010
@@ -178,13 +178,16 @@
longstring = longstring + longstring;
// longstring.length == 5 << 11
-replaceTest(longstring + longstring,
+replaceTest(longstring + longstring,
"<" + longstring + ">", /<(.*)>/g, "$1$1");
-
+
replaceTest("string 42", "string x", /x/g, function() { return 42; });
-replaceTest("string 42", "string x", /x/, function() { return 42; });
+replaceTest("string 42", "string x", /x/, function() { return 42; });
replaceTest("string 42", "string x", /[xy]/g, function() { return 42; });
replaceTest("string 42", "string x", /[xy]/, function() { return 42; });
replaceTest("string true", "string x", /x/g, function() { return true; });
replaceTest("string null", "string x", /x/g, function() { return null; });
-replaceTest("string undefined", "string x", /x/g, function() { return
undefined; });
+replaceTest("string undefined", "string x", /x/g, function() { return
undefined; });
+
+replaceTest("aundefinedbundefinedcundefined",
+ "abc", /(.)|(.)/g, function(m, m1, m2, i, s) { return m1+m2;
});
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
To unsubscribe from this group, send email to v8-dev+unsubscribegooglegroups.com or reply
to this email with the words "REMOVE ME" as the subject.