//------------------------------------------------------------------------------------------------------- | |
// Copyright (C) Microsoft. All rights reserved. | |
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. | |
//------------------------------------------------------------------------------------------------------- | |
// Cases related to type hard-coding and the prototype chain. | |
function print(x) { WScript.Echo(x + ''); } | |
// Set up a property x near the end of the prototype chain. | |
Function.prototype.x = 'Function.x'; | |
function proto() { } | |
// Test1: Add a new, nearer x after accessing the more distant x. | |
function foo1(o) { | |
var y = o.y; | |
var x = o.x; | |
print(o.x); | |
} | |
function bar1(o) { | |
proto1.prototype.x = 'new x'; | |
} | |
function proto1() { } | |
proto1.prototype = proto; | |
proto1.prototype.y = 'y'; | |
var o1 = new proto1(); | |
foo1(o1); | |
foo1(o1); | |
bar1(o1); | |
foo1(o1); | |
// Test2: Access a nearer x, then delete it so that we access the more distant one. | |
function foo2(o) { | |
var y = o.y; | |
var x = o.x; | |
print(o.x); | |
} | |
function bar2(o) { | |
delete proto2.prototype.x; | |
} | |
function proto2() { } | |
proto2.prototype = proto; | |
proto2.prototype.x = 'x'; | |
proto2.prototype.y = 'y'; | |
var o2 = new proto2(); | |
foo2(o2); | |
foo2(o2); | |
bar2(o2); | |
foo2(o2); | |
// Test3: Access x in the proto chain, then add it locally. | |
var o3 = {}; | |
Object.prototype.x = 'no'; | |
Object.prototype.y = 'yes'; | |
Object.prototype.foo = foo3; | |
function foo3() { | |
o3.x = this.y; | |
print(this.x); | |
} | |
o3 = new foo3(); | |
o3.foo(); | |
// Test4: Breaks if we don't re-check the proto cache sym after the store to this.prop5. | |
function test4(){ | |
var obj0 = {}; | |
var obj1 = {}; | |
var func0 = function(p0){ | |
var litObj5 = {prop0: (-- obj1.prop0), prop1: 1, prop2: 1, prop3: 1, prop4: 1, prop5: 1, prop6: 1, prop7: 1}; | |
} | |
Object.prototype.prop5 = 1; | |
for (var __loopvar0 = 0; __loopvar0 < 3; ++__loopvar0) { | |
obj2 = func0(1, 1, 1); | |
function func4 (){ | |
if (((obj1.prop0 >>= 1) >>> ((this.prop5)))) { | |
for (var strvar0 in obj1 ) { | |
this.prop5 >>>=1; | |
obj0.prop3 = ((obj0.prop6 ^= this.prop5)); | |
break ; | |
} | |
} | |
WScript.Echo("obj0.prop6 = " + (obj0.prop6|0)); | |
} | |
if (func4()) { | |
} | |
} | |
}; | |
// generate profile | |
test4(); | |
// run JITted code | |
test4(); |