From 2d8b36467c768af5cc63845f73f2beaeddfeb59c Mon Sep 17 00:00:00 2001 From: Sathya Gunasekaran Date: Tue, 11 Apr 2023 13:41:33 +0100 Subject: [PATCH] [hir] Put useMemo inlining behind a flag It's still a WIP so disable behind a flag for now. --- compiler/forget/src/CompilerPipeline.ts | 6 ++++-- compiler/forget/src/HIR/Environment.ts | 1 + compiler/forget/src/__tests__/compiler-test.ts | 1 + .../forget/src/__tests__/disableMemoizeJsxElements-test.ts | 1 + .../compiler/useMemo-if-else-multiple-return.expect.md | 2 ++ .../fixtures/compiler/useMemo-if-else-multiple-return.js | 1 + .../compiler/useMemo-independently-memoizeable.expect.md | 2 ++ .../fixtures/compiler/useMemo-independently-memoizeable.js | 1 + ...useMemo-labeled-statement-unconditional-return.expect.md | 2 ++ .../useMemo-labeled-statement-unconditional-return.js | 1 + .../__tests__/fixtures/compiler/useMemo-logical.expect.md | 2 ++ .../src/__tests__/fixtures/compiler/useMemo-logical.js | 1 + .../fixtures/compiler/useMemo-multiple-if-else.expect.md | 2 ++ .../__tests__/fixtures/compiler/useMemo-multiple-if-else.js | 1 + .../__tests__/fixtures/compiler/useMemo-simple.expect.md | 2 ++ .../src/__tests__/fixtures/compiler/useMemo-simple.js | 1 + .../compiler/useMemo-switch-no-fallthrough.expect.md | 2 ++ .../fixtures/compiler/useMemo-switch-no-fallthrough.js | 1 + compiler/forget/src/__tests__/hir-test.ts | 1 + .../src/__tests__/test-utils/generateTestsFromFixtures.ts | 6 +++++- 20 files changed, 34 insertions(+), 3 deletions(-) diff --git a/compiler/forget/src/CompilerPipeline.ts b/compiler/forget/src/CompilerPipeline.ts index fba60ba925..92d2cc8cb3 100644 --- a/compiler/forget/src/CompilerPipeline.ts +++ b/compiler/forget/src/CompilerPipeline.ts @@ -61,8 +61,10 @@ export function* run( const hir = lower(func, env).unwrap(); yield log({ kind: "hir", name: "HIR", value: hir }); - inlineUseMemo(hir); - yield log({ kind: "hir", name: "RewriteUseMemo", value: hir }); + if (config?.inlineUseMemo) { + inlineUseMemo(hir); + yield log({ kind: "hir", name: "RewriteUseMemo", value: hir }); + } mergeConsecutiveBlocks(hir); yield log({ kind: "hir", name: "MergeConsecutiveBlocks", value: hir }); diff --git a/compiler/forget/src/HIR/Environment.ts b/compiler/forget/src/HIR/Environment.ts index 4e11375a52..391830c7de 100644 --- a/compiler/forget/src/HIR/Environment.ts +++ b/compiler/forget/src/HIR/Environment.ts @@ -40,6 +40,7 @@ const HOOK_PATTERN = /^_?use/; export type EnvironmentConfig = Partial<{ customHooks: Map; memoizeJsxElements: boolean; + inlineUseMemo: boolean; }>; export class Environment { diff --git a/compiler/forget/src/__tests__/compiler-test.ts b/compiler/forget/src/__tests__/compiler-test.ts index 10f088dbed..b7b986f9a7 100644 --- a/compiler/forget/src/__tests__/compiler-test.ts +++ b/compiler/forget/src/__tests__/compiler-test.ts @@ -54,6 +54,7 @@ describe("React Forget", () => { }, ], ]), + inlineUseMemo: options.environment?.inlineUseMemo ?? false, }, logger: null, gating: options.gating, diff --git a/compiler/forget/src/__tests__/disableMemoizeJsxElements-test.ts b/compiler/forget/src/__tests__/disableMemoizeJsxElements-test.ts index f6582b6603..3418c09fd6 100644 --- a/compiler/forget/src/__tests__/disableMemoizeJsxElements-test.ts +++ b/compiler/forget/src/__tests__/disableMemoizeJsxElements-test.ts @@ -50,6 +50,7 @@ describe("React Forget (Disable memoization of JSX elements)", () => { }, ], ]), + inlineUseMemo: options.environment?.inlineUseMemo ?? false, }, logger: null, gating: options.gating, diff --git a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-if-else-multiple-return.expect.md b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-if-else-multiple-return.expect.md index 82ece6e3f1..a2abf46ae4 100644 --- a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-if-else-multiple-return.expect.md +++ b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-if-else-multiple-return.expect.md @@ -2,6 +2,7 @@ ## Input ```javascript +// @inlineUseMemo function Component(props) { const x = useMemo(() => { if (props.cond) { @@ -17,6 +18,7 @@ function Component(props) { ## Code ```javascript +// @inlineUseMemo function Component(props) { const $ = React.unstable_useMemoCache(5); if (props.cond) { diff --git a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-if-else-multiple-return.js b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-if-else-multiple-return.js index a39f3b2826..5eaa671680 100644 --- a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-if-else-multiple-return.js +++ b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-if-else-multiple-return.js @@ -1,3 +1,4 @@ +// @inlineUseMemo function Component(props) { const x = useMemo(() => { if (props.cond) { diff --git a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-independently-memoizeable.expect.md b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-independently-memoizeable.expect.md index df99148842..32767bb99b 100644 --- a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-independently-memoizeable.expect.md +++ b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-independently-memoizeable.expect.md @@ -2,6 +2,7 @@ ## Input ```javascript +// @inlineUseMemo function Component(props) { const [a, b] = useMemo(() => { const items = []; @@ -17,6 +18,7 @@ function Component(props) { ## Code ```javascript +// @inlineUseMemo function Component(props) { const $ = React.unstable_useMemoCache(10); const c_0 = $[0] !== props.a; diff --git a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-independently-memoizeable.js b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-independently-memoizeable.js index 4f9f5f39c1..861544699c 100644 --- a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-independently-memoizeable.js +++ b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-independently-memoizeable.js @@ -1,3 +1,4 @@ +// @inlineUseMemo function Component(props) { const [a, b] = useMemo(() => { const items = []; diff --git a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-labeled-statement-unconditional-return.expect.md b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-labeled-statement-unconditional-return.expect.md index 8e9d522789..5821491900 100644 --- a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-labeled-statement-unconditional-return.expect.md +++ b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-labeled-statement-unconditional-return.expect.md @@ -2,6 +2,7 @@ ## Input ```javascript +// @inlineUseMemo function Component(props) { const x = useMemo(() => { label: { @@ -16,6 +17,7 @@ function Component(props) { ## Code ```javascript +// @inlineUseMemo function Component(props) { const t19 = props.value; const x = t19; diff --git a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-labeled-statement-unconditional-return.js b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-labeled-statement-unconditional-return.js index a23a7bda64..e44bbcd49a 100644 --- a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-labeled-statement-unconditional-return.js +++ b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-labeled-statement-unconditional-return.js @@ -1,3 +1,4 @@ +// @inlineUseMemo function Component(props) { const x = useMemo(() => { label: { diff --git a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-logical.expect.md b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-logical.expect.md index e30d844490..9542e3f2fd 100644 --- a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-logical.expect.md +++ b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-logical.expect.md @@ -2,6 +2,7 @@ ## Input ```javascript +// @inlineUseMemo function Component(props) { const x = useMemo(() => props.a && props.b); return x; @@ -12,6 +13,7 @@ function Component(props) { ## Code ```javascript +// @inlineUseMemo function Component(props) { const t32 = props.a && props.b; const x = t32; diff --git a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-logical.js b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-logical.js index 1bfbd0e3fa..6892d2b26d 100644 --- a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-logical.js +++ b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-logical.js @@ -1,3 +1,4 @@ +// @inlineUseMemo function Component(props) { const x = useMemo(() => props.a && props.b); return x; diff --git a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-multiple-if-else.expect.md b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-multiple-if-else.expect.md index 29e32088b8..a99608301f 100644 --- a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-multiple-if-else.expect.md +++ b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-multiple-if-else.expect.md @@ -2,6 +2,7 @@ ## Input ```javascript +// @inlineUseMemo function Component(props) { const x = useMemo(() => { let y = []; @@ -22,6 +23,7 @@ function Component(props) { ## Code ```javascript +// @inlineUseMemo function Component(props) { const $ = React.unstable_useMemoCache(2); const c_0 = $[0] !== props; diff --git a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-multiple-if-else.js b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-multiple-if-else.js index 24e10f21c9..f5aec98ace 100644 --- a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-multiple-if-else.js +++ b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-multiple-if-else.js @@ -1,3 +1,4 @@ +// @inlineUseMemo function Component(props) { const x = useMemo(() => { let y = []; diff --git a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-simple.expect.md b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-simple.expect.md index 0eaeb73317..190d780bfb 100644 --- a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-simple.expect.md +++ b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-simple.expect.md @@ -2,6 +2,7 @@ ## Input ```javascript +// @inlineUseMemo function component(a) { let x = useMemo(() => [a], [a]); return ; @@ -12,6 +13,7 @@ function component(a) { ## Code ```javascript +// @inlineUseMemo function component(a) { const $ = React.unstable_useMemoCache(4); const c_0 = $[0] !== a; diff --git a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-simple.js b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-simple.js index a680d099be..96c93e10c7 100644 --- a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-simple.js +++ b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-simple.js @@ -1,3 +1,4 @@ +// @inlineUseMemo function component(a) { let x = useMemo(() => [a], [a]); return ; diff --git a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-switch-no-fallthrough.expect.md b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-switch-no-fallthrough.expect.md index 35946f0393..836c12739b 100644 --- a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-switch-no-fallthrough.expect.md +++ b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-switch-no-fallthrough.expect.md @@ -2,6 +2,7 @@ ## Input ```javascript +// @inlineUseMemo function Component(props) { const x = useMemo(() => { switch (props.key) { @@ -21,6 +22,7 @@ function Component(props) { ## Code ```javascript +// @inlineUseMemo function Component(props) { bb8: switch (props.key) { case "key": { diff --git a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-switch-no-fallthrough.js b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-switch-no-fallthrough.js index 74011509fb..09164664c0 100644 --- a/compiler/forget/src/__tests__/fixtures/compiler/useMemo-switch-no-fallthrough.js +++ b/compiler/forget/src/__tests__/fixtures/compiler/useMemo-switch-no-fallthrough.js @@ -1,3 +1,4 @@ +// @inlineUseMemo function Component(props) { const x = useMemo(() => { switch (props.key) { diff --git a/compiler/forget/src/__tests__/hir-test.ts b/compiler/forget/src/__tests__/hir-test.ts index 520c2587f4..7a391fd604 100644 --- a/compiler/forget/src/__tests__/hir-test.ts +++ b/compiler/forget/src/__tests__/hir-test.ts @@ -45,6 +45,7 @@ describe("React Forget (HIR version)", () => { }, ], ]), + inlineUseMemo: options.environment?.inlineUseMemo ?? false, }); if (compileResult.isErr()) { diff --git a/compiler/forget/src/__tests__/test-utils/generateTestsFromFixtures.ts b/compiler/forget/src/__tests__/test-utils/generateTestsFromFixtures.ts index cf5b9cb7e3..7d0607636c 100644 --- a/compiler/forget/src/__tests__/test-utils/generateTestsFromFixtures.ts +++ b/compiler/forget/src/__tests__/test-utils/generateTestsFromFixtures.ts @@ -91,6 +91,7 @@ export default function generateTestsFromFixtures( let debug = false; let enableOnlyOnUseForgetDirective = false; let gating: GatingOptions | null = null; + let inlineUseMemo = true; if (inputFile != null) { input = fs.readFileSync(inputFile, "utf8"); @@ -111,13 +112,16 @@ export default function generateTestsFromFixtures( importSpecifierName: "isForgetEnabled_Fixtures", }; } + if (lines[0]!.indexOf("@inlineUseMemo") !== -1) { + inlineUseMemo = true; + } } testCommand(basename, () => { let receivedOutput; if (input !== null) { receivedOutput = transform(input, basename, { - environment: null, + environment: { inlineUseMemo }, logger: null, debug, enableOnlyOnUseForgetDirective,