//------------------------------------------------------------------------------------------------------- | |
// Copyright (C) Microsoft. All rights reserved. | |
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. | |
//------------------------------------------------------------------------------------------------------- | |
// This test verifies that we correctly bail out if a constructor cache is invalidated as part | |
// of evaluating one of the arguments of the call to the constructor. | |
// This test invalidates the constructor cache by changing the constructor's prototype. | |
WScript.Echo("Test 1:"); | |
function SimpleObject1() { | |
this.x = 0; | |
} | |
SimpleObject1.prototype = { p: 10 }; | |
function test1(forceBailout) { | |
var o = new SimpleObject1(forceBailout ? SimpleObject1.prototype = { q: 11 } : 0); | |
return o; | |
} | |
var o = test1(false); | |
WScript.Echo("{ p: " + o.p + ", q: " + o.q + ", x: " + o.x + " }"); | |
var o = test1(false); | |
WScript.Echo("{ p: " + o.p + ", q: " + o.q + ", x: " + o.x + " }"); | |
o = test1(true); | |
WScript.Echo("{ p: " + o.p + ", q: " + o.q + ", x: " + o.x + " }"); | |
for (var i = 0; i < 10; i++) { | |
o = test1(false); | |
WScript.Echo("{ p: " + o.p + ", q: " + o.q + ", x: " + o.x + " }"); | |
} | |
WScript.Echo(""); | |
// This test invalidates the constructor cache guard by making one of the properties protected by the | |
// guard read-only. The property in question is added in the constructor. | |
WScript.Echo("Test 2:"); | |
function SimpleObject2() { | |
this.x = 0; | |
} | |
SimpleObject2.prototype = { p: 10 }; | |
function test2(forceBailout) { | |
var o = new SimpleObject2(forceBailout ? Object.defineProperty(SimpleObject2.prototype, "x", { value: 12, writable: false }) : 0); | |
return o; | |
} | |
var o = test2(false); | |
WScript.Echo("{ p: " + o.p + ", q: " + o.q + ", x: " + o.x + " }"); | |
var o = test2(false); | |
WScript.Echo("{ p: " + o.p + ", q: " + o.q + ", x: " + o.x + " }"); | |
o = test2(true); | |
WScript.Echo("{ p: " + o.p + ", q: " + o.q + ", x: " + o.x + " }"); | |
for (var i = 0; i < 10; i++) { | |
o = test2(false); | |
WScript.Echo("{ p: " + o.p + ", q: " + o.q + ", x: " + o.x + " }"); | |
} | |
WScript.Echo(""); | |
// This test invalidates the constructor cache guard by making one of the properties protected by the | |
// guard read-only. The property in question is added after the constructor | |
WScript.Echo("Test 3:"); | |
function SimpleObject3() { | |
this.x = 0; | |
} | |
SimpleObject3.prototype = { p: 10 }; | |
function test3(forceBailout) { | |
var o = new SimpleObject3(forceBailout ? Object.defineProperty(SimpleObject3.prototype, "y", { value: 12, writable: false }) : 0); | |
o.y = 1; | |
return o; | |
} | |
var o = test3(false); | |
WScript.Echo("{ p: " + o.p + ", q: " + o.q + ", x: " + o.x + ", y: " + o.y + " }"); | |
var o = test3(false); | |
WScript.Echo("{ p: " + o.p + ", q: " + o.q + ", x: " + o.x + ", y: " + o.y + " }"); | |
o = test3(true); | |
WScript.Echo("{ p: " + o.p + ", q: " + o.q + ", x: " + o.x + ", y: " + o.y + " }"); | |
for (var i = 0; i < 10; i++) { | |
o = test3(false); | |
WScript.Echo("{ p: " + o.p + ", q: " + o.q + ", x: " + o.x + ", y: " + o.y + " }"); | |
} | |
WScript.Echo(""); |