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