Commit 94524539 authored by lrn@chromium.org's avatar lrn@chromium.org

Fix for issue 351 - lastIndexOf.

Review URL: http://codereview.chromium.org/113838


git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2060 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent e66a0831
...@@ -120,20 +120,26 @@ function StringIndexOf(searchString /* position */) { // length == 1 ...@@ -120,20 +120,26 @@ function StringIndexOf(searchString /* position */) { // length == 1
// ECMA-262 section 15.5.4.8 // ECMA-262 section 15.5.4.8
function StringLastIndexOf(searchString /* position */) { // length == 1 function StringLastIndexOf(searchString /* position */) { // length == 1
var sub = ToString(this); var sub = ToString(this);
var subLength = sub.length;
var pat = ToString(searchString); var pat = ToString(searchString);
var index = (%_ArgumentsLength() > 1) var patLength = pat.length;
? ToNumber(%_Arguments(1) /* position */) var index = subLength - patLength;
: $NaN; if (%_ArgumentsLength() > 1) {
var firstIndex; var position = ToNumber(%_Arguments(1));
if ($isNaN(index)) { if (!$isNaN(position)) {
firstIndex = sub.length - pat.length; position = TO_INTEGER(position);
} else { if (position < 0) {
firstIndex = TO_INTEGER(index); position = 0;
if (firstIndex + pat.length > sub.length) { }
firstIndex = sub.length - pat.length; if (position + patLength < subLength) {
index = position
}
} }
} }
return %StringLastIndexOf(sub, pat, firstIndex); if (index < 0) {
return -1;
}
return %StringLastIndexOf(sub, pat, index);
} }
......
// Copyright 2009 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.
// Should use index of 0 if provided index is negative.
// See http://code.google.com/p/v8/issues/detail?id=351
assertEquals(0, "test".lastIndexOf("test", -1));
...@@ -27,25 +27,62 @@ ...@@ -27,25 +27,62 @@
var s = "test test test"; var s = "test test test";
assertEquals(5, s.lastIndexOf("test", 5)); var MAX_DOUBLE = 1.7976931348623157e+308;
assertEquals(5, s.lastIndexOf("test", 6)); var MIN_DOUBLE = -MAX_DOUBLE;
assertEquals(0, s.lastIndexOf("test", 4)); var MAX_SMI = Math.pow(2,30)-1;
assertEquals(0, s.lastIndexOf("test", 0)); var MIN_SMI = -Math.pow(2,30);
assertEquals(-1, s.lastIndexOf("test", -1));
assertEquals(10, s.lastIndexOf("test")); assertEquals(10, s.lastIndexOf("test", Infinity), "tinf");
assertEquals(-1, s.lastIndexOf("notpresent")); assertEquals(10, s.lastIndexOf("test", MAX_DOUBLE), "tmaxdouble");
assertEquals(-1, s.lastIndexOf()); assertEquals(10, s.lastIndexOf("test", MAX_SMI), "tmaxsmi");
assertEquals(10, s.lastIndexOf("test", "not a number")); assertEquals(10, s.lastIndexOf("test", s.length * 2), "t2length");
assertEquals(10, s.lastIndexOf("test", 15), "t15");
assertEquals(10, s.lastIndexOf("test", 14), "t14");
assertEquals(10, s.lastIndexOf("test", 10), "t10");
assertEquals(5, s.lastIndexOf("test", 9), "t9");
assertEquals(5, s.lastIndexOf("test", 6), "t6");
assertEquals(5, s.lastIndexOf("test", 5), "t5");
assertEquals(0, s.lastIndexOf("test", 4), "t4");
assertEquals(0, s.lastIndexOf("test", 0), "t0");
assertEquals(0, s.lastIndexOf("test", -1), "t-1");
assertEquals(0, s.lastIndexOf("test", -s.length), "t-len");
assertEquals(0, s.lastIndexOf("test", MIN_SMI), "tminsmi");
assertEquals(0, s.lastIndexOf("test", MIN_DOUBLE), "tmindouble");
assertEquals(0, s.lastIndexOf("test", -Infinity), "tneginf");
assertEquals(10, s.lastIndexOf("test"), "t");
assertEquals(-1, s.lastIndexOf("notpresent"), "n");
assertEquals(-1, s.lastIndexOf(), "none");
assertEquals(10, s.lastIndexOf("test", "not a number"), "nan");
var longNonMatch = "overlong string that doesn't match";
var longAlmostMatch = "test test test!";
var longAlmostMatch2 = "!test test test";
assertEquals(-1, s.lastIndexOf(longNonMatch), "long");
assertEquals(-1, s.lastIndexOf(longNonMatch, 10), "longpos");
assertEquals(-1, s.lastIndexOf(longNonMatch, NaN), "longnan");
assertEquals(-1, s.lastIndexOf(longAlmostMatch), "tlong");
assertEquals(-1, s.lastIndexOf(longAlmostMatch, 10), "tlongpos");
assertEquals(-1, s.lastIndexOf(longAlmostMatch), "tlongnan");
var nonInitialMatch = "est";
assertEquals(-1, s.lastIndexOf(nonInitialMatch, 0), "noninit");
assertEquals(-1, s.lastIndexOf(nonInitialMatch, -1), "noninitneg");
assertEquals(-1, s.lastIndexOf(nonInitialMatch, MIN_SMI), "noninitminsmi");
assertEquals(-1, s.lastIndexOf(nonInitialMatch, MIN_DOUBLE), "noninitmindbl");
assertEquals(-1, s.lastIndexOf(nonInitialMatch, -Infinity), "noninitneginf");
for (var i = s.length + 10; i >= 0; i--) { for (var i = s.length + 10; i >= 0; i--) {
var expected = i < s.length ? i : s.length; var expected = i < s.length ? i : s.length;
assertEquals(expected, s.lastIndexOf("", i)); assertEquals(expected, s.lastIndexOf("", i), "empty" + i);
} }
var reString = "asdf[a-z]+(asdf)?"; var reString = "asdf[a-z]+(asdf)?";
assertEquals(4, reString.lastIndexOf("[a-z]+")); assertEquals(4, reString.lastIndexOf("[a-z]+"), "r4");
assertEquals(10, reString.lastIndexOf("(asdf)?")); assertEquals(10, reString.lastIndexOf("(asdf)?"), "r10");
assertEquals(1, String.prototype.lastIndexOf.length); assertEquals(1, String.prototype.lastIndexOf.length, "length");
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment