Reviewers: danno,

Message:
ptal

Description:
Port r9116 to the 3.5 branch.


Please review this at http://codereview.chromium.org/8271028/

SVN Base: https://v8.googlecode.com/svn/branches/3.5

Affected files:
  M src/v8natives.js
  M src/version.cc
  M test/mjsunit/parse-int-float.js


Index: src/v8natives.js
diff --git a/src/v8natives.js b/src/v8natives.js
index 035fd2e2be11bc11679e936031377cb2699c82f4..982e18e4d5564cc6874e215eaf86b6d94bf699ec 100644
--- a/src/v8natives.js
+++ b/src/v8natives.js
@@ -106,13 +106,16 @@ function GlobalParseInt(string, radix) {
       // Truncate number.
       return string | 0;
     }
+    string = TO_STRING_INLINE(string);
     radix = radix | 0;
   } else {
+    // The spec says ToString should be evaluated before ToInt32.
+    string = TO_STRING_INLINE(string);
     radix = TO_INT32(radix);
     if (!(radix == 0 || (2 <= radix && radix <= 36)))
       return $NaN;
   }
-  string = TO_STRING_INLINE(string);
+
   if (%_HasCachedArrayIndex(string) &&
       (radix == 0 || radix == 10)) {
     return %_GetCachedArrayIndex(string);
Index: src/version.cc
diff --git a/src/version.cc b/src/version.cc
index 5898a26b9855add51eb28c120e1bb4823226b82b..d4ce63a736523e2d0f0d34e8d5a3daf5fafff9da 100644
--- a/src/version.cc
+++ b/src/version.cc
@@ -35,7 +35,7 @@
 #define MAJOR_VERSION     3
 #define MINOR_VERSION     5
 #define BUILD_NUMBER      10
-#define PATCH_LEVEL       18
+#define PATCH_LEVEL       19
 // Use 1 for candidates and 0 otherwise.
 // (Boolean macro values are not supported by all preprocessors.)
 #define IS_CANDIDATE_VERSION 0
Index: test/mjsunit/parse-int-float.js
diff --git a/test/mjsunit/parse-int-float.js b/test/mjsunit/parse-int-float.js index a4f09df9b4a24d6ff7ffdc30316183760fa7bde8..2e4f6484370f2329213dd53ea5e85f8d7fabc7da 100644
--- a/test/mjsunit/parse-int-float.js
+++ b/test/mjsunit/parse-int-float.js
@@ -100,4 +100,17 @@ assertTrue(isNaN(parseFloat(0/0)));
 assertEquals(Infinity, parseFloat(1/0), "parseFloat Infinity");
 assertEquals(-Infinity, parseFloat(-1/0), "parseFloat -Infinity");

+var state;
+var throwingRadix = { valueOf: function() { state = "throwingRadix"; throw null; } }; +var throwingString = { toString: function() { state = "throwingString"; throw null; } };
+state = null;
+try { parseInt('123', throwingRadix); } catch (e) {}
+assertEquals(state, "throwingRadix");

+state = null;
+try { parseInt(throwingString, 10); } catch (e) {}
+assertEquals(state, "throwingString");
+
+state = null;
+try { parseInt(throwingString, throwingRadix); } catch (e) {}
+assertEquals(state, "throwingString");


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

Reply via email to