Revision: 13471
Author: [email protected]
Date: Wed Jan 23 04:28:16 2013
Log: Correctly reset lastIndex in an RegExp object.
[email protected]
BUG=170856
Review URL: https://chromiumcodereview.appspot.com/11896060
http://code.google.com/p/v8/source/detail?r=13471
Added:
/branches/bleeding_edge/test/mjsunit/regress/regress-crbug-170856.js
Modified:
/branches/bleeding_edge/src/objects-inl.h
/branches/bleeding_edge/src/objects.h
/branches/bleeding_edge/src/runtime.cc
=======================================
--- /dev/null
+++ /branches/bleeding_edge/test/mjsunit/regress/regress-crbug-170856.js
Wed Jan 23 04:28:16 2013
@@ -0,0 +1,33 @@
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+r = new RegExp("a");
+for (var i = 0; i < 100; i++) {
+ r["abc" + i] = i;
+}
+"zzzz".replace(r, "");
+assertEquals(0, r.lastIndex);
=======================================
--- /branches/bleeding_edge/src/objects-inl.h Mon Jan 21 06:53:29 2013
+++ /branches/bleeding_edge/src/objects-inl.h Wed Jan 23 04:28:16 2013
@@ -5009,10 +5009,14 @@
}
-void JSRegExp::ResetLastIndex() {
- InObjectPropertyAtPut(JSRegExp::kLastIndexFieldIndex,
- Smi::FromInt(0),
- SKIP_WRITE_BARRIER); // It's a Smi.
+void JSRegExp::ResetLastIndex(Isolate* isolate,
+ Handle<JSRegExp> regexp) {
+ // Reset lastIndex property to 0.
+ SetProperty(regexp,
+ isolate->factory()->last_index_symbol(),
+ Handle<Smi>(Smi::FromInt(0)),
+ ::NONE,
+ kNonStrictMode);
}
=======================================
--- /branches/bleeding_edge/src/objects.h Thu Jan 17 00:41:27 2013
+++ /branches/bleeding_edge/src/objects.h Wed Jan 23 04:28:16 2013
@@ -6573,7 +6573,8 @@
inline Object* DataAtUnchecked(int index);
inline void SetDataAtUnchecked(int index, Object* value, Heap* heap);
inline Type TypeTagUnchecked();
- inline void ResetLastIndex();
+
+ static inline void ResetLastIndex(Isolate* isolate, Handle<JSRegExp>
regexp);
static int code_index(bool is_ascii) {
if (is_ascii) {
=======================================
--- /branches/bleeding_edge/src/runtime.cc Mon Jan 21 08:11:31 2013
+++ /branches/bleeding_edge/src/runtime.cc Wed Jan 23 04:28:16 2013
@@ -1794,7 +1794,8 @@
JSRegExp::kIgnoreCaseFieldIndex, ignoreCase, SKIP_WRITE_BARRIER);
regexp->InObjectPropertyAtPut(
JSRegExp::kMultilineFieldIndex, multiline, SKIP_WRITE_BARRIER);
- regexp->ResetLastIndex();
+ regexp->InObjectPropertyAtPut(
+ JSRegExp::kLastIndexFieldIndex, Smi::FromInt(0),
SKIP_WRITE_BARRIER);
return regexp;
}
@@ -2911,7 +2912,7 @@
int matches = indices.length();
if (matches == 0) {
- pattern_regexp->ResetLastIndex();
+ JSRegExp::ResetLastIndex(isolate, pattern_regexp);
return *subject;
}
@@ -3014,7 +3015,7 @@
int32_t* current_match = global_cache.FetchNext();
if (current_match == NULL) {
if (global_cache.HasException()) return Failure::Exception();
- regexp->ResetLastIndex();
+ JSRegExp::ResetLastIndex(isolate, regexp);
return *subject;
}
@@ -3113,7 +3114,7 @@
int32_t* current_match = global_cache.FetchNext();
if (current_match == NULL) {
if (global_cache.HasException()) return Failure::Exception();
- regexp->ResetLastIndex();
+ JSRegExp::ResetLastIndex(isolate, regexp);
return *subject;
}
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev