Skip to content

Commit

Permalink
Merge pull request #584 from Agoric/swingset-metering
Browse files Browse the repository at this point in the history
Pass all tests with metering installed
  • Loading branch information
michaelfig authored Feb 20, 2020
2 parents 9f9452c + d2dbd2c commit beac518
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 6 deletions.
1 change: 1 addition & 0 deletions packages/SwingSet/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
"@agoric/marshal": "^0.1.1",
"@agoric/nat": "^2.0.1",
"@agoric/swing-store-simple": "^0.1.0",
"@agoric/tame-metering": "^1.0.0",
"rollup": "^1.23.1",
"rollup-plugin-node-resolve": "^5.2.0",
"semver": "^6.3.0",
Expand Down
31 changes: 25 additions & 6 deletions packages/SwingSet/src/controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ import { assert } from '@agoric/assert';
import makeDefaultEvaluateOptions from '@agoric/default-evaluate-options';
import bundleSource from '@agoric/bundle-source';
import { makeMemorySwingStore } from '@agoric/swing-store-simple';
import {
SES1ReplaceGlobalMeter,
SES1TameMeteringShim,
} from '@agoric/tame-metering';

// eslint-disable-next-line import/extensions
import kernelSourceFunc from './bundles/kernel';
Expand Down Expand Up @@ -107,9 +111,6 @@ function makeEvaluate(e) {
transforms,
});
transforms.forEach(t => t.closeOverSES && t.closeOverSES(c));
// Global shims need to take effect before realm shims.
const shims = (rootOptions.shims || []).concat(realmOptions.shims || []);
shims.forEach(shim => c.evaluate(shim));
return {
evaluateExpr(source, endowments = {}, options = {}) {
return c.evaluate(`(${source}\n)`, endowments, options);
Expand All @@ -135,13 +136,16 @@ function makeEvaluate(e) {

function makeSESEvaluator() {
const evaluateOptions = makeDefaultEvaluateOptions();
const { transforms, ...otherOptions } = evaluateOptions;
const { transforms, shims = [], ...otherOptions } = evaluateOptions;
const s = SES.makeSESRootRealm({
...otherOptions,
transforms,
consoleMode: 'allow',
errorStackMode: 'allow',
shims: [SES1TameMeteringShim, ...shims],
configurableGlobals: true,
});
const replaceGlobalMeter = SES1ReplaceGlobalMeter(s);
transforms.forEach(t => {
t.closeOverSES && t.closeOverSES(s);
});
Expand All @@ -159,13 +163,28 @@ function makeSESEvaluator() {
confine: s.global.SES.confine,
confineExpr: s.global.SES.confineExpr,
rootOptions: evaluateOptions,
makeCompartment: s.global.Realm.makeCompartment,
makeCompartment: (...args) => {
const c = s.global.Realm.makeCompartment(...args);
// FIXME: This call should be unnecessary.
// We currently need it because fresh Compartments
// do not inherit the configured stable globals.
Object.defineProperties(
c.global,
Object.getOwnPropertyDescriptors(s.global),
);
return c;
},
},
'@agoric/harden': true,
'@agoric/nat': Nat,
});
return src => {
return s.evaluate(src, { require: r })().default;
// FIXME: Note that this replaceGlobalMeter endowment is not any
// worse than before metering existed. However, it probably is
// only necessary to be added to the kernel, rather than all
// static vats once we add metering support to the dynamic vat
// implementation.
return s.evaluate(src, { require: r, replaceGlobalMeter })().default;
};
}

Expand Down
5 changes: 5 additions & 0 deletions packages/SwingSet/src/kernel/kernel.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/* global replaceGlobalMeter */
import harden from '@agoric/harden';
import { makeMarshal, QCLASS } from '@agoric/marshal';
import Nat from '@agoric/nat';
Expand Down Expand Up @@ -114,6 +115,10 @@ export default function buildKernel(kernelEndowments) {
.then(f)
.then(undefined, logerr);
await queueEmptyP;
if (typeof replaceGlobalMeter !== 'undefined') {
// Turn off the global meter now that we've run the user code.
replaceGlobalMeter(null);
}
whenDone();
}

Expand Down

0 comments on commit beac518

Please sign in to comment.