WIP: Align detached buffer semantics with web reality

To support https://github.com/tc39/ecma262/pull/2164
This commit is contained in:
Rick Waldron 2020-09-28 11:12:45 -04:00
parent 52cb1d0c98
commit 36c2cd165f
39 changed files with 378 additions and 412 deletions

View File

@ -4,11 +4,9 @@
esid: sec-get-arraybuffer.prototype.bytelength esid: sec-get-arraybuffer.prototype.bytelength
description: Returns 0 if the buffer is detached description: Returns 0 if the buffer is detached
info: | info: |
24.1.4.1 get ArrayBuffer.prototype.byteLength get ArrayBuffer.prototype.byteLength
1. Let O be the this value.
... ...
4. If IsDetachedBuffer(O) is true, throw a TypeError exception. If IsDetachedBuffer(buffer) is true, return 0.
... ...
includes: [detachArrayBuffer.js] includes: [detachArrayBuffer.js]
---*/ ---*/
@ -17,6 +15,4 @@ var ab = new ArrayBuffer(1);
$DETACHBUFFER(ab); $DETACHBUFFER(ab);
assert.throws(TypeError, function() { assert.sameValue(ab.byteLength, 0, 'The value of ab.byteLength is 0');
ab.byteLength;
});

View File

@ -7,11 +7,18 @@ description: Throws a TypeError exception when `this` is a SharedArrayBuffer
features: [SharedArrayBuffer] features: [SharedArrayBuffer]
---*/ ---*/
var getter = Object.getOwnPropertyDescriptor( var byteLength = Object.getOwnPropertyDescriptor(
ArrayBuffer.prototype, "byteLength" ArrayBuffer.prototype, "byteLength"
).get; );
var getter = byteLength.get;
var sab = new SharedArrayBuffer(4);
assert.throws(TypeError, function() { assert.throws(TypeError, function() {
var sab = new SharedArrayBuffer(4);
getter.call(sab); getter.call(sab);
}, "`this` cannot be a SharedArrayBuffer"); }, "`this` cannot be a SharedArrayBuffer");
assert.throws(TypeError, function() {
Object.defineProperties(sab, { byteLength });
sab.byteLength;
}, "`this` cannot be a SharedArrayBuffer");

View File

@ -5,19 +5,19 @@
esid: sec-get-dataview.prototype.bytelength esid: sec-get-dataview.prototype.bytelength
description: Throws a TypeError if the instance has a detached buffer description: Throws a TypeError if the instance has a detached buffer
info: | info: |
24.2.4.2 get DataView.prototype.byteLength get DataView.prototype.byteLength
... ...
5. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot.
6. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. If IsDetachedBuffer(buffer) is true, throw a TypeError exception.
... ...
includes: [detachArrayBuffer.js] includes: [detachArrayBuffer.js]
---*/ ---*/
var buffer = new ArrayBuffer(1); let buffer = new ArrayBuffer(1);
var sample = new DataView(buffer, 0); let dv = new DataView(buffer, 0);
$DETACHBUFFER(buffer); $DETACHBUFFER(buffer);
assert.throws(TypeError, function() { assert.throws(TypeError, () => {
sample.byteLength; dv.byteLength;
}); });

View File

@ -0,0 +1,23 @@
// Copyright (C) 2020 Rick Waldron. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-dataview.prototype.bytelength
description: Throws a TypeError if the instance has a detached buffer
info: |
get DataView.prototype.byteLength
...
Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot.
If IsDetachedBuffer(buffer) is true, throw a TypeError exception.
...
includes: [detachArrayBuffer.js]
---*/
let buffer = new ArrayBuffer(1);
let dv = new DataView(buffer, 0);
$DETACHBUFFER(dv.buffer);
assert.throws(TypeError, () => {
dv.byteLength;
});

View File

@ -3,36 +3,36 @@
/*--- /*---
esid: sec-%typedarray%.prototype.slice esid: sec-%typedarray%.prototype.slice
description: > description: >
Throws a TypeError buffer is detached on Get custom constructor. Using other Throws a TypeError if _O_.[[ViewedArrayBuffer]] is detached.
targetType
info: | info: |
22.2.3.24 %TypedArray%.prototype.slice ( start, end ) 22.2.3.24 %TypedArray%.prototype.slice ( start, end )
... ...
9. Let A be ? TypedArraySpeciesCreate(O, « count »). Let A be ? TypedArraySpeciesCreate(O, « count »).
... If count > 0, then
14. If SameValue(srcType, targetType) is false, then If IsDetachedBuffer(O.[[ViewedArrayBuffer]]) is true, throw a TypeError exception.
a. Let n be 0.
b. Repeat, while k < final
...
ii. Let kValue be ? Get(O, Pk).
...
... ...
includes: [testBigIntTypedArray.js, detachArrayBuffer.js] includes: [testBigIntTypedArray.js, detachArrayBuffer.js]
features: [BigInt, Symbol.species, TypedArray] features: [BigInt, Symbol.species, TypedArray]
---*/ ---*/
testWithBigIntTypedArrayConstructors(function(TA) { testWithBigIntTypedArrayConstructors(function(TA) {
let counter = 0;
var sample = new TA(1); var sample = new TA(1);
sample.constructor = {}; sample.constructor = {};
sample.constructor[Symbol.species] = function(count) { sample.constructor[Symbol.species] = function(count) {
var other = TA === BigInt64Array ? BigUint64Array : BigInt64Array; var other = TA === BigInt64Array ? BigUint64Array : BigInt64Array;
counter++;
assert.sameValue(count, 1, 'The value of `count` is 1');
$DETACHBUFFER(sample.buffer); $DETACHBUFFER(sample.buffer);
return new other(count); return new other(count);
}; };
assert.throws(TypeError, function() { assert.throws(TypeError, function() {
counter++;
sample.slice(); sample.slice();
}, "step 14.b.ii - ? Get(O, Pk), O has a detached buffer"); }, '`sample.slice()` throws TypeError');
assert.sameValue(counter, 2, 'The value of `counter` is 2');
}); });

View File

@ -3,7 +3,7 @@
/*--- /*---
esid: sec-integer-indexed-exotic-objects-defineownproperty-p-desc esid: sec-integer-indexed-exotic-objects-defineownproperty-p-desc
description: > description: >
Throws a TypeError if object has valid numeric index and a detached buffer Returns false if this has valid numeric index and a detached buffer
(honoring the Realm of the current execution context) (honoring the Realm of the current execution context)
info: | info: |
9.4.5.3 [[DefineOwnProperty]] ( P, Desc) 9.4.5.3 [[DefineOwnProperty]] ( P, Desc)
@ -20,17 +20,17 @@ info: |
9.4.5.9 IntegerIndexedElementSet ( O, index, value ) 9.4.5.9 IntegerIndexedElementSet ( O, index, value )
... ...
4. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot. Let buffer be O.[[ViewedArrayBuffer]].
5. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. If IsDetachedBuffer(buffer) is true, return false.
... ...
includes: [testBigIntTypedArray.js, detachArrayBuffer.js] includes: [testBigIntTypedArray.js, detachArrayBuffer.js]
features: [BigInt, cross-realm, Reflect, TypedArray] features: [BigInt, cross-realm, Reflect, TypedArray]
---*/ ---*/
var other = $262.createRealm().global; var other = $262.createRealm().global;
var desc = { var desc = {
value: 0n, value: 0n,
configurable: false, configurable: true,
enumerable: true, enumerable: true,
writable: true writable: true
}; };
@ -38,10 +38,11 @@ var desc = {
testWithBigIntTypedArrayConstructors(function(TA) { testWithBigIntTypedArrayConstructors(function(TA) {
var OtherTA = other[TA.name]; var OtherTA = other[TA.name];
var sample = new OtherTA(1); var sample = new OtherTA(1);
$DETACHBUFFER(sample.buffer); $DETACHBUFFER(sample.buffer);
assert.throws(TypeError, function() { assert.sameValue(
Reflect.defineProperty(sample, '0', desc); Reflect.defineProperty(sample, '0', desc),
}); false,
'Reflect.defineProperty( sample, "0", {value: 0n, configurable: true, enumerable: true, writable: true} ) must return false'
);
}); });

View File

@ -3,7 +3,7 @@
/*--- /*---
esid: sec-integer-indexed-exotic-objects-defineownproperty-p-desc esid: sec-integer-indexed-exotic-objects-defineownproperty-p-desc
description: > description: >
Throws a TypeError if object has valid numeric index and a detached buffer Returns false if this has valid numeric index and a detached buffer
info: | info: |
9.4.5.3 [[DefineOwnProperty]] ( P, Desc) 9.4.5.3 [[DefineOwnProperty]] ( P, Desc)
... ...
@ -19,13 +19,12 @@ info: |
9.4.5.9 IntegerIndexedElementSet ( O, index, value ) 9.4.5.9 IntegerIndexedElementSet ( O, index, value )
... ...
4. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot. Let buffer be O.[[ViewedArrayBuffer]].
5. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. If IsDetachedBuffer(buffer) is true, return false.
... ...
includes: [testBigIntTypedArray.js, detachArrayBuffer.js] includes: [testBigIntTypedArray.js, detachArrayBuffer.js]
features: [BigInt, Reflect, TypedArray] features: [BigInt, Reflect, TypedArray]
---*/ ---*/
var desc = { var desc = {
value: 0n, value: 0n,
configurable: false, configurable: false,
@ -43,92 +42,70 @@ testWithBigIntTypedArrayConstructors(function(TA) {
var sample = new TA(42); var sample = new TA(42);
$DETACHBUFFER(sample.buffer); $DETACHBUFFER(sample.buffer);
assert.throws(TypeError, function() {
Reflect.defineProperty(sample, "0", desc);
}, "Throws TypeError on valid numeric index if instance has a detached buffer");
assert.sameValue( assert.sameValue(
Reflect.defineProperty(sample, "-1", desc), Reflect.defineProperty(sample, '0', desc),
false, false,
"Return false before Detached Buffer check when value is a negative number" 'Reflect.defineProperty(sample, "0", {value: 0n, configurable: false, enumerable: true, writable: true}) must return false'
); );
assert.sameValue( assert.sameValue(
Reflect.defineProperty(sample, "1.1", desc), Reflect.defineProperty(sample, '-1', desc),
false, false,
"Return false before Detached Buffer check when value is not an integer" 'Reflect.defineProperty(sample, "-1", {value: 0n, configurable: false, enumerable: true, writable: true}) must return false'
); );
assert.sameValue( assert.sameValue(
Reflect.defineProperty(sample, "-0", desc), Reflect.defineProperty(sample, '1.1', desc),
false, false,
"Return false before Detached Buffer check when value is -0" 'Reflect.defineProperty(sample, "1.1", {value: 0n, configurable: false, enumerable: true, writable: true}) must return false'
); );
assert.sameValue( assert.sameValue(
Reflect.defineProperty(sample, "2", { Reflect.defineProperty(sample, '-0', desc),
false,
'Reflect.defineProperty(sample, "-0", {value: 0n, configurable: false, enumerable: true, writable: true}) must return false'
);
assert.sameValue(Reflect.defineProperty(sample, '2', {
configurable: true, configurable: true,
enumerable: true, enumerable: true,
writable: true, writable: true,
value: obj value: obj
}), }), false, 'Reflect.defineProperty(sample, "2", {configurable: true, enumerable: true, writable: true, value: obj}) must return false');
false,
"Return false before Detached Buffer check when desc configurable is true"
);
assert.sameValue( assert.sameValue(Reflect.defineProperty(sample, '3', {
Reflect.defineProperty(sample, "3", {
configurable: false, configurable: false,
enumerable: false, enumerable: false,
writable: true, writable: true,
value: obj value: obj
}), }), false, 'Reflect.defineProperty(sample, "3", {configurable: false, enumerable: false, writable: true, value: obj}) must return false');
false,
"Return false before Detached Buffer check when desc enumerable is false"
);
assert.sameValue( assert.sameValue(Reflect.defineProperty(sample, '4', {
Reflect.defineProperty(sample, "4", {
writable: false, writable: false,
configurable: false, configurable: false,
enumerable: true, enumerable: true,
value: obj value: obj
}), }), false, 'Reflect.defineProperty(sample, "4", {writable: false, configurable: false, enumerable: true, value: obj}) must return false');
assert.sameValue(
Reflect.defineProperty(sample, '42', desc),
false, false,
"Return false before Detached Buffer check when desc writable is false" 'Reflect.defineProperty(sample, "42", {value: 0n, configurable: false, enumerable: true, writable: true}) must return false'
); );
assert.sameValue( assert.sameValue(
Reflect.defineProperty(sample, "42", desc), Reflect.defineProperty(sample, '43', desc),
false, false,
"Return false before Detached Buffer check when key == [[ArrayLength]]" 'Reflect.defineProperty(sample, "43", {value: 0n, configurable: false, enumerable: true, writable: true}) must return false'
); );
assert.sameValue( assert.sameValue(Reflect.defineProperty(sample, '5', {
Reflect.defineProperty(sample, "43", desc),
false,
"Return false before Detached Buffer check when key > [[ArrayLength]]"
);
assert.sameValue(
Reflect.defineProperty(sample, "5", {
get: function() {} get: function() {}
}), }), false, 'Reflect.defineProperty(sample, "5", {get: function() {}}) must return false');
false,
"Return false before Detached Buffer check with accessor descriptor"
);
assert.sameValue( assert.sameValue(Reflect.defineProperty(sample, '6', {
Reflect.defineProperty(sample, "6", {
configurable: false, configurable: false,
enumerable: true, enumerable: true,
writable: true writable: true
}), }), false, 'Reflect.defineProperty(sample, "6", {configurable: false, enumerable: true, writable: true}) must return false');
true,
"Return true before Detached Buffer check when desc value is not present"
);
assert.throws(Test262Error, function() {
Reflect.defineProperty(sample, "7", {value: obj});
}, "Return Abrupt before Detached Buffer check from ToNumber(desc.value)");
}); });

View File

@ -11,32 +11,26 @@ info: |
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
... ...
x. If Desc has a [[Writable]] field and if Desc.[[Writable]] is false, v. If Desc has a [[Writable]] field and if Desc.[[Writable]] is false,
return false. return false.
... ...
includes: [testBigIntTypedArray.js, propertyHelper.js] includes: [testBigIntTypedArray.js, propertyHelper.js]
features: [BigInt, Reflect, TypedArray] features: [BigInt, Reflect, TypedArray]
---*/ ---*/
testWithBigIntTypedArrayConstructors(function(TA) { testWithBigIntTypedArrayConstructors(function(TA) {
var sample = new TA([42n, 42n]); var sample = new TA([42n, 42n]);
assert.sameValue( assert.sameValue(Reflect.defineProperty(sample, '0', {
Reflect.defineProperty(sample, "0", {
value: 8n, value: 8n,
configurable: false, configurable: true,
enumerable: true, enumerable: true,
writable: true writable: true
}), }), true, 'Reflect.defineProperty("new TA([42n, 42n])", "0", {value: 8n, configurable: true, enumerable: true, writable: true}) must return true');
true
);
assert.sameValue(sample[0], 8n, "property value was set"); assert.sameValue(sample[0], 8n, 'The value of sample[0] is 8n');
var desc = Object.getOwnPropertyDescriptor(sample, "0"); var desc = Object.getOwnPropertyDescriptor(sample, '0');
assert.sameValue(desc.value, 8n, 'The value of desc.value is 8n');
assert.sameValue(desc.value, 8n, "desc.value"); assert.sameValue(desc.writable, true, 'The value of desc.writable is true');
assert.sameValue(desc.writable, true, "property is writable"); verifyEnumerable(sample, '0');
verifyNotConfigurable(sample, '0');
verifyEnumerable(sample, "0");
verifyNotConfigurable(sample, "0");
}); });

View File

@ -1,12 +1,11 @@
// Copyright (C) 2017 Mozilla Corporation. All rights reserved. // Copyright (C) 2017 Mozilla Corporation. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file. // This code is governed by the BSD license found in the LICENSE file.
/*--- /*---
esid: sec-integer-indexed-exotic-objects-defineownproperty-p-desc esid: sec-integer-indexed-exotic-objects-defineownproperty-p-desc
description: > description: >
Defining a typed array element to a value that, when converted to the typed Defining a typed array element to a value that, when converted to the typed
array element type, detaches the typed array's underlying buffer, should array element type, detaches the typed array's underlying buffer, should return
throw a TypeError and not modify the typed array. false and not modify the typed array.
info: | info: |
9.4.5.3 [[DefineOwnProperty]] ( P, Desc ) 9.4.5.3 [[DefineOwnProperty]] ( P, Desc )
@ -28,28 +27,23 @@ info: |
includes: [testBigIntTypedArray.js, detachArrayBuffer.js] includes: [testBigIntTypedArray.js, detachArrayBuffer.js]
features: [BigInt, Reflect, TypedArray] features: [BigInt, Reflect, TypedArray]
---*/ ---*/
testWithBigIntTypedArrayConstructors(function(TA) { testWithBigIntTypedArrayConstructors(function(TA) {
var ta = new TA([17n]); var ta = new TA([17n]);
var desc = var desc = {
{
value: { value: {
valueOf: function() { valueOf() {
$DETACHBUFFER(ta.buffer); $DETACHBUFFER(ta.buffer);
return 42n; return 42n;
} }
} }
}; };
assert.throws(TypeError, function() { assert.sameValue(
Reflect.defineProperty(ta, 0, desc); Reflect.defineProperty(ta, 0, desc),
}, false,
"detaching a ArrayBuffer during defining an element of a typed array " + 'Reflect.defineProperty(ta, 0, {value: {valueOf() {$DETACHBUFFER(ta.buffer); return 42n;}}}) must return false'
"viewing it should throw"); );
assert.throws(TypeError, function() { assert.sameValue(ta[0], undefined, 'The value of ta[0] is expected to equal `undefined`');
ta[0];
});
}); });

View File

@ -3,7 +3,7 @@
/*--- /*---
esid: sec-integer-indexed-exotic-objects-defineownproperty-p-desc esid: sec-integer-indexed-exotic-objects-defineownproperty-p-desc
description: > description: >
Throws a TypeError if object has valid numeric index and a detached buffer Returns false if this has valid numeric index and a detached buffer
(honoring the Realm of the current execution context) (honoring the Realm of the current execution context)
info: | info: |
9.4.5.3 [[DefineOwnProperty]] ( P, Desc) 9.4.5.3 [[DefineOwnProperty]] ( P, Desc)
@ -20,8 +20,8 @@ info: |
9.4.5.9 IntegerIndexedElementSet ( O, index, value ) 9.4.5.9 IntegerIndexedElementSet ( O, index, value )
... ...
4. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot. Let buffer be O.[[ViewedArrayBuffer]].
5. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. If IsDetachedBuffer(buffer) is true, return false.
... ...
includes: [testTypedArray.js, detachArrayBuffer.js] includes: [testTypedArray.js, detachArrayBuffer.js]
features: [cross-realm, Reflect, TypedArray] features: [cross-realm, Reflect, TypedArray]
@ -30,7 +30,7 @@ features: [cross-realm, Reflect, TypedArray]
var other = $262.createRealm().global; var other = $262.createRealm().global;
var desc = { var desc = {
value: 0, value: 0,
configurable: false, configurable: true,
enumerable: true, enumerable: true,
writable: true writable: true
}; };
@ -41,7 +41,9 @@ testWithTypedArrayConstructors(function(TA) {
$DETACHBUFFER(sample.buffer); $DETACHBUFFER(sample.buffer);
assert.throws(TypeError, function() { assert.sameValue(
Reflect.defineProperty(sample, '0', desc); Reflect.defineProperty(sample, '0', desc),
}); false,
'Reflect.defineProperty(sample, "0", {value: 0, configurable: true, enumerable: true, writable: true}) must return false'
);
}); });

View File

@ -3,7 +3,7 @@
/*--- /*---
esid: sec-integer-indexed-exotic-objects-defineownproperty-p-desc esid: sec-integer-indexed-exotic-objects-defineownproperty-p-desc
description: > description: >
Throws a TypeError if object has valid numeric index and a detached buffer Returns false if this has valid numeric index and a detached buffer
info: | info: |
9.4.5.3 [[DefineOwnProperty]] ( P, Desc) 9.4.5.3 [[DefineOwnProperty]] ( P, Desc)
... ...
@ -19,8 +19,8 @@ info: |
9.4.5.9 IntegerIndexedElementSet ( O, index, value ) 9.4.5.9 IntegerIndexedElementSet ( O, index, value )
... ...
4. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot. Let buffer be O.[[ViewedArrayBuffer]].
5. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. If IsDetachedBuffer(buffer) is true, return false.
... ...
includes: [testTypedArray.js, detachArrayBuffer.js] includes: [testTypedArray.js, detachArrayBuffer.js]
features: [Reflect, TypedArray] features: [Reflect, TypedArray]
@ -43,26 +43,28 @@ testWithTypedArrayConstructors(function(TA) {
var sample = new TA(42); var sample = new TA(42);
$DETACHBUFFER(sample.buffer); $DETACHBUFFER(sample.buffer);
assert.throws(TypeError, function() { assert.sameValue(
Reflect.defineProperty(sample, "0", desc); Reflect.defineProperty(sample, "0", desc),
}, "Throws TypeError on valid numeric index if instance has a detached buffer"); false,
'Reflect.defineProperty(sample, "0", {value: 0, configurable: false, enumerable: true, writable: true} ) must return false'
);
assert.sameValue( assert.sameValue(
Reflect.defineProperty(sample, "-1", desc), Reflect.defineProperty(sample, "-1", desc),
false, false,
"Return false before Detached Buffer check when value is a negative number" 'Reflect.defineProperty(sample, "-1", {value: 0, configurable: false, enumerable: true, writable: true} ) must return false'
); );
assert.sameValue( assert.sameValue(
Reflect.defineProperty(sample, "1.1", desc), Reflect.defineProperty(sample, "1.1", desc),
false, false,
"Return false before Detached Buffer check when value is not an integer" 'Reflect.defineProperty(sample, "1.1", {value: 0, configurable: false, enumerable: true, writable: true} ) must return false'
); );
assert.sameValue( assert.sameValue(
Reflect.defineProperty(sample, "-0", desc), Reflect.defineProperty(sample, "-0", desc),
false, false,
"Return false before Detached Buffer check when value is -0" 'Reflect.defineProperty(sample, "-0", {value: 0, configurable: false, enumerable: true, writable: true} ) must return false'
); );
assert.sameValue( assert.sameValue(
@ -73,7 +75,7 @@ testWithTypedArrayConstructors(function(TA) {
value: obj value: obj
}), }),
false, false,
"Return false before Detached Buffer check when desc configurable is true" 'Reflect.defineProperty(sample, "2", {configurable: true, enumerable: true, writable: true, value: obj}) must return false'
); );
assert.sameValue( assert.sameValue(
@ -84,7 +86,7 @@ testWithTypedArrayConstructors(function(TA) {
value: obj value: obj
}), }),
false, false,
"Return false before Detached Buffer check when desc enumerable is false" 'Reflect.defineProperty(sample, "3", {configurable: false, enumerable: false, writable: true, value: obj}) must return false'
); );
assert.sameValue( assert.sameValue(
@ -95,19 +97,19 @@ testWithTypedArrayConstructors(function(TA) {
value: obj value: obj
}), }),
false, false,
"Return false before Detached Buffer check when desc writable is false" 'Reflect.defineProperty("new TA(42)", "4", {writable: false, configurable: false, enumerable: true, value: obj}) must return false'
); );
assert.sameValue( assert.sameValue(
Reflect.defineProperty(sample, "42", desc), Reflect.defineProperty(sample, "42", desc),
false, false,
"Return false before Detached Buffer check when key == [[ArrayLength]]" 'Reflect.defineProperty(sample, "42", {value: 0, configurable: false, enumerable: true, writable: true} ) must return false'
); );
assert.sameValue( assert.sameValue(
Reflect.defineProperty(sample, "43", desc), Reflect.defineProperty(sample, "43", desc),
false, false,
"Return false before Detached Buffer check when key > [[ArrayLength]]" 'Reflect.defineProperty(sample, "43", {value: 0, configurable: false, enumerable: true, writable: true} ) must return false'
); );
assert.sameValue( assert.sameValue(
@ -115,7 +117,7 @@ testWithTypedArrayConstructors(function(TA) {
get: function() {} get: function() {}
}), }),
false, false,
"Return false before Detached Buffer check with accessor descriptor" 'Reflect.defineProperty(sample, "5", {get: function() {}}) must return false'
); );
assert.sameValue( assert.sameValue(
@ -124,11 +126,7 @@ testWithTypedArrayConstructors(function(TA) {
enumerable: true, enumerable: true,
writable: true writable: true
}), }),
true, false,
"Return true before Detached Buffer check when desc value is not present" 'Reflect.defineProperty(sample, "6", {configurable: false, enumerable: true, writable: true}) must return false'
); );
assert.throws(Test262Error, function() {
Reflect.defineProperty(sample, "7", {value: obj});
}, "Return Abrupt before Detached Buffer check from ToNumber(desc.value)");
}); });

View File

@ -6,7 +6,7 @@ esid: sec-integer-indexed-exotic-objects-defineownproperty-p-desc
description: > description: >
Defining a typed array element to a value that, when converted to the typed Defining a typed array element to a value that, when converted to the typed
array element type, detaches the typed array's underlying buffer, should array element type, detaches the typed array's underlying buffer, should
throw a TypeError and not modify the typed array. return false and not modify the typed array.
info: | info: |
9.4.5.3 [[DefineOwnProperty]] ( P, Desc ) 9.4.5.3 [[DefineOwnProperty]] ( P, Desc )
@ -35,21 +35,18 @@ testWithTypedArrayConstructors(function(TA) {
var desc = var desc =
{ {
value: { value: {
valueOf: function() { valueOf() {
$DETACHBUFFER(ta.buffer); $DETACHBUFFER(ta.buffer);
return 42; return 42;
} }
} }
}; };
assert.throws(TypeError, function() { assert.sameValue(
Reflect.defineProperty(ta, 0, desc); Reflect.defineProperty(ta, 0, desc),
}, false,
"detaching a ArrayBuffer during defining an element of a typed array " + 'Reflect.defineProperty(ta, 0, {value: {valueOf() {$DETACHBUFFER(ta.buffer); return 42;}}} ) must return false'
"viewing it should throw"); );
assert.sameValue(ta[0], undefined, 'The value of ta[0] is expected to equal `undefined`');
assert.throws(TypeError, function() {
ta[0];
});
}); });

View File

@ -3,8 +3,7 @@
/*--- /*---
esid: sec-integer-indexed-exotic-objects-getownproperty-p esid: sec-integer-indexed-exotic-objects-getownproperty-p
description: > description: >
Throws a TypeError if this has a detached buffer (honoring the Realm of the Returned undefined if this has a detached buffer (honoring the Realm of the current execution context)
current execution context)
info: | info: |
9.4.5.1 [[GetOwnProperty]] ( P ) 9.4.5.1 [[GetOwnProperty]] ( P )
@ -12,14 +11,15 @@ info: |
3. If Type(P) is String, then 3. If Type(P) is String, then
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
i. Let value be ? IntegerIndexedElementGet(O, numericIndex). i. Let value be ! IntegerIndexedElementGet(O, numericIndex).
ii. If value is undefined, return undefined.
... ...
9.4.5.8 IntegerIndexedElementGet ( O, index ) IntegerIndexedElementGet ( O, index )
... ...
3. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot.
4. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. If IsDetachedBuffer(buffer) is true, return undefined.
... ...
includes: [testBigIntTypedArray.js, detachArrayBuffer.js] includes: [testBigIntTypedArray.js, detachArrayBuffer.js]
features: [BigInt, cross-realm, TypedArray] features: [BigInt, cross-realm, TypedArray]
@ -33,7 +33,9 @@ testWithBigIntTypedArrayConstructors(function(TA) {
$DETACHBUFFER(sample.buffer); $DETACHBUFFER(sample.buffer);
assert.throws(TypeError, function() { assert.sameValue(
Object.getOwnPropertyDescriptor(sample, 0); Object.getOwnPropertyDescriptor(sample, 0),
}); undefined,
'Object.getOwnPropertyDescriptor("new OtherTA(1)", 0) must return undefined'
);
}); });

View File

@ -2,7 +2,7 @@
// This code is governed by the BSD license found in the LICENSE file. // This code is governed by the BSD license found in the LICENSE file.
/*--- /*---
esid: sec-integer-indexed-exotic-objects-getownproperty-p esid: sec-integer-indexed-exotic-objects-getownproperty-p
description: Throws a TypeError if this has a detached buffer description: Returns undefined if this has a detached buffer
info: | info: |
9.4.5.1 [[GetOwnProperty]] ( P ) 9.4.5.1 [[GetOwnProperty]] ( P )
@ -10,14 +10,15 @@ info: |
3. If Type(P) is String, then 3. If Type(P) is String, then
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
i. Let value be ? IntegerIndexedElementGet(O, numericIndex). i. Let value be ! IntegerIndexedElementGet(O, numericIndex).
ii. If value is undefined, return undefined.
... ...
9.4.5.8 IntegerIndexedElementGet ( O, index ) IntegerIndexedElementGet ( O, index )
... ...
3. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot.
4. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. If IsDetachedBuffer(buffer) is true, return undefined.
... ...
includes: [testBigIntTypedArray.js, detachArrayBuffer.js] includes: [testBigIntTypedArray.js, detachArrayBuffer.js]
features: [BigInt, TypedArray] features: [BigInt, TypedArray]
@ -27,7 +28,9 @@ testWithBigIntTypedArrayConstructors(function(TA) {
var sample = new TA(1); var sample = new TA(1);
$DETACHBUFFER(sample.buffer); $DETACHBUFFER(sample.buffer);
assert.throws(TypeError, function() { assert.sameValue(
Object.getOwnPropertyDescriptor(sample, 0); Object.getOwnPropertyDescriptor(sample, 0),
}); undefined,
'Object.getOwnPropertyDescriptor(sample, 0) must return undefined'
);
}); });

View File

@ -10,13 +10,13 @@ info: |
3. If Type(P) is String, then 3. If Type(P) is String, then
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
i. Let value be ? IntegerIndexedElementGet(O, numericIndex). i. Let value be ! IntegerIndexedElementGet(O, numericIndex).
... ...
9.4.5.8 IntegerIndexedElementGet ( O, index ) IntegerIndexedElementGet ( O, index )
... ...
3. Let buffer be O.[[ViewedArrayBuffer]]. Let buffer be O.[[ViewedArrayBuffer]].
4. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. If IsDetachedBuffer(buffer) is true, return undefined.
... ...
13.7.5.15 EnumerateObjectProperties (O) 13.7.5.15 EnumerateObjectProperties (O)
@ -34,9 +34,9 @@ testWithBigIntTypedArrayConstructors(function(TA) {
var sample = new TA(42); var sample = new TA(42);
$DETACHBUFFER(sample.buffer); $DETACHBUFFER(sample.buffer);
assert.throws(TypeError, function() { let count = 0;
for (var key in sample) { for (var key in sample) {
throw new Test262Error(); count++;
} }
}); assert.sameValue(count, 0, 'The value of `count` is 0');
}); });

View File

@ -13,24 +13,21 @@ info: |
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
... ...
iii. Return a PropertyDescriptor{[[Value]]: value, [[Writable]]: true, iii. Return a PropertyDescriptor{[[Value]]: value, [[Writable]]: true,
[[Enumerable]]: true, [[Configurable]]: false}. [[Enumerable]]: true, [[Configurable]]: true}.
... ...
includes: [testBigIntTypedArray.js, propertyHelper.js] includes: [testBigIntTypedArray.js, propertyHelper.js]
features: [BigInt, TypedArray] features: [BigInt, TypedArray]
---*/ ---*/
testWithBigIntTypedArrayConstructors(function(TA) { testWithBigIntTypedArrayConstructors(function(TA) {
var sample = new TA([42n, 43n]); var sample = new TA([42n, 43n]);
var desc0 = Object.getOwnPropertyDescriptor(sample, 0); var desc0 = Object.getOwnPropertyDescriptor(sample, 0);
assert.sameValue(desc0.value, 42n, "value", "desc0.value === 42"); assert.sameValue(desc0.value, 42n, 'The value of desc0.value is 42n');
assert.sameValue(desc0.writable, true, "index descriptor is writable [0]"); assert.sameValue(desc0.writable, true, 'The value of desc0.writable is true');
verifyEnumerable(sample, "0", "index descriptor is enumerable [0]"); verifyEnumerable(sample, '0', 'index descriptor is enumerable [0]');
verifyNotConfigurable(sample, "0", "index descriptor is not configurable [0]"); verifyConfigurable(sample, '0', 'index descriptor is configurable [0]');
var desc1 = Object.getOwnPropertyDescriptor(sample, 1); var desc1 = Object.getOwnPropertyDescriptor(sample, 1);
assert.sameValue(desc1.value, 43n, "value", "desc1.value === 43"); assert.sameValue(desc1.value, 43n, 'The value of desc1.value is 43n');
assert.sameValue(desc1.writable, true, "index descriptor is writable [1]"); assert.sameValue(desc1.writable, true, 'The value of desc1.writable is true');
verifyEnumerable(sample, "1", "index descriptor is enumerable [1]"); verifyEnumerable(sample, '1', 'index descriptor is enumerable [1]');
verifyNotConfigurable(sample, "1", "index descriptor is not configurable [1]"); verifyConfigurable(sample, '1', 'index descriptor is configurable [1]');
}); });

View File

@ -3,8 +3,7 @@
/*--- /*---
esid: sec-integer-indexed-exotic-objects-getownproperty-p esid: sec-integer-indexed-exotic-objects-getownproperty-p
description: > description: >
Throws a TypeError if this has a detached buffer (honoring the Realm of the Returned undefined if this has a detached buffer (honoring the Realm of the current execution context)
current execution context)
info: | info: |
9.4.5.1 [[GetOwnProperty]] ( P ) 9.4.5.1 [[GetOwnProperty]] ( P )
@ -12,15 +11,16 @@ info: |
3. If Type(P) is String, then 3. If Type(P) is String, then
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
i. Let value be ? IntegerIndexedElementGet(O, numericIndex). i. Let value be ! IntegerIndexedElementGet(O, numericIndex).
ii. If value is undefined, return undefined.
... ...
9.4.5.8 IntegerIndexedElementGet ( O, index ) IntegerIndexedElementGet ( O, index )
... ...
3. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot.
4. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. If IsDetachedBuffer(buffer) is true, return undefined.
...
includes: [testTypedArray.js, detachArrayBuffer.js] includes: [testTypedArray.js, detachArrayBuffer.js]
features: [cross-realm, TypedArray] features: [cross-realm, TypedArray]
---*/ ---*/
@ -33,7 +33,9 @@ testWithTypedArrayConstructors(function(TA) {
$DETACHBUFFER(sample.buffer); $DETACHBUFFER(sample.buffer);
assert.throws(TypeError, function() { assert.sameValue(
Object.getOwnPropertyDescriptor(sample, 0); Object.getOwnPropertyDescriptor(sample, 0),
}); undefined,
'Object.getOwnPropertyDescriptor(sample, 0) must return undefined'
);
}); });

View File

@ -2,7 +2,7 @@
// This code is governed by the BSD license found in the LICENSE file. // This code is governed by the BSD license found in the LICENSE file.
/*--- /*---
esid: sec-integer-indexed-exotic-objects-getownproperty-p esid: sec-integer-indexed-exotic-objects-getownproperty-p
description: Throws a TypeError if this has a detached buffer description: Returns undefined if this has a detached buffer
info: | info: |
9.4.5.1 [[GetOwnProperty]] ( P ) 9.4.5.1 [[GetOwnProperty]] ( P )
@ -10,14 +10,15 @@ info: |
3. If Type(P) is String, then 3. If Type(P) is String, then
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
i. Let value be ? IntegerIndexedElementGet(O, numericIndex). i. Let value be ! IntegerIndexedElementGet(O, numericIndex).
ii. If value is undefined, return undefined.
... ...
9.4.5.8 IntegerIndexedElementGet ( O, index ) IntegerIndexedElementGet ( O, index )
... ...
3. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot.
4. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. If IsDetachedBuffer(buffer) is true, return undefined.
... ...
includes: [testTypedArray.js, detachArrayBuffer.js] includes: [testTypedArray.js, detachArrayBuffer.js]
features: [TypedArray] features: [TypedArray]
@ -27,7 +28,9 @@ testWithTypedArrayConstructors(function(TA) {
var sample = new TA(1); var sample = new TA(1);
$DETACHBUFFER(sample.buffer); $DETACHBUFFER(sample.buffer);
assert.throws(TypeError, function() { assert.sameValue(
Object.getOwnPropertyDescriptor(sample, 0); Object.getOwnPropertyDescriptor(sample, 0),
}); undefined,
'Object.getOwnPropertyDescriptor(sample, 0) must return undefined'
);
}); });

View File

@ -10,13 +10,13 @@ info: |
3. If Type(P) is String, then 3. If Type(P) is String, then
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
i. Let value be ? IntegerIndexedElementGet(O, numericIndex). i. Let value be ! IntegerIndexedElementGet(O, numericIndex).
... ...
9.4.5.8 IntegerIndexedElementGet ( O, index ) IntegerIndexedElementGet ( O, index )
... ...
3. Let buffer be O.[[ViewedArrayBuffer]]. Let buffer be O.[[ViewedArrayBuffer]].
4. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. If IsDetachedBuffer(buffer) is true, return undefined.
... ...
13.7.5.15 EnumerateObjectProperties (O) 13.7.5.15 EnumerateObjectProperties (O)
@ -34,9 +34,9 @@ testWithTypedArrayConstructors(function(TA) {
var sample = new TA(42); var sample = new TA(42);
$DETACHBUFFER(sample.buffer); $DETACHBUFFER(sample.buffer);
assert.throws(TypeError, function() { let count = 0;
for (var key in sample) { for (var key in sample) {
throw new Test262Error(); count++;
} }
}); assert.sameValue(count, 0, 'The value of `count` is 0');
}); });

View File

@ -23,14 +23,14 @@ testWithTypedArrayConstructors(function(TA) {
var sample = new TA([42, 43]); var sample = new TA([42, 43]);
var desc0 = Object.getOwnPropertyDescriptor(sample, 0); var desc0 = Object.getOwnPropertyDescriptor(sample, 0);
assert.sameValue(desc0.value, 42, "value", "desc0.value === 42"); assert.sameValue(desc0.value, 42, 'The value of desc0.value is 42');
assert.sameValue(desc0.writable, true, "index descriptor is writable [0]"); assert.sameValue(desc0.writable, true, 'The value of desc0.writable is true');
verifyEnumerable(sample, "0", "index descriptor is enumerable [0]"); verifyEnumerable(sample, "0", "index descriptor is enumerable [0]");
verifyNotConfigurable(sample, "0", "index descriptor is not configurable [0]"); verifyConfigurable(sample, "0", "index descriptor is configurable [0]");
var desc1 = Object.getOwnPropertyDescriptor(sample, 1); var desc1 = Object.getOwnPropertyDescriptor(sample, 1);
assert.sameValue(desc1.value, 43, "value", "desc1.value === 43"); assert.sameValue(desc1.value, 43, 'The value of desc1.value is 43');
assert.sameValue(desc1.writable, true, "index descriptor is writable [1]"); assert.sameValue(desc1.writable, true, 'The value of desc1.writable is true');
verifyEnumerable(sample, "1", "index descriptor is enumerable [1]"); verifyEnumerable(sample, "1", "index descriptor is enumerable [1]");
verifyNotConfigurable(sample, "1", "index descriptor is not configurable [1]"); verifyConfigurable(sample, "1", "index descriptor is configurable [1]");
}); });

View File

@ -10,8 +10,8 @@ info: |
3. If Type(P) is String, then 3. If Type(P) is String, then
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
i. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot. i. Let buffer be O.[[ViewedArrayBuffer]].
ii. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. ii. If IsDetachedBuffer(buffer) is true, return false.
... ...
9.1.7.1 OrdinaryHasProperty (O, P) 9.1.7.1 OrdinaryHasProperty (O, P)
@ -42,22 +42,22 @@ testWithBigIntTypedArrayConstructors(function(TA) {
assert.sameValue( assert.sameValue(
Reflect.has(sample, 0), true, Reflect.has(sample, 0), true,
"OrdinaryHasProperty does not affect numericIndex properties [0]" 'Reflect.has(sample, 0) must return true'
); );
assert.sameValue( assert.sameValue(
Reflect.has(sample, 1), false, Reflect.has(sample, 1), false,
"OrdinaryHasProperty does not affect numericIndex properties [1]" 'Reflect.has(sample, 1) must return false'
); );
assert.throws(Test262Error, function() { assert.throws(Test262Error, function() {
Reflect.has(sample, "foo"); Reflect.has(sample, "foo");
}, "Return abrupt from parent's [[HasProperty]] 'foo'"); }, '`Reflect.has(sample, "foo")` throws Test262Error');
Object.defineProperty(sample, "foo", { value: 42 }); Object.defineProperty(sample, "foo", { value: 42 });
assert.sameValue( assert.sameValue(
Reflect.has(sample, "foo"), Reflect.has(sample, "foo"),
true, true,
"trap is not triggered if [[GetOwnProperty]] returns a defined value" 'Reflect.has(sample, "foo") must return true'
); );
}); });

View File

@ -3,7 +3,7 @@
/*--- /*---
esid: sec-integer-indexed-exotic-objects-hasproperty-p esid: sec-integer-indexed-exotic-objects-hasproperty-p
description: > description: >
Throws a TypeError if this has a detached buffer (honoring the Realm of the Returns false if this has a detached buffer (honoring the Realm of the
current execution context) current execution context)
info: | info: |
9.4.5.2 [[HasProperty]](P) 9.4.5.2 [[HasProperty]](P)
@ -12,8 +12,8 @@ info: |
3. If Type(P) is String, then 3. If Type(P) is String, then
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
i. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot. i. Let buffer be O.[[ViewedArrayBuffer]].
ii. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. ii. If IsDetachedBuffer(buffer) is true, return false.
... ...
includes: [testBigIntTypedArray.js, detachArrayBuffer.js] includes: [testBigIntTypedArray.js, detachArrayBuffer.js]
features: [BigInt, cross-realm, Reflect, TypedArray] features: [BigInt, cross-realm, Reflect, TypedArray]
@ -27,7 +27,5 @@ testWithBigIntTypedArrayConstructors(function(TA) {
$DETACHBUFFER(sample.buffer); $DETACHBUFFER(sample.buffer);
assert.throws(TypeError, function() { assert.sameValue(Reflect.has(sample, '0'), false, 'Reflect.has(sample, "0") must return false');
Reflect.has(sample, '0');
}, '0');
}); });

View File

@ -2,7 +2,7 @@
// This code is governed by the BSD license found in the LICENSE file. // This code is governed by the BSD license found in the LICENSE file.
/*--- /*---
esid: sec-integer-indexed-exotic-objects-hasproperty-p esid: sec-integer-indexed-exotic-objects-hasproperty-p
description: Throws a TypeError if this has a detached buffer description: Returns false if this has a detached buffer
info: | info: |
9.4.5.2 [[HasProperty]](P) 9.4.5.2 [[HasProperty]](P)
@ -10,8 +10,8 @@ info: |
3. If Type(P) is String, then 3. If Type(P) is String, then
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
i. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot. i. Let buffer be O.[[ViewedArrayBuffer]].
ii. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. ii. If IsDetachedBuffer(buffer) is true, return false.
... ...
includes: [testBigIntTypedArray.js, detachArrayBuffer.js] includes: [testBigIntTypedArray.js, detachArrayBuffer.js]
features: [BigInt, Reflect, TypedArray] features: [BigInt, Reflect, TypedArray]
@ -21,15 +21,7 @@ testWithBigIntTypedArrayConstructors(function(TA) {
var sample = new TA(1); var sample = new TA(1);
$DETACHBUFFER(sample.buffer); $DETACHBUFFER(sample.buffer);
assert.throws(TypeError, function() { assert.sameValue(Reflect.has(sample, "0"), false, 'Reflect.has(sample, "0") must return false');
Reflect.has(sample, "0"); assert.sameValue(Reflect.has(sample, "-0"), false, 'Reflect.has(sample, "-0") must return false');
}, "0"); assert.sameValue(Reflect.has(sample, "1.1"), false, 'Reflect.has(sample, "1.1") must return false');
assert.throws(TypeError, function() {
Reflect.has(sample, "-0");
}, "-0");
assert.throws(TypeError, function() {
Reflect.has(sample, "1.1");
}, "1.1");
}); });

View File

@ -11,22 +11,16 @@ info: |
3. If Type(P) is String, then 3. If Type(P) is String, then
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
i. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot. i. Let buffer be O.[[ViewedArrayBuffer]].
ii. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. ii. If IsDetachedBuffer(buffer) is true, return false.
iii. If IsInteger(numericIndex) is false, return false. iii. If ! IsValidIntegerIndex(O, numericIndex) is false, return false.
iv. If numericIndex = -0, return false. iv. Return true.
v. If numericIndex < 0, return false.
vi. If numericIndex the value of O's [[ArrayLength]] internal slot,
return false.
vii. Return true.
... ...
includes: [testBigIntTypedArray.js] includes: [testBigIntTypedArray.js]
features: [BigInt, Reflect, TypedArray] features: [BigInt, Reflect, TypedArray]
---*/ ---*/
testWithBigIntTypedArrayConstructors(function(TA) { testWithBigIntTypedArrayConstructors(function(TA) {
var sample = new TA([42n, 43n]); var sample = new TA([42n, 43n]);
assert.sameValue(Reflect.has(sample, 0), true, 'Reflect.has(sample, 0) must return true');
assert.sameValue(Reflect.has(sample, 0), true); assert.sameValue(Reflect.has(sample, 1), true, 'Reflect.has(sample, 1) must return true');
assert.sameValue(Reflect.has(sample, 1), true);
}); });

View File

@ -1,6 +1,5 @@
// Copyright (C) 2017 André Bargull. All rights reserved. // Copyright (C) 2017 André Bargull. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file. // This code is governed by the BSD license found in the LICENSE file.
/*--- /*---
esid: sec-integer-indexed-exotic-objects-hasproperty-p esid: sec-integer-indexed-exotic-objects-hasproperty-p
description: > description: >
@ -12,7 +11,7 @@ info: |
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
i. Let buffer be O.[[ViewedArrayBuffer]]. i. Let buffer be O.[[ViewedArrayBuffer]].
ii. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. ii. If IsDetachedBuffer(buffer) is true, return false.
... ...
7.1.16 CanonicalNumericIndexString ( argument ) 7.1.16 CanonicalNumericIndexString ( argument )
@ -25,12 +24,23 @@ flags: [noStrict]
includes: [testBigIntTypedArray.js, detachArrayBuffer.js] includes: [testBigIntTypedArray.js, detachArrayBuffer.js]
features: [BigInt, TypedArray] features: [BigInt, TypedArray]
---*/ ---*/
testWithBigIntTypedArrayConstructors(function(TA) { testWithBigIntTypedArrayConstructors(function(TA) {
var sample = new TA(0); let count = 0;
$DETACHBUFFER(sample.buffer);
assert.throws(TypeError, function() { let n = {
with (sample) Infinity; valueOf() {
}); count++;
return 9n;
}
};
assert.sameValue(count, 0, 'The value of `count` is 0');
let ta = new TA([n]);
assert.sameValue(count, 1, 'The value of `count` is 1');
$DETACHBUFFER(ta.buffer);
with (ta) {
Infinity;
assert.sameValue(count, 1, 'The value of `count` is 1');
}
}); });

View File

@ -11,8 +11,7 @@ info: |
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
... ...
vi. If numericIndex the value of O's [[ArrayLength]] internal slot, iii. If ! IsValidIntegerIndex(O, numericIndex) is false, return false.
return false.
... ...
includes: [testBigIntTypedArray.js] includes: [testBigIntTypedArray.js]
features: [BigInt, Reflect, TypedArray] features: [BigInt, Reflect, TypedArray]
@ -24,5 +23,5 @@ TypedArray.prototype[1] = "test262";
testWithBigIntTypedArrayConstructors(function(TA) { testWithBigIntTypedArrayConstructors(function(TA) {
var sample = new TA(1); var sample = new TA(1);
assert.sameValue(Reflect.has(sample, "1"), false, "1"); assert.sameValue(Reflect.has(sample, "1"), false, 'Reflect.has(sample, "1") must return false');
}); });

View File

@ -11,7 +11,7 @@ info: |
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
... ...
v. If numericIndex < 0, return false. iii. If ! IsValidIntegerIndex(O, numericIndex) is false, return false.
... ...
includes: [testBigIntTypedArray.js] includes: [testBigIntTypedArray.js]
features: [BigInt, Reflect, TypedArray] features: [BigInt, Reflect, TypedArray]
@ -24,5 +24,5 @@ TypedArray.prototype[-1] = "test262";
testWithBigIntTypedArrayConstructors(function(TA) { testWithBigIntTypedArrayConstructors(function(TA) {
var sample = new TA(1); var sample = new TA(1);
assert.sameValue(Reflect.has(sample, "-1"), false, "-1"); assert.sameValue(Reflect.has(sample, "-1"), false, 'Reflect.has(sample, "-1") must return false');
}); });

View File

@ -11,7 +11,7 @@ info: |
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
... ...
iv. If numericIndex = -0, return false. iii. If ! IsValidIntegerIndex(O, numericIndex) is false, return false.
... ...
includes: [testBigIntTypedArray.js] includes: [testBigIntTypedArray.js]
features: [BigInt, Reflect, TypedArray] features: [BigInt, Reflect, TypedArray]
@ -24,5 +24,5 @@ TypedArray.prototype["-0"] = "test262";
testWithBigIntTypedArrayConstructors(function(TA) { testWithBigIntTypedArrayConstructors(function(TA) {
var sample = new TA(1); var sample = new TA(1);
assert.sameValue(Reflect.has(sample, "-0"), false, "-0"); assert.sameValue(Reflect.has(sample, "-0"), false, 'Reflect.has(sample, "-0") must return false');
}); });

View File

@ -10,8 +10,8 @@ info: |
3. If Type(P) is String, then 3. If Type(P) is String, then
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
i. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot. i. Let buffer be O.[[ViewedArrayBuffer]].
ii. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. ii. If IsDetachedBuffer(buffer) is true, return false.
... ...
9.1.7.1 OrdinaryHasProperty (O, P) 9.1.7.1 OrdinaryHasProperty (O, P)
@ -42,22 +42,22 @@ testWithTypedArrayConstructors(function(TA) {
assert.sameValue( assert.sameValue(
Reflect.has(sample, 0), true, Reflect.has(sample, 0), true,
"OrdinaryHasProperty does not affect numericIndex properties [0]" 'Reflect.has(sample, 0) must return true'
); );
assert.sameValue( assert.sameValue(
Reflect.has(sample, 1), false, Reflect.has(sample, 1), false,
"OrdinaryHasProperty does not affect numericIndex properties [1]" 'Reflect.has(sample, 1) must return false'
); );
assert.throws(Test262Error, function() { assert.throws(Test262Error, function() {
Reflect.has(sample, "foo"); Reflect.has(sample, "foo");
}, "Return abrupt from parent's [[HasProperty]] 'foo'"); }, '`Reflect.has(sample, "foo")` throws Test262Error');
Object.defineProperty(sample, "foo", { value: 42 }); Object.defineProperty(sample, "foo", { value: 42 });
assert.sameValue( assert.sameValue(
Reflect.has(sample, "foo"), Reflect.has(sample, "foo"),
true, true,
"trap is not triggered if [[GetOwnProperty]] returns a defined value" 'Reflect.has(sample, "foo") must return true'
); );
}); });

View File

@ -3,8 +3,7 @@
/*--- /*---
esid: sec-integer-indexed-exotic-objects-hasproperty-p esid: sec-integer-indexed-exotic-objects-hasproperty-p
description: > description: >
Throws a TypeError if this has a detached buffer (honoring the Realm of the Returns false if this has a detached buffer (honoring the Realm of the current execution context)
current execution context)
info: | info: |
9.4.5.2 [[HasProperty]](P) 9.4.5.2 [[HasProperty]](P)
@ -12,8 +11,8 @@ info: |
3. If Type(P) is String, then 3. If Type(P) is String, then
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
i. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot. i. Let buffer be O.[[ViewedArrayBuffer]].
ii. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. ii. If IsDetachedBuffer(buffer) is true, return false.
... ...
includes: [testTypedArray.js, detachArrayBuffer.js] includes: [testTypedArray.js, detachArrayBuffer.js]
features: [cross-realm, Reflect, TypedArray] features: [cross-realm, Reflect, TypedArray]
@ -27,7 +26,5 @@ testWithTypedArrayConstructors(function(TA) {
$DETACHBUFFER(sample.buffer); $DETACHBUFFER(sample.buffer);
assert.throws(TypeError, function() { assert.sameValue(Reflect.has(sample, '0'), false, 'Reflect.has(sample, "0") must return false');
Reflect.has(sample, '0');
}, '0');
}); });

View File

@ -2,7 +2,7 @@
// This code is governed by the BSD license found in the LICENSE file. // This code is governed by the BSD license found in the LICENSE file.
/*--- /*---
esid: sec-integer-indexed-exotic-objects-hasproperty-p esid: sec-integer-indexed-exotic-objects-hasproperty-p
description: Throws a TypeError if this has a detached buffer description: Return false if this has a detached buffer
info: | info: |
9.4.5.2 [[HasProperty]](P) 9.4.5.2 [[HasProperty]](P)
@ -10,8 +10,8 @@ info: |
3. If Type(P) is String, then 3. If Type(P) is String, then
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
i. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot. i. Let buffer be O.[[ViewedArrayBuffer]].
ii. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. ii. If IsDetachedBuffer(buffer) is true, return false.
... ...
includes: [testTypedArray.js, detachArrayBuffer.js] includes: [testTypedArray.js, detachArrayBuffer.js]
features: [Reflect, TypedArray] features: [Reflect, TypedArray]
@ -21,15 +21,7 @@ testWithTypedArrayConstructors(function(TA) {
var sample = new TA(1); var sample = new TA(1);
$DETACHBUFFER(sample.buffer); $DETACHBUFFER(sample.buffer);
assert.throws(TypeError, function() { assert.sameValue(Reflect.has(sample, "0"), false, 'Reflect.has(sample, "0") must return false');
Reflect.has(sample, "0"); assert.sameValue(Reflect.has(sample, "-0"), false, 'Reflect.has(sample, "-0") must return false');
}, "0"); assert.sameValue(Reflect.has(sample, "1.1"), false, 'Reflect.has(sample, "1.1") must return false');
assert.throws(TypeError, function() {
Reflect.has(sample, "-0");
}, "-0");
assert.throws(TypeError, function() {
Reflect.has(sample, "1.1");
}, "1.1");
}); });

View File

@ -11,14 +11,10 @@ info: |
3. If Type(P) is String, then 3. If Type(P) is String, then
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
i. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot. i. Let buffer be O.[[ViewedArrayBuffer]].
ii. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. ii. If IsDetachedBuffer(buffer) is true, return false.
iii. If IsInteger(numericIndex) is false, return false. iii. If ! IsValidIntegerIndex(O, numericIndex) is false, return false.
iv. If numericIndex = -0, return false. iv. Return true.
v. If numericIndex < 0, return false.
vi. If numericIndex the value of O's [[ArrayLength]] internal slot,
return false.
vii. Return true.
... ...
includes: [testTypedArray.js] includes: [testTypedArray.js]
features: [Reflect, TypedArray] features: [Reflect, TypedArray]
@ -27,6 +23,6 @@ features: [Reflect, TypedArray]
testWithTypedArrayConstructors(function(TA) { testWithTypedArrayConstructors(function(TA) {
var sample = new TA([42, 43]); var sample = new TA([42, 43]);
assert.sameValue(Reflect.has(sample, 0), true); assert.sameValue(Reflect.has(sample, 0), true, 'Reflect.has("new TA([42, 43])", 0) must return true');
assert.sameValue(Reflect.has(sample, 1), true); assert.sameValue(Reflect.has(sample, 1), true, 'Reflect.has("new TA([42, 43])", 1) must return true');
}); });

View File

@ -12,7 +12,7 @@ info: |
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
i. Let buffer be O.[[ViewedArrayBuffer]]. i. Let buffer be O.[[ViewedArrayBuffer]].
ii. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. ii. If IsDetachedBuffer(buffer) is true, return false.
... ...
7.1.16 CanonicalNumericIndexString ( argument ) 7.1.16 CanonicalNumericIndexString ( argument )
@ -27,10 +27,24 @@ features: [TypedArray]
---*/ ---*/
testWithTypedArrayConstructors(function(TA) { testWithTypedArrayConstructors(function(TA) {
var sample = new TA(0); let count = 0;
$DETACHBUFFER(sample.buffer); let n = {
valueOf() {
count++;
return 9;
}
};
assert.throws(TypeError, function() { assert.sameValue(count, 0, 'The value of `count` is 0');
with (sample) Infinity;
}); let ta = new TA([n]);
assert.sameValue(count, 1, 'The value of `count` is 1');
$DETACHBUFFER(ta.buffer);
with (ta) {
Infinity;
assert.sameValue(count, 1, 'The value of `count` is 1');
}
}); });

View File

@ -11,8 +11,7 @@ info: |
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
... ...
vi. If numericIndex the value of O's [[ArrayLength]] internal slot, iii. If ! IsValidIntegerIndex(O, numericIndex) is false, return false.
return false.
... ...
includes: [testTypedArray.js] includes: [testTypedArray.js]
features: [Reflect, TypedArray] features: [Reflect, TypedArray]
@ -24,5 +23,5 @@ TypedArray.prototype[1] = "test262";
testWithTypedArrayConstructors(function(TA) { testWithTypedArrayConstructors(function(TA) {
var sample = new TA(1); var sample = new TA(1);
assert.sameValue(Reflect.has(sample, "1"), false, "1"); assert.sameValue(Reflect.has(sample, "1"), false, 'Reflect.has(sample, "1") must return false');
}); });

View File

@ -11,7 +11,7 @@ info: |
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
... ...
v. If numericIndex < 0, return false. iii. If ! IsValidIntegerIndex(O, numericIndex) is false, return false.
... ...
includes: [testTypedArray.js] includes: [testTypedArray.js]
features: [Reflect, TypedArray] features: [Reflect, TypedArray]
@ -24,5 +24,5 @@ TypedArray.prototype[-1] = "test262";
testWithTypedArrayConstructors(function(TA) { testWithTypedArrayConstructors(function(TA) {
var sample = new TA(1); var sample = new TA(1);
assert.sameValue(Reflect.has(sample, "-1"), false, "-1"); assert.sameValue(Reflect.has(sample, "-1"), false, 'Reflect.has(sample, "-1") must return false');
}); });

View File

@ -11,7 +11,7 @@ info: |
a. Let numericIndex be ! CanonicalNumericIndexString(P). a. Let numericIndex be ! CanonicalNumericIndexString(P).
b. If numericIndex is not undefined, then b. If numericIndex is not undefined, then
... ...
iv. If numericIndex = -0, return false. iii. If ! IsValidIntegerIndex(O, numericIndex) is false, return false.
... ...
includes: [testTypedArray.js] includes: [testTypedArray.js]
features: [Reflect, TypedArray] features: [Reflect, TypedArray]
@ -24,5 +24,5 @@ TypedArray.prototype["-0"] = "test262";
testWithTypedArrayConstructors(function(TA) { testWithTypedArrayConstructors(function(TA) {
var sample = new TA(1); var sample = new TA(1);
assert.sameValue(Reflect.has(sample, "-0"), false, "-0"); assert.sameValue(Reflect.has(sample, "-0"), false, 'Reflect.has(sample, "-0") must return false');
}); });

View File

@ -3,7 +3,7 @@
/*--- /*---
esid: sec-integer-indexed-exotic-objects-set-p-v-receiver esid: sec-integer-indexed-exotic-objects-set-p-v-receiver
description: > description: >
Throws a TypeError if key has a numeric index and object has a detached Returns false if key has a numeric index and object has a detached
buffer (honoring the Realm of the current execution context) buffer (honoring the Realm of the current execution context)
info: | info: |
9.4.5.5 [[Set]] ( P, V, Receiver) 9.4.5.5 [[Set]] ( P, V, Receiver)
@ -17,24 +17,23 @@ info: |
9.4.5.9 IntegerIndexedElementSet ( O, index, value ) 9.4.5.9 IntegerIndexedElementSet ( O, index, value )
... Assert: O is an Integer-Indexed exotic object.
3. Let numValue be ? ToNumber(value). Assert: Type(index) is Number.
4. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot. If O.[[ContentType]] is BigInt, let numValue be ? ToBigInt(value).
5. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. Otherwise, let numValue be ? ToNumber(value).
... Let buffer be O.[[ViewedArrayBuffer]].
If IsDetachedBuffer(buffer) is true, return false.
If ! IsValidIntegerIndex(O, index) is false, return false.
includes: [testBigIntTypedArray.js, detachArrayBuffer.js] includes: [testBigIntTypedArray.js, detachArrayBuffer.js]
features: [BigInt, cross-realm, TypedArray] features: [BigInt, cross-realm, TypedArray]
---*/ ---*/
var other = $262.createRealm().global; var other = $262.createRealm().global;
testWithBigIntTypedArrayConstructors(function(TA) { testWithBigIntTypedArrayConstructors(function(TA) {
var OtherTA = other[TA.name]; var OtherTA = other[TA.name];
var sample = new OtherTA(1); var sample = new OtherTA(1);
$DETACHBUFFER(sample.buffer); $DETACHBUFFER(sample.buffer);
assert.throws(TypeError, function() {
sample[0] = 0n; sample[0] = 0n;
}); assert.sameValue(sample[0], undefined, 'The value of sample[0] is expected to equal `undefined`');
}); });

View File

@ -3,7 +3,7 @@
/*--- /*---
esid: sec-integer-indexed-exotic-objects-set-p-v-receiver esid: sec-integer-indexed-exotic-objects-set-p-v-receiver
description: > description: >
Throws a TypeError if key has a numeric index and object has a detached buffer Returns false if key has a numeric index and object has a detached buffer
info: | info: |
9.4.5.5 [[Set]] ( P, V, Receiver) 9.4.5.5 [[Set]] ( P, V, Receiver)
@ -16,42 +16,26 @@ info: |
9.4.5.9 IntegerIndexedElementSet ( O, index, value ) 9.4.5.9 IntegerIndexedElementSet ( O, index, value )
... Assert: O is an Integer-Indexed exotic object.
3. Let numValue be ? ToNumber(value). Assert: Type(index) is Number.
4. Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot. If O.[[ContentType]] is BigInt, let numValue be ? ToBigInt(value).
5. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. Otherwise, let numValue be ? ToNumber(value).
... Let buffer be O.[[ViewedArrayBuffer]].
If IsDetachedBuffer(buffer) is true, return false.
If ! IsValidIntegerIndex(O, index) is false, return false.
includes: [testBigIntTypedArray.js, detachArrayBuffer.js] includes: [testBigIntTypedArray.js, detachArrayBuffer.js]
features: [BigInt, TypedArray] features: [BigInt, TypedArray]
---*/ ---*/
testWithBigIntTypedArrayConstructors(function(TA) { testWithBigIntTypedArrayConstructors(function(TA) {
var sample = new TA([42n]); var sample = new TA([42n]);
$DETACHBUFFER(sample.buffer); $DETACHBUFFER(sample.buffer);
assert.sameValue(sample[0] = 1n, false, '`sample[0] = 1n` is false');
assert.throws(TypeError, function() { assert.sameValue(sample['1.1'] = 1n, false, '`sample["1.1"] = 1n` is false');
sample[0] = 1n; assert.sameValue(sample['-0'] = 1n, false, '`sample["-0"] = 1n` is false');
}, "valid numeric index"); assert.sameValue(sample['-1'] = 1n, false, '`sample["-1"] = 1n` is false');
assert.sameValue(sample['1'] = 1n, false, '`sample["1"] = 1n` is false');
assert.throws(TypeError, function() { assert.sameValue(sample['2'] = 1n, false, '`sample["2"] = 1n` is false');
sample["1.1"] = 1n;
}, "detach buffer runs before checking for 1.1");
assert.throws(TypeError, function() {
sample["-0"] = 1n;
}, "detach buffer runs before checking for -0");
assert.throws(TypeError, function() {
sample["-1"] = 1n;
}, "detach buffer runs before checking for -1");
assert.throws(TypeError, function() {
sample["1"] = 1n;
}, "detach buffer runs before checking for key == length");
assert.throws(TypeError, function() {
sample["2"] = 1n;
}, "detach buffer runs before checking for key > length");
var obj = { var obj = {
valueOf: function() { valueOf: function() {
@ -60,6 +44,6 @@ testWithBigIntTypedArrayConstructors(function(TA) {
}; };
assert.throws(Test262Error, function() { assert.throws(Test262Error, function() {
sample["0"] = obj; sample['0'] = obj;
}, "ToNumber(value) is called before detached buffer check"); }, '`sample["0"] = obj` throws Test262Error');
}); });

View File

@ -50,14 +50,10 @@ info: |
includes: [testTypedArray.js] includes: [testTypedArray.js]
features: [BigInt, TypedArray] features: [BigInt, TypedArray]
---*/ ---*/
var typedArray;
testWithTypedArrayConstructors(function(TA) { testWithTypedArrayConstructors(function(TA) {
var typedArray = new TA(1);
typedArray = new TA(1);
assert.throws(TypeError, function() { assert.throws(TypeError, function() {
typedArray[0] = 1n; typedArray[0] = 1n;
}); }, '`typedArray[0] = 1n` throws TypeError');
}); });