| //------------------------------------------------------------------------------------------------------- |
| // Copyright (C) Microsoft. All rights reserved. |
| // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. |
| //------------------------------------------------------------------------------------------------------- |
| |
| function write(v) { WScript.Echo("" + v); } |
| |
| var x = ['x']; |
| x.call1 = function() { write('In x.call1: this = ' + this) }; |
| |
| var y = ['y']; |
| y.call1 = function() { write('In y.call1: this = ' + this) }; |
| |
| function call1() |
| { |
| write('In call1: this = ' + this); |
| } |
| |
| function call2() |
| { |
| write('In call2: this = ' + this); |
| } |
| |
| var savecall1 = call1; |
| call1(call1 = call2); |
| call1 = savecall1; |
| |
| savecall1 = x.call1; |
| x.call1(x.call1 = call1); |
| x.call1 = savecall1; |
| |
| var savex = x; |
| x.call1(x.call1 = y.call1); |
| x = savex; |
| x.call1 = savecall1; |
| |
| var s = 'call1'; |
| x[x = s](); |
| x = savex; |
| |
| x[s](s = 'call2'); |
| s = 'call1'; |
| |
| x[s](x[s] = y.call1); |
| x[s] = x.call1; |
| |
| (function() { |
| // Now try the same set of stuff when call target components are local. |
| |
| var x = ['x']; |
| x.call1 = function() { write('In x.call1: this = ' + this) }; |
| |
| var y = ['y']; |
| y.call1 = function() { write('In y.call1: this = ' + this) }; |
| |
| function call1() |
| { |
| write('In call1: this = ' + this); |
| } |
| |
| function call2() |
| { |
| write('In call2: this = ' + this); |
| } |
| |
| var savecall1 = call1; |
| call1(call1 = call2); |
| call1 = savecall1; |
| |
| savecall1 = x.call1; |
| x.call1(x.call1 = call1); |
| x.call1 = savecall1; |
| |
| var savex = x; |
| x.call1(x.call1 = y.call1); |
| x = savex; |
| x.call1 = savecall1; |
| |
| var s = 'call1'; |
| x[x = s](); |
| x = savex; |
| |
| x[s](s = 'call2'); |
| s = 'call1'; |
| |
| x[s](x[s] = y.call1); |
| x[s] = x.call1; |
| })(); |
| |
| (function() { |
| var evalExpr = '' + |
| 'var x = ["x"];' + |
| 'x.call1 = function() { write("In x.call1: this = " + this) };' + |
| |
| 'var y = ["y"];' + |
| 'y.call1 = function() { write("In y.call1: this = " + this) };' + |
| |
| 'function call1()' + |
| '{' + |
| 'write("In call1: this = " + this);' + |
| '}' + |
| |
| 'function call2()' + |
| '{' + |
| 'write("In call2: this = " + this);' + |
| '}' + |
| |
| 'var savecall1 = call1;' + |
| 'call1(call1 = call2);' + |
| 'call1 = savecall1;' + |
| |
| 'savecall1 = x.call1;' + |
| 'x.call1(x.call1 = call1);' + |
| 'x.call1 = savecall1;' + |
| |
| 'var savex = x;' + |
| 'x.call1(x.call1 = y.call1);' + |
| 'x = savex;' + |
| 'x.call1 = savecall1;' + |
| |
| 'var s = "call1";' + |
| 'x[x = s]();' + |
| 'x = savex;' + |
| |
| 'x[s](s = "call2");' + |
| 's = "call1";' + |
| |
| 'x[s](x[s] = y.call1);' + |
| 'x[s] = x.call1;'; |
| |
| eval(evalExpr); |
| })(); |
| |
| // Verify that we assign regs properly in a compound assignment to function call result. |
| // Note: this will cease to be a valid test when early reference errors are thrown by default. |
| function test5921858() { |
| function eval([]){} |
| function shapeyConstructor(fujzty){ |
| Object.defineProperty(this, "a", |
| ({value: ((eval("true", window)) ^= z), writable: true, configurable: false})); |
| } |
| } |