Resizable ArrayBuffer: ArrayBuffer accessors (#3020)

* Add "feature" for "Resizable ArrayBuffer" proposal

* Resizable ArrayBuffer: ArrayBuffer accessors

* fixup! Resizable ArrayBuffer: ArrayBuffer accessors
This commit is contained in:
jugglinmike 2021-06-25 13:21:11 -04:00 committed by GitHub
parent 93ad86b859
commit 4da5c800a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 620 additions and 0 deletions

View File

@ -0,0 +1,22 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.maxbytelength
description: Returns 0 if the buffer is detached
info: |
get ArrayBuffer.prototype.maxByteLength
1. Let O be the this value.
2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception.
4. If IsDetachedBuffer(O) is true, return +0𝔽.
[...]
includes: [detachArrayBuffer.js]
features: [resizable-arraybuffer]
---*/
var ab = new ArrayBuffer(1);
$DETACHBUFFER(ab);
assert.sameValue(ab.maxByteLength, 0);

View File

@ -0,0 +1,17 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.maxbytelength
description: Requires this value to have a [[ArrayBufferData]] internal slot
info: |
get ArrayBuffer.prototype.maxByteLength
1. Let O be the this value.
2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
[...]
features: [resizable-arraybuffer]
---*/
assert.throws(TypeError, function() {
ArrayBuffer.prototype.maxByteLength;
});

View File

@ -0,0 +1,23 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.maxbytelength
description: Throws a TypeError exception when invoked as a function
info: |
get ArrayBuffer.prototype.maxByteLength
1. Let O be the this value.
2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
[...]
features: [resizable-arraybuffer]
---*/
var getter = Object.getOwnPropertyDescriptor(
ArrayBuffer.prototype, 'maxByteLength'
).get;
assert.sameValue(typeof getter, 'function');
assert.throws(TypeError, function() {
getter();
});

View File

@ -0,0 +1,32 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.maxbytelength
description: >
get ArrayBuffer.prototype.maxByteLength.length is 0.
info: |
get ArrayBuffer.prototype.maxByteLength
17 ECMAScript Standard Built-in Objects:
Every built-in Function object, including constructors, has a length
property whose value is an integer. Unless otherwise specified, this
value is equal to the largest number of named arguments shown in the
subclause headings for the function description, including optional
parameters. However, rest parameters shown using the form ...name
are not included in the default argument count.
Unless otherwise specified, the length property of a built-in Function
object has the attributes { [[Writable]]: false, [[Enumerable]]: false,
[[Configurable]]: true }.
includes: [propertyHelper.js]
features: [resizable-arraybuffer]
---*/
var desc = Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, 'maxByteLength');
verifyProperty(desc.get, 'length', {
value: 0,
enumerable: false,
writable: false,
configurable: true
});

View File

@ -0,0 +1,24 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.maxbytelength
description: >
get ArrayBuffer.prototype.maxByteLength
17 ECMAScript Standard Built-in Objects
Functions that are specified as get or set accessor functions of built-in
properties have "get " or "set " prepended to the property name string.
includes: [propertyHelper.js]
features: [resizable-arraybuffer]
---*/
var desc = Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, 'maxByteLength');
verifyProperty(desc.get, 'name', {
value: 'get maxByteLength',
enumerable: false,
writable: false,
configurable: true
});

View File

@ -0,0 +1,25 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.maxbytelength
description: >
"maxByteLength" property of ArrayBuffer.prototype
info: |
ArrayBuffer.prototype.maxByteLength is an accessor property whose set
accessor function is undefined.
Section 17: Every accessor property described in clauses 18 through 26 and in
Annex B.2 has the attributes {[[Enumerable]]: false, [[Configurable]]: true }
includes: [propertyHelper.js]
features: [resizable-arraybuffer]
---*/
var desc = Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, 'maxByteLength');
assert.sameValue(desc.set, undefined);
assert.sameValue(typeof desc.get, 'function');
verifyProperty(ArrayBuffer.prototype, 'maxByteLength', {
enumerable: false,
configurable: true
});

View File

@ -0,0 +1,25 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.maxbytelength
description: Return value from [[ArrayBufferByteLength]] internal slot
info: |
24.1.4.1 get ArrayBuffer.prototype.maxByteLength
1. Let O be the this value.
2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception.
4. If IsDetachedBuffer(O) is true, return +0𝔽.
5. If IsResizableArrayBuffer(O) is true, then
[...]
6. Else,
a. Let length be O.[[ArrayBufferByteLength]].
7. Return 𝔽(length).
features: [resizable-arraybuffer]
---*/
var ab1 = new ArrayBuffer(0);
assert.sameValue(ab1.maxByteLength, 0);
var ab2 = new ArrayBuffer(42);
assert.sameValue(ab2.maxByteLength, 42);

View File

@ -0,0 +1,28 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.maxbytelength
description: Return value from [[ArrayBufferMaxByteLength]] internal slot
info: |
24.1.4.1 get ArrayBuffer.prototype.maxByteLength
1. Let O be the this value.
2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception.
4. If IsDetachedBuffer(O) is true, return +0𝔽.
5. If IsResizableArrayBuffer(O) is true, then
a. Let length be O.[[ArrayBufferMaxByteLength]].
6. Else,
[...]
7. Return 𝔽(length).
features: [resizable-arraybuffer]
---*/
var ab1 = new ArrayBuffer(0, { maxByteLength: 0 });
assert.sameValue(ab1.maxByteLength, 0);
var ab2 = new ArrayBuffer(0, { maxByteLength: 23 });
assert.sameValue(ab2.maxByteLength, 23);
var ab3 = new ArrayBuffer(42, { maxByteLength: 42 });
assert.sameValue(ab3.maxByteLength, 42);

View File

@ -0,0 +1,39 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.maxbytelength
description: >
Throws a TypeError exception when `this` does not have a [[ArrayBufferData]]
internal slot
info: |
get ArrayBuffer.prototype.maxByteLength
1. Let O be the this value.
2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
[...]
features: [DataView, Int8Array, resizable-arraybuffer]
---*/
var getter = Object.getOwnPropertyDescriptor(
ArrayBuffer.prototype, "maxByteLength"
).get;
assert.sameValue(typeof getter, "function");
assert.throws(TypeError, function() {
getter.call({});
});
assert.throws(TypeError, function() {
getter.call([]);
});
var ta = new Int8Array(8);
assert.throws(TypeError, function() {
getter.call(ta);
});
var dv = new DataView(new ArrayBuffer(8), 0);
assert.throws(TypeError, function() {
getter.call(dv);
});

View File

@ -0,0 +1,48 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.maxbytelength
description: Throws a TypeError exception when `this` is not Object
info: |
get ArrayBuffer.prototype.maxByteLength
1. Let O be the this value.
2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
[...]
features: [Symbol, resizable-arraybuffer]
---*/
var getter = Object.getOwnPropertyDescriptor(
ArrayBuffer.prototype, "maxByteLength"
).get;
assert.sameValue(typeof getter, "function");
assert.throws(TypeError, function() {
getter.call(undefined);
}, "this is undefined");
assert.throws(TypeError, function() {
getter.call(null);
}, "this is null");
assert.throws(TypeError, function() {
getter.call(42);
}, "this is 42");
assert.throws(TypeError, function() {
getter.call("1");
}, "this is a string");
assert.throws(TypeError, function() {
getter.call(true);
}, "this is true");
assert.throws(TypeError, function() {
getter.call(false);
}, "this is false");
var s = Symbol("s");
assert.throws(TypeError, function() {
getter.call(s);
}, "this is a Symbol");

View File

@ -0,0 +1,33 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.maxbytelength
description: Throws a TypeError exception when `this` is a SharedArrayBuffer
info: |
get ArrayBuffer.prototype.maxByteLength
1. Let O be the this value.
2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception.
[...]
features: [SharedArrayBuffer, resizable-arraybuffer]
---*/
var maxByteLength = Object.getOwnPropertyDescriptor(
ArrayBuffer.prototype, "maxByteLength"
);
var getter = maxByteLength.get;
var sab = new SharedArrayBuffer(4);
assert.sameValue(typeof getter, "function");
assert.throws(TypeError, function() {
getter.call(sab);
}, "`this` cannot be a SharedArrayBuffer");
Object.defineProperties(sab, { maxByteLength: maxByteLength });
assert.throws(TypeError, function() {
sab.maxByteLength;
}, "`this` cannot be a SharedArrayBuffer");

View File

@ -0,0 +1,34 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.resizable
description: Unaffected by buffer's attachedness
info: |
get ArrayBuffer.prototype.resizable
1. Let O be the this value.
2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception.
4. Return IsResizableArrayBuffer(O).
IsResizableArrayBuffer ( arrayBuffer )
1. Assert: Type(arrayBuffer) is Object and arrayBuffer has an
[[ArrayBufferData]] internal slot.
2. If buffer has an [[ArrayBufferMaxByteLength]] internal slot, return true.
3. Return false.
includes: [detachArrayBuffer.js]
features: [resizable-arraybuffer]
---*/
var ab1 = new ArrayBuffer(1);
$DETACHBUFFER(ab1);
assert.sameValue(ab1.resizable, false);
var ab2 = new ArrayBuffer(1, {maxByteLength: 1});
$DETACHBUFFER(ab2);
assert.sameValue(ab2.resizable, true);

View File

@ -0,0 +1,17 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.resizable
description: Requires this value to have a [[ArrayBufferData]] internal slot
info: |
get ArrayBuffer.prototype.resizable
1. Let O be the this value.
2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
[...]
features: [resizable-arraybuffer]
---*/
assert.throws(TypeError, function() {
ArrayBuffer.prototype.resizable;
});

View File

@ -0,0 +1,23 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.resizable
description: Throws a TypeError exception when invoked as a function
info: |
get ArrayBuffer.prototype.resizable
1. Let O be the this value.
2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
[...]
features: [resizable-arraybuffer]
---*/
var getter = Object.getOwnPropertyDescriptor(
ArrayBuffer.prototype, 'resizable'
).get;
assert.sameValue(typeof getter, 'function');
assert.throws(TypeError, function() {
getter();
});

View File

@ -0,0 +1,32 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.resizable
description: >
get ArrayBuffer.prototype.resizable.length is 0.
info: |
get ArrayBuffer.prototype.resizeable
17 ECMAScript Standard Built-in Objects:
Every built-in Function object, including constructors, has a length
property whose value is an integer. Unless otherwise specified, this
value is equal to the largest number of named arguments shown in the
subclause headings for the function description, including optional
parameters. However, rest parameters shown using the form ...name
are not included in the default argument count.
Unless otherwise specified, the length property of a built-in Function
object has the attributes { [[Writable]]: false, [[Enumerable]]: false,
[[Configurable]]: true }.
includes: [propertyHelper.js]
features: [resizable-arraybuffer]
---*/
var desc = Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, 'resizable');
verifyProperty(desc.get, 'length', {
value: 0,
enumerable: false,
writable: false,
configurable: true
});

View File

@ -0,0 +1,24 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.resizable
description: >
get ArrayBuffer.prototype.resizable
17 ECMAScript Standard Built-in Objects
Functions that are specified as get or set accessor functions of built-in
properties have "get " or "set " prepended to the property name string.
includes: [propertyHelper.js]
features: [resizable-arraybuffer]
---*/
var desc = Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, 'resizable');
verifyProperty(desc.get, 'name', {
value: 'get resizable',
enumerable: false,
writable: false,
configurable: true
});

View File

@ -0,0 +1,25 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.resizable
description: >
"resizable" property of ArrayBuffer.prototype
info: |
ArrayBuffer.prototype.resizable is an accessor property whose set accessor
function is undefined.
Section 17: Every accessor property described in clauses 18 through 26 and in
Annex B.2 has the attributes {[[Enumerable]]: false, [[Configurable]]: true }
includes: [propertyHelper.js]
features: [resizable-arraybuffer]
---*/
var desc = Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, 'resizable');
assert.sameValue(desc.set, undefined);
assert.sameValue(typeof desc.get, 'function');
verifyProperty(ArrayBuffer.prototype, 'resizable', {
enumerable: false,
configurable: true
});

View File

@ -0,0 +1,29 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.resizable
description: Return value according to [[ArrayBufferMaxByteLength]] internal slot
info: |
get ArrayBuffer.prototype.resizable
1. Let O be the this value.
2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception.
4. Return IsResizableArrayBuffer(O).
IsResizableArrayBuffer ( arrayBuffer )
1. Assert: Type(arrayBuffer) is Object and arrayBuffer has an
[[ArrayBufferData]] internal slot.
2. If buffer has an [[ArrayBufferMaxByteLength]] internal slot, return true.
3. Return false.
features: [resizable-arraybuffer]
---*/
var ab1 = new ArrayBuffer(1);
assert.sameValue(ab1.resizable, false);
var ab2 = new ArrayBuffer(1, {maxByteLength: 1});
assert.sameValue(ab2.resizable, true);

View File

@ -0,0 +1,39 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.resizable
description: >
Throws a TypeError exception when `this` does not have a [[ArrayBufferData]]
internal slot
info: |
get ArrayBuffer.prototype.resizable
1. Let O be the this value.
2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
[...]
features: [DataView, Int8Array, resizable-arraybuffer]
---*/
var getter = Object.getOwnPropertyDescriptor(
ArrayBuffer.prototype, "resizable"
).get;
assert.sameValue(typeof getter, "function");
assert.throws(TypeError, function() {
getter.call({});
});
assert.throws(TypeError, function() {
getter.call([]);
});
var ta = new Int8Array(8);
assert.throws(TypeError, function() {
getter.call(ta);
});
var dv = new DataView(new ArrayBuffer(8), 0);
assert.throws(TypeError, function() {
getter.call(dv);
});

View File

@ -0,0 +1,48 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.resizable
description: Throws a TypeError exception when `this` is not Object
info: |
get ArrayBuffer.prototype.resizable
1. Let O be the this value.
2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
[...]
features: [Symbol, resizable-arraybuffer]
---*/
var getter = Object.getOwnPropertyDescriptor(
ArrayBuffer.prototype, "resizable"
).get;
assert.sameValue(typeof getter, "function");
assert.throws(TypeError, function() {
getter.call(undefined);
}, "this is undefined");
assert.throws(TypeError, function() {
getter.call(null);
}, "this is null");
assert.throws(TypeError, function() {
getter.call(42);
}, "this is 42");
assert.throws(TypeError, function() {
getter.call("1");
}, "this is a string");
assert.throws(TypeError, function() {
getter.call(true);
}, "this is true");
assert.throws(TypeError, function() {
getter.call(false);
}, "this is false");
var s = Symbol("s");
assert.throws(TypeError, function() {
getter.call(s);
}, "this is a Symbol");

View File

@ -0,0 +1,33 @@
// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-get-arraybuffer.prototype.resizable
description: Throws a TypeError exception when `this` is a SharedArrayBuffer
info: |
get ArrayBuffer.prototype.resizable
1. Let O be the this value.
2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception.
[...]
features: [SharedArrayBuffer, resizable-arraybuffer]
---*/
var resizable = Object.getOwnPropertyDescriptor(
ArrayBuffer.prototype, "resizable"
);
var getter = resizable.get;
var sab = new SharedArrayBuffer(4);
assert.sameValue(typeof getter, "function");
assert.throws(TypeError, function() {
getter.call(sab);
}, "`this` cannot be a SharedArrayBuffer");
Object.defineProperties(sab, { resizable: resizable });
assert.throws(TypeError, function() {
sab.resizable;
}, "`this` cannot be a SharedArrayBuffer");