Unreviewed, rolling out r223523.
authorryanhaddad@apple.com <ryanhaddad@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 17 Oct 2017 23:34:29 +0000 (23:34 +0000)
committerryanhaddad@apple.com <ryanhaddad@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 17 Oct 2017 23:34:29 +0000 (23:34 +0000)
A test for this change is failing on debug JSC bots.

Reverted changeset:

"[JSC] __proto__ getter should be fast"
https://bugs.webkit.org/show_bug.cgi?id=178067
https://trac.webkit.org/changeset/223523

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

49 files changed:
JSTests/ChangeLog
JSTests/stress/dfg-object-proto-accessor.js [deleted file]
JSTests/stress/dfg-object-proto-getter.js [deleted file]
JSTests/stress/dfg-object-prototype-of.js [deleted file]
JSTests/stress/dfg-reflect-get-prototype-of.js [deleted file]
JSTests/stress/intrinsic-getter-with-poly-proto.js [deleted file]
JSTests/stress/object-get-prototype-of-filtered.js [deleted file]
JSTests/stress/object-get-prototype-of-mono-proto.js [deleted file]
JSTests/stress/object-get-prototype-of-poly-mono-proto.js [deleted file]
JSTests/stress/object-get-prototype-of-poly-proto.js [deleted file]
JSTests/stress/object-proto-getter-filtered.js [deleted file]
JSTests/stress/object-proto-getter-poly-mono-proto.js [deleted file]
JSTests/stress/object-proto-getter-poly-proto.js [deleted file]
JSTests/stress/object-prototype-proto-accessors-should-throw-on-undefined-this.js
JSTests/stress/string-proto.js [deleted file]
LayoutTests/ChangeLog
LayoutTests/js/object-literal-shorthand-construction-expected.txt
LayoutTests/js/script-tests/object-literal-shorthand-construction.js
LayoutTests/js/script-tests/sloppy-getter-setter-global-object.js
LayoutTests/js/sloppy-getter-setter-global-object-expected.txt
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h
Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
Source/JavaScriptCore/dfg/DFGClobberize.h
Source/JavaScriptCore/dfg/DFGDoesGC.cpp
Source/JavaScriptCore/dfg/DFGFixupPhase.cpp
Source/JavaScriptCore/dfg/DFGHeapLocation.cpp
Source/JavaScriptCore/dfg/DFGHeapLocation.h
Source/JavaScriptCore/dfg/DFGNode.h
Source/JavaScriptCore/dfg/DFGNodeType.h
Source/JavaScriptCore/dfg/DFGOperations.cpp
Source/JavaScriptCore/dfg/DFGOperations.h
Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp
Source/JavaScriptCore/dfg/DFGSafeToExecute.h
Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp
Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
Source/JavaScriptCore/ftl/FTLCapabilities.cpp
Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp
Source/JavaScriptCore/jit/IntrinsicEmitter.cpp
Source/JavaScriptCore/jit/JITOperations.h
Source/JavaScriptCore/runtime/Intrinsic.cpp
Source/JavaScriptCore/runtime/Intrinsic.h
Source/JavaScriptCore/runtime/JSGlobalObject.cpp
Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp
Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.h
Source/JavaScriptCore/runtime/ObjectConstructor.cpp
Source/JavaScriptCore/runtime/ReflectObject.cpp

index 0f99c6c..6aa8d18 100644 (file)
@@ -1,3 +1,15 @@
+2017-10-17  Ryan Haddad  <ryanhaddad@apple.com>
+
+        Unreviewed, rolling out r223523.
+
+        A test for this change is failing on debug JSC bots.
+
+        Reverted changeset:
+
+        "[JSC] __proto__ getter should be fast"
+        https://bugs.webkit.org/show_bug.cgi?id=178067
+        https://trac.webkit.org/changeset/223523
+
 2017-10-10  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         [JSC] __proto__ getter should be fast
diff --git a/JSTests/stress/dfg-object-proto-accessor.js b/JSTests/stress/dfg-object-proto-accessor.js
deleted file mode 100644 (file)
index 0f6db7b..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-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)}`);
-}
-
-(function () {
-    function target(object)
-    {
-        return object.__proto__;
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i)
-        shouldBe(target({}), Object.prototype);
-}());
-
-(function () {
-    function target(object)
-    {
-        return object.__proto__;
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i) {
-        shouldThrow(() => target(null), `TypeError: null is not an object (evaluating 'object.__proto__')`);
-        shouldThrow(() => target(undefined), `TypeError: undefined is not an object (evaluating 'object.__proto__')`);
-    }
-}());
-
-(function () {
-    function target(object)
-    {
-        return object.__proto__;
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i)
-        shouldBe(target("Cocoa"), String.prototype);
-}());
-
-(function () {
-    function target(object)
-    {
-        return object.__proto__;
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i)
-        shouldBe(target(42), Number.prototype);
-}());
-
-(function () {
-    function target(object)
-    {
-        return object.__proto__;
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i)
-        shouldBe(target(42.195), Number.prototype);
-}());
-
-(function () {
-    function target(object)
-    {
-        return object.__proto__;
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i)
-        shouldBe(target(true), Boolean.prototype);
-}());
-
-(function () {
-    function target(object)
-    {
-        return object.__proto__;
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i)
-        shouldBe(target(Symbol("Cocoa")), Symbol.prototype);
-}());
-
-(function () {
-    function target(object)
-    {
-        return object.__proto__;
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i) {
-        shouldBe(target("Cocoa"), String.prototype);
-        shouldBe(target(42), Number.prototype);
-        shouldBe(target(42.195), Number.prototype);
-        shouldBe(target(true), Boolean.prototype);
-        shouldBe(target(Symbol("Cocoa")), Symbol.prototype);
-    }
-}());
diff --git a/JSTests/stress/dfg-object-proto-getter.js b/JSTests/stress/dfg-object-proto-getter.js
deleted file mode 100644 (file)
index 9a0716d..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-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 protoFunction = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").get;
-
-(function () {
-    function target(object)
-    {
-        return protoFunction.call(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i)
-        shouldBe(target({}), Object.prototype);
-}());
-
-(function () {
-    function target(object)
-    {
-        return protoFunction.call(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i) {
-        shouldThrow(() => target(null), `TypeError: null is not an object (evaluating 'protoFunction.call(object)')`);
-        shouldThrow(() => target(undefined), `TypeError: undefined is not an object (evaluating 'protoFunction.call(object)')`);
-    }
-}());
-
-(function () {
-    function target(object)
-    {
-        return protoFunction.call(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i)
-        shouldBe(target("Cocoa"), String.prototype);
-}());
-
-(function () {
-    function target(object)
-    {
-        return protoFunction.call(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i)
-        shouldBe(target(42), Number.prototype);
-}());
-
-(function () {
-    function target(object)
-    {
-        return protoFunction.call(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i)
-        shouldBe(target(42.195), Number.prototype);
-}());
-
-(function () {
-    function target(object)
-    {
-        return protoFunction.call(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i)
-        shouldBe(target(true), Boolean.prototype);
-}());
-
-(function () {
-    function target(object)
-    {
-        return protoFunction.call(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i)
-        shouldBe(target(Symbol("Cocoa")), Symbol.prototype);
-}());
-
-(function () {
-    function target(object)
-    {
-        return protoFunction.call(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i) {
-        shouldBe(target("Cocoa"), String.prototype);
-        shouldBe(target(42), Number.prototype);
-        shouldBe(target(42.195), Number.prototype);
-        shouldBe(target(true), Boolean.prototype);
-        shouldBe(target(Symbol("Cocoa")), Symbol.prototype);
-    }
-}());
diff --git a/JSTests/stress/dfg-object-prototype-of.js b/JSTests/stress/dfg-object-prototype-of.js
deleted file mode 100644 (file)
index 4e2684d..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-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)}`);
-}
-
-(function () {
-    function target(object)
-    {
-        return Object.getPrototypeOf(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i)
-        shouldBe(target({}), Object.prototype);
-}());
-
-(function () {
-    function target(object)
-    {
-        return Object.getPrototypeOf(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i) {
-        shouldThrow(() => target(null), `TypeError: null is not an object (evaluating 'Object.getPrototypeOf(object)')`);
-        shouldThrow(() => target(undefined), `TypeError: undefined is not an object (evaluating 'Object.getPrototypeOf(object)')`);
-    }
-}());
-
-(function () {
-    function target(object)
-    {
-        return Object.getPrototypeOf(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i)
-        shouldBe(target("Cocoa"), String.prototype);
-}());
-
-(function () {
-    function target(object)
-    {
-        return Object.getPrototypeOf(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i)
-        shouldBe(target(42), Number.prototype);
-}());
-
-(function () {
-    function target(object)
-    {
-        return Object.getPrototypeOf(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i)
-        shouldBe(target(42.195), Number.prototype);
-}());
-
-(function () {
-    function target(object)
-    {
-        return Object.getPrototypeOf(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i)
-        shouldBe(target(true), Boolean.prototype);
-}());
-
-(function () {
-    function target(object)
-    {
-        return Object.getPrototypeOf(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i)
-        shouldBe(target(Symbol("Cocoa")), Symbol.prototype);
-}());
-
-(function () {
-    function target(object)
-    {
-        return Object.getPrototypeOf(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i) {
-        shouldBe(target("Cocoa"), String.prototype);
-        shouldBe(target(42), Number.prototype);
-        shouldBe(target(42.195), Number.prototype);
-        shouldBe(target(true), Boolean.prototype);
-        shouldBe(target(Symbol("Cocoa")), Symbol.prototype);
-    }
-}());
diff --git a/JSTests/stress/dfg-reflect-get-prototype-of.js b/JSTests/stress/dfg-reflect-get-prototype-of.js
deleted file mode 100644 (file)
index 7c888ff..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-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)}`);
-}
-
-(function () {
-    function target(object)
-    {
-        return Reflect.getPrototypeOf(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i)
-        shouldBe(target({}), Object.prototype);
-}());
-
-(function () {
-    function target(object)
-    {
-        return Reflect.getPrototypeOf(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i) {
-        shouldThrow(() => target(null), `TypeError: Reflect.getPrototypeOf requires the first argument be an object`);
-        shouldThrow(() => target(undefined), `TypeError: Reflect.getPrototypeOf requires the first argument be an object`);
-    }
-}());
-
-(function () {
-    function target(object)
-    {
-        return Reflect.getPrototypeOf(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e3; ++i) {
-        shouldThrow(() => target("Cocoa"), `TypeError: Reflect.getPrototypeOf requires the first argument be an object`);
-        shouldThrow(() => target(42), `TypeError: Reflect.getPrototypeOf requires the first argument be an object`);
-        shouldThrow(() => target(true), `TypeError: Reflect.getPrototypeOf requires the first argument be an object`);
-    }
-}());
diff --git a/JSTests/stress/intrinsic-getter-with-poly-proto.js b/JSTests/stress/intrinsic-getter-with-poly-proto.js
deleted file mode 100644 (file)
index d865235..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-function shouldBe(actual, expected) {
-    if (actual !== expected)
-        throw new Error('bad value: ' + actual);
-}
-
-function makePolyProtoObject() {
-    function foo() {
-        class C {
-            constructor() {
-                this._field = 42;
-            }
-        };
-        return new C;
-    }
-    for (let i = 0; i < 15; ++i)
-        foo();
-    return foo();
-}
-
-function target(object)
-{
-    return object.__proto__;
-}
-noInline(target);
-
-var polyProtoObject = makePolyProtoObject();
-var prototype = Reflect.getPrototypeOf(polyProtoObject);
-for (var i = 0; i < 1e5; ++i)
-    shouldBe(target(polyProtoObject), prototype);
-polyProtoObject.__proto__ = null;
-shouldBe(target(polyProtoObject), undefined);
diff --git a/JSTests/stress/object-get-prototype-of-filtered.js b/JSTests/stress/object-get-prototype-of-filtered.js
deleted file mode 100644 (file)
index e1a0808..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-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)}`);
-}
-
-// In this case, we cannot handle it as GetPrototypeOf since GetById is opaque.
-
-(function () {
-    function target(object)
-    {
-        return Object.getPrototypeOf(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e4; ++i) {
-        var object = {};
-        object[`Cocoa${i}`] = `Cocoa`;
-        shouldBe(target(object), Object.prototype);
-    }
-}());
-
-(function () {
-    function target(object)
-    {
-        return Object.getPrototypeOf(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e4; ++i) {
-        var array = [];
-        array[`Cocoa${i}`] = `Cocoa`;
-        shouldBe(target(array), Array.prototype);
-    }
-}());
-
-(function () {
-    function target(object)
-    {
-        return Object.getPrototypeOf(object);
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e4; ++i) {
-        function Cocoa() { }
-        Cocoa[`Cocoa${i}`] = `Cocoa`;
-        shouldBe(target(Cocoa), Function.prototype);
-    }
-}());
diff --git a/JSTests/stress/object-get-prototype-of-mono-proto.js b/JSTests/stress/object-get-prototype-of-mono-proto.js
deleted file mode 100644 (file)
index 5e0754e..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-function shouldBe(actual, expected) {
-    if (actual !== expected)
-        throw new Error('bad value: ' + actual);
-}
-
-function makePolyProtoObject() {
-    function foo() {
-        class C {
-            constructor() {
-                this._field = 42;
-                this.hello = 33;
-            }
-        };
-        return new C;
-    }
-    for (let i = 0; i < 15; ++i)
-        foo();
-    return foo();
-}
-
-function target(object)
-{
-    return [object.hello, Object.getPrototypeOf(object)];
-}
-noInline(target);
-
-var polyProtoObject = makePolyProtoObject();
-var prototype = Reflect.getPrototypeOf(polyProtoObject);
-var object1 = { __proto__: prototype, hello: 44 };
-var object2 = { hello: 45 };
-for (var i = 0; i < 1e5; ++i) {
-    shouldBe(target(object1)[1], prototype);
-    shouldBe(target(object2)[1], Object.prototype);
-}
diff --git a/JSTests/stress/object-get-prototype-of-poly-mono-proto.js b/JSTests/stress/object-get-prototype-of-poly-mono-proto.js
deleted file mode 100644 (file)
index 3fa09ef..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-function shouldBe(actual, expected) {
-    if (actual !== expected)
-        throw new Error('bad value: ' + actual);
-}
-
-function makePolyProtoObject() {
-    function foo() {
-        class C {
-            constructor() {
-                this._field = 42;
-                this.hello = 33;
-            }
-        };
-        return new C;
-    }
-    for (let i = 0; i < 15; ++i)
-        foo();
-    return foo();
-}
-
-function target(object)
-{
-    return [object.hello, Object.getPrototypeOf(object)];
-}
-noInline(target);
-
-var polyProtoObject = makePolyProtoObject();
-var prototype = Reflect.getPrototypeOf(polyProtoObject);
-var object = { __proto__: prototype, hello: 44 };
-for (var i = 0; i < 1e5; ++i) {
-    shouldBe(target(polyProtoObject)[1], prototype);
-    shouldBe(target(object)[1], prototype);
-}
diff --git a/JSTests/stress/object-get-prototype-of-poly-proto.js b/JSTests/stress/object-get-prototype-of-poly-proto.js
deleted file mode 100644 (file)
index 43d649d..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-function shouldBe(actual, expected) {
-    if (actual !== expected)
-        throw new Error('bad value: ' + actual);
-}
-
-function makePolyProtoObject() {
-    function foo() {
-        class C {
-            constructor() {
-                this._field = 42;
-                this.hello = 33;
-            }
-        };
-        return new C;
-    }
-    for (let i = 0; i < 15; ++i)
-        foo();
-    return foo();
-}
-
-function target(object)
-{
-    return [object.hello, Object.getPrototypeOf(object)];
-}
-noInline(target);
-
-var polyProtoObject = makePolyProtoObject();
-var prototype = Reflect.getPrototypeOf(polyProtoObject);
-for (var i = 0; i < 1e5; ++i)
-    shouldBe(target(polyProtoObject)[1], prototype);
diff --git a/JSTests/stress/object-proto-getter-filtered.js b/JSTests/stress/object-proto-getter-filtered.js
deleted file mode 100644 (file)
index 33fb527..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-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)}`);
-}
-
-(function () {
-    function target(object)
-    {
-        return object.__proto__;
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e4; ++i) {
-        var object = {};
-        object[`Cocoa${i}`] = `Cocoa`;
-        shouldBe(target(object), Object.prototype);
-    }
-}());
-
-(function () {
-    function target(object)
-    {
-        return object.__proto__;
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e4; ++i) {
-        var array = [];
-        array[`Cocoa${i}`] = `Cocoa`;
-        shouldBe(target(array), Array.prototype);
-    }
-}());
-
-(function () {
-    function target(object)
-    {
-        return object.__proto__;
-    }
-    noInline(target);
-
-    for (var i = 0; i < 1e4; ++i) {
-        function Cocoa() { }
-        Cocoa[`Cocoa${i}`] = `Cocoa`;
-        shouldBe(target(Cocoa), Function.prototype);
-    }
-}());
diff --git a/JSTests/stress/object-proto-getter-poly-mono-proto.js b/JSTests/stress/object-proto-getter-poly-mono-proto.js
deleted file mode 100644 (file)
index 1cc77e5..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-function shouldBe(actual, expected) {
-    if (actual !== expected)
-        throw new Error('bad value: ' + actual);
-}
-
-function makePolyProtoObject() {
-    function foo() {
-        class C {
-            constructor() {
-                this._field = 42;
-            }
-        };
-        return new C;
-    }
-    for (let i = 0; i < 15; ++i)
-        foo();
-    return foo();
-}
-
-function target(object)
-{
-    return object.__proto__;
-}
-noInline(target);
-
-var polyProtoObject = makePolyProtoObject();
-var prototype = Reflect.getPrototypeOf(polyProtoObject);
-var object = {
-    __proto__: prototype
-};
-for (var i = 0; i < 1e5; ++i) {
-    shouldBe(target(polyProtoObject), prototype);
-    shouldBe(target(object), prototype);
-}
diff --git a/JSTests/stress/object-proto-getter-poly-proto.js b/JSTests/stress/object-proto-getter-poly-proto.js
deleted file mode 100644 (file)
index 9b8efd9..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-function shouldBe(actual, expected) {
-    if (actual !== expected)
-        throw new Error('bad value: ' + actual);
-}
-
-function makePolyProtoObject() {
-    function foo() {
-        class C {
-            constructor() {
-                this._field = 42;
-            }
-        };
-        return new C;
-    }
-    for (let i = 0; i < 15; ++i)
-        foo();
-    return foo();
-}
-
-function target(object)
-{
-    return object.__proto__;
-}
-noInline(target);
-
-var polyProtoObject = makePolyProtoObject();
-var prototype = Reflect.getPrototypeOf(polyProtoObject);
-for (var i = 0; i < 1e5; ++i)
-    shouldBe(target(polyProtoObject), prototype);
index 5d4505b..5ffb4aa 100644 (file)
@@ -34,5 +34,5 @@ function runTest(testId, test, expectedResult, expectedException) {
     }
 }
 
-runTest(10000, testInvokeGetter, undefined, "TypeError: undefined is not an object (evaluating 'getter()')");
+runTest(10000, testInvokeGetter, undefined, "TypeError: Object.prototype.__proto__ called on null or undefined");
 runTest(10100, testInvokeSetter, undefined, "TypeError: Object.prototype.__proto__ called on null or undefined");
diff --git a/JSTests/stress/string-proto.js b/JSTests/stress/string-proto.js
deleted file mode 100644 (file)
index ddcf012..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-function shouldBe(actual, expected) {
-    if (actual !== expected)
-        throw new Error('bad value: ' + actual);
-}
-
-function target(value)
-{
-    return value.__proto__;
-}
-noInline(target);
-for (var i = 0; i < 1e6; ++i)
-    shouldBe(target("Cocoa"), String.prototype)
index cf2b7d6..0d047ed 100644 (file)
@@ -1,3 +1,15 @@
+2017-10-17  Ryan Haddad  <ryanhaddad@apple.com>
+
+        Unreviewed, rolling out r223523.
+
+        A test for this change is failing on debug JSC bots.
+
+        Reverted changeset:
+
+        "[JSC] __proto__ getter should be fast"
+        https://bugs.webkit.org/show_bug.cgi?id=178067
+        https://trac.webkit.org/changeset/223523
+
 2017-10-17  Per Arne Vollan  <pvollan@apple.com>
 
         Mark fast/text/ellipsis-text-rtl.html as a failure on Windows.
index 6fb1775..ee16b85 100644 (file)
@@ -64,7 +64,7 @@ PASS !!Object.getOwnPropertyDescriptor({set 42(value){}}, '42').set is true
 PASS this.__proto__ = [] threw exception TypeError: Cannot set prototype of immutable prototype object.
 PASS ({__proto__: this.__proto__}) instanceof Array is false
 PASS __proto__ = [] threw exception TypeError: Object.prototype.__proto__ called on null or undefined.
-PASS ({__proto__: __proto__}) instanceof Array threw exception TypeError: undefined is not an object (evaluating '__proto__').
+PASS ({__proto__: __proto__}) instanceof Array threw exception TypeError: Object.prototype.__proto__ called on null or undefined.
 SyntaxErrors
 PASS ({break}) threw exception SyntaxError: Cannot use the keyword 'break' as a shorthand property name..
 PASS ({case}) threw exception SyntaxError: Cannot use the keyword 'case' as a shorthand property name..
index d604894..0460b66 100644 (file)
@@ -113,7 +113,7 @@ shouldBeTrue("!!Object.getOwnPropertyDescriptor({set 42(value){}}, '42').set");
 shouldThrow("this.__proto__ = []");
 shouldBeFalse("({__proto__: this.__proto__}) instanceof Array");
 shouldThrow("__proto__ = []", '"TypeError: Object.prototype.__proto__ called on null or undefined"');
-shouldThrow("({__proto__: __proto__}) instanceof Array", '"TypeError: undefined is not an object (evaluating \'__proto__\')"');
+shouldThrow("({__proto__: __proto__}) instanceof Array", '"TypeError: Object.prototype.__proto__ called on null or undefined"');
 
 // Keywords - Syntax Errors
 debug("SyntaxErrors");
index 8803e6b..ebcbea9 100644 (file)
@@ -25,12 +25,12 @@ shouldThrow("Object.prototype.valueOf.call(null);");
 shouldNotThrow("Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').get()");
 shouldNotThrow("Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').set(['foo'])");
 
-shouldThrow("(0,Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').get)()", "\"TypeError: undefined is not an object (evaluating '(0,Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').get)()')\"");
+shouldThrow("(0,Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').get)()", "\"TypeError: Object.prototype.__proto__ called on null or undefined\"");
 shouldThrow("(0,Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').set)(['foo'])", "\"TypeError: Object.prototype.__proto__ called on null or undefined\"");
 
 
 var top_level_sloppy_getter = Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').get;
-shouldThrow("top_level_sloppy_getter();", "\"TypeError: undefined is not an object (evaluating 'top_level_sloppy_getter()')\"");
+shouldThrow("top_level_sloppy_getter();", "\"TypeError: Object.prototype.__proto__ called on null or undefined\"");
 
 var top_level_sloppy_setter = Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').set;
 shouldThrow("top_level_sloppy_setter(['foo']);", "\"TypeError: Object.prototype.__proto__ called on null or undefined\"");
index 8faa475..9339dd3 100644 (file)
@@ -8,9 +8,9 @@ PASS Object.prototype.valueOf.call(3); did not throw exception.
 PASS Object.prototype.valueOf.call(null); threw exception TypeError: null is not an object (evaluating 'Object.prototype.valueOf.call(null)').
 PASS Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').get() did not throw exception.
 PASS Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').set(['foo']) did not throw exception.
-PASS (0,Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').get)() threw exception TypeError: undefined is not an object (evaluating '(0,Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').get)()').
+PASS (0,Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').get)() threw exception TypeError: Object.prototype.__proto__ called on null or undefined.
 PASS (0,Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').set)(['foo']) threw exception TypeError: Object.prototype.__proto__ called on null or undefined.
-PASS top_level_sloppy_getter(); threw exception TypeError: undefined is not an object (evaluating 'top_level_sloppy_getter()').
+PASS top_level_sloppy_getter(); threw exception TypeError: Object.prototype.__proto__ called on null or undefined.
 PASS top_level_sloppy_setter(['foo']); threw exception TypeError: Object.prototype.__proto__ called on null or undefined.
 PASS successfullyParsed is true
 
index ac730b7..5845df9 100644 (file)
@@ -1,3 +1,15 @@
+2017-10-17  Ryan Haddad  <ryanhaddad@apple.com>
+
+        Unreviewed, rolling out r223523.
+
+        A test for this change is failing on debug JSC bots.
+
+        Reverted changeset:
+
+        "[JSC] __proto__ getter should be fast"
+        https://bugs.webkit.org/show_bug.cgi?id=178067
+        https://trac.webkit.org/changeset/223523
+
 2017-10-17  Youenn Fablet  <youenn@apple.com>
 
         Add preliminary support for fetch event
index cb58bf0..56e5ac5 100644 (file)
@@ -2740,48 +2740,6 @@ bool AbstractInterpreter<AbstractStateType>::executeEffects(unsigned clobberLimi
         forNode(node).setType(SpecInt32Only);
         break;
     }
-
-    case GetPrototypeOf: {
-        AbstractValue& value = forNode(node->child1());
-        if ((value.m_type && !(value.m_type & ~SpecObject)) && value.m_structure.isFinite()) {
-            bool canFold = !value.m_structure.isClear();
-            JSValue prototype;
-            value.m_structure.forEach([&] (RegisteredStructure structure) {
-                auto getPrototypeMethod = structure->classInfo()->methodTable.getPrototype;
-                MethodTable::GetPrototypeFunctionPtr defaultGetPrototype = JSObject::getPrototype;
-                if (getPrototypeMethod != defaultGetPrototype) {
-                    canFold = false;
-                    return;
-                }
-
-                if (structure->hasPolyProto()) {
-                    canFold = false;
-                    return;
-                }
-                if (!prototype)
-                    prototype = structure->storedPrototype();
-                else if (prototype != structure->storedPrototype())
-                    canFold = false;
-            });
-
-            if (prototype && canFold) {
-                setConstant(node, *m_graph.freeze(prototype));
-                break;
-            }
-        }
-
-        switch (node->child1().useKind()) {
-        case ArrayUse:
-        case FunctionUse:
-        case FinalObjectUse:
-            break;
-        default:
-            clobberWorld(node->origin.semantic, clobberLimit);
-            break;
-        }
-        forNode(node).setType(m_graph, SpecObject | SpecOther);
-        break;
-    }
         
     case GetByOffset: {
         StorageAccessData& data = node->storageAccessData();
index 7e921ce..87fd695 100644 (file)
@@ -238,7 +238,7 @@ private:
     template<typename ChecksFunctor>
     bool handleDOMJITCall(Node* callee, int resultOperand, const DOMJIT::Signature*, int registerOffset, int argumentCountIncludingThis, SpeculatedType prediction, const ChecksFunctor& insertChecks);
     template<typename ChecksFunctor>
-    bool handleIntrinsicGetter(int resultOperand, SpeculatedType prediction, const GetByIdVariant& intrinsicVariant, Node* thisNode, const ChecksFunctor& insertChecks);
+    bool handleIntrinsicGetter(int resultOperand, const GetByIdVariant& intrinsicVariant, Node* thisNode, const ChecksFunctor& insertChecks);
     template<typename ChecksFunctor>
     bool handleTypedArrayConstructor(int resultOperand, InternalFunction*, int registerOffset, int argumentCountIncludingThis, TypedArrayType, const ChecksFunctor& insertChecks);
     template<typename ChecksFunctor>
@@ -2599,24 +2599,6 @@ bool ByteCodeParser::handleIntrinsicCall(Node* callee, int resultOperand, Intrin
         return true;
     }
 
-    case ObjectGetPrototypeOfIntrinsic: {
-        if (argumentCountIncludingThis != 2)
-            return false;
-
-        insertChecks();
-        set(VirtualRegister(resultOperand), addToGraph(GetPrototypeOf, OpInfo(0), OpInfo(prediction), get(virtualRegisterForArgument(1, registerOffset))));
-        return true;
-    }
-
-    case ReflectGetPrototypeOfIntrinsic: {
-        if (argumentCountIncludingThis != 2)
-            return false;
-
-        insertChecks();
-        set(VirtualRegister(resultOperand), addToGraph(GetPrototypeOf, OpInfo(0), OpInfo(prediction), Edge(get(virtualRegisterForArgument(1, registerOffset)), ObjectUse)));
-        return true;
-    }
-
     case IsTypedArrayViewIntrinsic: {
         ASSERT(argumentCountIncludingThis == 2);
 
@@ -2964,7 +2946,7 @@ bool ByteCodeParser::handleDOMJITCall(Node* callTarget, int resultOperand, const
 
 
 template<typename ChecksFunctor>
-bool ByteCodeParser::handleIntrinsicGetter(int resultOperand, SpeculatedType prediction, const GetByIdVariant& variant, Node* thisNode, const ChecksFunctor& insertChecks)
+bool ByteCodeParser::handleIntrinsicGetter(int resultOperand, const GetByIdVariant& variant, Node* thisNode, const ChecksFunctor& insertChecks)
 {
     switch (variant.intrinsic()) {
     case TypedArrayByteLengthIntrinsic: {
@@ -3031,40 +3013,6 @@ bool ByteCodeParser::handleIntrinsicGetter(int resultOperand, SpeculatedType pre
         return true;
     }
 
-    case UnderscoreProtoIntrinsic: {
-        insertChecks();
-
-        bool canFold = !variant.structureSet().isEmpty();
-        JSValue prototype;
-        variant.structureSet().forEach([&] (Structure* structure) {
-            auto getPrototypeMethod = structure->classInfo()->methodTable.getPrototype;
-            MethodTable::GetPrototypeFunctionPtr defaultGetPrototype = JSObject::getPrototype;
-            if (getPrototypeMethod != defaultGetPrototype) {
-                canFold = false;
-                return;
-            }
-
-            if (structure->hasPolyProto()) {
-                canFold = false;
-                return;
-            }
-            if (!prototype)
-                prototype = structure->storedPrototype();
-            else if (prototype != structure->storedPrototype())
-                canFold = false;
-        });
-
-        // OK, only one prototype is found. We perform constant folding here.
-        // This information is important for super's constructor call to get new.target constant.
-        if (prototype && canFold) {
-            set(VirtualRegister(resultOperand), weakJSConstant(prototype));
-            return true;
-        }
-
-        set(VirtualRegister(resultOperand), addToGraph(GetPrototypeOf, OpInfo(0), OpInfo(prediction), thisNode));
-        return true;
-    }
-
     default:
         return false;
     }
@@ -3848,7 +3796,7 @@ void ByteCodeParser::handleGetById(
     
     Node* getter = addToGraph(GetGetter, loadedValue);
 
-    if (handleIntrinsicGetter(destinationOperand, prediction, variant, base,
+    if (handleIntrinsicGetter(destinationOperand, variant, base,
             [&] () {
                 addToGraph(CheckCell, OpInfo(m_graph.freeze(variant.intrinsicFunction())), getter);
             })) {
index 00641dd..68ab243 100644 (file)
@@ -1114,23 +1114,6 @@ void clobberize(Graph& graph, Node* node, const ReadFunctor& read, const WriteFu
         read(MiscFields);
         def(HeapLocation(TypedArrayByteOffsetLoc, MiscFields, node->child1()), LazyNode(node));
         return;
-
-    case GetPrototypeOf: {
-        switch (node->child1().useKind()) {
-        case ArrayUse:
-        case FunctionUse:
-        case FinalObjectUse:
-            read(JSCell_structureID);
-            read(JSObject_butterfly);
-            read(NamedProperties); // Poly proto could load prototype from its slot.
-            def(HeapLocation(PrototypeLoc, NamedProperties, node->child1()), LazyNode(node));
-            return;
-        default:
-            read(World);
-            write(Heap);
-            return;
-        }
-    }
         
     case GetByOffset:
     case GetGetterSetterByOffset: {
index b3c623f..b44d778 100644 (file)
@@ -238,7 +238,6 @@ bool doesGC(Graph& graph, Node* node)
     case StringCharAt:
     case StringCharCodeAt:
     case GetTypedArrayByteOffset:
-    case GetPrototypeOf:
     case PutByValDirect:
     case PutByVal:
     case PutByValAlias:
index 7d152ed..51410bc 100644 (file)
@@ -1603,11 +1603,6 @@ private:
             break;
         }
 
-        case GetPrototypeOf: {
-            fixupGetPrototypeOf(node);
-            break;
-        }
-
         case Phi:
         case Upsilon:
         case EntrySwitch:
@@ -2307,59 +2302,6 @@ private:
         }
     }
 
-    void fixupGetPrototypeOf(Node* node)
-    {
-        // Reflect.getPrototypeOf only accepts Objects. For Reflect.getPrototypeOf, ByteCodeParser attaches ObjectUse edge filter before fixup phase.
-        if (node->child1().useKind() != ObjectUse) {
-            if (node->child1()->shouldSpeculateString()) {
-                insertCheck<StringUse>(node->child1().node());
-                m_graph.convertToConstant(node, m_graph.freeze(m_graph.globalObjectFor(node->origin.semantic)->stringPrototype()));
-                return;
-            }
-            if (node->child1()->shouldSpeculateInt32()) {
-                insertCheck<Int32Use>(node->child1().node());
-                m_graph.convertToConstant(node, m_graph.freeze(m_graph.globalObjectFor(node->origin.semantic)->numberPrototype()));
-                return;
-            }
-            if (enableInt52() && node->child1()->shouldSpeculateAnyInt()) {
-                insertCheck<Int52RepUse>(node->child1().node());
-                m_graph.convertToConstant(node, m_graph.freeze(m_graph.globalObjectFor(node->origin.semantic)->numberPrototype()));
-                return;
-            }
-            if (node->child1()->shouldSpeculateNumber()) {
-                insertCheck<NumberUse>(node->child1().node());
-                m_graph.convertToConstant(node, m_graph.freeze(m_graph.globalObjectFor(node->origin.semantic)->numberPrototype()));
-                return;
-            }
-            if (node->child1()->shouldSpeculateSymbol()) {
-                insertCheck<SymbolUse>(node->child1().node());
-                m_graph.convertToConstant(node, m_graph.freeze(m_graph.globalObjectFor(node->origin.semantic)->symbolPrototype()));
-                return;
-            }
-            if (node->child1()->shouldSpeculateBoolean()) {
-                insertCheck<BooleanUse>(node->child1().node());
-                m_graph.convertToConstant(node, m_graph.freeze(m_graph.globalObjectFor(node->origin.semantic)->booleanPrototype()));
-                return;
-            }
-        }
-
-        if (node->child1()->shouldSpeculateFinalObject()) {
-            fixEdge<FinalObjectUse>(node->child1());
-            node->clearFlags(NodeMustGenerate);
-            return;
-        }
-        if (node->child1()->shouldSpeculateArray()) {
-            fixEdge<ArrayUse>(node->child1());
-            node->clearFlags(NodeMustGenerate);
-            return;
-        }
-        if (node->child1()->shouldSpeculateFunction()) {
-            fixEdge<FunctionUse>(node->child1());
-            node->clearFlags(NodeMustGenerate);
-            return;
-        }
-    }
-
     void fixupToThis(Node* node)
     {
         ECMAMode ecmaMode = m_graph.executableFor(node->origin.semantic)->isStrictMode() ? StrictMode : NotStrictMode;
index 20d9269..4ed0e47 100644 (file)
@@ -151,10 +151,6 @@ void printInternal(PrintStream& out, LocationKind kind)
     case TypedArrayByteOffsetLoc:
         out.print("TypedArrayByteOffsetLoc");
         return;
-
-    case PrototypeLoc:
-        out.print("PrototypeLoc");
-        return;
         
     case StructureLoc:
         out.print("StructureLoc");
index a7e1427..676565c 100644 (file)
@@ -60,7 +60,6 @@ enum LocationKind {
     SetterLoc,
     StructureLoc,
     TypedArrayByteOffsetLoc,
-    PrototypeLoc,
     StackLoc,
     StackPayloadLoc,
     MapBucketLoc,
index a692142..628bfc7 100644 (file)
@@ -1548,7 +1548,6 @@ public:
         case GetById:
         case GetByIdFlush:
         case GetByIdWithThis:
-        case GetPrototypeOf:
         case TryGetById:
         case GetByVal:
         case GetByValWithThis:
@@ -2312,11 +2311,6 @@ public:
         return isArraySpeculation(prediction());
     }
 
-    bool shouldSpeculateFunction()
-    {
-        return isFunctionSpeculation(prediction());
-    }
-
     bool shouldSpeculateProxyObject()
     {
         return isProxyObjectSpeculation(prediction());
index 0d63e9f..354ad37 100644 (file)
@@ -251,7 +251,6 @@ namespace JSC { namespace DFG {
     macro(CheckTypeInfoFlags, NodeMustGenerate) /* Takes an OpInfo with the flags you want to test are set */\
     macro(CheckSubClass, NodeMustGenerate) \
     macro(ParseInt, NodeMustGenerate | NodeResultJS) \
-    macro(GetPrototypeOf, NodeMustGenerate | NodeResultJS) \
     \
     /* Atomics object functions. */\
     macro(AtomicsAdd, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
index 01f4213..0217ea8 100644 (file)
@@ -52,7 +52,6 @@
 #include "JSCInlines.h"
 #include "JSFixedArray.h"
 #include "JSGenericTypedArrayViewConstructorInlines.h"
-#include "JSGlobalObjectFunctions.h"
 #include "JSLexicalEnvironment.h"
 #include "JSMap.h"
 #include "JSSet.h"
@@ -2519,36 +2518,6 @@ JSCell* JIT_OPERATION operationJSSetFindBucket(ExecState* exec, JSCell* map, Enc
     return *bucket;
 }
 
-EncodedJSValue JIT_OPERATION operationGetPrototypeOfObject(ExecState* exec, JSObject* thisObject)
-{
-    VM& vm = exec->vm();
-    NativeCallFrameTracer tracer(&vm, exec);
-    return JSValue::encode(thisObject->getPrototype(vm, exec));
-}
-
-EncodedJSValue JIT_OPERATION operationGetPrototypeOf(ExecState* exec, EncodedJSValue encodedValue)
-{
-    VM& vm = exec->vm();
-    NativeCallFrameTracer tracer(&vm, exec);
-    auto scope = DECLARE_THROW_SCOPE(vm);
-
-    JSValue thisValue = JSValue::decode(encodedValue).toThis(exec, StrictMode);
-    if (thisValue.isUndefinedOrNull())
-        return throwVMError(exec, scope, createNotAnObjectError(exec, thisValue));
-
-    JSObject* thisObject = jsDynamicCast<JSObject*>(vm, thisValue);
-    if (!thisObject) {
-        JSObject* prototype = thisValue.synthesizePrototype(exec);
-        EXCEPTION_ASSERT(!!scope.exception() == !prototype);
-        if (UNLIKELY(!prototype))
-            return JSValue::encode(JSValue());
-        return JSValue::encode(prototype);
-    }
-
-    scope.release();
-    return JSValue::encode(thisObject->getPrototype(vm, exec));
-}
-
 void JIT_OPERATION operationThrowDFG(ExecState* exec, EncodedJSValue valueToThrow)
 {
     VM& vm = exec->vm();
index 702599b..b165a9b 100644 (file)
@@ -77,8 +77,6 @@ EncodedJSValue JIT_OPERATION operationToPrimitive(ExecState*, EncodedJSValue) WT
 EncodedJSValue JIT_OPERATION operationToNumber(ExecState*, EncodedJSValue) WTF_INTERNAL;
 EncodedJSValue JIT_OPERATION operationGetByIdWithThis(ExecState*, EncodedJSValue, EncodedJSValue, UniquedStringImpl*) WTF_INTERNAL;
 EncodedJSValue JIT_OPERATION operationGetByValWithThis(ExecState*, EncodedJSValue, EncodedJSValue, EncodedJSValue) WTF_INTERNAL;
-EncodedJSValue JIT_OPERATION operationGetPrototypeOf(ExecState*, EncodedJSValue) WTF_INTERNAL;
-EncodedJSValue JIT_OPERATION operationGetPrototypeOfObject(ExecState*, JSObject*) WTF_INTERNAL;
 char* JIT_OPERATION operationNewArray(ExecState*, Structure*, void*, size_t) WTF_INTERNAL;
 char* JIT_OPERATION operationNewArrayBuffer(ExecState*, Structure*, size_t, size_t) WTF_INTERNAL;
 char* JIT_OPERATION operationNewEmptyArray(ExecState*, Structure*) WTF_INTERNAL;
index 6220de1..d64154f 100644 (file)
@@ -723,8 +723,7 @@ private:
         case GetArgument:
         case CallDOMGetter:
         case GetDynamicVar:
-        case WeakMapGet:
-        case GetPrototypeOf: {
+        case WeakMapGet: {
             setPrediction(m_currentNode->getHeapPrediction());
             break;
         }
index c04b702..5c71d62 100644 (file)
@@ -401,7 +401,6 @@ bool safeToExecute(AbstractStateType& state, Graph& graph, Node* node)
     case GetMyArgumentByValOutOfBounds:
     case ForwardVarargs:
     case CreateRest:
-    case GetPrototypeOf:
     case StringReplace:
     case StringReplaceRegExp:
     case GetRegExpObjectLastIndex:
index f46864c..a6188d4 100644 (file)
@@ -9186,23 +9186,13 @@ void SpeculativeJIT::speculateObject(Edge edge)
     speculateObject(edge, operand.gpr());
 }
 
-void SpeculativeJIT::speculateFunction(Edge edge, GPRReg cell)
-{
-    speculateCellType(edge, cell, SpecFunction, JSFunctionType);
-}
-
 void SpeculativeJIT::speculateFunction(Edge edge)
 {
     if (!needsTypeCheck(edge, SpecFunction))
         return;
     
     SpeculateCellOperand operand(this, edge);
-    speculateFunction(edge, operand.gpr());
-}
-
-void SpeculativeJIT::speculateFinalObject(Edge edge, GPRReg cell)
-{
-    speculateCellType(edge, cell, SpecFinalObject, FinalObjectType);
+    speculateCellType(edge, operand.gpr(), SpecFunction, JSFunctionType);
 }
 
 void SpeculativeJIT::speculateFinalObject(Edge edge)
@@ -9211,7 +9201,7 @@ void SpeculativeJIT::speculateFinalObject(Edge edge)
         return;
     
     SpeculateCellOperand operand(this, edge);
-    speculateFinalObject(edge, operand.gpr());
+    speculateCellType(edge, operand.gpr(), SpecFinalObject, FinalObjectType);
 }
 
 void SpeculativeJIT::speculateRegExpObject(Edge edge, GPRReg cell)
@@ -10777,125 +10767,6 @@ void SpeculativeJIT::compileWeakMapGet(Node* node)
     jsValueResult(resultRegs, node);
 }
 
-void SpeculativeJIT::compileGetPrototypeOf(Node* node)
-{
-    switch (node->child1().useKind()) {
-    case ArrayUse:
-    case FunctionUse:
-    case FinalObjectUse: {
-        SpeculateCellOperand object(this, node->child1());
-        GPRTemporary temp(this);
-        GPRTemporary temp2(this);
-
-        GPRReg objectGPR = object.gpr();
-        GPRReg tempGPR = temp.gpr();
-        GPRReg temp2GPR = temp2.gpr();
-
-        switch (node->child1().useKind()) {
-        case ArrayUse:
-            speculateArray(node->child1(), objectGPR);
-            break;
-        case FunctionUse:
-            speculateFunction(node->child1(), objectGPR);
-            break;
-        case FinalObjectUse:
-            speculateFinalObject(node->child1(), objectGPR);
-            break;
-        default:
-            RELEASE_ASSERT_NOT_REACHED();
-            break;
-        }
-
-        m_jit.emitLoadStructure(*m_jit.vm(), objectGPR, tempGPR, temp2GPR);
-
-        AbstractValue& value = m_state.forNode(node->child1());
-        if ((value.m_type && !(value.m_type & ~SpecObject)) && value.m_structure.isFinite()) {
-            bool hasPolyProto = false;
-            bool hasMonoProto = false;
-            value.m_structure.forEach([&] (RegisteredStructure structure) {
-                if (structure->hasPolyProto())
-                    hasPolyProto = true;
-                else
-                    hasMonoProto = true;
-            });
-
-            if (hasMonoProto && !hasPolyProto) {
-#if USE(JSVALUE64)
-                m_jit.load64(MacroAssembler::Address(tempGPR, Structure::prototypeOffset()), tempGPR);
-                jsValueResult(tempGPR, node);
-#else
-                m_jit.load32(MacroAssembler::Address(tempGPR, Structure::prototypeOffset() + TagOffset), temp2GPR);
-                m_jit.load32(MacroAssembler::Address(tempGPR, Structure::prototypeOffset() + PayloadOffset), tempGPR);
-                jsValueResult(temp2GPR, tempGPR, node);
-#endif
-                return;
-            }
-
-            if (hasPolyProto && !hasMonoProto) {
-#if USE(JSVALUE64)
-                m_jit.load64(MacroAssembler::Address(tempGPR, Structure::prototypeOffset()), tempGPR);
-                m_jit.zeroExtend32ToPtr(tempGPR, tempGPR);
-                m_jit.load64(JITCompiler::BaseIndex(objectGPR, tempGPR, JITCompiler::TimesEight, JSObject::offsetOfInlineStorage()), tempGPR);
-                jsValueResult(tempGPR, node);
-#else
-                m_jit.load32(MacroAssembler::Address(tempGPR, Structure::prototypeOffset() + PayloadOffset), tempGPR);
-                m_jit.load32(JITCompiler::BaseIndex(objectGPR, tempGPR, JITCompiler::TimesEight, JSObject::offsetOfInlineStorage() + TagOffset), temp2GPR);
-                m_jit.load32(JITCompiler::BaseIndex(objectGPR, tempGPR, JITCompiler::TimesEight, JSObject::offsetOfInlineStorage() + PayloadOffset), tempGPR);
-                jsValueResult(temp2GPR, tempGPR, node);
-#endif
-                return;
-            }
-        }
-
-#if USE(JSVALUE64)
-        m_jit.load64(MacroAssembler::Address(tempGPR, Structure::prototypeOffset()), tempGPR);
-        auto isMonoProto = m_jit.branchIfNotInt32(JSValueRegs(tempGPR));
-        m_jit.zeroExtend32ToPtr(tempGPR, tempGPR);
-        m_jit.load64(JITCompiler::BaseIndex(objectGPR, tempGPR, JITCompiler::TimesEight, JSObject::offsetOfInlineStorage()), tempGPR);
-        isMonoProto.link(&m_jit);
-        jsValueResult(tempGPR, node);
-#else
-        m_jit.load32(MacroAssembler::Address(tempGPR, Structure::prototypeOffset() + TagOffset), temp2GPR);
-        m_jit.load32(MacroAssembler::Address(tempGPR, Structure::prototypeOffset() + PayloadOffset), tempGPR);
-        auto isMonoProto = m_jit.branch32(CCallHelpers::NotEqual, temp2GPR, TrustedImm32(JSValue::Int32Tag));
-        m_jit.load32(JITCompiler::BaseIndex(objectGPR, tempGPR, JITCompiler::TimesEight, JSObject::offsetOfInlineStorage() + TagOffset), temp2GPR);
-        m_jit.load32(JITCompiler::BaseIndex(objectGPR, tempGPR, JITCompiler::TimesEight, JSObject::offsetOfInlineStorage() + PayloadOffset), tempGPR);
-        isMonoProto.link(&m_jit);
-        jsValueResult(temp2GPR, tempGPR, node);
-#endif
-        return;
-    }
-    case ObjectUse: {
-        SpeculateCellOperand value(this, node->child1());
-        JSValueRegsTemporary result(this);
-
-        GPRReg valueGPR = value.gpr();
-        JSValueRegs resultRegs = result.regs();
-
-        speculateObject(node->child1(), valueGPR);
-
-        flushRegisters();
-        callOperation(operationGetPrototypeOfObject, resultRegs, valueGPR);
-        m_jit.exceptionCheck();
-        jsValueResult(resultRegs, node);
-        return;
-    }
-    default: {
-        JSValueOperand value(this, node->child1());
-        JSValueRegsTemporary result(this);
-
-        JSValueRegs valueRegs = value.jsValueRegs();
-        JSValueRegs resultRegs = result.regs();
-
-        flushRegisters();
-        callOperation(operationGetPrototypeOf, resultRegs, valueRegs);
-        m_jit.exceptionCheck();
-        jsValueResult(resultRegs, node);
-        return;
-    }
-    }
-}
-
 } } // namespace JSC::DFG
 
 #endif
index b0e03b2..414d6a8 100644 (file)
@@ -987,11 +987,6 @@ public:
         m_jit.setupArgumentsWithExecState(object, TrustedImmPtr(static_cast<size_t>(size)));
         return appendCallSetResult(operation, result);
     }
-    JITCompiler::Call callOperation(J_JITOperation_EO operation, JSValueRegs result, GPRReg object)
-    {
-        m_jit.setupArgumentsWithExecState(object);
-        return appendCallSetResult(operation, result);
-    }
     JITCompiler::Call callOperation(P_JITOperation_EPS operation, GPRReg result, GPRReg old, size_t size)
     {
         m_jit.setupArgumentsWithExecState(old, TrustedImmPtr(size));
@@ -2840,7 +2835,6 @@ public:
     void compileWeakMapGet(Node*);
     void compileLoadKeyFromMapBucket(Node*);
     void compileLoadValueFromMapBucket(Node*);
-    void compileGetPrototypeOf(Node*);
     
 #if USE(JSVALUE32_64)
     template<typename BaseOperandType, typename PropertyOperandType, typename ValueOperandType, typename TagType>
@@ -3090,9 +3084,7 @@ public:
     void speculateObject(Edge);
     void speculateArray(Edge, GPRReg cell);
     void speculateArray(Edge);
-    void speculateFunction(Edge, GPRReg cell);
     void speculateFunction(Edge);
-    void speculateFinalObject(Edge, GPRReg cell);
     void speculateFinalObject(Edge);
     void speculateRegExpObject(Edge, GPRReg cell);
     void speculateRegExpObject(Edge);
index 240a572..a23b8a1 100644 (file)
@@ -4434,11 +4434,6 @@ void SpeculativeJIT::compile(Node* node)
         compileGetTypedArrayByteOffset(node);
         break;
     }
-
-    case GetPrototypeOf: {
-        compileGetPrototypeOf(node);
-        break;
-    }
         
     case GetByOffset: {
         StorageOperand storage(this, node->child1());
index e4fa86a..84da999 100644 (file)
@@ -4650,11 +4650,6 @@ void SpeculativeJIT::compile(Node* node)
         compileGetTypedArrayByteOffset(node);
         break;
     }
-
-    case GetPrototypeOf: {
-        compileGetPrototypeOf(node);
-        break;
-    }
         
     case GetByOffset:
     case GetGetterSetterByOffset: {
index 7e609cc..6926e1e 100644 (file)
@@ -144,7 +144,6 @@ inline CapabilityLevel canCompile(Node* node)
     case ReallocatePropertyStorage:
     case NukeStructureAndSetButterfly:
     case GetTypedArrayByteOffset:
-    case GetPrototypeOf:
     case NotifyWrite:
     case StoreBarrier:
     case FencedStoreBarrier:
index 1732f88..3ba45af 100644 (file)
@@ -821,9 +821,6 @@ private:
         case GetTypedArrayByteOffset:
             compileGetTypedArrayByteOffset();
             break;
-        case GetPrototypeOf:
-            compileGetPrototypeOf();
-            break;
         case AllocatePropertyStorage:
             compileAllocatePropertyStorage();
             break;
@@ -3432,82 +3429,6 @@ private:
 
         setInt32(m_out.castToInt32(m_out.phi(pointerType(), simpleOut, wastefulOut)));
     }
-
-    void compileGetPrototypeOf()
-    {
-        switch (m_node->child1().useKind()) {
-        case ArrayUse:
-        case FunctionUse:
-        case FinalObjectUse: {
-            LValue object = lowCell(m_node->child1());
-            switch (m_node->child1().useKind()) {
-            case ArrayUse:
-                speculateArray(m_node->child1(), object);
-                break;
-            case FunctionUse:
-                speculateFunction(m_node->child1(), object);
-                break;
-            case FinalObjectUse:
-                speculateFinalObject(m_node->child1(), object);
-                break;
-            default:
-                RELEASE_ASSERT_NOT_REACHED();
-                break;
-            }
-
-            LValue structure = loadStructure(object);
-
-            AbstractValue& value = m_state.forNode(m_node->child1());
-            if ((value.m_type && !(value.m_type & ~SpecObject)) && value.m_structure.isFinite()) {
-                bool hasPolyProto = false;
-                bool hasMonoProto = false;
-                value.m_structure.forEach([&] (RegisteredStructure structure) {
-                    if (structure->hasPolyProto())
-                        hasPolyProto = true;
-                    else
-                        hasMonoProto = true;
-                });
-
-                if (hasMonoProto && !hasPolyProto) {
-                    setJSValue(m_out.load64(structure, m_heaps.Structure_prototype));
-                    return;
-                }
-
-                if (hasPolyProto && !hasMonoProto) {
-                    LValue prototypeBits = m_out.load64(structure, m_heaps.Structure_prototype);
-                    LValue index = m_out.bitAnd(prototypeBits, m_out.constInt64(UINT_MAX));
-                    setJSValue(m_out.load64(m_out.baseIndex(m_heaps.properties.atAnyNumber(), object, index, ScaleEight, JSObject::offsetOfInlineStorage())));
-                    return;
-                }
-            }
-
-            LBasicBlock continuation = m_out.newBlock();
-            LBasicBlock loadPolyProto = m_out.newBlock();
-
-            LValue prototypeBits = m_out.load64(structure, m_heaps.Structure_prototype);
-            ValueFromBlock directPrototype = m_out.anchor(prototypeBits);
-            m_out.branch(isInt32(prototypeBits), unsure(loadPolyProto), unsure(continuation));
-
-            LBasicBlock lastNext = m_out.appendTo(loadPolyProto, continuation);
-            LValue index = m_out.bitAnd(prototypeBits, m_out.constInt64(UINT_MAX));
-            ValueFromBlock polyProto = m_out.anchor(
-                m_out.load64(m_out.baseIndex(m_heaps.properties.atAnyNumber(), object, index, ScaleEight, JSObject::offsetOfInlineStorage())));
-            m_out.jump(continuation);
-
-            m_out.appendTo(continuation, lastNext);
-            setJSValue(m_out.phi(Int64, directPrototype, polyProto));
-            return;
-        }
-        case ObjectUse: {
-            setJSValue(vmCall(Int64, m_out.operation(operationGetPrototypeOfObject), m_callFrame, lowObject(m_node->child1())));
-            return;
-        }
-        default: {
-            setJSValue(vmCall(Int64, m_out.operation(operationGetPrototypeOf), m_callFrame, lowJSValue(m_node->child1())));
-            return;
-        }
-        }
-    }
     
     void compileGetArrayLength()
     {
@@ -9082,7 +9003,7 @@ private:
         LValue structure = loadStructure(value);
 
         LValue prototypeBits = m_out.load64(structure, m_heaps.Structure_prototype);
-        ValueFromBlock directPrototype = m_out.anchor(prototypeBits);
+        ValueFromBlock directProtoype = m_out.anchor(prototypeBits);
         m_out.branch(isInt32(prototypeBits), unsure(loadPolyProto), unsure(comparePrototype));
 
         m_out.appendTo(loadPolyProto, comparePrototype);
@@ -9092,7 +9013,7 @@ private:
         m_out.jump(comparePrototype);
 
         m_out.appendTo(comparePrototype, notYetInstance);
-        LValue currentPrototype = m_out.phi(Int64, directPrototype, polyProto);
+        LValue currentPrototype = m_out.phi(Int64, directProtoype, polyProto);
         ValueFromBlock isInstanceResult = m_out.anchor(m_out.booleanTrue);
         m_out.branch(
             m_out.equal(currentPrototype, prototype),
index 6f9909f..4fb7a59 100644 (file)
@@ -63,11 +63,6 @@ bool IntrinsicGetterAccessCase::canEmitIntrinsicGetter(JSFunction* getter, Struc
         
         return true;
     }
-    case UnderscoreProtoIntrinsic: {
-        auto getPrototypeMethod = structure->classInfo()->methodTable.getPrototype;
-        MethodTable::GetPrototypeFunctionPtr defaultGetPrototype = JSObject::getPrototype;
-        return getPrototypeMethod == defaultGetPrototype;
-    }
     default:
         return false;
     }
@@ -130,19 +125,6 @@ void IntrinsicGetterAccessCase::emitIntrinsicGetter(AccessGenerationState& state
         return;
     }
 
-    case UnderscoreProtoIntrinsic: {
-        if (structure()->hasMonoProto()) {
-            jit.moveValue(structure()->storedPrototype(), valueRegs);
-            state.succeed();
-            return;
-        }
-        // FIXME: Support poly proto for intrinsic getters.
-        // https://bugs.webkit.org/show_bug.cgi?id=177318
-        jit.loadValue(MacroAssembler::Address(baseGPR, sizeof(EncodedJSValue) * structure()->polyProtoOffset() + JSObject::offsetOfInlineStorage()), valueRegs);
-        state.succeed();
-        return;
-    }
-
     default:
         break;
     }
index b04be15..c0ac2ef 100644 (file)
@@ -176,7 +176,6 @@ typedef EncodedJSValue (JIT_OPERATION *J_JITOperation_EZ)(ExecState*, int32_t);
 typedef EncodedJSValue (JIT_OPERATION *J_JITOperation_EZIcfZ)(ExecState*, int32_t, InlineCallFrame*, int32_t);
 typedef EncodedJSValue (JIT_OPERATION *J_JITOperation_EZZ)(ExecState*, int32_t, int32_t);
 typedef EncodedJSValue (JIT_OPERATION *J_JITOperation_EZSymtabJ)(ExecState*, int32_t, SymbolTable*, EncodedJSValue);
-typedef EncodedJSValue (JIT_OPERATION *J_JITOperation_EO)(ExecState*, JSObject*);
 typedef EncodedJSValue (JIT_OPERATION *J_JITOperation_EOIUi)(ExecState*, JSObject*, UniquedStringImpl*, uint32_t);
 typedef EncodedJSValue (JIT_OPERATION *J_JITOperation_EJJI)(ExecState*, EncodedJSValue, EncodedJSValue, UniquedStringImpl*);
 typedef JSCell* (JIT_OPERATION *C_JITOperation_EPUi)(ExecState*, void*, uint32_t);
index 9b5bd08..9d12fff 100644 (file)
@@ -111,10 +111,6 @@ const char* intrinsicName(Intrinsic intrinsic)
         return "RegExpTestIntrinsic";
     case RegExpTestFastIntrinsic:
         return "RegExpTestFastIntrinsic";
-    case ObjectGetPrototypeOfIntrinsic:
-        return "ObjectGetPrototypeOfIntrinsic";
-    case ReflectGetPrototypeOfIntrinsic:
-        return "ReflectGetPrototypeOfIntrinsic";
     case StringPrototypeValueOfIntrinsic:
         return "StringPrototypeValueOfIntrinsic";
     case StringPrototypeReplaceIntrinsic:
@@ -193,8 +189,6 @@ const char* intrinsicName(Intrinsic intrinsic)
         return "TypedArrayByteLengthIntrinsic";
     case TypedArrayByteOffsetIntrinsic:
         return "TypedArrayByteOffsetIntrinsic";
-    case UnderscoreProtoIntrinsic:
-        return "UnderscoreProtoIntrinsic";
     case DFGTrueIntrinsic:
         return "DFGTrueIntrinsic";
     case OSRExitIntrinsic:
index 06cb28a..29d95f7 100644 (file)
@@ -68,8 +68,6 @@ enum Intrinsic {
     RegExpExecIntrinsic,
     RegExpTestIntrinsic,
     RegExpTestFastIntrinsic,
-    ObjectGetPrototypeOfIntrinsic,
-    ReflectGetPrototypeOfIntrinsic,
     StringPrototypeValueOfIntrinsic,
     StringPrototypeReplaceIntrinsic,
     StringPrototypeReplaceRegExpIntrinsic,
@@ -111,7 +109,6 @@ enum Intrinsic {
     TypedArrayLengthIntrinsic,
     TypedArrayByteLengthIntrinsic,
     TypedArrayByteOffsetIntrinsic,
-    UnderscoreProtoIntrinsic,
 
     // Debugging intrinsics. These are meant to be used as testing hacks within
     // jsc.cpp and should never be exposed to users.
index 8b08ec6..41335a7 100644 (file)
@@ -449,7 +449,7 @@ void JSGlobalObject::init(VM& vm)
     m_nullSetterFunction.set(vm, this, NullSetterFunction::create(vm, NullSetterFunction::createStructure(vm, this, m_functionPrototype.get())));
     m_objectPrototype.set(vm, this, ObjectPrototype::create(vm, this, ObjectPrototype::createStructure(vm, this, jsNull())));
     GetterSetter* protoAccessor = GetterSetter::create(vm, this);
-    protoAccessor->setGetter(vm, this, JSFunction::create(vm, this, 0, makeString("get ", vm.propertyNames->underscoreProto.string()), globalFuncProtoGetter, UnderscoreProtoIntrinsic));
+    protoAccessor->setGetter(vm, this, JSFunction::create(vm, this, 0, makeString("get ", vm.propertyNames->underscoreProto.string()), globalFuncProtoGetter));
     protoAccessor->setSetter(vm, this, JSFunction::create(vm, this, 0, makeString("set ", vm.propertyNames->underscoreProto.string()), globalFuncProtoSetter));
     m_objectPrototype->putDirectNonIndexAccessor(vm, vm.propertyNames->underscoreProto, protoAccessor, PropertyAttribute::Accessor | PropertyAttribute::DontEnum);
     m_functionPrototype->structure()->setPrototypeWithoutTransition(vm, m_objectPrototype.get());
index cd686e8..42209d6 100644 (file)
@@ -64,7 +64,7 @@ using namespace Unicode;
 
 namespace JSC {
 
-const char* const ObjectProtoCalledOnNullOrUndefinedError = "Object.prototype.__proto__ called on null or undefined";
+static const char* const ObjectProtoCalledOnNullOrUndefinedError = "Object.prototype.__proto__ called on null or undefined";
 
 template<unsigned charactersCount>
 static Bitmap<256> makeCharacterBitmap(const char (&characters)[charactersCount])
@@ -706,11 +706,11 @@ EncodedJSValue JSC_HOST_CALL globalFuncProtoGetter(ExecState* exec)
 
     JSValue thisValue = exec->thisValue().toThis(exec, StrictMode);
     if (thisValue.isUndefinedOrNull())
-        return throwVMError(exec, scope, createNotAnObjectError(exec, thisValue));
+        return throwVMTypeError(exec, scope, ASCIILiteral(ObjectProtoCalledOnNullOrUndefinedError));
 
     JSObject* thisObject = jsDynamicCast<JSObject*>(vm, thisValue);
     if (!thisObject) {
-        JSObject* prototype = thisValue.synthesizePrototype(exec);
+        JSObject* prototype = exec->thisValue().synthesizePrototype(exec);
         EXCEPTION_ASSERT(!!scope.exception() == !prototype);
         if (UNLIKELY(!prototype))
             return JSValue::encode(JSValue());
index b6799e2..4e85eda 100644 (file)
@@ -35,8 +35,6 @@ class JSObject;
 // FIXME: These functions should really be in JSGlobalObject.cpp, but putting them there
 // is a 0.5% reduction.
 
-extern const char* const ObjectProtoCalledOnNullOrUndefinedError;
-
 EncodedJSValue JSC_HOST_CALL globalFuncEval(ExecState*);
 EncodedJSValue JSC_HOST_CALL globalFuncParseInt(ExecState*);
 EncodedJSValue JSC_HOST_CALL globalFuncParseFloat(ExecState*);
index f670bd3..228727b 100644 (file)
@@ -67,7 +67,7 @@ const ClassInfo ObjectConstructor::s_info = { "Function", &InternalFunction::s_i
 
 /* Source for ObjectConstructor.lut.h
 @begin objectConstructorTable
-  getPrototypeOf            objectConstructorGetPrototypeOf             DontEnum|Function 1 ObjectGetPrototypeOfIntrinsic
+  getPrototypeOf            objectConstructorGetPrototypeOf             DontEnum|Function 1
   setPrototypeOf            objectConstructorSetPrototypeOf             DontEnum|Function 2
   getOwnPropertyDescriptor  objectConstructorGetOwnPropertyDescriptor   DontEnum|Function 2
   getOwnPropertyDescriptors objectConstructorGetOwnPropertyDescriptors  DontEnum|Function 1
index dd0e18e..40e19f3 100644 (file)
@@ -63,7 +63,7 @@ const ClassInfo ReflectObject::s_info = { "Object", &Base::s_info, &reflectObjec
     deleteProperty           JSBuiltin                             DontEnum|Function 2
     get                      reflectObjectGet                      DontEnum|Function 2
     getOwnPropertyDescriptor reflectObjectGetOwnPropertyDescriptor DontEnum|Function 2
-    getPrototypeOf           reflectObjectGetPrototypeOf           DontEnum|Function 1 ReflectGetPrototypeOfIntrinsic
+    getPrototypeOf           reflectObjectGetPrototypeOf           DontEnum|Function 1
     has                      JSBuiltin                             DontEnum|Function 2
     isExtensible             reflectObjectIsExtensible             DontEnum|Function 1
     ownKeys                  reflectObjectOwnKeys                  DontEnum|Function 1