| //------------------------------------------------------------------------------------------------------- |
| // Copyright (C) Microsoft. All rights reserved. |
| // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. |
| //------------------------------------------------------------------------------------------------------- |
| |
| WScript.Echo("Testing invalidation due to overwrite:"); |
| |
| var proto1 = { |
| // Make sure we branch to a unique type path to avoid false sharing |
| unique1_1: 0, |
| add: function () { |
| return (this.x + this.y) + " (original)"; |
| }, |
| subtract: function () { |
| return (this.x - this.y) + " (original)"; |
| } |
| } |
| |
| var object1 = Object.create(proto1); |
| object1.x = 0; |
| object1.y = 1; |
| |
| var testOverwrite = function (object) { |
| WScript.Echo("x + y = " + object.add()); |
| WScript.Echo("x - y = " + object.subtract()); |
| } |
| |
| testOverwrite(object1); |
| |
| testOverwrite(object1); |
| |
| proto1.subtract = function () { |
| return (this.x - this.y) + " (overwritten)"; |
| } |
| |
| testOverwrite(object1); |
| |
| proto1.add = function () { |
| return (this.x + this.y) + " (overwritten)"; |
| } |
| |
| testOverwrite(object1); |
| |
| var proto1 = { |
| // Make sure we branch to a unique type path to avoid false sharing |
| unique1_2: 0, |
| add: function () { |
| return (this.x + this.y) + " (original)"; |
| }, |
| subtract: function () { |
| return (this.x - this.y) + " (original)"; |
| } |
| } |
| |
| var object1 = Object.create(proto1); |
| object1.x = 0; |
| object1.y = 1; |
| |
| var overwrittenSubtract = function () { |
| return (this.x - this.y) + " (overwritten)"; |
| } |
| |
| var testOverwrite = function (object, overwrite) { |
| WScript.Echo("x + y = " + object.add()); |
| if (overwrite) { |
| proto1.subtract = overwrittenSubtract; |
| } |
| WScript.Echo("x - y = " + object.subtract()); |
| } |
| |
| testOverwrite(object1, false); |
| |
| testOverwrite(object1, false); |
| |
| testOverwrite(object1, true); |
| |
| WScript.Echo(); |
| |
| |
| WScript.Echo("Testing invalidation due to delete:"); |
| |
| var proto2 = { |
| // Make sure we branch to a unique type path to avoid false sharing |
| unique2: 0, |
| add: function () { |
| return (this.x + this.y) + " (from proto2)"; |
| }, |
| subtract: function () { |
| return (this.x - this.y) + " (from proto2)"; |
| } |
| } |
| |
| var proto1 = Object.create(proto2, { |
| // Make sure we branch to a unique type path to avoid false sharing |
| unique3: { value: 0 }, |
| add: { |
| value: function () { |
| return (this.x + this.y) + " (from proto1)"; |
| }, |
| writable: true, configurable: true |
| }, |
| subtract: { |
| value: function () { |
| return (this.x - this.y) + " (from proto1)"; |
| }, |
| writable: true, configurable: true |
| } |
| }); |
| |
| var object1 = Object.create(proto1); |
| object1.x = 0; |
| object1.y = 1; |
| |
| function testDelete(object) { |
| WScript.Echo("x + y = " + object.add()); |
| WScript.Echo("x - y = " + object.subtract()); |
| } |
| |
| testDelete(object1); |
| |
| testDelete(object1); |
| |
| delete proto1.subtract; |
| |
| testDelete(object1); |
| |
| delete proto1.add; |
| |
| testDelete(object1); |
| |
| WScript.Echo(); |
| |
| |
| WScript.Echo("Testing invalidation due to shadowing:"); |
| |
| var proto2 = { |
| // Make sure we branch to a unique type path to avoid false sharing |
| unique4: 0, |
| add: function () { |
| return (this.x + this.y) + " (from proto2)"; |
| }, |
| subtract: function () { |
| return (this.x - this.y) + " (from proto2)"; |
| } |
| } |
| |
| var proto1 = Object.create(proto2, { |
| // Make sure we branch to a unique type path to avoid false sharing |
| unique5: { value: 0 }, |
| }); |
| |
| var object1 = Object.create(proto1); |
| object1.x = 0; |
| object1.y = 1; |
| |
| function testShadow(object) { |
| WScript.Echo("x + y = " + object.add()); |
| WScript.Echo("x - y = " + object.subtract()); |
| } |
| |
| testShadow(object1); |
| |
| testShadow(object1); |
| |
| proto1.subtract = function () { |
| return (this.x - this.y) + " (from proto1)"; |
| }; |
| |
| testShadow(object1); |
| |
| proto1.add = function () { |
| return (this.x + this.y) + " (from proto1)"; |
| }; |
| |
| testShadow(object1); |
| |
| WScript.Echo(); |