| //------------------------------------------------------------------------------------------------------- |
| // 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(); |