From ea6c18c5e21189acd2fd26961ea6dc6d2a1947ac Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Bargull?= <andre.bargull@gmail.com>
Date: Thu, 22 Mar 2018 17:20:29 -0700
Subject: [PATCH] Don't compute NaN values in functions (#1503)

`function nan() { return /* expression to compute NaN */ }` may not return the same implementation-distinguishable NaN value before and after JIT compilation.
---
 harness/nans.js                               | 18 ++++++++---------
 ...quivalence-define-own-property-reassign.js |  6 +++---
 ...valence-define-own-property-reconfigure.js |  6 +++---
 .../prototype/copyWithin/bit-precision.js     |  2 +-
 ...es-conversion-operations-consistent-nan.js |  6 +++---
 ...ray-conversion-operation-consistent-nan.js |  4 ++--
 .../TypedArray/prototype/set/bit-precision.js |  2 +-
 .../prototype/slice/bit-precision.js          |  2 +-
 .../conversion-operation-consistent-nan.js    |  4 ++--
 .../conversion-operation-consistent-nan.js    |  6 +++---
 .../conversion-operation-consistent-nan.js    |  6 +++---
 test/built-ins/isNaN/return-true-nan.js       |  2 +-
 test/harness/nans.js                          | 20 +++++++++----------
 13 files changed, 42 insertions(+), 42 deletions(-)

diff --git a/harness/nans.js b/harness/nans.js
index 3636a0b8c4..d4cc5720d2 100644
--- a/harness/nans.js
+++ b/harness/nans.js
@@ -9,13 +9,13 @@ description: |
 ---*/
 
 var NaNs = [
-  () => NaN,
-  () => Number.NaN,
-  () => NaN * 0,
-  () => 0/0,
-  () => Infinity/Infinity,
-  () => -(0/0),
-  () => Math.pow(-1, 0.5),
-  () => -Math.pow(-1, 0.5),
-  () => Number("Not-a-Number"),
+  NaN,
+  Number.NaN,
+  NaN * 0,
+  0/0,
+  Infinity/Infinity,
+  -(0/0),
+  Math.pow(-1, 0.5),
+  -Math.pow(-1, 0.5),
+  Number("Not-a-Number"),
 ];
diff --git a/test/built-ins/Object/internals/DefineOwnProperty/nan-equivalence-define-own-property-reassign.js b/test/built-ins/Object/internals/DefineOwnProperty/nan-equivalence-define-own-property-reassign.js
index fe1d3ba2a1..5050de0826 100644
--- a/test/built-ins/Object/internals/DefineOwnProperty/nan-equivalence-define-own-property-reassign.js
+++ b/test/built-ins/Object/internals/DefineOwnProperty/nan-equivalence-define-own-property-reassign.js
@@ -57,12 +57,12 @@ for (var idx = 0; idx < len; ++idx) {
   for (var jdx = 0; jdx < len; ++jdx) {
     var a = {};
 
-    a.prop = NaNs[idx]();
-    a.prop = NaNs[jdx]();
+    a.prop = NaNs[idx];
+    a.prop = NaNs[jdx];
 
     assert(
       a.prop !== a.prop,
-      `Object property value reassigned to NaN produced by (${NaNs[idx].toString()}) results in a valid NaN`
+      `Object property value reassigned to NaN produced by (index=${idx}) results in a valid NaN`
     );
   }
 }
diff --git a/test/built-ins/Object/internals/DefineOwnProperty/nan-equivalence-define-own-property-reconfigure.js b/test/built-ins/Object/internals/DefineOwnProperty/nan-equivalence-define-own-property-reconfigure.js
index 7eb257bc16..d269d32176 100644
--- a/test/built-ins/Object/internals/DefineOwnProperty/nan-equivalence-define-own-property-reconfigure.js
+++ b/test/built-ins/Object/internals/DefineOwnProperty/nan-equivalence-define-own-property-reconfigure.js
@@ -59,17 +59,17 @@ for (var idx = 0; idx < len; ++idx) {
     var b = {};
 
     Object.defineProperty(a, "prop", {
-      value: NaNs[idx](),
+      value: NaNs[idx],
       configurable: true,
     });
 
     Object.defineProperty(a, "prop", {
-      value: NaNs[jdx](),
+      value: NaNs[jdx],
     });
 
     assert(
       a.prop !== a.prop,
-      `Object property value reconfigured to NaN produced by (${NaNs[idx].toString()}) results in a valid NaN`
+      `Object property value reconfigured to NaN produced by (index=${idx}) results in a valid NaN`
     );
   }
 }
diff --git a/test/built-ins/TypedArray/prototype/copyWithin/bit-precision.js b/test/built-ins/TypedArray/prototype/copyWithin/bit-precision.js
index 1aa660622b..399cda2dcd 100644
--- a/test/built-ins/TypedArray/prototype/copyWithin/bit-precision.js
+++ b/test/built-ins/TypedArray/prototype/copyWithin/bit-precision.js
@@ -20,7 +20,7 @@ function body(FloatArray) {
   var subject = new FloatArray(NaNs.length * 2);
 
   NaNs.forEach(function(v, i) {
-    subject[i] = v();
+    subject[i] = v;
   });
 
   var originalBytes, copiedBytes;
diff --git a/test/built-ins/TypedArray/prototype/fill/fill-values-conversion-operations-consistent-nan.js b/test/built-ins/TypedArray/prototype/fill/fill-values-conversion-operations-consistent-nan.js
index 34e1f507bc..2194ba61af 100644
--- a/test/built-ins/TypedArray/prototype/fill/fill-values-conversion-operations-consistent-nan.js
+++ b/test/built-ins/TypedArray/prototype/fill/fill-values-conversion-operations-consistent-nan.js
@@ -78,7 +78,7 @@ testWithTypedArrayConstructors(function(FA) {
   var controls, idx, aNaN;
 
   for (idx = 0; idx < NaNs.length; ++idx) {
-    aNaN = NaNs[idx]();
+    aNaN = NaNs[idx];
     controls = new Float32Array([aNaN, aNaN, aNaN]);
 
     samples.fill(aNaN);
@@ -89,12 +89,12 @@ testWithTypedArrayConstructors(function(FA) {
 
       assert(
         samples[i] !== samples[i],
-        `samples (${NaNs[idx].toString()}) produces a valid NaN (${precision} precision)`
+        `samples (index=${idx}) produces a valid NaN (${precision} precision)`
       );
 
       assert(
         controls[i] !== controls[i],
-        `controls (${NaNs[idx].toString()}) produces a valid NaN (${precision} precision)`
+        `controls (index=${idx}) produces a valid NaN (${precision} precision)`
       );
     }
   }
diff --git a/test/built-ins/TypedArray/prototype/map/return-new-typedarray-conversion-operation-consistent-nan.js b/test/built-ins/TypedArray/prototype/map/return-new-typedarray-conversion-operation-consistent-nan.js
index e8b94a22a5..dba6bc011b 100644
--- a/test/built-ins/TypedArray/prototype/map/return-new-typedarray-conversion-operation-consistent-nan.js
+++ b/test/built-ins/TypedArray/prototype/map/return-new-typedarray-conversion-operation-consistent-nan.js
@@ -45,12 +45,12 @@ features: [TypedArray]
 ---*/
 
 function body(FloatArray) {
-  var sample = new FloatArray(NaNs.map(n => n()));
+  var sample = new FloatArray(NaNs);
   var sampleBytes, resultBytes;
   var i = 0;
 
   var result = sample.map(function() {
-    return NaNs[i++]();
+    return NaNs[i++];
   });
 
   sampleBytes = new Uint8Array(sample.buffer);
diff --git a/test/built-ins/TypedArray/prototype/set/bit-precision.js b/test/built-ins/TypedArray/prototype/set/bit-precision.js
index 569d9cdd79..e0a9b814d4 100644
--- a/test/built-ins/TypedArray/prototype/set/bit-precision.js
+++ b/test/built-ins/TypedArray/prototype/set/bit-precision.js
@@ -20,7 +20,7 @@ features: [TypedArray]
 ---*/
 
 function body(FA) {
-  var source = new FA(NaNs.map(n => n()));
+  var source = new FA(NaNs);
   var target = new FA(NaNs.length);
   var sourceBytes, targetBytes;
 
diff --git a/test/built-ins/TypedArray/prototype/slice/bit-precision.js b/test/built-ins/TypedArray/prototype/slice/bit-precision.js
index 4698d460c6..fb3074b0bf 100644
--- a/test/built-ins/TypedArray/prototype/slice/bit-precision.js
+++ b/test/built-ins/TypedArray/prototype/slice/bit-precision.js
@@ -25,7 +25,7 @@ features: [TypedArray]
 ---*/
 
 function body(FloatArray) {
-  var subject = new FloatArray(NaNs.map(n => n()));
+  var subject = new FloatArray(NaNs);
   var sliced, subjectBytes, slicedBytes;
 
   sliced = subject.slice();
diff --git a/test/built-ins/TypedArrayConstructors/ctors/object-arg/conversion-operation-consistent-nan.js b/test/built-ins/TypedArrayConstructors/ctors/object-arg/conversion-operation-consistent-nan.js
index bb652e602e..d4a6235da9 100644
--- a/test/built-ins/TypedArrayConstructors/ctors/object-arg/conversion-operation-consistent-nan.js
+++ b/test/built-ins/TypedArrayConstructors/ctors/object-arg/conversion-operation-consistent-nan.js
@@ -50,8 +50,8 @@ features: [TypedArray]
 ---*/
 
 function body(FloatArray) {
-  var first = new FloatArray(NaNs.map(n => n()));
-  var second = new FloatArray(NaNs.map(n => n()));
+  var first = new FloatArray(NaNs);
+  var second = new FloatArray(NaNs);
   var firstBytes = new Uint8Array(first.buffer);
   var secondBytes = new Uint8Array(second.buffer);
 
diff --git a/test/built-ins/TypedArrayConstructors/internals/DefineOwnProperty/conversion-operation-consistent-nan.js b/test/built-ins/TypedArrayConstructors/internals/DefineOwnProperty/conversion-operation-consistent-nan.js
index 434b557e67..b861866230 100644
--- a/test/built-ins/TypedArrayConstructors/internals/DefineOwnProperty/conversion-operation-consistent-nan.js
+++ b/test/built-ins/TypedArrayConstructors/internals/DefineOwnProperty/conversion-operation-consistent-nan.js
@@ -74,7 +74,7 @@ testWithTypedArrayConstructors(function(FA) {
   var controls, idx, aNaN;
 
   for (idx = 0; idx < NaNs.length; ++idx) {
-    aNaN = NaNs[idx]();
+    aNaN = NaNs[idx];
     controls = new FA([aNaN, aNaN, aNaN]);
 
     Object.defineProperty(samples, "0", { value: aNaN });
@@ -85,12 +85,12 @@ testWithTypedArrayConstructors(function(FA) {
 
       assert(
         samples[i] !== samples[i],
-        `samples (${NaNs[idx].toString()}) produces a valid NaN (${precision} precision)`
+        `samples (index=${idx}) produces a valid NaN (${precision} precision)`
       );
 
       assert(
         controls[i] !== controls[i],
-        `controls (${NaNs[idx].toString()}) produces a valid NaN (${precision} precision)`
+        `controls (index=${idx}) produces a valid NaN (${precision} precision)`
       );
     }
   }
diff --git a/test/built-ins/TypedArrayConstructors/internals/Set/conversion-operation-consistent-nan.js b/test/built-ins/TypedArrayConstructors/internals/Set/conversion-operation-consistent-nan.js
index 6d9b1677a5..7c65d9b0e0 100644
--- a/test/built-ins/TypedArrayConstructors/internals/Set/conversion-operation-consistent-nan.js
+++ b/test/built-ins/TypedArrayConstructors/internals/Set/conversion-operation-consistent-nan.js
@@ -72,7 +72,7 @@ testWithTypedArrayConstructors(function(FA) {
   var controls, idx, aNaN;
 
   for (idx = 0; idx < NaNs.length; ++idx) {
-    aNaN = NaNs[idx]();
+    aNaN = NaNs[idx];
     controls = new FA([aNaN, aNaN, aNaN]);
 
     samples[0] = aNaN;
@@ -83,12 +83,12 @@ testWithTypedArrayConstructors(function(FA) {
 
       assert(
         samples[i] !== samples[i],
-        `samples (${NaNs[idx].toString()}) produces a valid NaN (${precision} precision)`
+        `samples (index=${idx}) produces a valid NaN (${precision} precision)`
       );
 
       assert(
         controls[i] !== controls[i],
-        `controls (${NaNs[idx].toString()}) produces a valid NaN (${precision} precision)`
+        `controls (index=${idx}) produces a valid NaN (${precision} precision)`
       );
     }
   }
diff --git a/test/built-ins/isNaN/return-true-nan.js b/test/built-ins/isNaN/return-true-nan.js
index d77e4cb584..32cf3835a2 100644
--- a/test/built-ins/isNaN/return-true-nan.js
+++ b/test/built-ins/isNaN/return-true-nan.js
@@ -15,5 +15,5 @@ includes: [nans.js]
 ---*/
 
 NaNs.forEach(function(v, i) {
-  assert.sameValue(isNaN(v()), true, "value on position: " + i);
+  assert.sameValue(isNaN(v), true, "value on position: " + i);
 });
diff --git a/test/harness/nans.js b/test/harness/nans.js
index bd0d7b9bd7..833a7f967b 100644
--- a/test/harness/nans.js
+++ b/test/harness/nans.js
@@ -5,20 +5,20 @@ description: >
   Including nans.js will expose:
 
   var NaNs = [
-    () => NaN,
-    () => Number.NaN,
-    () => NaN * 0,
-    () => 0/0,
-    () => Infinity/Infinity,
-    () => -(0/0),
-    () => Math.pow(-1, 0.5),
-    () => -Math.pow(-1, 0.5),
-    () => Number("Not-a-Number"),
+    NaN,
+    Number.NaN,
+    NaN * 0,
+    0/0,
+    Infinity/Infinity,
+    -(0/0),
+    Math.pow(-1, 0.5),
+    -Math.pow(-1, 0.5),
+    Number("Not-a-Number"),
   ];
 
 includes: [nans.js]
 ---*/
 
 for (var i = 0; i < NaNs.length; i++) {
-  assert.sameValue(Number.isNaN(NaNs[i]()), true, NaNs[i].toString());
+  assert.sameValue(Number.isNaN(NaNs[i]), true, "index: " + i);
 }
-- 
GitLab