From d87ba1b9df3eb1a079fea57f76147441c35274b2 Mon Sep 17 00:00:00 2001 From: Mofei Zhang Date: Tue, 23 Apr 2024 10:18:48 +0100 Subject: [PATCH] [be] Stabilize block ids ghstack-source-id: 83aedf9f086ccb4819655eab803f25f944b75c7b Pull Request resolved: https://github.com/facebook/react-forget/pull/2851 --- .../src/Entrypoint/Pipeline.ts | 8 ++ .../src/ReactiveScopes/StabilizeBlockIds.ts | 80 ++++++++++++++++ .../src/ReactiveScopes/index.ts | 1 + .../block-scoping-switch-dead-code.expect.md | 4 +- ...-scoping-switch-variable-scoping.expect.md | 4 +- .../fixtures/compiler/complex-while.expect.md | 4 +- .../conditional-break-labeled.expect.md | 4 +- .../conditional-early-return.expect.md | 12 +-- .../fixtures/compiler/dominator.expect.md | 10 +- ...rly-return-within-reactive-scope.expect.md | 8 +- ...tions-reassignments-dependencies.expect.md | 4 +- ...rly-return-within-reactive-scope.expect.md | 6 +- .../compiler/inverted-if-else.expect.md | 4 +- .../fixtures/compiler/inverted-if.expect.md | 4 +- .../labeled-break-within-label-loop.expect.md | 4 +- ...abeled-break-within-label-switch.expect.md | 4 +- ...consequent-alternate-both-return.expect.md | 6 +- ...rly-return-within-reactive-scope.expect.md | 6 +- ...emo-conditional-access-own-scope.expect.md | 4 +- ...om-interleaved-reactivity-switch.expect.md | 4 +- ...trol-dependency-switch-case-test.expect.md | 6 +- ...trol-dependency-switch-condition.expect.md | 4 +- .../reassignment-separate-scopes.expect.md | 4 +- ...eactive-cond-deps-break-in-scope.expect.md | 4 +- ...active-cond-deps-return-in-scope.expect.md | 4 +- .../cfg-switch-exhaustive.expect.md | 6 +- .../cfg-switch-missing-case.expect.md | 6 +- .../cfg-switch-missing-default.expect.md | 4 +- .../jump-poisoned/break-in-scope.expect.md | 4 +- .../break-poisons-outer-scope.expect.md | 4 +- ...e-if-nonexhaustive-poisoned-deps.expect.md | 4 +- ...-if-nonexhaustive-poisoned-deps1.expect.md | 4 +- .../jump-poisoned/return-in-scope.expect.md | 4 +- .../return-poisons-outer-scope.expect.md | 4 +- .../else-branch-scope-unpoisoned.expect.md | 4 +- .../jump-target-within-scope-label.expect.md | 4 +- ...e-if-exhaustive-nonpoisoned-deps.expect.md | 4 +- ...-if-exhaustive-nonpoisoned-deps1.expect.md | 4 +- ...duce-if-exhaustive-poisoned-deps.expect.md | 4 +- ...reactive-scope-with-early-return.expect.md | 4 +- ...reactive-scope-with-early-return.expect.md | 4 +- ...fined-try-catch-return-primitive.expect.md | 6 +- ...repro-renaming-conflicting-decls.expect.md | 4 +- ...ble-code-early-return-in-useMemo.expect.md | 4 +- .../compiler/reverse-postorder.expect.md | 6 +- .../fixtures/compiler/ssa-switch.expect.md | 6 +- .../switch-non-final-default.expect.md | 6 +- .../switch-with-fallthrough.expect.md | 6 +- .../try-catch-in-nested-scope.expect.md | 92 +++++++++++++++++++ .../compiler/try-catch-in-nested-scope.ts | 28 ++++++ ...atch-try-value-modified-in-catch.expect.md | 6 +- .../try-catch-with-catch-param.expect.md | 6 +- .../compiler/try-catch-with-return.expect.md | 6 +- ...abeled-break-within-label-switch.expect.md | 4 +- .../useMemo-if-else-multiple-return.expect.md | 4 +- .../useMemo-inlining-block-return.expect.md | 4 +- .../compiler/useMemo-inverted-if.expect.md | 8 +- .../useMemo-multiple-if-else.expect.md | 4 +- .../useMemo-switch-no-fallthrough.expect.md | 4 +- .../compiler/useMemo-switch-return.expect.md | 8 +- .../snap/src/sprout/shared-runtime.ts | 6 ++ 61 files changed, 352 insertions(+), 137 deletions(-) create mode 100644 compiler/packages/babel-plugin-react-forget/src/ReactiveScopes/StabilizeBlockIds.ts create mode 100644 compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/try-catch-in-nested-scope.expect.md create mode 100644 compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/try-catch-in-nested-scope.ts diff --git a/compiler/packages/babel-plugin-react-forget/src/Entrypoint/Pipeline.ts b/compiler/packages/babel-plugin-react-forget/src/Entrypoint/Pipeline.ts index 939f341240..010695490b 100644 --- a/compiler/packages/babel-plugin-react-forget/src/Entrypoint/Pipeline.ts +++ b/compiler/packages/babel-plugin-react-forget/src/Entrypoint/Pipeline.ts @@ -66,6 +66,7 @@ import { import { alignMethodCallScopes } from "../ReactiveScopes/AlignMethodCallScopes"; import { alignReactiveScopesToBlockScopesHIR } from "../ReactiveScopes/AlignReactiveScopesToBlockScopesHIR"; import { pruneAlwaysInvalidatingScopes } from "../ReactiveScopes/PruneAlwaysInvalidatingScopes"; +import { stabilizeBlockIds } from "../ReactiveScopes/StabilizeBlockIds"; import { eliminateRedundantPhi, enterSSA, leaveSSA } from "../SSA"; import { inferTypes } from "../TypeInference"; import { @@ -366,6 +367,13 @@ function* runWithEnvironment( value: reactiveFunction, }); + stabilizeBlockIds(reactiveFunction); + yield log({ + kind: "reactive", + name: "StabilizeBlockIds", + value: reactiveFunction, + }); + const uniqueIdentifiers = renameVariables(reactiveFunction); yield log({ kind: "reactive", diff --git a/compiler/packages/babel-plugin-react-forget/src/ReactiveScopes/StabilizeBlockIds.ts b/compiler/packages/babel-plugin-react-forget/src/ReactiveScopes/StabilizeBlockIds.ts new file mode 100644 index 0000000000..8a28e4227d --- /dev/null +++ b/compiler/packages/babel-plugin-react-forget/src/ReactiveScopes/StabilizeBlockIds.ts @@ -0,0 +1,80 @@ +import { + BlockId, + ReactiveFunction, + ReactiveScopeBlock, + ReactiveTerminalStatement, + makeBlockId, +} from "../HIR"; +import { getOrInsertDefault } from "../Utils/utils"; +import { ReactiveFunctionVisitor, visitReactiveFunction } from "./visitors"; + +export function stabilizeBlockIds(fn: ReactiveFunction): void { + const referenced: Set = new Set(); + visitReactiveFunction(fn, new CollectReferencedLabels(), referenced); + + const mappings = new Map(); + for (const blockId of referenced) { + mappings.set(blockId, makeBlockId(mappings.size)); + } + + visitReactiveFunction(fn, new RewriteBlockIds(), mappings); +} + +class CollectReferencedLabels extends ReactiveFunctionVisitor> { + override visitScope(scope: ReactiveScopeBlock, state: Set): void { + const { earlyReturnValue } = scope.scope; + if (earlyReturnValue != null) { + state.add(earlyReturnValue.label); + } + this.traverseScope(scope, state); + } + override visitTerminal( + stmt: ReactiveTerminalStatement, + state: Set + ): void { + if (stmt.label != null) { + if (!stmt.label.implicit) { + state.add(stmt.label.id); + } + } + this.traverseTerminal(stmt, state); + } +} + +class RewriteBlockIds extends ReactiveFunctionVisitor> { + override visitScope( + scope: ReactiveScopeBlock, + state: Map + ): void { + const { earlyReturnValue } = scope.scope; + if (earlyReturnValue != null) { + const rewrittenId = getOrInsertDefault( + state, + earlyReturnValue.label, + state.size + ); + earlyReturnValue.label = makeBlockId(rewrittenId); + } + this.traverseScope(scope, state); + } + override visitTerminal( + stmt: ReactiveTerminalStatement, + state: Map + ): void { + if (stmt.label != null) { + const rewrittenId = getOrInsertDefault(state, stmt.label.id, state.size); + stmt.label.id = makeBlockId(rewrittenId); + } + + const terminal = stmt.terminal; + if (terminal.kind === "break" || terminal.kind === "continue") { + const rewrittenId = getOrInsertDefault( + state, + terminal.target, + state.size + ); + terminal.target = makeBlockId(rewrittenId); + } + this.traverseTerminal(stmt, state); + } +} diff --git a/compiler/packages/babel-plugin-react-forget/src/ReactiveScopes/index.ts b/compiler/packages/babel-plugin-react-forget/src/ReactiveScopes/index.ts index 089e136fda..733ddc6f72 100644 --- a/compiler/packages/babel-plugin-react-forget/src/ReactiveScopes/index.ts +++ b/compiler/packages/babel-plugin-react-forget/src/ReactiveScopes/index.ts @@ -33,6 +33,7 @@ export { pruneTemporaryLValues as pruneUnusedLValues } from "./PruneTemporaryLVa export { pruneUnusedLabels } from "./PruneUnusedLabels"; export { pruneUnusedScopes } from "./PruneUnusedScopes"; export { renameVariables } from "./RenameVariables"; +export { stabilizeBlockIds } from "./StabilizeBlockIds"; export { ReactiveFunctionTransform, eachReactiveValueOperand, diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/block-scoping-switch-dead-code.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/block-scoping-switch-dead-code.expect.md index 11ccbe00d8..7b5643726f 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/block-scoping-switch-dead-code.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/block-scoping-switch-dead-code.expect.md @@ -28,14 +28,14 @@ export const FIXTURE_ENTRYPOINT = { ```javascript function useHook(a, b) { - bb1: switch (a) { + bb0: switch (a) { case 1: { if (b == null) { return; } console.log(b); - break bb1; + break bb0; } case 2: { return; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/block-scoping-switch-variable-scoping.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/block-scoping-switch-variable-scoping.expect.md index afa30b2e92..a712be8685 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/block-scoping-switch-variable-scoping.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/block-scoping-switch-variable-scoping.expect.md @@ -44,10 +44,10 @@ function Component(props) { t1 = $[1]; } const handlers = t1; - bb2: switch (props.test) { + bb0: switch (props.test) { case true: { console.log(handlers.value); - break bb2; + break bb0; } default: { } diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/complex-while.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/complex-while.expect.md index cdc69d553f..8cdfc3d275 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/complex-while.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/complex-while.expect.md @@ -25,10 +25,10 @@ export const FIXTURE_ENTRYPOINT = { ```javascript function foo(a, b, c) { - bb1: if (a) { + bb0: if (a) { while (b) { if (c) { - break bb1; + break bb0; } } } diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/conditional-break-labeled.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/conditional-break-labeled.expect.md index 4f87e9f80c..3178491e39 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/conditional-break-labeled.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/conditional-break-labeled.expect.md @@ -39,9 +39,9 @@ function Component(props) { if ($[0] !== props) { a = []; a.push(props.a); - bb1: { + bb0: { if (props.b) { - break bb1; + break bb0; } a.push(props.c); diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/conditional-early-return.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/conditional-early-return.expect.md index 940da08261..7f642f8195 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/conditional-early-return.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/conditional-early-return.expect.md @@ -76,12 +76,12 @@ function ComponentA(props) { let t0; if ($[0] !== props) { t0 = Symbol.for("react.early_return_sentinel"); - bb8: { + bb0: { a_DEBUG = []; a_DEBUG.push(props.a); if (props.b) { t0 = null; - break bb8; + break bb0; } a_DEBUG.push(props.d); @@ -130,13 +130,13 @@ function ComponentC(props) { let t0; if ($[0] !== props) { t0 = Symbol.for("react.early_return_sentinel"); - bb8: { + bb0: { a = []; a.push(props.a); if (props.b) { a.push(props.c); t0 = null; - break bb8; + break bb0; } a.push(props.d); @@ -163,13 +163,13 @@ function ComponentD(props) { let t0; if ($[0] !== props) { t0 = Symbol.for("react.early_return_sentinel"); - bb8: { + bb0: { a = []; a.push(props.a); if (props.b) { a.push(props.c); t0 = a; - break bb8; + break bb0; } a.push(props.d); diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/dominator.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/dominator.expect.md index f4bcab3373..3d5f124e07 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/dominator.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/dominator.expect.md @@ -49,23 +49,23 @@ export const FIXTURE_ENTRYPOINT = { ```javascript function Component(props) { let x = 0; - bb1: if (props.a) { + bb0: if (props.a) { x = 1; } else { if (props.b) { } else { - break bb1; + break bb0; } x = 3; } - bb10: bb12: switch (props.c) { + bb1: bb2: switch (props.c) { case "a": { x = 4; - break bb12; + break bb2; } case "b": { - break bb10; + break bb1; } case "c": { } diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/early-return-nested-early-return-within-reactive-scope.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/early-return-nested-early-return-within-reactive-scope.expect.md index 7f7c6d0e1f..a5467eed0d 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/early-return-nested-early-return-within-reactive-scope.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/early-return-nested-early-return-within-reactive-scope.expect.md @@ -35,7 +35,7 @@ function Component(props) { let t0; if ($[0] !== props) { t0 = Symbol.for("react.early_return_sentinel"); - bb12: { + bb0: { const x = []; if (props.cond) { x.push(props.a); @@ -51,11 +51,11 @@ function Component(props) { const y = t1; x.push(y); t0 = x; - break bb12; + break bb0; } t0 = x; - break bb12; + break bb0; } else { let t1; if ($[4] === Symbol.for("react.memo_cache_sentinel")) { @@ -65,7 +65,7 @@ function Component(props) { t1 = $[4]; } t0 = t1; - break bb12; + break bb0; } } $[0] = props; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/early-return-no-declarations-reassignments-dependencies.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/early-return-no-declarations-reassignments-dependencies.expect.md index ba75dfee38..73510183ce 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/early-return-no-declarations-reassignments-dependencies.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/early-return-no-declarations-reassignments-dependencies.expect.md @@ -73,12 +73,12 @@ function Component(props) { let t0; if ($[0] === Symbol.for("react.memo_cache_sentinel")) { t0 = Symbol.for("react.early_return_sentinel"); - bb9: { + bb0: { const x = []; if (ENABLE_FEATURE) { x.push(42); t0 = x; - break bb9; + break bb0; } else { console.log("fallthrough"); } diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/early-return-within-reactive-scope.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/early-return-within-reactive-scope.expect.md index e138ee0a80..a9922cfe31 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/early-return-within-reactive-scope.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/early-return-within-reactive-scope.expect.md @@ -49,12 +49,12 @@ function Component(props) { let t0; if ($[0] !== props) { t0 = Symbol.for("react.early_return_sentinel"); - bb9: { + bb0: { const x = []; if (props.cond) { x.push(props.a); t0 = x; - break bb9; + break bb0; } else { let t1; if ($[2] !== props.b) { @@ -65,7 +65,7 @@ function Component(props) { t1 = $[3]; } t0 = t1; - break bb9; + break bb0; } } $[0] = props; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/inverted-if-else.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/inverted-if-else.expect.md index 3cea08a9c4..1a806e5414 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/inverted-if-else.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/inverted-if-else.expect.md @@ -27,10 +27,10 @@ export const FIXTURE_ENTRYPOINT = { ```javascript function foo(a, b, c) { let x; - bb1: { + bb0: { if (a) { x = b; - break bb1; + break bb0; } x = c; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/inverted-if.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/inverted-if.expect.md index 13fc9aeaee..a3ddc572ae 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/inverted-if.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/inverted-if.expect.md @@ -31,10 +31,10 @@ function foo(a, b, c, d) { let y; if ($[0] !== a || $[1] !== b || $[2] !== c || $[3] !== d) { y = []; - bb1: if (a) { + bb0: if (a) { if (b) { y.push(c); - break bb1; + break bb0; } y.push(d); diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/labeled-break-within-label-loop.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/labeled-break-within-label-loop.expect.md index 52a04577fc..3eb9ab1f9b 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/labeled-break-within-label-loop.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/labeled-break-within-label-loop.expect.md @@ -35,9 +35,9 @@ function useHook(end) { log = []; for (let i = 0; i < end + 1; i++) { log.push(`${i} @A`); - bb6: { + bb0: { if (i === end) { - break bb6; + break bb0; } log.push(`${i} @B`); diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/labeled-break-within-label-switch.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/labeled-break-within-label-switch.expect.md index a18a31cebd..73e82a4608 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/labeled-break-within-label-switch.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/labeled-break-within-label-switch.expect.md @@ -41,9 +41,9 @@ function useHook(cond) { switch (CONST_STRING0) { case CONST_STRING0: { log.push(`@A`); - bb3: { + bb0: { if (cond) { - break bb3; + break bb0; } log.push(`@B`); diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/object-mutated-in-consequent-alternate-both-return.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/object-mutated-in-consequent-alternate-both-return.expect.md index 47a68b2804..c334496872 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/object-mutated-in-consequent-alternate-both-return.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/object-mutated-in-consequent-alternate-both-return.expect.md @@ -33,16 +33,16 @@ function Component(props) { let t0; if ($[0] !== props) { t0 = Symbol.for("react.early_return_sentinel"); - bb9: { + bb0: { const object = makeObject_Primitives(); if (props.cond) { object.value = 1; t0 = object; - break bb9; + break bb0; } else { object.value = props.value; t0 = object; - break bb9; + break bb0; } } $[0] = props; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/partial-early-return-within-reactive-scope.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/partial-early-return-within-reactive-scope.expect.md index ee267cf72a..5db970685a 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/partial-early-return-within-reactive-scope.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/partial-early-return-within-reactive-scope.expect.md @@ -35,12 +35,12 @@ function Component(props) { let t0; if ($[0] !== props) { t0 = Symbol.for("react.early_return_sentinel"); - bb12: { + bb0: { const x = []; if (props.cond) { x.push(props.a); t0 = x; - break bb12; + break bb0; } else { let t1; if ($[3] === Symbol.for("react.memo_cache_sentinel")) { @@ -52,7 +52,7 @@ function Component(props) { y = t1; if (props.b) { t0 = undefined; - break bb12; + break bb0; } } } diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/preserve-memo-validation/useMemo-conditional-access-own-scope.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/preserve-memo-validation/useMemo-conditional-access-own-scope.expect.md index e774691faa..09795988c0 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/preserve-memo-validation/useMemo-conditional-access-own-scope.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/preserve-memo-validation/useMemo-conditional-access-own-scope.expect.md @@ -32,7 +32,7 @@ function Component(t0) { const $ = useMemoCache(2); const { propA, propB } = t0; let t1; - bb6: { + bb0: { if (propA) { let t2; if ($[0] !== propB.x.y) { @@ -43,7 +43,7 @@ function Component(t0) { t2 = $[1]; } t1 = t2; - break bb6; + break bb0; } t1 = undefined; } diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reactive-control-dependency-from-interleaved-reactivity-switch.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reactive-control-dependency-from-interleaved-reactivity-switch.expect.md index 672e64924b..e00b2c70de 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reactive-control-dependency-from-interleaved-reactivity-switch.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reactive-control-dependency-from-interleaved-reactivity-switch.expect.md @@ -55,10 +55,10 @@ function Component(props) { const c = [a]; let x; - bb1: switch (c[0][0]) { + bb0: switch (c[0][0]) { case true: { x = 1; - break bb1; + break bb0; } default: { x = 2; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reactive-control-dependency-switch-case-test.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reactive-control-dependency-switch-case-test.expect.md index 70dbfa1120..53bd8b50f8 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reactive-control-dependency-switch-case-test.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reactive-control-dependency-switch-case-test.expect.md @@ -47,14 +47,14 @@ import { unstable_useMemoCache as useMemoCache } from "react"; function Component(props) { const $ = useMemoCache(2); let x; - bb1: switch (props.cond) { + bb0: switch (props.cond) { case true: { x = 1; - break bb1; + break bb0; } case false: { x = 2; - break bb1; + break bb0; } default: { x = 3; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reactive-control-dependency-switch-condition.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reactive-control-dependency-switch-condition.expect.md index dc102a476c..3f2d5d08d8 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reactive-control-dependency-switch-condition.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reactive-control-dependency-switch-condition.expect.md @@ -48,10 +48,10 @@ function Component(t0) { const $ = useMemoCache(2); const { value } = t0; let x; - bb1: switch (GLOBAL) { + bb0: switch (GLOBAL) { case value: { x = 1; - break bb1; + break bb0; } default: { x = 2; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reassignment-separate-scopes.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reassignment-separate-scopes.expect.md index 7ff467add4..5261535931 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reassignment-separate-scopes.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reassignment-separate-scopes.expect.md @@ -62,7 +62,7 @@ function foo(a, b, c) { t0 = $[3]; } const y = t0; - bb3: switch (b) { + bb0: switch (b) { case 0: { if ($[4] !== b) { x = []; @@ -72,7 +72,7 @@ function foo(a, b, c) { } else { x = $[5]; } - break bb3; + break bb0; } default: { if ($[6] !== c) { diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-cond-deps-break-in-scope.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-cond-deps-break-in-scope.expect.md index 2ee79a5d5c..71054d780c 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-cond-deps-break-in-scope.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-cond-deps-break-in-scope.expect.md @@ -36,9 +36,9 @@ function useFoo(t0) { let x; if ($[0] !== objIsNull || $[1] !== obj) { x = []; - bb1: { + bb0: { if (objIsNull) { - break bb1; + break bb0; } else { x.push(obj.a); } diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-cond-deps-return-in-scope.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-cond-deps-return-in-scope.expect.md index 1c60214c33..883630d29c 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-cond-deps-return-in-scope.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-cond-deps-return-in-scope.expect.md @@ -35,11 +35,11 @@ function useFoo(t0) { let t1; if ($[0] !== objIsNull || $[1] !== obj) { t1 = Symbol.for("react.early_return_sentinel"); - bb9: { + bb0: { x = []; if (objIsNull) { t1 = undefined; - break bb9; + break bb0; } else { x.push(obj.a); } diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/cfg-switch-exhaustive.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/cfg-switch-exhaustive.expect.md index faf8d5418f..ad1151d1d5 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/cfg-switch-exhaustive.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/cfg-switch-exhaustive.expect.md @@ -44,14 +44,14 @@ function useCondDepInSwitch(props, other) { let x; if ($[0] !== other || $[1] !== props.a.b) { x = {}; - bb1: switch (identity(other)) { + bb0: switch (identity(other)) { case 1: { x.a = props.a.b; - break bb1; + break bb0; } case 2: { x.b = props.a.b; - break bb1; + break bb0; } default: { x.c = props.a.b; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/cfg-switch-missing-case.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/cfg-switch-missing-case.expect.md index fe3786ca08..eb6749be92 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/cfg-switch-missing-case.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/cfg-switch-missing-case.expect.md @@ -43,14 +43,14 @@ function useCondDepInSwitchMissingCase(props, other) { let x; if ($[0] !== other || $[1] !== props) { x = {}; - bb1: switch (identity(other)) { + bb0: switch (identity(other)) { case 1: { x.a = props.a.b; - break bb1; + break bb0; } case 2: { x.b = 42; - break bb1; + break bb0; } default: { x.c = props.a.b; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/cfg-switch-missing-default.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/cfg-switch-missing-default.expect.md index c085a530c2..55fd08d1c2 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/cfg-switch-missing-default.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/cfg-switch-missing-default.expect.md @@ -40,10 +40,10 @@ function useCondDepInSwitchMissingDefault(props, other) { let x; if ($[0] !== other || $[1] !== props) { x = {}; - bb1: switch (identity(other)) { + bb0: switch (identity(other)) { case 1: { x.a = props.a.b; - break bb1; + break bb0; } case 2: { x.b = props.a.b; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/break-in-scope.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/break-in-scope.expect.md index 6f490f7f2c..15ed150915 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/break-in-scope.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/break-in-scope.expect.md @@ -38,9 +38,9 @@ function useFoo(t0) { let x; if ($[0] !== objIsNull || $[1] !== obj) { x = []; - bb1: { + bb0: { if (objIsNull) { - break bb1; + break bb0; } x.push(obj.a); diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/break-poisons-outer-scope.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/break-poisons-outer-scope.expect.md index 47d7a9fb3b..5009f54575 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/break-poisons-outer-scope.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/break-poisons-outer-scope.expect.md @@ -44,9 +44,9 @@ function useFoo(t0) { let x; if ($[0] !== cond || $[1] !== input) { x = []; - bb1: { + bb0: { if (cond) { - break bb1; + break bb0; } let t1; if ($[3] !== input.a.b) { diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/reduce-if-nonexhaustive-poisoned-deps.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/reduce-if-nonexhaustive-poisoned-deps.expect.md index e91d83d061..4757ea8a44 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/reduce-if-nonexhaustive-poisoned-deps.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/reduce-if-nonexhaustive-poisoned-deps.expect.md @@ -46,12 +46,12 @@ function useFoo(t0) { let t1; if ($[0] !== cond || $[1] !== hasAB || $[2] !== input) { t1 = Symbol.for("react.early_return_sentinel"); - bb11: { + bb0: { x = []; if (cond) { if (!hasAB) { t1 = null; - break bb11; + break bb0; } let t2; if ($[5] !== input.a.b) { diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/reduce-if-nonexhaustive-poisoned-deps1.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/reduce-if-nonexhaustive-poisoned-deps1.expect.md index 3a3efe7066..e3aaa68826 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/reduce-if-nonexhaustive-poisoned-deps1.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/reduce-if-nonexhaustive-poisoned-deps1.expect.md @@ -47,12 +47,12 @@ function useFoo(t0) { let t1; if ($[0] !== cond || $[1] !== hasAB || $[2] !== input) { t1 = Symbol.for("react.early_return_sentinel"); - bb12: { + bb0: { x = []; if (cond) { if (!hasAB) { t1 = null; - break bb12; + break bb0; } else { let t2; if ($[5] !== input.a.b) { diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/return-in-scope.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/return-in-scope.expect.md index 34d6e79080..8621e7dc65 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/return-in-scope.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/return-in-scope.expect.md @@ -37,11 +37,11 @@ function useFoo(t0) { let t1; if ($[0] !== objIsNull || $[1] !== obj) { t1 = Symbol.for("react.early_return_sentinel"); - bb8: { + bb0: { x = []; if (objIsNull) { t1 = undefined; - break bb8; + break bb0; } x.push(obj.b); diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/return-poisons-outer-scope.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/return-poisons-outer-scope.expect.md index ddfca55bbb..704cc6f817 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/return-poisons-outer-scope.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-poisoned/return-poisons-outer-scope.expect.md @@ -43,11 +43,11 @@ function useFoo(t0) { let t1; if ($[0] !== cond || $[1] !== input) { t1 = Symbol.for("react.early_return_sentinel"); - bb8: { + bb0: { x = []; if (cond) { t1 = null; - break bb8; + break bb0; } let t2; if ($[4] !== input.a.b) { diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-unpoisoned/else-branch-scope-unpoisoned.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-unpoisoned/else-branch-scope-unpoisoned.expect.md index 491342c5c9..15563fb6d6 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-unpoisoned/else-branch-scope-unpoisoned.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-unpoisoned/else-branch-scope-unpoisoned.expect.md @@ -45,8 +45,8 @@ function useFoo(t0) { let x; if ($[0] !== cond || $[1] !== input) { x = []; - bb1: if (cond) { - break bb1; + bb0: if (cond) { + break bb0; } else { let t1; if ($[3] !== input.a.b) { diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-unpoisoned/jump-target-within-scope-label.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-unpoisoned/jump-target-within-scope-label.expect.md index a8a8c58997..2027d91ebf 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-unpoisoned/jump-target-within-scope-label.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-unpoisoned/jump-target-within-scope-label.expect.md @@ -40,8 +40,8 @@ function useFoo(t0) { let x; if ($[0] !== cond || $[1] !== input.a.b) { x = []; - bb1: if (cond) { - break bb1; + bb0: if (cond) { + break bb0; } x.push(input.a.b); diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-unpoisoned/reduce-if-exhaustive-nonpoisoned-deps.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-unpoisoned/reduce-if-exhaustive-nonpoisoned-deps.expect.md index 00b516600b..795a56fecf 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-unpoisoned/reduce-if-exhaustive-nonpoisoned-deps.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-unpoisoned/reduce-if-exhaustive-nonpoisoned-deps.expect.md @@ -37,7 +37,7 @@ function useFoo(t0) { let t1; if ($[0] !== hasAB || $[1] !== input.a || $[2] !== returnNull) { t1 = Symbol.for("react.early_return_sentinel"); - bb11: { + bb0: { x = []; if (!hasAB) { let t2; @@ -51,7 +51,7 @@ function useFoo(t0) { x.push(t2); if (!returnNull) { t1 = null; - break bb11; + break bb0; } } else { let t2; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-unpoisoned/reduce-if-exhaustive-nonpoisoned-deps1.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-unpoisoned/reduce-if-exhaustive-nonpoisoned-deps1.expect.md index a003b16bd0..a91e4061f5 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-unpoisoned/reduce-if-exhaustive-nonpoisoned-deps1.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/jump-unpoisoned/reduce-if-exhaustive-nonpoisoned-deps1.expect.md @@ -47,7 +47,7 @@ function useFoo(t0) { let t1; if ($[0] !== cond1 || $[1] !== cond2 || $[2] !== input.a.b) { t1 = Symbol.for("react.early_return_sentinel"); - bb12: { + bb0: { x = []; if (cond1) { if (!cond2) { @@ -61,7 +61,7 @@ function useFoo(t0) { } x.push(t2); t1 = null; - break bb12; + break bb0; } else { let t2; if ($[7] !== input.a.b) { diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/reduce-if-exhaustive-poisoned-deps.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/reduce-if-exhaustive-poisoned-deps.expect.md index 1a628635a7..ad51d0a096 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/reduce-if-exhaustive-poisoned-deps.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reduce-reactive-deps/reduce-if-exhaustive-poisoned-deps.expect.md @@ -38,7 +38,7 @@ function useFoo(t0) { let t1; if ($[0] !== inputHasABC || $[1] !== input.a || $[2] !== inputHasAB) { t1 = Symbol.for("react.early_return_sentinel"); - bb11: { + bb0: { x = []; if (!inputHasABC) { let t2; @@ -52,7 +52,7 @@ function useFoo(t0) { x.push(t2); if (!inputHasAB) { t1 = null; - break bb11; + break bb0; } let t3; if ($[7] !== input.a.b) { diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/repro-no-declarations-in-reactive-scope-with-early-return.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/repro-no-declarations-in-reactive-scope-with-early-return.expect.md index fd4c44c029..1f52490de6 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/repro-no-declarations-in-reactive-scope-with-early-return.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/repro-no-declarations-in-reactive-scope-with-early-return.expect.md @@ -46,7 +46,7 @@ function Component() { let t2; if ($[0] !== items) { t2 = Symbol.for("react.early_return_sentinel"); - bb15: { + bb0: { let t3; if ($[4] === Symbol.for("react.memo_cache_sentinel")) { t3 = (t4) => { @@ -72,7 +72,7 @@ function Component() { t4 = $[5]; } t2 = t4; - break bb15; + break bb0; } let t4; if ($[6] === Symbol.for("react.memo_cache_sentinel")) { diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/repro-no-value-for-temporary-reactive-scope-with-early-return.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/repro-no-value-for-temporary-reactive-scope-with-early-return.expect.md index 40728be577..7088d3db94 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/repro-no-value-for-temporary-reactive-scope-with-early-return.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/repro-no-value-for-temporary-reactive-scope-with-early-return.expect.md @@ -43,12 +43,12 @@ function Component(props) { let t1; if ($[0] === Symbol.for("react.memo_cache_sentinel")) { t1 = Symbol.for("react.early_return_sentinel"); - bb8: { + bb0: { const object = makeObject_Primitives(); const cond = makeObject_Primitives(); if (!cond) { t1 = null; - break bb8; + break bb0; } t0 = ( diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/repro-preds-undefined-try-catch-return-primitive.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/repro-preds-undefined-try-catch-return-primitive.expect.md index 9210aac5d4..9842a75309 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/repro-preds-undefined-try-catch-return-primitive.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/repro-preds-undefined-try-catch-return-primitive.expect.md @@ -37,15 +37,15 @@ import { useMemo } from "react"; const checkforTouchEvents = true; function useSupportsTouchEvent() { let t0; - bb15: { + bb0: { if (checkforTouchEvents) { try { document.createEvent("TouchEvent"); t0 = true; - break bb15; + break bb0; } catch { t0 = false; - break bb15; + break bb0; } } t0 = undefined; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/repro-renaming-conflicting-decls.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/repro-renaming-conflicting-decls.expect.md index 05b1809f88..9c8c083968 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/repro-renaming-conflicting-decls.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/repro-renaming-conflicting-decls.expect.md @@ -51,12 +51,12 @@ function Component(props) { let t2; if ($[0] !== props) { t2 = Symbol.for("react.early_return_sentinel"); - bb11: { + bb0: { t0 = toJSON(props); const propsString = t0; if (propsString.length <= 2) { t2 = null; - break bb11; + break bb0; } t1 = identity(propsString); diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/repro-unreachable-code-early-return-in-useMemo.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/repro-unreachable-code-early-return-in-useMemo.expect.md index eb1008fa55..351b3abc78 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/repro-unreachable-code-early-return-in-useMemo.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/repro-unreachable-code-early-return-in-useMemo.expect.md @@ -52,10 +52,10 @@ function Component(t0) { const $ = useMemoCache(7); const { value } = t0; let t1; - bb13: { + bb0: { if (value == null) { t1 = null; - break bb13; + break bb0; } try { let t3; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reverse-postorder.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reverse-postorder.expect.md index a8f4ccaddc..be053ca350 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reverse-postorder.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reverse-postorder.expect.md @@ -43,12 +43,12 @@ export const FIXTURE_ENTRYPOINT = { ```javascript function Component(props) { if (props.cond) { - bb3: switch (props.test) { + bb0: switch (props.test) { case 0: { - break bb3; + break bb0; } case 1: { - break bb3; + break bb0; } case 2: { } diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/ssa-switch.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/ssa-switch.expect.md index ae0a498034..4796fbdcc2 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/ssa-switch.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/ssa-switch.expect.md @@ -34,12 +34,12 @@ export const FIXTURE_ENTRYPOINT = { ```javascript function foo() { - bb1: switch (1) { + bb0: switch (1) { case 1: { - break bb1; + break bb0; } case 2: { - break bb1; + break bb0; } default: { } diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/switch-non-final-default.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/switch-non-final-default.expect.md index 21a091a6ff..ae48a772ff 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/switch-non-final-default.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/switch-non-final-default.expect.md @@ -38,9 +38,9 @@ function Component(props) { let y; if ($[0] !== props) { x = []; - bb1: switch (props.p0) { + bb0: switch (props.p0) { case 1: { - break bb1; + break bb0; } case true: { x.push(props.p2); @@ -54,7 +54,7 @@ function Component(props) { y = t0; } default: { - break bb1; + break bb0; } case false: { y = x; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/switch-with-fallthrough.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/switch-with-fallthrough.expect.md index b5275e221a..d1c85da623 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/switch-with-fallthrough.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/switch-with-fallthrough.expect.md @@ -42,16 +42,16 @@ export const FIXTURE_ENTRYPOINT = { ```javascript function foo(x) { - bb1: switch (x) { + bb0: switch (x) { case 0: { } case 1: { } case 2: { - break bb1; + break bb0; } case 3: { - break bb1; + break bb0; } case 4: { } diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/try-catch-in-nested-scope.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/try-catch-in-nested-scope.expect.md new file mode 100644 index 0000000000..9ed207d171 --- /dev/null +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/try-catch-in-nested-scope.expect.md @@ -0,0 +1,92 @@ + +## Input + +```javascript +import { mutate, setProperty, throwErrorWithMessageIf } from "shared-runtime"; + +function useFoo({ value, cond }) { + let y = [value]; + let x = { cond }; + + try { + mutate(x); + throwErrorWithMessageIf(x.cond, "error"); + } catch { + setProperty(x, "henderson"); + return x; + } + setProperty(x, "nevada"); + y.push(x); + + return y; +} + +export const FIXTURE_ENTRYPOINT = { + fn: useFoo, + params: [{ value: 4, cond: true }], + sequentialRenders: [ + { value: 4, cond: true }, + { value: 5, cond: true }, + { value: 5, cond: false }, + ], +}; + +``` + +## Code + +```javascript +import { unstable_useMemoCache as useMemoCache } from "react"; +import { mutate, setProperty, throwErrorWithMessageIf } from "shared-runtime"; + +function useFoo(t0) { + const $ = useMemoCache(3); + const { value, cond } = t0; + let t1; + if ($[0] !== value || $[1] !== cond) { + t1 = Symbol.for("react.early_return_sentinel"); + bb0: { + const y = [value]; + const x = { cond }; + try { + mutate(x); + throwErrorWithMessageIf(x.cond, "error"); + } catch { + setProperty(x, "henderson"); + t1 = x; + break bb0; + } + + setProperty(x, "nevada"); + y.push(x); + + t1 = y; + break bb0; + } + $[0] = value; + $[1] = cond; + $[2] = t1; + } else { + t1 = $[2]; + } + if (t1 !== Symbol.for("react.early_return_sentinel")) { + return t1; + } +} + +export const FIXTURE_ENTRYPOINT = { + fn: useFoo, + params: [{ value: 4, cond: true }], + sequentialRenders: [ + { value: 4, cond: true }, + { value: 5, cond: true }, + { value: 5, cond: false }, + ], +}; + +``` + +### Eval output +(kind: ok) {"cond":true,"wat0":"joe","wat1":"henderson"} +{"cond":true,"wat0":"joe","wat1":"henderson"} +[5,{"cond":false,"wat0":"joe","wat1":"nevada"}] \ No newline at end of file diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/try-catch-in-nested-scope.ts b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/try-catch-in-nested-scope.ts new file mode 100644 index 0000000000..139e37894f --- /dev/null +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/try-catch-in-nested-scope.ts @@ -0,0 +1,28 @@ +import { mutate, setProperty, throwErrorWithMessageIf } from "shared-runtime"; + +function useFoo({ value, cond }) { + let y = [value]; + let x = { cond }; + + try { + mutate(x); + throwErrorWithMessageIf(x.cond, "error"); + } catch { + setProperty(x, "henderson"); + return x; + } + setProperty(x, "nevada"); + y.push(x); + + return y; +} + +export const FIXTURE_ENTRYPOINT = { + fn: useFoo, + params: [{ value: 4, cond: true }], + sequentialRenders: [ + { value: 4, cond: true }, + { value: 5, cond: true }, + { value: 5, cond: false }, + ], +}; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/try-catch-try-value-modified-in-catch.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/try-catch-try-value-modified-in-catch.expect.md index a5d87524bd..0cb7e5993a 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/try-catch-try-value-modified-in-catch.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/try-catch-try-value-modified-in-catch.expect.md @@ -34,7 +34,7 @@ function Component(props) { let t0; if ($[0] !== props.y || $[1] !== props.e) { t0 = Symbol.for("react.early_return_sentinel"); - bb19: { + bb0: { try { const y = []; y.push(props.y); @@ -43,11 +43,11 @@ function Component(props) { const e = t1; e.push(props.e); t0 = e; - break bb19; + break bb0; } t0 = null; - break bb19; + break bb0; } $[0] = props.y; $[1] = props.e; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/try-catch-with-catch-param.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/try-catch-with-catch-param.expect.md index 19d95b7b8b..a490495a93 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/try-catch-with-catch-param.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/try-catch-with-catch-param.expect.md @@ -35,7 +35,7 @@ function Component(props) { let t0; if ($[0] === Symbol.for("react.memo_cache_sentinel")) { t0 = Symbol.for("react.early_return_sentinel"); - bb12: { + bb0: { const x = []; try { throwInput(x); @@ -43,11 +43,11 @@ function Component(props) { const e = t1; e.push(null); t0 = e; - break bb12; + break bb0; } t0 = x; - break bb12; + break bb0; } $[0] = t0; } else { diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/try-catch-with-return.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/try-catch-with-return.expect.md index ab4d2aea2c..3055fb83d7 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/try-catch-with-return.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/try-catch-with-return.expect.md @@ -37,19 +37,19 @@ function Component(props) { let t0; if ($[0] === Symbol.for("react.memo_cache_sentinel")) { t0 = Symbol.for("react.early_return_sentinel"); - bb26: { + bb0: { x = []; try { const y = shallowCopy({}); if (y == null) { t0 = undefined; - break bb26; + break bb0; } x.push(throwInput(y)); } catch { t0 = null; - break bb26; + break bb0; } } $[0] = x; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/unlabeled-break-within-label-switch.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/unlabeled-break-within-label-switch.expect.md index 7ff261158c..4cdef77ee8 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/unlabeled-break-within-label-switch.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/unlabeled-break-within-label-switch.expect.md @@ -38,11 +38,11 @@ function useHook(cond) { let log; if ($[0] !== cond) { log = []; - bb1: switch (CONST_STRING0) { + bb0: switch (CONST_STRING0) { case CONST_STRING0: { log.push(`@A`); if (cond) { - break bb1; + break bb0; } log.push(`@B`); diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-if-else-multiple-return.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-if-else-multiple-return.expect.md index 325cf9479b..5ad4f7991d 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-if-else-multiple-return.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-if-else-multiple-return.expect.md @@ -21,7 +21,7 @@ import { unstable_useMemoCache as useMemoCache } from "react"; function Component(props) { const $ = useMemoCache(4); let t0; - bb7: { + bb0: { if (props.cond) { let t1; if ($[0] !== props.a) { @@ -32,7 +32,7 @@ function Component(props) { t1 = $[1]; } t0 = t1; - break bb7; + break bb0; } let t1; if ($[2] !== props.b) { diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-inlining-block-return.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-inlining-block-return.expect.md index 2d32ce9c9d..0588f51746 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-inlining-block-return.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-inlining-block-return.expect.md @@ -26,7 +26,7 @@ import { unstable_useMemoCache as useMemoCache } from "react"; function component(a, b) { const $ = useMemoCache(2); let t0; - bb6: { + bb0: { if (a) { let t1; if ($[0] !== b) { @@ -37,7 +37,7 @@ function component(a, b) { t1 = $[1]; } t0 = t1; - break bb6; + break bb0; } t0 = undefined; } diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-inverted-if.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-inverted-if.expect.md index 672bb6cc45..a137ec8dc6 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-inverted-if.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-inverted-if.expect.md @@ -28,14 +28,14 @@ export const FIXTURE_ENTRYPOINT = { ```javascript function Component(props) { let t0; - bb10: { - bb2: { + bb0: { + bb1: { if (props.cond) { - break bb2; + break bb1; } t0 = props.a; - break bb10; + break bb0; } t0 = props.b; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-multiple-if-else.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-multiple-if-else.expect.md index f96b4a7bb6..8136cdb1ab 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-multiple-if-else.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-multiple-if-else.expect.md @@ -34,7 +34,7 @@ import { useMemo, unstable_useMemoCache as useMemoCache } from "react"; function Component(props) { const $ = useMemoCache(3); let t0; - bb9: { + bb0: { let y; if ($[0] !== props) { y = []; @@ -43,7 +43,7 @@ function Component(props) { } if (props.cond2) { t0 = y; - break bb9; + break bb0; } y.push(props.b); diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-switch-no-fallthrough.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-switch-no-fallthrough.expect.md index be9ff2ef50..80cd50cff3 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-switch-no-fallthrough.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-switch-no-fallthrough.expect.md @@ -29,10 +29,10 @@ export const FIXTURE_ENTRYPOINT = { ```javascript function Component(props) { let t0; - bb8: switch (props.key) { + bb0: switch (props.key) { case "key": { t0 = props.value; - break bb8; + break bb0; } default: { t0 = props.defaultValue; diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-switch-return.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-switch-return.expect.md index 782db27c4f..22a42363f5 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-switch-return.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/useMemo-switch-return.expect.md @@ -35,16 +35,16 @@ export const FIXTURE_ENTRYPOINT = { ```javascript function Component(props) { let t0; - bb10: { + bb0: { let y; - bb2: switch (props.switch) { + bb1: switch (props.switch) { case "foo": { t0 = "foo"; - break bb10; + break bb0; } case "bar": { y = "bar"; - break bb2; + break bb1; } default: { y = props.y; diff --git a/compiler/packages/snap/src/sprout/shared-runtime.ts b/compiler/packages/snap/src/sprout/shared-runtime.ts index 6229fe1211..0d2e1998e1 100644 --- a/compiler/packages/snap/src/sprout/shared-runtime.ts +++ b/compiler/packages/snap/src/sprout/shared-runtime.ts @@ -157,6 +157,12 @@ export function throwInput(x: Object): never { throw x; } +export function throwErrorWithMessageIf(cond: boolean, message: string): void { + if (cond) { + throw new Error(message); + } +} + export function logValue(value: T): void { console.log(value); }