Array.prototype.toLocaleString visits elements in wrong order under certain conditions
authorbarraclough@apple.com <barraclough@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 10 Mar 2012 01:20:01 +0000 (01:20 +0000)
committerbarraclough@apple.com <barraclough@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 10 Mar 2012 01:20:01 +0000 (01:20 +0000)
https://bugs.webkit.org/show_bug.cgi?id=80663

Reviewed by Michael Saboff.

The bug here is actually that we're continuing to process the array after an exception
has been thrown, and that the second value throw is overriding the first.

Source/JavaScriptCore:

* runtime/ArrayPrototype.cpp:
(JSC::arrayProtoFuncToLocaleString):

LayoutTests:

* fast/js/array-prototype-properties-expected.txt:
* fast/js/script-tests/array-prototype-properties.js:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@110352 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/js/array-prototype-properties-expected.txt
LayoutTests/fast/js/script-tests/array-prototype-properties.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/ArrayPrototype.cpp

index 1c94cfc..657d2e2 100644 (file)
@@ -1,3 +1,16 @@
+2012-03-09  Gavin Barraclough  <barraclough@apple.com>
+
+        Array.prototype.toLocaleString visits elements in wrong order under certain conditions
+        https://bugs.webkit.org/show_bug.cgi?id=80663
+
+        Reviewed by Michael Saboff.
+
+        The bug here is actually that we're continuing to process the array after an exception
+        has been thrown, and that the second value throw is overriding the first.
+
+        * fast/js/array-prototype-properties-expected.txt:
+        * fast/js/script-tests/array-prototype-properties.js:
+
 2012-03-09  Ojan Vafai  <ojan@chromium.org>
 
         So many Chromium-Lion rebaselines. :(
index 706cc5f..e200bf0 100644 (file)
@@ -24,6 +24,7 @@ PASS Array.prototype.filter.call(undefined, toString) threw exception TypeError:
 PASS Array.prototype.reduce.call(undefined, toString) threw exception TypeError: 'undefined' is not an object (evaluating 'Array.prototype.reduce.call(undefined, toString)').
 PASS Array.prototype.reduceRight.call(undefined, toString) threw exception TypeError: 'undefined' is not an object (evaluating 'Array.prototype.reduceRight.call(undefined, toString)').
 PASS Array.prototype.map.call(undefined, toString) threw exception TypeError: 'undefined' is not an object (evaluating 'Array.prototype.map.call(undefined, toString)').
+PASS [{toLocaleString:function(){throw 1}},{toLocaleString:function(){throw 2}}].toLocaleString() threw exception 1.
 PASS successfullyParsed is true
 
 TEST COMPLETE
index d607e92..62746f4 100644 (file)
@@ -2,7 +2,7 @@ description(
 'This is a test case for <a https://bugs.webkit.org/show_bug.cgi?id=64679">bug 64679</a>.'
 );
 
-// These calls pass undefined as this value, and as such should show in toObject.
+// These calls pass undefined as this value, and as such should throw in toObject.
 shouldThrow("Array.prototype.toString.call(undefined)");
 shouldThrow("Array.prototype.toLocaleString.call(undefined)");
 shouldThrow("Array.prototype.concat.call(undefined, [])");
@@ -24,3 +24,6 @@ shouldThrow("Array.prototype.filter.call(undefined, toString)");
 shouldThrow("Array.prototype.reduce.call(undefined, toString)");
 shouldThrow("Array.prototype.reduceRight.call(undefined, toString)");
 shouldThrow("Array.prototype.map.call(undefined, toString)");
+
+// Test exception ordering in Array.prototype.toLocaleString ( https://bugs.webkit.org/show_bug.cgi?id=80663 )
+shouldThrow("[{toLocaleString:function(){throw 1}},{toLocaleString:function(){throw 2}}].toLocaleString()", '1');
index 31c17b5..961bc8b 100644 (file)
@@ -1,3 +1,16 @@
+2012-03-09  Gavin Barraclough  <barraclough@apple.com>
+
+        Array.prototype.toLocaleString visits elements in wrong order under certain conditions
+        https://bugs.webkit.org/show_bug.cgi?id=80663
+
+        Reviewed by Michael Saboff.
+
+        The bug here is actually that we're continuing to process the array after an exception
+        has been thrown, and that the second value throw is overriding the first.
+
+        * runtime/ArrayPrototype.cpp:
+        (JSC::arrayProtoFuncToLocaleString):
+
 2012-03-09  Ryosuke Niwa  <rniwa@webkit.org>
 
         WebKit compiled by gcc (Xcode 3.2.6) hangs while running DOM/Accessors.html
index 8602342..2f000fc 100644 (file)
@@ -349,9 +349,13 @@ EncodedJSValue JSC_HOST_CALL arrayProtoFuncToLocaleString(ExecState* exec)
             strBuffer.append(',');
 
         JSValue element = thisObj->get(exec, k);
+        if (exec->hadException())
+            return JSValue::encode(jsUndefined());
         if (!element.isUndefinedOrNull()) {
             JSObject* o = element.toObject(exec);
             JSValue conversionFunction = o->get(exec, exec->propertyNames().toLocaleString);
+            if (exec->hadException())
+                return JSValue::encode(jsUndefined());
             UString str;
             CallData callData;
             CallType callType = getCallData(conversionFunction, callData);
@@ -359,6 +363,8 @@ EncodedJSValue JSC_HOST_CALL arrayProtoFuncToLocaleString(ExecState* exec)
                 str = call(exec, conversionFunction, callType, callData, element, exec->emptyList()).toString(exec)->value(exec);
             else
                 str = element.toString(exec)->value(exec);
+            if (exec->hadException())
+                return JSValue::encode(jsUndefined());
             strBuffer.append(str);
         }
     }