Skip to content

Commit

Permalink
update test262
Browse files Browse the repository at this point in the history
  • Loading branch information
devsnek committed Feb 20, 2020
1 parent 8473db6 commit c13b620
Show file tree
Hide file tree
Showing 11 changed files with 212 additions and 216 deletions.
68 changes: 34 additions & 34 deletions src/abstract-ops/weak-operations.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,11 @@ export function AddToKeptObjects(object) {
}

// https://tc39.es/proposal-weakrefs/#sec-check-for-empty-cells
export function CheckForEmptyCells(finalizationGroup) {
// 1. Assert: finalizationGroup has an [[Cells]] internal slot.
Assert('Cells' in finalizationGroup);
// 2. For each cell in finalizationGroup.[[Cells]], do
for (const cell of finalizationGroup.Cells) {
export function CheckForEmptyCells(finalizationRegistry) {
// 1. Assert: finalizationRegistry has an [[Cells]] internal slot.
Assert('Cells' in finalizationRegistry);
// 2. For each cell in finalizationRegistry.[[Cells]], do
for (const cell of finalizationRegistry.Cells) {
// a. If cell.[[WeakRefTarget]] is empty, then
if (cell.WeakRefTarget === undefined) {
// i. Return true.
Expand All @@ -40,45 +40,45 @@ export function CheckForEmptyCells(finalizationGroup) {
return Value.false;
}

// https://tc39.es/proposal-weakrefs/#sec-createfinalizationgroupcleanupiterator
function CreateFinalizationGroupCleanupIterator(finalizationGroup) {
// 1. Assert: Type(finalizationGroup) is Object.
// 2. Assert: finalizationGroup has a [[Cells]] internal slot.
X(RequireInternalSlot(finalizationGroup, 'Cells'));
// 3. Assert: finalizationGroup.[[Realm]].[[Intrinsics]].[[%FinalizationGroupCleanupIteratorPrototype%]] exists and has been initialized.
Assert(finalizationGroup.Realm.Intrinsics['%FinalizationGroupCleanupIteratorPrototype%']);
// 4. Let prototype be finalizationGroup.[[Realm]].[[Intrinsics]].[[%FinalizationGroupCleanupIteratorPrototype%]].
const prototype = finalizationGroup.Realm.Intrinsics['%FinalizationGroupCleanupIteratorPrototype%'];
// 5. Let iterator be OrdinaryObjectCreate(prototype, « [[FinalizationGroup]] »).
const iterator = OrdinaryObjectCreate(prototype, ['FinalizationGroup']);
// 6. Set iterator.[[FinalizationGroup]] to finalizationGroup.
iterator.FinalizationGroup = finalizationGroup;
// https://tc39.es/proposal-weakrefs/#sec-createfinalizationregistrycleanupiterator
function CreateFinalizationRegistryCleanupIterator(finalizationRegistry) {
// 1. Assert: Type(finalizationRegistry) is Object.
// 2. Assert: finalizationRegistry has a [[Cells]] internal slot.
X(RequireInternalSlot(finalizationRegistry, 'Cells'));
// 3. Assert: finalizationRegistry.[[Realm]].[[Intrinsics]].[[%FinalizationRegistryCleanupIteratorPrototype%]] exists and has been initialized.
Assert(finalizationRegistry.Realm.Intrinsics['%FinalizationRegistryCleanupIteratorPrototype%']);
// 4. Let prototype be finalizationRegistry.[[Realm]].[[Intrinsics]].[[%FinalizationRegistryCleanupIteratorPrototype%]].
const prototype = finalizationRegistry.Realm.Intrinsics['%FinalizationRegistryCleanupIteratorPrototype%'];
// 5. Let iterator be OrdinaryObjectCreate(prototype, « [[FinalizationRegistry]] »).
const iterator = OrdinaryObjectCreate(prototype, ['FinalizationRegistry']);
// 6. Set iterator.[[FinalizationRegistry]] to finalizationRegistry.
iterator.FinalizationRegistry = finalizationRegistry;
// 7. Return iterator.
return iterator;
}

// https://tc39.es/proposal-weakrefs/#sec-cleanup-finalization-group
export function CleanupFinalizationGroup(finalizationGroup, callback) {
// 1. Assert: finalizationGroup has [[Cells]], [[CleanupCallback]], and [[IsFinalizationGroupCleanupJobActive]] internal slots.
Assert('Cells' in finalizationGroup);
// 2. If CheckForEmptyCells(finalizationGroup) is false, return.
if (CheckForEmptyCells(finalizationGroup) === Value.false) {
// https://tc39.es/proposal-weakrefs/#sec-cleanup-finalization-registry
export function CleanupFinalizationRegistry(finalizationRegistry, callback) {
// 1. Assert: finalizationRegistry has [[Cells]], [[CleanupCallback]], and [[IsFinalizationRegistryCleanupJobActive]] internal slots.
Assert('Cells' in finalizationRegistry);
// 2. If CheckForEmptyCells(finalizationRegistry) is false, return.
if (CheckForEmptyCells(finalizationRegistry) === Value.false) {
return NormalCompletion(Value.undefined);
}
// 3. Let iterator be ! CreateFinalizationGroupCleanupIterator(finalizationGroup).
const iterator = X(CreateFinalizationGroupCleanupIterator(finalizationGroup));
// 4. If callback is not present or undefined, set callback to finalizationGroup.[[CleanupCallback]].
// 3. Let iterator be ! CreateFinalizationRegistryCleanupIterator(finalizationRegistry).
const iterator = X(CreateFinalizationRegistryCleanupIterator(finalizationRegistry));
// 4. If callback is not present or undefined, set callback to finalizationRegistry.[[CleanupCallback]].
if (callback === undefined || callback === Value.undefined) {
callback = finalizationGroup.CleanupCallback;
callback = finalizationRegistry.CleanupCallback;
}
// 5. Set finalizationGroup.[[IsFinalizationGroupCleanupJobActive]] to true.
finalizationGroup.IsFinalizationGroupCleanupJobActive = true;
// 5. Set finalizationRegistry.[[IsFinalizationRegistryCleanupJobActive]] to true.
finalizationRegistry.IsFinalizationRegistryCleanupJobActive = true;
// 6. Let result be Call(callback, undefined, « iterator »).
const result = Call(callback, Value.undefined, [iterator]);
// 7. Set finalizationGroup.[[IsFinalizationGroupCleanupJobActive]] to false.
finalizationGroup.IsFinalizationGroupCleanupJobActive = false;
// 8. Set iterator.[[FinalizationGroup]] to empty.
iterator.FinalizationGroup = undefined;
// 7. Set finalizationRegistry.[[IsFinalizationRegistryCleanupJobActive]] to false.
finalizationRegistry.IsFinalizationRegistryCleanupJobActive = false;
// 8. Set iterator.[[FinalizationRegistry]] to empty.
iterator.FinalizationRegistry = undefined;
// 9. If result is an abrupt completion, return result.
if (result instanceof AbruptCompletion) {
return result;
Expand Down
8 changes: 4 additions & 4 deletions src/api.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
setSurroundingAgent,
Agent,
HostReportErrors,
HostCleanupFinalizationGroup,
HostCleanupFinalizationRegistry,
FEATURES,
} from './engine.mjs';
import {
Expand Down Expand Up @@ -52,9 +52,9 @@ function mark() {
// 1. For each obj os S, do
// a. For each WeakRef ref such that ref.[[WeakRefTarget]] is obj,
// i. Set ref.[[WeakRefTarget]] to empty.
// b. For each FinalizationGroup fg such that fg.[[Cells]] contains cell, such that cell.[[WeakRefTarget]] is obj,
// b. For each FinalizationRegistry fg such that fg.[[Cells]] contains cell, such that cell.[[WeakRefTarget]] is obj,
// i. Set cell.[[WeakRefTarget]] to empty.
// ii. Optionally, perform ! HostCleanupFinalizationGroup(fg).
// ii. Optionally, perform ! HostCleanupFinalizationRegistry(fg).
// c. For each WeakMap map such that map.WeakMapData contains a record r such that r.Key is obj,
// i. Remove r from map.WeakMapData.
// d. For each WeakSet set such that set.WeakSetData contains obj,
Expand Down Expand Up @@ -122,7 +122,7 @@ function mark() {
}
});
if (dirty) {
X(HostCleanupFinalizationGroup(fg));
X(HostCleanupFinalizationRegistry(fg));
}
});
}
Expand Down
12 changes: 6 additions & 6 deletions src/engine.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import {
import {
Call, Construct, Assert, GetModuleNamespace,
PerformPromiseThen, CreateBuiltinFunction,
CleanupFinalizationGroup,
CleanupFinalizationRegistry,
} from './abstract-ops/all.mjs';
import { GlobalDeclarationInstantiation } from './runtime-semantics/all.mjs';
import { Evaluate_Script } from './evaluator.mjs';
Expand Down Expand Up @@ -433,17 +433,17 @@ export function HostFinalizeImportMeta(importMeta, moduleRecord) {
return Value.undefined;
}

// https://tc39.es/proposal-weakrefs/#sec-host-cleanup-finalization-group
// https://tc39.es/proposal-weakrefs/#sec-host-cleanup-finalization-registry
const scheduledForCleanup = new Set();
export function HostCleanupFinalizationGroup(fg) {
if (surroundingAgent.hostDefinedOptions.cleanupFinalizationGroup !== undefined) {
Q(surroundingAgent.hostDefinedOptions.cleanupFinalizationGroup(fg));
export function HostCleanupFinalizationRegistry(fg) {
if (surroundingAgent.hostDefinedOptions.cleanupFinalizationRegistry !== undefined) {
Q(surroundingAgent.hostDefinedOptions.cleanupFinalizationRegistry(fg));
} else {
if (!scheduledForCleanup.has(fg)) {
scheduledForCleanup.add(fg);
EnqueueJob('FinalizationCleanup', () => {
scheduledForCleanup.delete(fg);
CleanupFinalizationGroup(fg);
CleanupFinalizationRegistry(fg);
}, []);
}
}
Expand Down
43 changes: 0 additions & 43 deletions src/intrinsics/FinalizationGroupCleanupIteratorPrototype.mjs

This file was deleted.

103 changes: 0 additions & 103 deletions src/intrinsics/FinalizationGroupPrototype.mjs

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,22 @@ import { IsCallable, OrdinaryCreateFromConstructor } from '../abstract-ops/all.m
import { Q } from '../completion.mjs';
import { BootstrapConstructor } from './Bootstrap.mjs';

// https://tc39.es/proposal-weakrefs/#sec-finalization-group-cleanup-callback
function FinalizationGroupConstructor([cleanupCallback = Value.undefined], { NewTarget }) {
// https://tc39.es/proposal-weakrefs/#sec-finalization-registry-cleanup-callback
function FinalizationRegistryConstructor([cleanupCallback = Value.undefined], { NewTarget }) {
// 1. If NewTarget is undefined, throw a TypeError exception.
if (NewTarget === Value.undefined) {
return surroundingAgent.Throw('TypeError', 'NotAFunction', 'FinalizationGroup');
return surroundingAgent.Throw('TypeError', 'NotAFunction', 'FinalizationRegistry');
}
// 2. If IsCallable(cleanupCallback) is false, throw a TypeError exception.
if (IsCallable(cleanupCallback) === Value.false) {
return surroundingAgent.Throw('TypeError', 'NotAFunction', cleanupCallback);
}
// 3. Let finalizationGroup be ? OrdinaryCreateFromConstructor(NewTarget, "%FinalizationGroupPrototype%", « [[Realm]], [[CleanupCallback]], [[Cells]], [[IsFinalizationGroupCleanupJobActive]] »).
const finalizationGroup = Q(OrdinaryCreateFromConstructor(NewTarget, '%FinalizationGroup.prototype%', [
// 3. Let finalizationGroup be ? OrdinaryCreateFromConstructor(NewTarget, "%FinalizationRegistryPrototype%", « [[Realm]], [[CleanupCallback]], [[Cells]], [[IsFinalizationRegistryCleanupJobActive]] »).
const finalizationGroup = Q(OrdinaryCreateFromConstructor(NewTarget, '%FinalizationRegistry.prototype%', [
'Realm',
'CleanupCallback',
'Cells',
'IsFinalizationGroupCleanupJobActive',
'IsFinalizationRegistryCleanupJobActive',
]));
// 4. Let fn be the active function object.
const fn = surroundingAgent.activeFunctionObject;
Expand All @@ -29,17 +29,17 @@ function FinalizationGroupConstructor([cleanupCallback = Value.undefined], { New
finalizationGroup.CleanupCallback = cleanupCallback;
// 7. Set finalizationGroup.[[Cells]] to be an empty List.
finalizationGroup.Cells = [];
// 8. Set finalizationGroup.[[IsFinalizationGroupCleanupJobActive]] to false.
finalizationGroup.IsFinalizationGroupCleanupJobActive = false;
// 8. Set finalizationGroup.[[IsFinalizationRegistryCleanupJobActive]] to false.
finalizationGroup.IsFinalizationRegistryCleanupJobActive = false;
// 9. Return finalizationGroup.
return finalizationGroup;
}

export function BootstrapFinalizationGroup(realmRec) {
const finalizationGroupConstructor = BootstrapConstructor(
realmRec, FinalizationGroupConstructor, 'FinalizationGroup', 1,
realmRec.Intrinsics['%FinalizationGroup.prototype%'], [],
export function BootstrapFinalizationRegistry(realmRec) {
const cons = BootstrapConstructor(
realmRec, FinalizationRegistryConstructor, 'FinalizationRegistry', 1,
realmRec.Intrinsics['%FinalizationRegistry.prototype%'], [],
);

realmRec.Intrinsics['%FinalizationGroup%'] = finalizationGroupConstructor;
realmRec.Intrinsics['%FinalizationRegistry%'] = cons;
}
Loading

0 comments on commit c13b620

Please sign in to comment.