From 16852386a5ac9ccffa265ad96f2d7e1db544aecb Mon Sep 17 00:00:00 2001 From: Joe Savona Date: Fri, 8 Mar 2024 13:59:22 -0800 Subject: [PATCH] Support more cases of reassignment within value blocks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes T175283039 — it's totally fine to have a StoreLocal as an instruction in a value block, so long as its a reassignment. --- .../ReactiveScopes/CodegenReactiveFunction.ts | 18 +++++- ...reassign-in-while-loop-condition.expect.md | 38 ------------ ...reassign-in-while-loop-condition.expect.md | 59 +++++++++++++++++++ ...js => reassign-in-while-loop-condition.js} | 2 +- 4 files changed, 77 insertions(+), 40 deletions(-) delete mode 100644 compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/error.todo-reassign-in-while-loop-condition.expect.md create mode 100644 compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reassign-in-while-loop-condition.expect.md rename compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/{error.todo-reassign-in-while-loop-condition.js => reassign-in-while-loop-condition.js} (92%) diff --git a/compiler/packages/babel-plugin-react-forget/src/ReactiveScopes/CodegenReactiveFunction.ts b/compiler/packages/babel-plugin-react-forget/src/ReactiveScopes/CodegenReactiveFunction.ts index 1f75d32067..30b5141b6f 100644 --- a/compiler/packages/babel-plugin-react-forget/src/ReactiveScopes/CodegenReactiveFunction.ts +++ b/compiler/packages/babel-plugin-react-forget/src/ReactiveScopes/CodegenReactiveFunction.ts @@ -1752,13 +1752,29 @@ function codegenInstructionValue( ); break; } + case "StoreLocal": { + CompilerError.invariant( + instrValue.lvalue.kind === InstructionKind.Reassign, + { + reason: `Unexpected StoreLocal in codegenInstructionValue`, + description: null, + loc: instrValue.loc, + suggestions: null, + } + ); + value = t.assignmentExpression( + "=", + codegenLValue(cx, instrValue.lvalue.place), + codegenPlaceToExpression(cx, instrValue.value) + ); + break; + } case "ReactiveFunctionValue": case "Memoize": case "Debugger": case "DeclareLocal": case "DeclareContext": case "Destructure": - case "StoreLocal": case "ObjectMethod": case "StoreContext": { CompilerError.invariant(false, { diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/error.todo-reassign-in-while-loop-condition.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/error.todo-reassign-in-while-loop-condition.expect.md deleted file mode 100644 index 94a9cb8000..0000000000 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/error.todo-reassign-in-while-loop-condition.expect.md +++ /dev/null @@ -1,38 +0,0 @@ - -## Input - -```javascript -import { makeArray } from "shared-runtime"; - -// @flow -function Component() { - const items = makeArray(0, 1, 2); - let item; - let sum = 0; - while ((item = items.pop())) { - sum += item; - } - return [sum]; -} - -export const FIXTURE_ENTRYPOINT = { - fn: Component, - params: [{}], -}; - -``` - - -## Error - -``` - 6 | let item; - 7 | let sum = 0; -> 8 | while ((item = items.pop())) { - | ^^^^ [ReactForget] Invariant: Unexpected StoreLocal in codegenInstructionValue (8:8) - 9 | sum += item; - 10 | } - 11 | return [sum]; -``` - - \ No newline at end of file diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reassign-in-while-loop-condition.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reassign-in-while-loop-condition.expect.md new file mode 100644 index 0000000000..27c1681ff5 --- /dev/null +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reassign-in-while-loop-condition.expect.md @@ -0,0 +1,59 @@ + +## Input + +```javascript +import { makeArray } from "shared-runtime"; + +// @flow +function Component() { + const items = makeArray(0, 1, 2); + let item; + let sum = 0; + while ((item = items.pop())) { + sum += item; + } + return [items, sum]; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{}], +}; + +``` + +## Code + +```javascript +import { unstable_useMemoCache as useMemoCache } from "react"; +import { makeArray } from "shared-runtime"; + +// @flow +function Component() { + const $ = useMemoCache(1); + let t0; + if ($[0] === Symbol.for("react.memo_cache_sentinel")) { + const items = makeArray(0, 1, 2); + let item; + let sum = 0; + while ((item = items.pop())) { + sum = sum + item; + } + + t0 = [items, sum]; + $[0] = t0; + } else { + t0 = $[0]; + } + return t0; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{}], +}; + +``` + +### Eval output +(kind: ok) [[],3] \ No newline at end of file diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/error.todo-reassign-in-while-loop-condition.js b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reassign-in-while-loop-condition.js similarity index 92% rename from compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/error.todo-reassign-in-while-loop-condition.js rename to compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reassign-in-while-loop-condition.js index 1bd95da06a..634f0c5101 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/error.todo-reassign-in-while-loop-condition.js +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/reassign-in-while-loop-condition.js @@ -8,7 +8,7 @@ function Component() { while ((item = items.pop())) { sum += item; } - return [sum]; + return [items, sum]; } export const FIXTURE_ENTRYPOINT = {