From f262d8c4cb99480835c7a0d1ef220198dee1a88a Mon Sep 17 00:00:00 2001 From: Brian Warner Date: Fri, 31 May 2024 15:57:19 -0700 Subject: [PATCH] use symbol-named property instead of globalThis.passStyleOf Update the swingset test to look for it there, and compare against a bundle-generated version (they should be different). This currently fails because importBundle() does not respect symbol-named properties of `vatGlobals`. Restored the SwingSet/package.json dependency on `@endo/pass-style` so the vat-under-test can get a bundle-generated version, for comparison. Added a liveslots-local test of the same, which passes because it's only looking at the `vatGlobals` given to `buildVatNamespace()`, and doesn't use `importBundle()`. --- packages/SwingSet/package.json | 1 + packages/SwingSet/test/test-vat-env.js | 3 +- packages/SwingSet/test/vat-envtest.js | 5 ++ packages/swingset-liveslots/src/liveslots.js | 8 ++- .../test/test-vat-environment.js | 60 +++++++++++++++++++ 5 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 packages/swingset-liveslots/test/test-vat-environment.js diff --git a/packages/SwingSet/package.json b/packages/SwingSet/package.json index c946369346b..1af7f5eb216 100644 --- a/packages/SwingSet/package.json +++ b/packages/SwingSet/package.json @@ -49,6 +49,7 @@ "@endo/init": "^1.0.4", "@endo/marshal": "^1.3.0", "@endo/nat": "^5.0.4", + "@endo/pass-style": "^1.2.0", "@endo/patterns": "^1.2.0", "@endo/promise-kit": "^1.0.4", "@endo/ses-ava": "^1.1.2", diff --git a/packages/SwingSet/test/test-vat-env.js b/packages/SwingSet/test/test-vat-env.js index 1b422c06a6a..61848df986b 100644 --- a/packages/SwingSet/test/test-vat-env.js +++ b/packages/SwingSet/test/test-vat-env.js @@ -97,7 +97,8 @@ async function testForExpectedGlobals(t, workerType) { 'VatData.makeScalarBigWeakMapStore: function', 'VatData.makeScalarBigSetStore: function', 'VatData.makeScalarBigWeakSetStore: function', - 'VatData.passStyleOf: function', + 'global has passStyleOf: true', + 'global passStyleOf is special: true', ]); } diff --git a/packages/SwingSet/test/vat-envtest.js b/packages/SwingSet/test/vat-envtest.js index e66efd4f9c0..11d2de7b7c3 100644 --- a/packages/SwingSet/test/vat-envtest.js +++ b/packages/SwingSet/test/vat-envtest.js @@ -1,6 +1,8 @@ // @ts-nocheck /* global VatData */ import { Far } from '@endo/far'; +import { passStyleOf } from '@endo/pass-style'; +import { PassStyleOfEndowmentSymbol } from '@endo/pass-style/endow.js'; export function buildRootObject(vatPowers) { const log = vatPowers.testLog; @@ -13,6 +15,9 @@ export function buildRootObject(vatPowers) { for (const prop of Object.keys(VatData)) { log(`VatData.${prop}: ${typeof VatData[prop]}`); } + const globalPassStyleOf = globalThis && globalThis[PassStyleOfEndowmentSymbol]; + log(`global has passStyleOf: ${!!globalPassStyleOf}`); + log(`global passStyleOf is special: ${globalPassStyleOf !== passStyleOf}`); }, }); } diff --git a/packages/swingset-liveslots/src/liveslots.js b/packages/swingset-liveslots/src/liveslots.js index 704ca4e5230..e7e9d91c4f6 100644 --- a/packages/swingset-liveslots/src/liveslots.js +++ b/packages/swingset-liveslots/src/liveslots.js @@ -2,6 +2,7 @@ import { Remotable, getInterfaceOf, makeMarshal } from '@endo/marshal'; import { assert, Fail } from '@agoric/assert'; import { passStyleOf } from '@endo/pass-style'; +import { PassStyleOfEndowmentSymbol } from '@endo/pass-style/endow.js'; import { isPromise } from '@endo/promise-kit'; import { E, HandledPromise } from '@endo/eventual-send'; import { insistVatType, makeVatSlot, parseVatSlot } from './parseVatSlots.js'; @@ -1319,7 +1320,7 @@ function build( syscall.dropImports([slot]); } - const vatGlobals = harden({ + const vatGlobals = { VatData: { defineKind: vom.defineKind, defineKindMulti: vom.defineKindMulti, @@ -1333,9 +1334,10 @@ function build( makeScalarBigWeakMapStore: collectionManager.makeScalarBigWeakMapStore, makeScalarBigSetStore: collectionManager.makeScalarBigSetStore, makeScalarBigWeakSetStore: collectionManager.makeScalarBigWeakSetStore, - passStyleOf, }, - }); + [PassStyleOfEndowmentSymbol]: passStyleOf, + }; + harden(vatGlobals); const inescapableGlobalProperties = harden({ WeakMap: vom.VirtualObjectAwareWeakMap, diff --git a/packages/swingset-liveslots/test/test-vat-environment.js b/packages/swingset-liveslots/test/test-vat-environment.js new file mode 100644 index 00000000000..a6382c54a06 --- /dev/null +++ b/packages/swingset-liveslots/test/test-vat-environment.js @@ -0,0 +1,60 @@ +import '@endo/init/debug.js'; +import test from 'ava'; +import { Far } from '@endo/marshal'; +import { kser } from '@agoric/kmarshal'; +import { passStyleOf } from '@endo/pass-style'; +import { PassStyleOfEndowmentSymbol } from '@endo/pass-style/endow.js'; +import { makeLiveSlots } from '../src/index.js'; +import { makeStartVat } from './util.js'; +import { buildSyscall } from './liveslots-helpers.js'; +import { makeMockGC } from './mock-gc.js'; + +test('vat globals', async t => { + const { syscall } = buildSyscall(); + const gcTools = makeMockGC(); + const buildRootObject = () => Far('root', {}); + let called = 0; + let vatGlobals; + let inescapableGlobalProperties; + const vatNS = harden({ buildRootObject }); + // buildVatNamespace + const bVN = async (vG, iGP) => { + called += 1; + vatGlobals = vG; + inescapableGlobalProperties = iGP; + return vatNS; + }; + + const ls = makeLiveSlots(syscall, 'vatA', {}, {}, gcTools, undefined, bVN); + t.is(called, 0); // not called yet + await ls.dispatch(makeStartVat(kser())); + t.is(called, 1); + t.truthy(vatGlobals); + + // 'harden' is provided by SES (installed by the supervisor), not liveslots + t.is(typeof vatGlobals.harden, 'undefined'); + + // but liveslots provides VatData + t.is(typeof vatGlobals.VatData, 'object'); + t.is(typeof vatGlobals.VatData, 'object'); + t.is(typeof vatGlobals.VatData.defineKind, 'function'); + t.is(typeof vatGlobals.VatData.defineKindMulti, 'function'); + t.is(typeof vatGlobals.VatData.defineDurableKind, 'function'); + t.is(typeof vatGlobals.VatData.defineDurableKindMulti, 'function'); + t.is(typeof vatGlobals.VatData.makeKindHandle, 'function'); + t.is(typeof vatGlobals.VatData.canBeDurable, 'function'); + t.is(typeof vatGlobals.VatData.providePromiseWatcher, 'function'); + t.is(typeof vatGlobals.VatData.watchPromise, 'function'); + t.is(typeof vatGlobals.VatData.makeScalarBigMapStore, 'function'); + t.is(typeof vatGlobals.VatData.makeScalarBigWeakMapStore, 'function'); + t.is(typeof vatGlobals.VatData.makeScalarBigSetStore, 'function'); + t.is(typeof vatGlobals.VatData.makeScalarBigWeakSetStore, 'function'); + t.is(typeof vatGlobals[PassStyleOfEndowmentSymbol], 'function'); + // this is the passStyleOf created by liveslots, with a real WeakMap + t.is(vatGlobals[PassStyleOfEndowmentSymbol], passStyleOf); + + t.is(typeof inescapableGlobalProperties.WeakMap, 'function'); + t.not(inescapableGlobalProperties.WeakMap, WeakMap); + t.is(typeof inescapableGlobalProperties.WeakSet, 'function'); + t.not(inescapableGlobalProperties.WeakSet, WeakSet); +});