Adapt descriptions of existing tests using Objects as weak values

There are many existing tests for WeakMap, WeakSet, WeakRef, and
FinalizationRegistry using Objects as weak values. For symbols-as-weakmap-
keys, we'll want to write tests that parallel these for Symbol keys.

Change the descriptions and filenames of these tests to describe their new
scope of only Object weak values.

Update the front matter of these tests while we're at it, to reflect the
changes to the spec text that the symbols-as-weakmap-keys brings in. (In
some cases, remove irrelevant bits of the front matter.)

See: #2850
This commit is contained in:
Philip Chimento 2022-09-23 14:40:58 -07:00 committed by Ms2ger
parent 6291e42a72
commit d101ab9bc4
26 changed files with 288 additions and 342 deletions

View File

@ -4,27 +4,26 @@
/*--- /*---
esid: sec-finalization-registry-target esid: sec-finalization-registry-target
description: > description: >
cleanupCallback has only one optional chance to be called for a GC that cleans up cleanupCallback has only one optional chance to be called for a GC that cleans
a registered target. up a registered Object target.
info: | info: |
FinalizationRegistry ( cleanupCallback ) FinalizationRegistry.prototype.cleanupSome ( [ _callback_ ] )
3. If _callback_ is present and IsCallable(_callback_) is *false*, throw a
FinalizationRegistry.prototype.cleanupSome ( [ callback ] ) *TypeError* exception.
4. Perform ? CleanupFinalizationRegistry(_finalizationRegistry_, _callback_).
... 5. Return *undefined*.
4. If callback is not undefined and IsCallable(callback) is false, throw a TypeError exception.
5. Perform ? CleanupFinalizationRegistry(finalizationRegistry, callback).
6. Return undefined.
Execution Execution
At any time, if an object obj is not live, an ECMAScript implementation may perform the following steps atomically: At any time, if a set of objects and/or symbols _S_ is not live, an ECMAScript
implementation may perform the following steps atomically:
1. For each WeakRef ref such that ref.[[Target]] is obj, 1. For each element _value_ of _S_, do
a. Set ref.[[Target]] to empty. ...
2. For each FinalizationRegistry finalizationRegistry such that finalizationRegistry.[[Cells]] contains cell, such that cell.[[Target]] is obj, b. For each FinalizationRegistry _fg_ such that _fg_.[[Cells]] contains a
a. Set cell.[[Target]] to empty. Record _cell_ such that _cell_.[[WeakRefTarget]] is _value_,
b. Optionally, perform ! HostCleanupFinalizationRegistry(finalizationRegistry). i. Set _cell_.[[WeakRefTarget]] to ~empty~.
ii. Optionally, perform HostEnqueueFinalizationRegistryCleanupJob(_fg_).
features: [FinalizationRegistry.prototype.cleanupSome, FinalizationRegistry, async-functions, host-gc-required] features: [FinalizationRegistry.prototype.cleanupSome, FinalizationRegistry, async-functions, host-gc-required]
flags: [async, non-deterministic] flags: [async, non-deterministic]
includes: [async-gc.js, compareArray.js] includes: [async-gc.js, compareArray.js]
@ -65,7 +64,7 @@ emptyCells().then(async function() {
// optional. Although, we can finally assert it's not gonna be called anymore // optional. Although, we can finally assert it's not gonna be called anymore
// for the other executions of the Garbage Collector. // for the other executions of the Garbage Collector.
// The chance of having it called only happens right after the // The chance of having it called only happens right after the
// cell.[[Target]] is set to empty. // cell.[[WeakRefTarget]] is set to empty.
assert(cleanupCallback >= 0, 'cleanupCallback might be 0'); assert(cleanupCallback >= 0, 'cleanupCallback might be 0');
assert(cleanupCallback <= 1, 'cleanupCallback might be 1'); assert(cleanupCallback <= 1, 'cleanupCallback might be 1');

View File

@ -0,0 +1,19 @@
// Copyright (C) 2019 Leo Balter. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-finalization-registry.prototype.register
description: heldValue may be the same as target
info: |
FinalizationRegistry.prototype.register ( _target_ , _heldValue_ [, _unregisterToken_ ] )
1. Let _finalizationRegistry_ be the *this* value.
2. Perform ? RequireInternalSlot(_finalizationRegistry_, [[Cells]]).
3. If CanBeHeldWeakly(_target_) is *false*, throw a *TypeError* exception.
4. If SameValue(_target_, _heldValue_) is *true*, throw a *TypeError* exception.
features: [FinalizationRegistry]
---*/
var finalizationRegistry = new FinalizationRegistry(function() {});
var target = {};
assert.throws(TypeError, () => finalizationRegistry.register(target, target));

View File

@ -1,21 +0,0 @@
// Copyright (C) 2019 Leo Balter. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-finalization-registry.prototype.register
description: holdings may be the same as target
info: |
FinalizationRegistry.prototype.register ( target , holdings [, unregisterToken ] )
1. Let finalizationRegistry be the this value.
2. If Type(finalizationRegistry) is not Object, throw a TypeError exception.
3. If finalizationRegistry does not have a [[Cells]] internal slot, throw a TypeError exception.
4. If Type(target) is not Object, throw a TypeError exception.
5. If SameValue(target, holdings), throw a TypeError exception.
features: [FinalizationRegistry]
---*/
var finalizationRegistry = new FinalizationRegistry(function() {});
var target = {};
assert.throws(TypeError, () => finalizationRegistry.register(target, target));

View File

@ -3,20 +3,21 @@
/*--- /*---
esid: sec-finalization-registry.prototype.register esid: sec-finalization-registry.prototype.register
description: Return undefined after registering description: Return undefined after registering an Object
info: | info: |
FinalizationRegistry.prototype.register ( target , holdings [, unregisterToken ] ) FinalizationRegistry.prototype.register ( _target_ , _heldValue_ [, _unregisterToken_ ] )
1. Let _finalizationRegistry_ be the *this* value.
1. Let finalizationRegistry be the this value. 2. Perform ? RequireInternalSlot(_finalizationRegistry_, [[Cells]]).
2. If Type(finalizationRegistry) is not Object, throw a TypeError exception. 3. If CanBeHeldWeakly(_target_) is *false*, throw a *TypeError* exception.
3. If Type(target) is not Object, throw a TypeError exception. 4. If SameValue(_target_, _heldValue_) is *true*, throw a *TypeError*
4. If finalizationRegistry does not have a [[Cells]] internal slot, throw a TypeError exception. exception.
5. If Type(unregisterToken) is not Object, 5. If CanBeHeldWeakly(_unregisterToken_) is *false*,
a. If unregisterToken is not undefined, throw a TypeError exception. a. If _unregisterToken_ is not *undefined*, throw a *TypeError* exception.
b. Set unregisterToken to empty. b. Set _unregisterToken_ to ~empty~.
6. Let cell be the Record { [[Target]] : target, [[Holdings]]: holdings, [[UnregisterToken]]: unregisterToken }. 6. Let _cell_ be the Record { [[WeakRefTarget]]: _target_, [[HeldValue]]:
7. Append cell to finalizationRegistry.[[Cells]]. _heldValue_, [[UnregisterToken]]: _unregisterToken_ }.
8. Return undefined. 7. Append _cell_ to _finalizationRegistry_.[[Cells]].
8. Return *undefined*.
features: [FinalizationRegistry] features: [FinalizationRegistry]
---*/ ---*/
@ -24,7 +25,7 @@ var fn = function() {};
var finalizationRegistry = new FinalizationRegistry(fn); var finalizationRegistry = new FinalizationRegistry(fn);
var target = {}; var target = {};
assert.sameValue(finalizationRegistry.register(target), undefined, 'Register a targer'); assert.sameValue(finalizationRegistry.register(target), undefined, 'Register a target');
assert.sameValue(finalizationRegistry.register(target), undefined, 'Register the same target again'); assert.sameValue(finalizationRegistry.register(target), undefined, 'Register the same target again');
assert.sameValue(finalizationRegistry.register(target), undefined, 'Register the same target again and again'); assert.sameValue(finalizationRegistry.register(target), undefined, 'Register the same target again and again');

View File

@ -1,65 +0,0 @@
// Copyright (C) 2019 Mathieu Hofman. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-finalization-registry.prototype.unregister
description: Cannot unregister a cell that has been cleaned up
info: |
FinalizationRegistry.prototype.cleanupSome ( [ callback ] )
1. Let finalizationRegistry be the this value.
...
5. Perform ! CleanupFinalizationRegistry(finalizationRegistry, callback).
...
CleanupFinalizationRegistry ( finalizationRegistry [ , callback ] )
...
3. While finalizationRegistry.[[Cells]] contains a Record cell such that cell.[[WeakRefTarget]] is ~empty~, then an implementation may perform the following steps,
a. Choose any such cell.
b. Remove cell from finalizationRegistry.[[Cells]].
c. Perform ? Call(callback, undefined, << cell.[[HeldValue]] >>).
...
FinalizationRegistry.prototype.unregister ( unregisterToken )
1. Let removed be false.
2. For each Record { [[Target]], [[Holdings]], [[UnregisterToken]] } cell that is an element of finalizationRegistry.[[Cells]], do
a. If SameValue(cell.[[UnregisterToken]], unregisterToken) is true, then
i. Remove cell from finalizationRegistry.[[Cells]].
ii. Set removed to true.
3. Return removed.
features: [FinalizationRegistry.prototype.cleanupSome, FinalizationRegistry, host-gc-required]
includes: [async-gc.js]
flags: [async, non-deterministic]
---*/
var value = 'target!';
var token = {};
var finalizationRegistry = new FinalizationRegistry(function() {});
function emptyCells() {
var target = {};
finalizationRegistry.register(target, value, token);
var prom = asyncGC(target);
target = null;
return prom;
}
emptyCells().then(function() {
var called = 0;
var holdings = [];
finalizationRegistry.cleanupSome(function cb(holding) {
called += 1;
holdings.push(holding);
});
assert.sameValue(called, 1);
assert.sameValue(holdings.length, 1);
assert.sameValue(holdings[0], value);
var res = finalizationRegistry.unregister(token);
assert.sameValue(res, false, 'unregister after iterating over it in cleanup');
}).then($DONE, resolveAsyncGC);

View File

@ -0,0 +1,63 @@
// Copyright (C) 2019 Mathieu Hofman. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-finalization-registry.prototype.unregister
description: >
Cannot unregister a cell referring to an Object that has been cleaned up
info: |
FinalizationRegistry.prototype.cleanupSome ( [ _callback_ ] )
4. Perform ? CleanupFinalizationRegistry(_finalizationRegistry_, _callback_).
CleanupFinalizationRegistry ( _finalizationRegistry_ ):
3. While _finalizationRegistry_.[[Cells]] contains a Record _cell_ such that
_cell_.[[WeakRefTarget]] is ~empty~, then an implementation may perform the
following steps:
a. Choose any such _cell_.
b. Remove _cell_ from _finalizationRegistry_.[[Cells]].
c. Perform ? HostCallJobCallback(_callback_, *undefined*,
« _cell_.[[HeldValue]] »).
FinalizationRegistry.prototype.unregister ( _unregisterToken_ )
4. Let _removed_ be *false*.
5. For each Record { [[WeakRefTarget]], [[HeldValue]], [[UnregisterToken]] }
_cell_ of _finalizationRegistry_.[[Cells]], do
a. If _cell_.[[UnregisterToken]] is not ~empty~ and
SameValue(_cell_.[[UnregisterToken]], _unregisterToken_) is *true*, then
i. Remove _cell_ from _finalizationRegistry_.[[Cells]].
ii. Set _removed_ to *true*.
6. Return _removed_.
features: [FinalizationRegistry.prototype.cleanupSome, FinalizationRegistry, host-gc-required]
includes: [async-gc.js]
flags: [async, non-deterministic]
---*/
var value = 'target!';
var token = {};
var finalizationRegistry = new FinalizationRegistry(function() {});
function emptyCells() {
var target = {};
finalizationRegistry.register(target, value, token);
var prom = asyncGC(target);
target = null;
return prom;
}
emptyCells().then(function() {
var called = 0;
var holdings = [];
finalizationRegistry.cleanupSome(function cb(holding) {
called += 1;
holdings.push(holding);
});
assert.sameValue(called, 1);
assert.sameValue(holdings.length, 1);
assert.sameValue(holdings[0], value);
var res = finalizationRegistry.unregister(token);
assert.sameValue(res, false, 'unregister after iterating over it in cleanup');
}).then($DONE, resolveAsyncGC);

View File

@ -3,20 +3,18 @@
/*--- /*---
esid: sec-finalization-registry.prototype.unregister esid: sec-finalization-registry.prototype.unregister
description: Return boolean values indicating unregistering of values from given token description: >
Return boolean values indicating unregistering of values with Object token
info: | info: |
FinalizationRegistry.prototype.unregister ( unregisterToken ) FinalizationRegistry.prototype.unregister ( _unregisterToken_ )
4. Let _removed_ be *false*.
1. Let finalizationRegistry be the this value. 5. For each Record { [[WeakRefTarget]], [[HeldValue]], [[UnregisterToken]] }
2. If Type(finalizationRegistry) is not Object, throw a TypeError exception. _cell_ of _finalizationRegistry_.[[Cells]], do
3. If finalizationRegistry does not have a [[Cells]] internal slot, throw a TypeError exception. a. If _cell_.[[UnregisterToken]] is not ~empty~ and
4. If Type(unregisterToken) is not Object, throw a TypeError exception. SameValue(_cell_.[[UnregisterToken]], _unregisterToken_) is *true*, then
5. Let removed be false. i. Remove _cell_ from _finalizationRegistry_.[[Cells]].
6. For each Record { [[Target]], [[Holdings]], [[UnregisterToken]] } cell that is an element of finalizationRegistry.[[Cells]], do ii. Set _removed_ to *true*.
a. If SameValue(cell.[[UnregisterToken]], unregisterToken) is true, then 6. Return _removed_.
i. Remove cell from finalizationRegistry.[[Cells]].
ii. Set removed to true.
7. Return removed.
features: [FinalizationRegistry] features: [FinalizationRegistry]
---*/ ---*/

View File

@ -3,14 +3,20 @@
/*--- /*---
esid: sec-weakmap-iterable esid: sec-weakmap-iterable
description: > description: >
Returns the new WeakMap adding the objects from the iterable parameter. Returns the new WeakMap adding entries from the iterable parameter, with
Object keys.
info: | info: |
WeakMap ( [ iterable ] ) WeakMap ( [ _iterable_ ] )
5. Let _adder_ be ? Get(_map_, *"set"*).
6. Return ? AddEntriesFromIterable(_map_, _iterable_, _adder_).
... AddEntriesFromIterable:
9. Repeat 3. Repeat,
k. Let status be Call(adder, map, «k.[[value]], v.[[value]]»). i. Let _status_ be Completion(Call(_adder_, _target_, « _k_, _v_ »)).
l. If status is an abrupt completion, return IteratorClose(iter, status).
WeakMap.prototype.set( _key_, _value_ ):
6. Let _p_ be the Record {[[Key]]: _key_, [[Value]]: _value_}.
7. Append _p_ as the last element of _entries_.
features: [WeakMap] features: [WeakMap]
---*/ ---*/

View File

@ -1,32 +0,0 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-weakmap.prototype.delete
description: >
Delete an entry from initial iterable.
info: |
WeakMap.prototype.delete ( value )
...
5. Let entries be the List that is the value of Ms [[WeakMapData]] internal
slot.
6. If Type(key) is not Object, return false.
7. Repeat for each Record {[[key]], [[value]]} p that is an element of
entries,
a. If p.[[key]] is not empty and SameValue(p.[[key]], key) is true, then
i. Set p.[[key]] to empty.
ii. Set p.[[value]] to empty.
iii. Return true.
...
features: [WeakMap]
---*/
var foo = {};
var map = new WeakMap([
[foo, 42]
]);
var result = map.delete(foo);
assert.sameValue(map.has(foo), false);
assert.sameValue(result, true, 'WeakMap#delete returns true');

View File

@ -0,0 +1,28 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-weakmap.prototype.delete
description: >
Delete an entry with an Object key, added from initial iterable.
info: |
WeakMap.prototype.delete ( _key_ )
3. Let _entries_ be the List that is _M_.[[WeakMapData]].
4. If CanBeHeldWeakly(_key_) is *false*, return *false*.
5. For each Record {[[Key]], [[Value]]} _p_ of _entries_, do
a. If _p_.[[Key]] is not ~empty~ and SameValue(_p_.[[Key]], _key_) is
*true*, then
i. Set _p_.[[Key]] to ~empty~.
ii. Set _p_.[[Value]] to ~empty~.
iii. Return *true*.
features: [WeakMap]
---*/
var foo = {};
var map = new WeakMap([
[foo, 42]
]);
var result = map.delete(foo);
assert.sameValue(map.has(foo), false);
assert.sameValue(result, true, 'WeakMap#delete returns true');

View File

@ -0,0 +1,28 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-weakmap.prototype.delete
description: >
Delete an entry with an Object key.
info: |
WeakMap.prototype.delete ( _key_ )
3. Let _entries_ be the List that is _M_.[[WeakMapData]].
4. If CanBeHeldWeakly(_key_) is *false*, return *false*.
5. For each Record {[[Key]], [[Value]]} _p_ of _entries_, do
a. If _p_.[[Key]] is not ~empty~ and SameValue(_p_.[[Key]], _key_) is
*true*, then
i. Set _p_.[[Key]] to ~empty~.
ii. Set _p_.[[Value]] to ~empty~.
iii. Return *true*.
features: [WeakMap]
---*/
var foo = {};
var map = new WeakMap();
map.set(foo, 42);
var result = map.delete(foo);
assert.sameValue(map.has(foo), false);
assert.sameValue(result, true, 'WeakMap#delete returns true');

View File

@ -1,32 +0,0 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-weakmap.prototype.delete
description: >
Delete an entry.
info: |
WeakMap.prototype.delete ( value )
...
5. Let entries be the List that is the value of Ms [[WeakMapData]] internal
slot.
6. If Type(key) is not Object, return false.
7. Repeat for each Record {[[key]], [[value]]} p that is an element of
entries,
a. If p.[[key]] is not empty and SameValue(p.[[key]], key) is true, then
i. Set p.[[key]] to empty.
ii. Set p.[[value]] to empty.
iii. Return true.
...
features: [WeakMap]
---*/
var foo = {};
var map = new WeakMap();
map.set(foo, 42);
var result = map.delete(foo);
assert.sameValue(map.has(foo), false);
assert.sameValue(result, true, 'WeakMap#delete returns true');

View File

@ -3,13 +3,10 @@
/*--- /*---
esid: sec-weakmap.prototype.delete esid: sec-weakmap.prototype.delete
description: > description: >
Return false if entry is not in the WeakMap. Return false if an Object key is not in the WeakMap.
info: | info: |
WeakMap.prototype.delete ( value ) WeakMap.prototype.delete ( _key_ )
6. Return *false*.
...
7. Return false.
features: [WeakMap] features: [WeakMap]
---*/ ---*/

View File

@ -3,19 +3,15 @@
/*--- /*---
esid: sec-weakmap.prototype.get esid: sec-weakmap.prototype.get
description: > description: >
Returns undefined when key is not on the WeakMap object. Returns undefined when an Object key is not on the WeakMap object.
info: | info: |
WeakMap.prototype.get ( key ) WeakMap.prototype.get ( _key_ )
3. Let _entries_ be the List that is _M_.[[WeakMapData]].
4. Let entries be the List that is the value of Ms [[WeakMapData]] internal 4. If CanBeHeldWeakly(_key_) is *false*, return *undefined*.
slot. 5. For each Record {[[Key]], [[Value]]} _p_ of _entries_, do
5. If Type(key) is not Object, return undefined. a. If _p_.[[Key]] is not empty and SameValue(_p_.[[Key]], _key_) is *true*,
6. Repeat for each Record {[[key]], [[value]]} p that is an element of return _p_.[[Value]].
entries, 6. Return *undefined*.
a. If p.[[key]] is not empty and SameValue(p.[[key]], key) is true, return
p.[[value]].
7. Return undefined.
...
features: [WeakMap] features: [WeakMap]
---*/ ---*/

View File

@ -3,18 +3,14 @@
/*--- /*---
esid: sec-weakmap.prototype.get esid: sec-weakmap.prototype.get
description: > description: >
Returns the value from the specified key Returns the value from the specified Object key
info: | info: |
WeakMap.prototype.get ( key ) WeakMap.prototype.get ( _key_ )
3. Let _entries_ be the List that is _M_.[[WeakMapData]].
4. Let entries be the List that is the value of Ms [[WeakMapData]] internal 4. If CanBeHeldWeakly(_key_) is *false*, return *undefined*.
slot. 5. For each Record {[[Key]], [[Value]]} _p_ of _entries_, do
5. If Type(key) is not Object, return undefined. a. If _p_.[[Key]] is not ~empty~ and SameValue(_p_.[[Key]], _key_) is
6. Repeat for each Record {[[key]], [[value]]} p that is an element of *true*, return _p_.[[Value]].
entries,
a. If p.[[key]] is not empty and SameValue(p.[[key]], key) is true, return
p.[[value]].
...
features: [WeakMap] features: [WeakMap]
---*/ ---*/

View File

@ -3,12 +3,10 @@
/*--- /*---
esid: sec-weakmap.prototype.has esid: sec-weakmap.prototype.has
description: > description: >
Return false when value is not present in the WeakMap entries. Return false when an Object key is not present in the WeakMap entries.
info: | info: |
WeakMap.prototype.has ( value ) WeakMap.prototype.has ( _key_ )
6. Return *false*.
...
7. Return false.
features: [WeakMap] features: [WeakMap]
---*/ ---*/

View File

@ -3,16 +3,12 @@
/*--- /*---
esid: sec-weakmap.prototype.has esid: sec-weakmap.prototype.has
description: > description: >
Returns true when value is present in the WeakMap entries list. Returns true when an Object key is present in the WeakMap entries list.
info: | info: |
WeakMap.prototype.has ( value ) WeakMap.prototype.has ( _key_ )
5. For each Record {[[Key]], [[Value]]} _p_ of _entries_, do
... a. If _p_.[[Key]] is not ~empty~ and SameValue(_p_.[[Key]], _key_) is
6. Repeat for each Record {[[key]], [[value]]} p that is an element of *true*, return *true*.
entries,
a. If p.[[key]] is not empty and SameValue(p.[[key]], key) is true, return
true.
...
features: [WeakMap] features: [WeakMap]
---*/ ---*/

View File

@ -3,14 +3,11 @@
/*--- /*---
esid: sec-weakmap.prototype.set esid: sec-weakmap.prototype.set
description: > description: >
Appends value as the last element of entries. Adds a value with an Object key.
info: | info: |
WeakMap.prototype.set ( key, value ) WeakMap.prototype.set ( _key_, _value_ )
6. Let _p_ be the Record {[[Key]]: _key_, [[Value]]: _value_}.
... 7. Append _p_ as the last element of _entries_.
7. Let p be the Record {[[key]]: key, [[value]]: value}.
8. Append p as the last element of entries.
...
features: [WeakMap] features: [WeakMap]
---*/ ---*/

View File

@ -3,16 +3,16 @@
/*--- /*---
esid: sec-weak-ref.prototype.deref esid: sec-weak-ref.prototype.deref
description: Return target if weakRef.[[Target]] is not empty description: Return an Object target if weakRef.[[Target]] is not empty
info: | info: |
WeakRef.prototype.deref () WeakRef.prototype.deref ()
3. Return WeakRefDeref(_weakRef_).
... WeakRefDeref( _weakRef_ ):
4. Let target be the value of weakRef.[[Target]]. 1. Let _target_ be _weakRef_.[[WeakRefTarget]].
5. If target is not empty, 2. If _target_ is not ~empty~,
a. Perform ! KeepDuringJob(target). a. Perform AddToKeptObjects(_target_).
b. Return target. b. Return _target_.
6. Return undefined.
features: [WeakRef] features: [WeakRef]
---*/ ---*/

View File

@ -0,0 +1,35 @@
// Copyright (C) 2019 Leo Balter. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-weak-ref-target
description: >
Returns a new ordinary object from the WeakRef constructor when called with an
Object target
info: |
WeakRef ( _target_ )
3. Let _weakRef_ be ? OrdinaryCreateFromConstructor(NewTarget,
*"%WeakRefPrototype%"*, « [[WeakRefTarget]] »).
4. Perfom AddToKeptObjects(_target_).
5. Set _weakRef_.[[WeakRefTarget]] to _target_.
6. Return _weakRef_.
features: [WeakRef]
---*/
var target = {};
var wr = new WeakRef(target);
assert.notSameValue(wr, target, 'does not return the same object');
assert.sameValue(wr instanceof WeakRef, true, 'instanceof');
for (let key of Object.getOwnPropertyNames(wr)) {
assert(false, `should not set any own named properties: ${key}`);
}
for (let key of Object.getOwnPropertySymbols(wr)) {
assert(false, `should not set any own symbol properties: ${String(key)}`);
}
assert.sameValue(Object.getPrototypeOf(wr), WeakRef.prototype);

View File

@ -1,49 +0,0 @@
// Copyright (C) 2019 Leo Balter. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-weak-ref-target
description: >
Returns a new ordinary object from the WeakRef constructor
info: |
WeakRef ( target )
...
3. Let weakRef be ? OrdinaryCreateFromConstructor(NewTarget, "%WeakRefPrototype%", « [[Target]] »).
4. Perfom ! KeepDuringJob(target).
5. Set weakRef.[[Target]] to target.
6. Return weakRef.
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: [WeakRef]
---*/
var target = {};
var wr = new WeakRef(target);
assert.notSameValue(wr, target, 'does not return the same object');
assert.sameValue(wr instanceof WeakRef, true, 'instanceof');
for (let key of Object.getOwnPropertyNames(wr)) {
assert(false, `should not set any own named properties: ${key}`);
}
for (let key of Object.getOwnPropertySymbols(wr)) {
assert(false, `should not set any own symbol properties: ${String(key)}`);
}
assert.sameValue(Object.getPrototypeOf(wr), WeakRef.prototype);

View File

@ -3,14 +3,14 @@
/*--- /*---
esid: sec-weakset-iterable esid: sec-weakset-iterable
description: > description: >
Returns the new WeakSet adding the objects from the iterable parameter. Returns the new WeakSet adding Object values from the iterable parameter.
info: | info: |
WeakSet ( [ iterable ] ) WeakSet ( [ _iterable_ ] )
8. Repeat,
d. Let _status_ be Completion(Call(_adder_, _set_, « _nextValue_ »)).
... WeakSet.prototype.add ( _value_ ):
9. Repeat 6. Append _value_ as the last element of _entries_.
f. Let status be Call(adder, set, «nextValue»).
g. If status is an abrupt completion, return IteratorClose(iter, status).
features: [WeakSet] features: [WeakSet]
---*/ ---*/

View File

@ -3,13 +3,10 @@
/*--- /*---
esid: sec-weakset.prototype.add esid: sec-weakset.prototype.add
description: > description: >
Appends value as the last element of entries. Adds an Object value.
info: | info: |
WeakSet.prototype.add ( value ) WeakSet.prototype.add ( _value_ )
6. Append _value_ as the last element of _entries_.
...
7. Append value as the last element of entries.
...
features: [WeakSet] features: [WeakSet]
---*/ ---*/

View File

@ -3,19 +3,15 @@
/*--- /*---
esid: sec-weakset.prototype.delete esid: sec-weakset.prototype.delete
description: > description: >
Delete an entry. Delete an entry that is an Object
info: | info: |
WeakSet.prototype.delete ( value ) WeakSet.prototype.delete ( _value_ )
4. Let _entries_ be the List that is _S_.[[WeakSetData]].
... 5. For each element _e_ of _entries_, do
5. Let entries be the List that is the value of Ss [[WeakSetData]] internal a. If _e_ is not ~empty~ and SameValue(_e_, _value_) is *true*, then
slot. i. Replace the element of _entries_ whose value is _e_ with an element
6. Repeat for each e that is an element of entries, whose value is ~empty~.
a. If e is not empty and SameValue(e, value) is true, then ii. Return *true*.
i. Replace the element of entries whose value is e with an element whose
value is empty.
ii. Return true.
...
features: [WeakSet] features: [WeakSet]
---*/ ---*/

View File

@ -3,12 +3,10 @@
/*--- /*---
esid: sec-weakset.prototype.has esid: sec-weakset.prototype.has
description: > description: >
Return false when value is not present in the WeakSet entries. Return false when an Object value is not present in the WeakSet entries.
info: | info: |
WeakSet.prototype.has ( value ) WeakSet.prototype.has ( _value_ )
6. Return *false*.
...
7. Return false.
features: [WeakSet] features: [WeakSet]
---*/ ---*/

View File

@ -3,14 +3,11 @@
/*--- /*---
esid: sec-weakset.prototype.has esid: sec-weakset.prototype.has
description: > description: >
Returns true when value is present in the WeakSet entries list. Returns true when an Object value is present in the WeakSet entries list.
info: | info: |
WeakSet.prototype.has ( value ) WeakSet.prototype.has ( _value_ )
5. For each element _e_ of _entries_, do
... a. If _e_ is not ~empty~ and SameValue(_e_, _value_) is *true*, return *true*.
6. Repeat for each e that is an element of entries,
a. If e is not empty and SameValue(e, value) is true, return true.
...
features: [WeakSet] features: [WeakSet]
---*/ ---*/