blob: 20d1d273300f55aea0f0a25480c1b4afde976243 [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// 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("");