diff --git a/test/built-ins/DisposableStack/constructor.js b/test/built-ins/DisposableStack/constructor.js new file mode 100644 index 0000000000..4a314ed084 --- /dev/null +++ b/test/built-ins/DisposableStack/constructor.js @@ -0,0 +1,15 @@ +// Copyright (C) 2023 Ron Buckton. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-disposablestack-constructor +description: > + The DisposableStack constructor is the %DisposableStack% intrinsic object and the initial + value of the DisposableStack property of the global object. +features: [explicit-resource-management] +---*/ + +assert.sameValue( + typeof DisposableStack, 'function', + 'typeof DisposableStack is function' +); diff --git a/test/built-ins/DisposableStack/prototype-from-newtarget-abrupt.js b/test/built-ins/DisposableStack/prototype-from-newtarget-abrupt.js new file mode 100644 index 0000000000..9543b4a134 --- /dev/null +++ b/test/built-ins/DisposableStack/prototype-from-newtarget-abrupt.js @@ -0,0 +1,42 @@ +// Copyright (C) 2023 Ron Buckton. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-disposablestack +description: > + Return abrupt from getting the NewTarget prototype +info: | + DisposableStack ( ) + + ... + 2. Let disposableStack be ? OrdinaryCreateFromConstructor(NewTarget, "%DisposableStack.prototype%", « [[DisposableState]], [[DisposeCapability]] »). + 3. Set disposableStack.[[DisposableState]] to pending. + 4. Set disposableStack.[[DisposeCapability]] to NewDisposeCapability(). + 5. Return disposableStack. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + 3. Let proto be ? Get(constructor, 'prototype'). +features: [explicit-resource-management, Reflect.construct] +---*/ + +var calls = 0; +var newTarget = function() {}.bind(null); +Object.defineProperty(newTarget, 'prototype', { + get: function() { + calls += 1; + throw new Test262Error(); + } +}); + +assert.throws(Test262Error, function() { + Reflect.construct(DisposableStack, [], newTarget); +}); + +assert.sameValue(calls, 1); diff --git a/test/built-ins/DisposableStack/prototype-from-newtarget-custom.js b/test/built-ins/DisposableStack/prototype-from-newtarget-custom.js new file mode 100644 index 0000000000..edf91b33b4 --- /dev/null +++ b/test/built-ins/DisposableStack/prototype-from-newtarget-custom.js @@ -0,0 +1,45 @@ +// Copyright (C) 2023 Ron Buckton. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-disposablestack +description: > + The [[Prototype]] internal slot is computed from NewTarget. +info: | + DisposableStack ( ) + + ... + 2. Let disposableStack be ? OrdinaryCreateFromConstructor(NewTarget, "%DisposableStack.prototype%", « [[DisposableState]], [[DisposeCapability]] »). + 3. Set disposableStack.[[DisposableState]] to pending. + 4. Set disposableStack.[[DisposeCapability]] to NewDisposeCapability(). + 5. Return disposableStack. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + 3. Let proto be ? Get(constructor, 'prototype'). + 4. If Type(proto) is not Object, then + a. Let realm be ? GetFunctionRealm(constructor). + b. Set proto to realm's intrinsic object named intrinsicDefaultProto. + 5. Return proto. +features: [explicit-resource-management, Reflect.construct] +---*/ + +var stack; + +stack = Reflect.construct(DisposableStack, [], Object); +assert.sameValue(Object.getPrototypeOf(stack), Object.prototype, 'NewTarget is built-in Object constructor'); + +var newTarget = function() {}.bind(null); +Object.defineProperty(newTarget, 'prototype', { + get: function() { + return Array.prototype; + } +}); +stack = Reflect.construct(DisposableStack, [], newTarget); +assert.sameValue(Object.getPrototypeOf(stack), Array.prototype, 'NewTarget is BoundFunction with accessor'); diff --git a/test/built-ins/DisposableStack/prototype-from-newtarget.js b/test/built-ins/DisposableStack/prototype-from-newtarget.js new file mode 100644 index 0000000000..4a01ae6038 --- /dev/null +++ b/test/built-ins/DisposableStack/prototype-from-newtarget.js @@ -0,0 +1,34 @@ +// Copyright (C) 2023 Ron Buckton. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-disposablestack +description: > + The [[Prototype]] internal slot is computed from NewTarget. +info: | + DisposableStack ( ) + + ... + 2. Let disposableStack be ? OrdinaryCreateFromConstructor(NewTarget, "%DisposableStack.prototype%", « [[DisposableState]], [[DisposeCapability]] »). + 3. Set disposableStack.[[DisposableState]] to pending. + 4. Set disposableStack.[[DisposeCapability]] to NewDisposeCapability(). + 5. Return disposableStack. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + 3. Let proto be ? Get(constructor, 'prototype'). + 4. If Type(proto) is not Object, then + a. Let realm be ? GetFunctionRealm(constructor). + b. Set proto to realm's intrinsic object named intrinsicDefaultProto. + 5. Return proto. +features: [explicit-resource-management] +---*/ + +var stack = new DisposableStack(); +assert.sameValue(Object.getPrototypeOf(stack), DisposableStack.prototype); diff --git a/test/built-ins/DisposableStack/undefined-newtarget-throws.js b/test/built-ins/DisposableStack/undefined-newtarget-throws.js new file mode 100644 index 0000000000..a37445a023 --- /dev/null +++ b/test/built-ins/DisposableStack/undefined-newtarget-throws.js @@ -0,0 +1,18 @@ +// Copyright (C) 2023 Ron Buckton. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-disposablestack +description: > + Throws a TypeError if NewTarget is undefined. +info: | + DisposableStack ( ) + + 1. If NewTarget is undefined, throw a TypeError exception. + ... +features: [explicit-resource-management] +---*/ + +assert.throws(TypeError, function() { + DisposableStack(); +});