fieldhoist_number.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. // These tests are to make sure the following:
  6. // o[i] = ...
  7. // ... = o.x -- make sure that we don't hoist the load of o.x,
  8. // if previous call to o[i] has a chance to kill some o.x.
  9. // Access via o.x (use NaN)
  10. function test1() {
  11. var a = {};
  12. var r;
  13. a.NaN = "orig";
  14. for (var i = 0; i < 1; ++i) {
  15. r = a.NaN;
  16. i = Math.pow(1, Infinity); // Get NaN which val we know to be a Number.
  17. a[i] = "new"; // This will kill a.NaN.
  18. r = a.NaN; // This must cause a reload.
  19. }
  20. return r;
  21. }
  22. // Access via o.x (use Infinity)
  23. function test2() {
  24. var a = {};
  25. var r;
  26. a.Infinity = "orig";
  27. for (var i = 0; i < 1; ++i) {
  28. r = a.Infinity;
  29. i = 1 / 0; // Get Infinity which val we know to be a Number.
  30. a[i] = "new"; // This will kill a.Infinity.
  31. r = a.Infinity; // This must cause a reload.
  32. }
  33. return r;
  34. }
  35. // Access via o["x"] (use -Infinity)
  36. function test3() {
  37. var a = {};
  38. a[-Infinity] = "orig";
  39. var r;
  40. for (var i = 0; i > -1; --i) {
  41. r = a["-Infinity"];
  42. i = -1 / 0;
  43. a[i] = "new";
  44. r = a["-Infinity"];
  45. }
  46. return r;
  47. }
  48. // Access fia o["x"], use float number
  49. function test4() {
  50. var a = {};
  51. var r;
  52. a[1.23] = "orig";
  53. for (var i = 1; i < 2; ++i) {
  54. r = a[1.23];
  55. i = 1 + 0.23;
  56. a[i] = "new"; // This will kill a[1.23].
  57. r = a["1.23"]; // This must cause a reload.
  58. }
  59. return r;
  60. }
  61. // Access via o[x] (use NaN)
  62. function test5() {
  63. var a = {};
  64. var r;
  65. a.NaN = "orig";
  66. for (var i = 0; i < 1; ++i) {
  67. r = a.NaN;
  68. i = Math.pow(1, Infinity); // Get a NaN that which val we know to be a Number.
  69. a[i] = "new"; // This will kill a.NaN.
  70. r = a[NaN]; // This must cause a reload.
  71. }
  72. return r;
  73. }
  74. // Access via o[x] (use float number)
  75. function test6() {
  76. var a = {};
  77. var r;
  78. a[1.23] = "orig";
  79. for (var i = 1; i < 2; ++i) {
  80. r = a[1.23];
  81. i = 1 + 0.23;
  82. a[i] = "new"; // This will kill a[1.23].
  83. r = a[1.23]; // This must cause a reload.
  84. }
  85. return r;
  86. }
  87. var isPass = true;
  88. function reportError(arg1, arg2) {
  89. WScript.Echo(arg1, arg2);
  90. isPass = false;
  91. }
  92. var expected = "new";
  93. var r1 = test1();
  94. var r2 = test2();
  95. var r3 = test3();
  96. var r4 = test4();
  97. var r5 = test5();
  98. var r6 = test6();
  99. if (r1 != expected) reportError("bug: r1 =", r1);
  100. if (r2 != expected) reportError("bug: r2 =", r2);
  101. if (r3 != expected) reportError("bug: r3 =", r3);
  102. if (r4 != expected) reportError("bug: r4 =", r4);
  103. if (r5 != expected) reportError("bug: r5 =", r5);
  104. if (r6 != expected) reportError("bug: r6 =", r6);
  105. if (isPass) WScript.Echo("PASS");