Skip to content

Commit

Permalink
use symbol-named property instead of globalThis.passStyleOf
Browse files Browse the repository at this point in the history
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()`.
  • Loading branch information
warner committed May 31, 2024
1 parent 2ace6d9 commit f262d8c
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 4 deletions.
1 change: 1 addition & 0 deletions packages/SwingSet/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
3 changes: 2 additions & 1 deletion packages/SwingSet/test/test-vat-env.js
Original file line number Diff line number Diff line change
Expand Up @@ -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',
]);
}

Expand Down
5 changes: 5 additions & 0 deletions packages/SwingSet/test/vat-envtest.js
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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}`);
},
});
}
8 changes: 5 additions & 3 deletions packages/swingset-liveslots/src/liveslots.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -1319,7 +1320,7 @@ function build(
syscall.dropImports([slot]);
}

const vatGlobals = harden({
const vatGlobals = {
VatData: {
defineKind: vom.defineKind,
defineKindMulti: vom.defineKindMulti,
Expand All @@ -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,
Expand Down
60 changes: 60 additions & 0 deletions packages/swingset-liveslots/test/test-vat-environment.js
Original file line number Diff line number Diff line change
@@ -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);
});

0 comments on commit f262d8c

Please sign in to comment.