Skip to content

Commit f926f6a

Browse files
committed
chore: make GC tools optional to support Node.js v12
Node.js v14 provides `WeakRef` and `FinalizationRegistry` as globals. Node.js v12 does not (there might be a command-line flag to enable it, but I think it's marked as experimental). Rather than require all users upgrade to v14, we elect to disable GC when running on v12. This change attempts to pull `WeakRef` and `FinalizationRegistry` from the global, and deliver either the real constructors or `undefined` to the liveslots code that uses it. We'll write that liveslots code to tolerate their lack. refs #1872 refs #1925
1 parent 5afcfeb commit f926f6a

9 files changed

+27
-10
lines changed

packages/SwingSet/src/controller.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* global Compartment WeakRef FinalizationRegistry */
1+
/* global Compartment */
22

33
import fs from 'fs';
44
import path from 'path';
@@ -18,6 +18,7 @@ import { makeMeteringTransformer } from '@agoric/transform-metering';
1818
import { makeTransform } from '@agoric/transform-eventual-send';
1919
import { locateWorkerBin } from '@agoric/xs-vat-worker';
2020

21+
import { WeakRef, FinalizationRegistry } from './optional-weakref';
2122
import { startSubprocessWorker } from './spawnSubprocessWorker';
2223
import { waitUntilQuiescent } from './waitUntilQuiescent';
2324
import { insistStorageAPI } from './storageAPI';

packages/SwingSet/src/kernel/vatManager/nodeWorkerSupervisor.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
// this file is loaded at the start of a new Worker, which makes it a new JS
22
// environment (with it's own Realm), so we must install-ses too.
3-
/* global WeakRef FinalizationRegistry */
43
import '@agoric/install-ses';
54
import { parentPort } from 'worker_threads';
65
import anylogger from 'anylogger';
76

87
import { assert } from '@agoric/assert';
98
import { importBundle } from '@agoric/import-bundle';
109
import { Remotable, getInterfaceOf, makeMarshal } from '@agoric/marshal';
10+
import { WeakRef, FinalizationRegistry } from '../../optional-weakref';
1111
import { waitUntilQuiescent } from '../../waitUntilQuiescent';
1212
import { makeLiveSlots } from '../liveSlots';
1313

packages/SwingSet/src/kernel/vatManager/subprocessSupervisor.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
// this file is loaded at the start of a new subprocess
2-
/* global WeakRef FinalizationRegistry */
32
import '@agoric/install-ses';
43

54
import anylogger from 'anylogger';
@@ -8,6 +7,7 @@ import fs from 'fs';
87
import { assert } from '@agoric/assert';
98
import { importBundle } from '@agoric/import-bundle';
109
import { Remotable, getInterfaceOf, makeMarshal } from '@agoric/marshal';
10+
import { WeakRef, FinalizationRegistry } from '../../optional-weakref';
1111
import { arrayEncoderStream, arrayDecoderStream } from '../../worker-protocol';
1212
import {
1313
netstringEncoderStream,
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/* global globalThis */
2+
3+
/*
4+
* We retain a measure of compatibility with Node.js v12, which does not
5+
* expose WeakRef or FinalizationRegistry (there is a --flag for it, but it's
6+
* not clear how stable it is). When running on a platform without these
7+
* tools, vats cannot do GC.
8+
*
9+
* Modules should do:
10+
*
11+
* import { WeakRef, FinalizationRegistry } from '.../optional-weakref';
12+
*
13+
* and refrain from GC if `WeakRef === undefined`
14+
*/
15+
16+
export const WeakRef = globalThis.WeakRef;
17+
export const FinalizationRegistry = globalThis.FinalizationRegistry;

packages/SwingSet/test/test-kernel.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
/* global WeakRef FinalizationRegistry */
21
import '@agoric/install-ses';
32
import test from 'ava';
43
import anylogger from 'anylogger';
54
import { initSwingStore } from '@agoric/swing-store-simple';
5+
import { WeakRef, FinalizationRegistry } from '../src/optional-weakref';
66
import { waitUntilQuiescent } from '../src/waitUntilQuiescent';
77

88
import buildKernel from '../src/kernel/index';

packages/SwingSet/test/test-liveslots.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
/* global WeakRef FinalizationRegistry */
21
import '@agoric/install-ses';
32
import test from 'ava';
43
import { E } from '@agoric/eventual-send';
4+
import { WeakRef, FinalizationRegistry } from '../src/optional-weakref';
55
import { waitUntilQuiescent } from '../src/waitUntilQuiescent';
66
import { makeLiveSlots } from '../src/kernel/liveSlots';
77

packages/SwingSet/test/test-marshal.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
/* global WeakRef FinalizationRegistry */
21
import '@agoric/install-ses';
32
import test from 'ava';
43
import { makePromiseKit } from '@agoric/promise-kit';
54

5+
import { WeakRef, FinalizationRegistry } from '../src/optional-weakref';
66
import { makeMarshaller } from '../src/kernel/liveSlots';
77

88
import { buildVatController } from '../src/index';

packages/SwingSet/test/test-vpid-kernel.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
/* global WeakRef FinalizationRegistry */
2-
// eslint-disable-next-line no-redeclare
3-
41
import '@agoric/install-ses';
52
import test from 'ava';
63
import anylogger from 'anylogger';
74
import { initSwingStore } from '@agoric/swing-store-simple';
5+
import { WeakRef, FinalizationRegistry } from '../src/optional-weakref';
86
import { waitUntilQuiescent } from '../src/waitUntilQuiescent';
97

108
import buildKernel from '../src/kernel/index';

packages/SwingSet/test/test-vpid-liveslots.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
// eslint-disable-next-line no-redeclare
2-
/* global setImmediate WeakRef FinalizationRegistry */
2+
/* global setImmediate */
33

44
import '@agoric/install-ses';
55
import test from 'ava';
66

77
import { E } from '@agoric/eventual-send';
88
import { makePromiseKit } from '@agoric/promise-kit';
9+
import { WeakRef, FinalizationRegistry } from '../src/optional-weakref';
910
import { makeLiveSlots } from '../src/kernel/liveSlots';
1011

1112
const RETIRE_VPIDS = true;

0 commit comments

Comments
 (0)