| //------------------------------------------------------------------------------------------------------- |
| // Copyright (C) Microsoft. All rights reserved. |
| // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. |
| //------------------------------------------------------------------------------------------------------- |
| |
| // These tests are to make sure the following: |
| // o[i] = ... |
| // ... = o.x -- make sure that we don't hoist the load of o.x, |
| // if previous call to o[i] has a chance to kill some o.x. |
| |
| // Access via o.x (use NaN) |
| function test1() { |
| var a = {}; |
| var r; |
| a.NaN = "orig"; |
| for (var i = 0; i < 1; ++i) { |
| r = a.NaN; |
| i = Math.pow(1, Infinity); // Get NaN which val we know to be a Number. |
| a[i] = "new"; // This will kill a.NaN. |
| r = a.NaN; // This must cause a reload. |
| } |
| return r; |
| } |
| |
| // Access via o.x (use Infinity) |
| function test2() { |
| var a = {}; |
| var r; |
| a.Infinity = "orig"; |
| for (var i = 0; i < 1; ++i) { |
| r = a.Infinity; |
| i = 1 / 0; // Get Infinity which val we know to be a Number. |
| a[i] = "new"; // This will kill a.Infinity. |
| r = a.Infinity; // This must cause a reload. |
| } |
| return r; |
| } |
| |
| // Access via o["x"] (use -Infinity) |
| function test3() { |
| var a = {}; |
| a[-Infinity] = "orig"; |
| var r; |
| for (var i = 0; i > -1; --i) { |
| r = a["-Infinity"]; |
| i = -1 / 0; |
| a[i] = "new"; |
| r = a["-Infinity"]; |
| } |
| return r; |
| } |
| |
| // Access fia o["x"], use float number |
| function test4() { |
| var a = {}; |
| var r; |
| a[1.23] = "orig"; |
| for (var i = 1; i < 2; ++i) { |
| r = a[1.23]; |
| i = 1 + 0.23; |
| a[i] = "new"; // This will kill a[1.23]. |
| r = a["1.23"]; // This must cause a reload. |
| } |
| return r; |
| } |
| |
| // Access via o[x] (use NaN) |
| function test5() { |
| var a = {}; |
| var r; |
| a.NaN = "orig"; |
| for (var i = 0; i < 1; ++i) { |
| r = a.NaN; |
| i = Math.pow(1, Infinity); // Get a NaN that which val we know to be a Number. |
| a[i] = "new"; // This will kill a.NaN. |
| r = a[NaN]; // This must cause a reload. |
| } |
| return r; |
| } |
| |
| // Access via o[x] (use float number) |
| function test6() { |
| var a = {}; |
| var r; |
| a[1.23] = "orig"; |
| for (var i = 1; i < 2; ++i) { |
| r = a[1.23]; |
| i = 1 + 0.23; |
| a[i] = "new"; // This will kill a[1.23]. |
| r = a[1.23]; // This must cause a reload. |
| } |
| return r; |
| } |
| |
| var isPass = true; |
| function reportError(arg1, arg2) { |
| WScript.Echo(arg1, arg2); |
| isPass = false; |
| } |
| |
| var expected = "new"; |
| var r1 = test1(); |
| var r2 = test2(); |
| var r3 = test3(); |
| var r4 = test4(); |
| var r5 = test5(); |
| var r6 = test6(); |
| |
| if (r1 != expected) reportError("bug: r1 =", r1); |
| if (r2 != expected) reportError("bug: r2 =", r2); |
| if (r3 != expected) reportError("bug: r3 =", r3); |
| if (r4 != expected) reportError("bug: r4 =", r4); |
| if (r5 != expected) reportError("bug: r5 =", r5); |
| if (r6 != expected) reportError("bug: r6 =", r6); |
| |
| if (isPass) WScript.Echo("PASS"); |