Author: [email protected]
Date: Tue May 26 08:42:06 2009
New Revision: 2060

Added:
    branches/bleeding_edge/test/mjsunit/regress/regress-351.js
       - copied, changed from r2059,  
/branches/bleeding_edge/test/mjsunit/string-lastindexof.js
Modified:
    branches/bleeding_edge/src/string.js
    branches/bleeding_edge/test/mjsunit/string-lastindexof.js

Log:
Fix for issue 351 - lastIndexOf.

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


Modified: branches/bleeding_edge/src/string.js
==============================================================================
--- branches/bleeding_edge/src/string.js        (original)
+++ branches/bleeding_edge/src/string.js        Tue May 26 08:42:06 2009
@@ -120,20 +120,26 @@
  // ECMA-262 section 15.5.4.8
  function StringLastIndexOf(searchString /* position */) {  // length == 1
    var sub = ToString(this);
+  var subLength = sub.length;
    var pat = ToString(searchString);
-  var index = (%_ArgumentsLength() > 1)
-      ? ToNumber(%_Arguments(1) /* position */)
-      : $NaN;
-  var firstIndex;
-  if ($isNaN(index)) {
-    firstIndex = sub.length - pat.length;
-  } else {
-    firstIndex = TO_INTEGER(index);
-    if (firstIndex + pat.length > sub.length) {
-      firstIndex = sub.length - pat.length;
+  var patLength = pat.length;
+  var index = subLength - patLength;
+  if (%_ArgumentsLength() > 1) {
+    var position = ToNumber(%_Arguments(1));
+    if (!$isNaN(position)) {
+      position = TO_INTEGER(position);
+      if (position < 0) {
+        position = 0;
+      }
+      if (position + patLength < subLength) {
+        index = position
+      }
      }
    }
-  return %StringLastIndexOf(sub, pat, firstIndex);
+  if (index < 0) {
+    return -1;
+  }
+  return %StringLastIndexOf(sub, pat, index);
  }



Copied: branches/bleeding_edge/test/mjsunit/regress/regress-351.js (from  
r2059, /branches/bleeding_edge/test/mjsunit/string-lastindexof.js)
==============================================================================
--- /branches/bleeding_edge/test/mjsunit/string-lastindexof.js  (original)
+++ branches/bleeding_edge/test/mjsunit/regress/regress-351.js  Tue May 26  
08:42:06 2009
@@ -1,4 +1,4 @@
-// Copyright 2008 the V8 project authors. All rights reserved.
+// 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:
@@ -25,27 +25,7 @@
  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

-var s = "test test test";
+// Should use index of 0 if provided index is negative.
+// See http://code.google.com/p/v8/issues/detail?id=351

-assertEquals(5, s.lastIndexOf("test", 5));
-assertEquals(5, s.lastIndexOf("test", 6));
-assertEquals(0, s.lastIndexOf("test", 4));
-assertEquals(0, s.lastIndexOf("test", 0));
-assertEquals(-1, s.lastIndexOf("test", -1));
-assertEquals(10, s.lastIndexOf("test"));
-assertEquals(-1, s.lastIndexOf("notpresent"));
-assertEquals(-1, s.lastIndexOf());
-assertEquals(10, s.lastIndexOf("test", "not a number"));
-
-for (var i = s.length + 10; i >= 0; i--) {
-  var expected = i < s.length ? i : s.length;
-  assertEquals(expected, s.lastIndexOf("", i));
-}
-
-
-var reString = "asdf[a-z]+(asdf)?";
-
-assertEquals(4, reString.lastIndexOf("[a-z]+"));
-assertEquals(10, reString.lastIndexOf("(asdf)?"));
-
-assertEquals(1, String.prototype.lastIndexOf.length);
+assertEquals(0, "test".lastIndexOf("test", -1));

Modified: branches/bleeding_edge/test/mjsunit/string-lastindexof.js
==============================================================================
--- branches/bleeding_edge/test/mjsunit/string-lastindexof.js   (original)
+++ branches/bleeding_edge/test/mjsunit/string-lastindexof.js   Tue May 26  
08:42:06 2009
@@ -27,25 +27,62 @@

  var s = "test test test";

-assertEquals(5, s.lastIndexOf("test", 5));
-assertEquals(5, s.lastIndexOf("test", 6));
-assertEquals(0, s.lastIndexOf("test", 4));
-assertEquals(0, s.lastIndexOf("test", 0));
-assertEquals(-1, s.lastIndexOf("test", -1));
-assertEquals(10, s.lastIndexOf("test"));
-assertEquals(-1, s.lastIndexOf("notpresent"));
-assertEquals(-1, s.lastIndexOf());
-assertEquals(10, s.lastIndexOf("test", "not a number"));
+var MAX_DOUBLE = 1.7976931348623157e+308;
+var MIN_DOUBLE = -MAX_DOUBLE;
+var MAX_SMI = Math.pow(2,30)-1;
+var MIN_SMI = -Math.pow(2,30);
+
+assertEquals(10, s.lastIndexOf("test", Infinity), "tinf");
+assertEquals(10, s.lastIndexOf("test", MAX_DOUBLE), "tmaxdouble");
+assertEquals(10, s.lastIndexOf("test", MAX_SMI), "tmaxsmi");
+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--) {
    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)?";

-assertEquals(4, reString.lastIndexOf("[a-z]+"));
-assertEquals(10, reString.lastIndexOf("(asdf)?"));
+assertEquals(4, reString.lastIndexOf("[a-z]+"), "r4");
+assertEquals(10, reString.lastIndexOf("(asdf)?"), "r10");

-assertEquals(1, String.prototype.lastIndexOf.length);
+assertEquals(1, String.prototype.lastIndexOf.length, "length");

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to