blob: d269d32176184e64bce3c64ca988626bdb99d655 [file] [log] [blame]
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-ordinary-object-internal-methods-and-internal-slots-defineownproperty-p-desc
description: >
Replaces value field even if they pass in the SameValue algorithm, including
distinct NaN values
info: |
This test does not compare the actual byte values, instead it simply checks that
the value is some valid NaN encoding.
---
Previously, this method compared the "value" field using the SameValue
algorithm (thereby ignoring distinct NaN values)
---
[[DefineOwnProperty]] (P, Desc)
Return ? OrdinaryDefineOwnProperty(O, P, Desc).
#sec-ordinarydefineownproperty
OrdinaryDefineOwnProperty ( O, P, Desc )
1. Let current be ? O.[[GetOwnProperty]](P).
2. Let extensible be O.[[Extensible]].
3. Return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc,
current).
#sec-validateandapplypropertydescriptor
ValidateAndApplyPropertyDescriptor ( O, P, extensible, Desc, current )
...
7. Else if IsDataDescriptor(current) and IsDataDescriptor(Desc) are both true,
then
a. If current.[[Configurable]] is false and current.[[Writable]] is false,
then
...
...
9. If O is not undefined, then
a. For each field of Desc that is present, set the corresponding attribute
of the property named P of object O to the value of the field.
10. Return true.
#sec-isnan-number
NOTE: A reliable way for ECMAScript code to test if a value X is a NaN is
an expression of the form X !== X. The result will be true if and only
if X is a NaN.
includes: [nans.js]
---*/
var len = NaNs.length;
for (var idx = 0; idx < len; ++idx) {
for (var jdx = 0; jdx < len; ++jdx) {
var a = {};
var b = {};
Object.defineProperty(a, "prop", {
value: NaNs[idx],
configurable: true,
});
Object.defineProperty(a, "prop", {
value: NaNs[jdx],
});
assert(
a.prop !== a.prop,
`Object property value reconfigured to NaN produced by (index=${idx}) results in a valid NaN`
);
}
}