test262: test262/test/built-ins/Object/prototype/toLocaleString/primitive_this_value.js
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 17 Apr 2017 02:59:40 +0000 (02:59 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 17 Apr 2017 02:59:40 +0000 (02:59 +0000)
https://bugs.webkit.org/show_bug.cgi?id=170882

Patch by Joseph Pecoraro <pecoraro@apple.com> on 2017-04-16
Reviewed by Saam Barati.

JSTests:

* test262.yaml:

Source/JavaScriptCore:

* runtime/ObjectPrototype.cpp:
(JSC::objectProtoFuncToLocaleString):
We should be using the this value without ToObject conversion both when
getting the potential accessor and calling it. In strict mode, the this
value will remain its simple value, in non-strict it is still converted.

LayoutTests:

* js/dom/object-prototype-toLocaleString-expected.txt:
* js/dom/script-tests/object-prototype-toLocaleString.js:
Test the case of toLocaleString where toString does not exist.

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

JSTests/ChangeLog
JSTests/test262.yaml
LayoutTests/ChangeLog
LayoutTests/js/dom/object-prototype-toLocaleString-expected.txt
LayoutTests/js/dom/script-tests/object-prototype-toLocaleString.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/ObjectPrototype.cpp

index c5d5881..cc2aec8 100644 (file)
@@ -1,5 +1,14 @@
 2017-04-16  Joseph Pecoraro  <pecoraro@apple.com>
 
+        test262: test262/test/built-ins/Object/prototype/toLocaleString/primitive_this_value.js
+        https://bugs.webkit.org/show_bug.cgi?id=170882
+
+        Reviewed by Saam Barati.
+
+        * test262.yaml:
+
+2017-04-16  Joseph Pecoraro  <pecoraro@apple.com>
+
         test262: test262/test/built-ins/isNaN/toprimitive-not-callable-throws.js
         https://bugs.webkit.org/show_bug.cgi?id=170888
 
index 5658075..3c2387d 100644 (file)
 - path: test262/test/built-ins/Array/prototype/toLocaleString/name.js
   cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/built-ins/Array/prototype/toLocaleString/primitive_this_value.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
 - path: test262/test/built-ins/Array/prototype/toLocaleString/primitive_this_value_getter.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
 - path: test262/test/built-ins/Array/prototype/toString/S15.4.4.2_A1_T1.js
   cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
 - path: test262/test/built-ins/Array/prototype/toString/S15.4.4.2_A1_T1.js
 - path: test262/test/built-ins/Object/prototype/toLocaleString/name.js
   cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js", "../../../../../harness/propertyHelper.js"], [:strict]
 - path: test262/test/built-ins/Object/prototype/toLocaleString/primitive_this_value.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
 - path: test262/test/built-ins/Object/prototype/toLocaleString/primitive_this_value_getter.js
-  cmd: runTest262 :fail, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
+  cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], [:strict]
 - path: test262/test/built-ins/Object/prototype/toString/15.2.4.2-1-1.js
   cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
 - path: test262/test/built-ins/Object/prototype/toString/15.2.4.2-1-1.js
index cec41fe..f30a1e9 100644 (file)
@@ -1,3 +1,14 @@
+2017-04-16  Joseph Pecoraro  <pecoraro@apple.com>
+
+        test262: test262/test/built-ins/Object/prototype/toLocaleString/primitive_this_value.js
+        https://bugs.webkit.org/show_bug.cgi?id=170882
+
+        Reviewed by Saam Barati.
+
+        * js/dom/object-prototype-toLocaleString-expected.txt:
+        * js/dom/script-tests/object-prototype-toLocaleString.js:
+        Test the case of toLocaleString where toString does not exist.
+
 2017-04-16  Chris Dumez  <cdumez@apple.com>
 
         CMD+R / CMD+Q is considered as user interaction and beforeunload alert is shown
index 5816496..ca74422 100644 (file)
@@ -7,6 +7,8 @@ PASS o.toLocaleString() is o.toString()
 PASS o.toLocaleString() is "Dynamic toLocaleString()"
 PASS Object.prototype.toLocaleString.call('Hello, world!') is "Hello, world!"
 PASS Object.prototype.toLocaleString.call('Hello, world!') is "stringPrototypeToString"
+PASS obj.toLocaleString() is obj.toString()
+PASS obj.toLocaleString() threw exception TypeError: Type error.
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 9770445..dd34697 100644 (file)
@@ -13,3 +13,8 @@ var stringPrototypeToString = String.prototype.toString;
 String.prototype.toString = (function(){ return "stringPrototypeToString"; });
 shouldBe("Object.prototype.toLocaleString.call('Hello, world!')", '"stringPrototypeToString"');
 String.prototype.toString = stringPrototypeToString;
+
+var obj = {};
+shouldBe("obj.toLocaleString()", "obj.toString()");
+delete Object.prototype.toString;
+shouldThrow("obj.toLocaleString()");
index d5a3a42..22c9478 100644 (file)
@@ -1,5 +1,18 @@
 2017-04-16  Joseph Pecoraro  <pecoraro@apple.com>
 
+        test262: test262/test/built-ins/Object/prototype/toLocaleString/primitive_this_value.js
+        https://bugs.webkit.org/show_bug.cgi?id=170882
+
+        Reviewed by Saam Barati.
+
+        * runtime/ObjectPrototype.cpp:
+        (JSC::objectProtoFuncToLocaleString):
+        We should be using the this value without ToObject conversion both when
+        getting the potential accessor and calling it. In strict mode, the this
+        value will remain its simple value, in non-strict it is still converted.
+
+2017-04-16  Joseph Pecoraro  <pecoraro@apple.com>
+
         test262: test262/test/built-ins/isNaN/toprimitive-not-callable-throws.js
         https://bugs.webkit.org/show_bug.cgi?id=170888
 
index 9cd302c..c03dc0a 100644 (file)
@@ -281,23 +281,30 @@ EncodedJSValue JSC_HOST_CALL objectProtoFuncToLocaleString(ExecState* exec)
     VM& vm = exec->vm();
     auto scope = DECLARE_THROW_SCOPE(vm);
 
-    // 1. Let O be the result of calling ToObject passing the this value as the argument.
-    JSObject* object = exec->thisValue().toThis(exec, StrictMode).toObject(exec);
+    // 1. Let V be the this value.
+    JSValue thisValue = exec->thisValue();
+
+    // 2. Invoke(V, "toString")
+
+    // Let O be the result of calling ToObject passing the this value as the argument.
+    JSObject* object = thisValue.toThis(exec, StrictMode).toObject(exec);
     RETURN_IF_EXCEPTION(scope, encodedJSValue());
 
-    // 2. Let toString be the result of calling the [[Get]] internal method of O passing "toString" as the argument.
-    JSValue toString = object->get(exec, vm.propertyNames->toString);
+    // Let toString be the O.[[Get]]("toString", V)
+    PropertySlot slot(thisValue, PropertySlot::InternalMethodType::Get);
+    bool hasProperty = object->getPropertySlot(exec, vm.propertyNames->toString, slot);
+    JSValue toString = hasProperty ? slot.getValue(exec, vm.propertyNames->toString) : jsUndefined();
     RETURN_IF_EXCEPTION(scope, encodedJSValue());
 
-    // 3. If IsCallable(toString) is false, throw a TypeError exception.
+    // If IsCallable(toString) is false, throw a TypeError exception.
     CallData callData;
     CallType callType = getCallData(toString, callData);
     if (callType == CallType::None)
-        return JSValue::encode(jsUndefined());
+        return throwVMTypeError(exec, scope);
 
-    // 4. Return the result of calling the [[Call]] internal method of toString passing O as the this value and no arguments.
+    // Return the result of calling the [[Call]] internal method of toString passing the this value and no arguments.
     scope.release();
-    return JSValue::encode(call(exec, toString, callType, callData, object, exec->emptyList()));
+    return JSValue::encode(call(exec, toString, callType, callData, thisValue, exec->emptyList()));
 }
 
 EncodedJSValue JSC_HOST_CALL objectProtoFuncToString(ExecState* exec)