Skip to content

Commit 8a54d36

Browse files
committed
fix(transform-eventual-send): split out rewriter.js to fix cycle
The old default export (used for SES1's evaluator transforms array) is now in a separate file: ```js import makeEventualSendTransformer from '@agoric/transform-eventual-send/src/rewriter'; ``` The new smaller `makeTransform` function (used by bundle-source) is a named export of the package: ```js import { makeTransform } from '@agoric/transform-eventual-send'; ``` This breaks the dependency cycle between bundle-source (which needs `makeTransform`) and `makeEventualSendTransformer` (which needs a file created at `yarn build` time by running bundle-source).
1 parent 9b69286 commit 8a54d36

File tree

4 files changed

+88
-88
lines changed

4 files changed

+88
-88
lines changed

packages/default-evaluate-options/src/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { parse } from '@agoric/babel-parser';
22
import generate from '@babel/generator';
3-
import makeEventualSendTransformer from '@agoric/transform-eventual-send';
3+
import makeEventualSendTransformer from '@agoric/transform-eventual-send/src/rewriter';
44

55
export default function makeDefaultEvaluateOptions() {
66
const shims = [];
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import eventualSendBundle from './bundles/eventual-send';
2-
31
export function makeTransform(parser, generate) {
42
function transform(source) {
53
// Parse with eventualSend enabled, rewriting to
@@ -17,87 +15,3 @@ export function makeTransform(parser, generate) {
1715
}
1816
return transform;
1917
}
20-
21-
// this transformer is meant for the SES1 evaluation format, with mutable
22-
// endowments and stuff
23-
24-
function makeEventualSendTransformer(parser, generate) {
25-
const transformer = makeTransform(parser, generate);
26-
let HandledPromise;
27-
let evaluateProgram;
28-
let myRequire;
29-
let recursive = false;
30-
const transform = {
31-
closeOverSES(s) {
32-
// FIXME: This will go away when we can bundle an @agoric/harden that understands SES.
33-
myRequire = name => {
34-
if (name === '@agoric/harden') {
35-
return s.global.SES.harden;
36-
}
37-
throw Error(`Unrecognized require ${name}`);
38-
};
39-
// FIXME: This should be replaced with ss.evaluateProgram support in SES.
40-
evaluateProgram = (src, endowments = {}) => s.evaluate(src, endowments);
41-
},
42-
rewrite(ss) {
43-
const source = ss.src;
44-
const endowments = ss.endowments || {};
45-
if (!recursive && !('HandledPromise' in endowments)) {
46-
// Use a getter to postpone initialization.
47-
Object.defineProperty(endowments, 'HandledPromise', {
48-
get() {
49-
if (!HandledPromise) {
50-
// Get a HandledPromise endowment for the evaluator.
51-
// It will be hardened in the evaluator's context.
52-
const nestedEvaluate = src =>
53-
(evaluateProgram || ss.evaluateProgram)(src, {
54-
require: myRequire || require,
55-
nestedEvaluate,
56-
});
57-
const {
58-
source: evSendSrc,
59-
moduleFormat,
60-
sourceMap,
61-
} = eventualSendBundle;
62-
if (
63-
moduleFormat === 'getExport' ||
64-
moduleFormat === 'nestedEvaluate'
65-
) {
66-
recursive = true;
67-
try {
68-
const ns = nestedEvaluate(`(${evSendSrc}\n${sourceMap})`)();
69-
HandledPromise = ns.HandledPromise;
70-
} finally {
71-
recursive = false;
72-
}
73-
} else {
74-
throw Error(`Unrecognized moduleFormat ${moduleFormat}`);
75-
}
76-
}
77-
return HandledPromise;
78-
},
79-
});
80-
}
81-
82-
const maybeSource = transformer(source);
83-
84-
// Work around Babel appending semicolons.
85-
const actualSource =
86-
ss.sourceType === 'expression' &&
87-
maybeSource.endsWith(';') &&
88-
!source.endsWith(';')
89-
? maybeSource.slice(0, -1)
90-
: maybeSource;
91-
92-
return {
93-
...ss,
94-
endowments,
95-
src: actualSource,
96-
};
97-
},
98-
};
99-
100-
return [transform];
101-
}
102-
103-
export default makeEventualSendTransformer;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import { makeTransform } from './index';
2+
import eventualSendBundle from './bundles/eventual-send';
3+
4+
// this transformer is meant for the SES1 evaluation format, with mutable
5+
// endowments and stuff
6+
7+
function makeEventualSendTransformer(parser, generate) {
8+
const transformer = makeTransform(parser, generate);
9+
let HandledPromise;
10+
let evaluateProgram;
11+
let myRequire;
12+
let recursive = false;
13+
const transform = {
14+
closeOverSES(s) {
15+
// FIXME: This will go away when we can bundle an @agoric/harden that understands SES.
16+
myRequire = name => {
17+
if (name === '@agoric/harden') {
18+
return s.global.SES.harden;
19+
}
20+
throw Error(`Unrecognized require ${name}`);
21+
};
22+
// FIXME: This should be replaced with ss.evaluateProgram support in SES.
23+
evaluateProgram = (src, endowments = {}) => s.evaluate(src, endowments);
24+
},
25+
rewrite(ss) {
26+
const source = ss.src;
27+
const endowments = ss.endowments || {};
28+
if (!recursive && !('HandledPromise' in endowments)) {
29+
// Use a getter to postpone initialization.
30+
Object.defineProperty(endowments, 'HandledPromise', {
31+
get() {
32+
if (!HandledPromise) {
33+
// Get a HandledPromise endowment for the evaluator.
34+
// It will be hardened in the evaluator's context.
35+
const nestedEvaluate = src =>
36+
(evaluateProgram || ss.evaluateProgram)(src, {
37+
require: myRequire || require,
38+
nestedEvaluate,
39+
});
40+
const {
41+
source: evSendSrc,
42+
moduleFormat,
43+
sourceMap,
44+
} = eventualSendBundle;
45+
if (
46+
moduleFormat === 'getExport' ||
47+
moduleFormat === 'nestedEvaluate'
48+
) {
49+
recursive = true;
50+
try {
51+
const ns = nestedEvaluate(`(${evSendSrc}\n${sourceMap})`)();
52+
HandledPromise = ns.HandledPromise;
53+
} finally {
54+
recursive = false;
55+
}
56+
} else {
57+
throw Error(`Unrecognized moduleFormat ${moduleFormat}`);
58+
}
59+
}
60+
return HandledPromise;
61+
},
62+
});
63+
}
64+
65+
const maybeSource = transformer(source);
66+
67+
// Work around Babel appending semicolons.
68+
const actualSource =
69+
ss.sourceType === 'expression' &&
70+
maybeSource.endsWith(';') &&
71+
!source.endsWith(';')
72+
? maybeSource.slice(0, -1)
73+
: maybeSource;
74+
75+
return {
76+
...ss,
77+
endowments,
78+
src: actualSource,
79+
};
80+
},
81+
};
82+
83+
return [transform];
84+
}
85+
86+
export default makeEventualSendTransformer;

packages/transform-eventual-send/test/ses-test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import eventualSend from '@agoric/acorn-eventual-send';
1010
import * as acorn from 'acorn';
1111
import * as astring from 'astring';
1212

13-
import makeEventualSendTransformer from '../src';
13+
import makeEventualSendTransformer from '../src/rewriter';
1414

1515
// FIXME: This should be unnecessary when SES has support
1616
// for passing `evaluateProgram` through to the rewriter state.

0 commit comments

Comments
 (0)