Title: [188459] releases/WebKitGTK/webkit-2.10/Source/_javascript_Core
Revision
188459
Author
[email protected]
Date
2015-08-14 04:00:43 -0700 (Fri, 14 Aug 2015)

Log Message

Merge r188384 - X.[[SetPrototypeOf]](Y) should succeed if X.[[Prototype]] is already Y even if X is not extensible
https://bugs.webkit.org/show_bug.cgi?id=147930

Reviewed by Saam Barati.

When the passed prototype object to be set is the same to the existing
prototype object, [[SetPrototypeOf]] just finishes its operation even
if the extensibility of the target object is `false`.

* runtime/JSGlobalObjectFunctions.cpp:
(JSC::globalFuncProtoSetter):
* runtime/ObjectConstructor.cpp:
(JSC::objectConstructorSetPrototypeOf):
* runtime/ReflectObject.cpp:
(JSC::reflectObjectSetPrototypeOf):
* tests/stress/set-same-prototype.js: Added.
(shouldBe):
(shouldThrow):

Modified Paths

Added Paths

Diff

Modified: releases/WebKitGTK/webkit-2.10/Source/_javascript_Core/ChangeLog (188458 => 188459)


--- releases/WebKitGTK/webkit-2.10/Source/_javascript_Core/ChangeLog	2015-08-14 10:47:45 UTC (rev 188458)
+++ releases/WebKitGTK/webkit-2.10/Source/_javascript_Core/ChangeLog	2015-08-14 11:00:43 UTC (rev 188459)
@@ -1,3 +1,24 @@
+2015-08-13  Yusuke Suzuki  <[email protected]>
+
+        X.[[SetPrototypeOf]](Y) should succeed if X.[[Prototype]] is already Y even if X is not extensible
+        https://bugs.webkit.org/show_bug.cgi?id=147930
+
+        Reviewed by Saam Barati.
+
+        When the passed prototype object to be set is the same to the existing
+        prototype object, [[SetPrototypeOf]] just finishes its operation even
+        if the extensibility of the target object is `false`.
+
+        * runtime/JSGlobalObjectFunctions.cpp:
+        (JSC::globalFuncProtoSetter):
+        * runtime/ObjectConstructor.cpp:
+        (JSC::objectConstructorSetPrototypeOf):
+        * runtime/ReflectObject.cpp:
+        (JSC::reflectObjectSetPrototypeOf):
+        * tests/stress/set-same-prototype.js: Added.
+        (shouldBe):
+        (shouldThrow):
+
 2015-08-13  Joseph Pecoraro  <[email protected]>
 
         Web Inspector: A {Map, WeakMap, Set, WeakSet} object contains itself will hang the console

Modified: releases/WebKitGTK/webkit-2.10/Source/_javascript_Core/runtime/JSGlobalObjectFunctions.cpp (188458 => 188459)


--- releases/WebKitGTK/webkit-2.10/Source/_javascript_Core/runtime/JSGlobalObjectFunctions.cpp	2015-08-14 10:47:45 UTC (rev 188458)
+++ releases/WebKitGTK/webkit-2.10/Source/_javascript_Core/runtime/JSGlobalObjectFunctions.cpp	2015-08-14 11:00:43 UTC (rev 188459)
@@ -874,6 +874,9 @@
     if (!value.isObject() && !value.isNull())
         return JSValue::encode(jsUndefined());
 
+    if (thisObject->prototype() == value)
+        return JSValue::encode(jsUndefined());
+
     if (!thisObject->isExtensible())
         return throwVMError(exec, createTypeError(exec, StrictModeReadonlyPropertyWriteError));
 

Modified: releases/WebKitGTK/webkit-2.10/Source/_javascript_Core/runtime/ObjectConstructor.cpp (188458 => 188459)


--- releases/WebKitGTK/webkit-2.10/Source/_javascript_Core/runtime/ObjectConstructor.cpp	2015-08-14 10:47:45 UTC (rev 188458)
+++ releases/WebKitGTK/webkit-2.10/Source/_javascript_Core/runtime/ObjectConstructor.cpp	2015-08-14 11:00:43 UTC (rev 188459)
@@ -208,6 +208,9 @@
     if (!checkProtoSetterAccessAllowed(exec, object))
         return JSValue::encode(objectValue);
 
+    if (object->prototype() == protoValue)
+        return JSValue::encode(objectValue);
+
     if (!object->isExtensible())
         return throwVMError(exec, createTypeError(exec, StrictModeReadonlyPropertyWriteError));
 

Modified: releases/WebKitGTK/webkit-2.10/Source/_javascript_Core/runtime/ReflectObject.cpp (188458 => 188459)


--- releases/WebKitGTK/webkit-2.10/Source/_javascript_Core/runtime/ReflectObject.cpp	2015-08-14 10:47:45 UTC (rev 188458)
+++ releases/WebKitGTK/webkit-2.10/Source/_javascript_Core/runtime/ReflectObject.cpp	2015-08-14 11:00:43 UTC (rev 188459)
@@ -168,6 +168,9 @@
     if (!checkProtoSetterAccessAllowed(exec, object))
         return JSValue::encode(jsBoolean(false));
 
+    if (object->prototype() == proto)
+        return JSValue::encode(jsBoolean(true));
+
     if (!object->isExtensible())
         return JSValue::encode(jsBoolean(false));
 

Added: releases/WebKitGTK/webkit-2.10/Source/_javascript_Core/tests/stress/set-same-prototype.js (0 => 188459)


--- releases/WebKitGTK/webkit-2.10/Source/_javascript_Core/tests/stress/set-same-prototype.js	                        (rev 0)
+++ releases/WebKitGTK/webkit-2.10/Source/_javascript_Core/tests/stress/set-same-prototype.js	2015-08-14 11:00:43 UTC (rev 188459)
@@ -0,0 +1,38 @@
+function shouldBe(actual, expected) {
+    if (actual !== expected)
+        throw new Error('bad value: ' + actual);
+}
+
+function shouldThrow(func, errorMessage) {
+    var errorThrown = false;
+    var error = null;
+    try {
+        func();
+    } catch (e) {
+        errorThrown = true;
+        error = e;
+    }
+    if (!errorThrown)
+        throw new Error('not thrown');
+    if (String(error) !== errorMessage)
+        throw new Error(`bad error: ${String(error)}`);
+}
+
+var proto = {};
+var object = Object.preventExtensions(Object.create(proto));
+
+shouldBe(Object.setPrototypeOf(object, proto), object);
+shouldThrow(() => {
+    Object.setPrototypeOf(object, {});
+}, `TypeError: Attempted to assign to readonly property.`);
+shouldBe(Reflect.getPrototypeOf(object), proto);
+
+shouldBe(Reflect.setPrototypeOf(object, proto), true);
+shouldBe(Reflect.setPrototypeOf(object, {}), false);
+shouldBe(Reflect.getPrototypeOf(object), proto);
+
+object.__proto__ = proto;
+shouldThrow(() => {
+    object.__proto__ = {};
+}, `TypeError: Attempted to assign to readonly property.`);
+shouldBe(object.__proto__, proto);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to