diff --git a/compiler/forget/src/__tests__/fixtures/hir/reassignment-separate-scopes.expect.md b/compiler/forget/src/__tests__/fixtures/hir/reassignment-separate-scopes.expect.md new file mode 100644 index 0000000000..2378bad585 --- /dev/null +++ b/compiler/forget/src/__tests__/fixtures/hir/reassignment-separate-scopes.expect.md @@ -0,0 +1,166 @@ + +## Input + +```javascript +function foo(a, b, c) { + let x = []; + if (a) { + x.push(a); + } + let y =
{x}
; + + switch (b) { + case 0: { + x = []; + x.push(b); + break; + } + default: { + x = []; + x.push(c); + } + } + return ( +
+ {y} + {x} +
+ ); +} + +``` + +## HIR + +``` +bb0: + [1] Let mutate x$4_@0[1:5] = Array [] + [2] If (read a$1) then:bb2 else:bb1 +bb2: + predecessor blocks: bb0 + [3] Call mutate x$4_@0.push(read a$1) + [4] Goto bb1 +bb1: + predecessor blocks: bb2 bb0 + [5] Const mutate $6_@1 = "div" + [6] Let mutate y$5_@2 = JSX {freeze x$4_@0} + [7] Const mutate $7_@4[7:14] = 0 + [8] Switch (read b$2) + Case read $7_@4: bb5 + Default: bb4 +bb5: + predecessor blocks: bb1 + [9] Reassign mutate x$4_@4[7:14] = Array [] + [10] Call mutate x$4_@4.push(read b$2) + [11] Goto bb3 +bb4: + predecessor blocks: bb1 + [12] Reassign mutate x$4_@4[7:14] = Array [] + [13] Call mutate x$4_@4.push(read c$3) + [14] Goto bb3 +bb3: + predecessor blocks: bb5 bb4 + [15] Const mutate $8_@5 = "div" + [16] Const mutate $9_@6 = "\n " + [17] Const mutate $10_@7 = "\n " + [18] Const mutate $11_@8 = "\n " + [19] Const mutate $12_@9 = JSX {read $9_@6}{read y$5_@2}{read $10_@7}{freeze x$4_@4}{read $11_@8} + [20] Return read $12_@9 +``` + +### CFG + +```mermaid +flowchart TB + %% Basic Blocks + subgraph bb0 + bb0_instrs[" + [1] Let mutate x$4_@0[1:5] = Array [] + "] + bb0_instrs --> bb0_terminal(["If (read a$1)"]) + end + subgraph bb2 + bb2_instrs[" + [3] Call mutate x$4_@0.push(read a$1) + "] + bb2_instrs --> bb2_terminal(["Goto"]) + end + subgraph bb1 + bb1_instrs[" + [5] Const mutate $6_@1 = 'div' + [6] Let mutate y$5_@2 = JSX {freeze x$4_@0} + [7] Const mutate $7_@4[7:14] = 0 + "] + bb1_instrs --> bb1_terminal(["Switch (read b$2)"]) + end + subgraph bb5 + bb5_instrs[" + [9] Reassign mutate x$4_@4[7:14] = Array [] + [10] Call mutate x$4_@4.push(read b$2) + "] + bb5_instrs --> bb5_terminal(["Goto"]) + end + subgraph bb4 + bb4_instrs[" + [12] Reassign mutate x$4_@4[7:14] = Array [] + [13] Call mutate x$4_@4.push(read c$3) + "] + bb4_instrs --> bb4_terminal(["Goto"]) + end + subgraph bb3 + bb3_instrs[" + [15] Const mutate $8_@5 = 'div' + [16] Const mutate $9_@6 = '\n ' + [17] Const mutate $10_@7 = '\n ' + [18] Const mutate $11_@8 = '\n ' + [19] Const mutate $12_@9 = JSX {read $9_@6}{read y$5_@2}{read $10_@7}{freeze x$4_@4}{read $11_@8} + "] + bb3_instrs --> bb3_terminal(["Return read $12_@9"]) + end + + %% Jumps + bb0_terminal -- "then" --> bb2 + bb0_terminal -- "else" --> bb1 + bb2_terminal --> bb1 + bb1_terminal -- "read $7_@4" --> bb5 + bb1_terminal -- "default" --> bb4 + bb1_terminal -- "fallthrough" --> bb3 + bb5_terminal --> bb3 + bb4_terminal --> bb3 + +``` + +## Code + +```javascript +function foo$0(a$1, b$2, c$3) { + let x$4 = []; + bb1: if (a$1) { + x$4.push(a$1); + } + + let y$5 =
{x$4}
; + + bb3: switch (b$2) { + case 0: { + x$4 = []; + x$4.push(b$2); + break bb3; + } + + default: { + x$4 = []; + x$4.push(c$3); + } + } + + return ( +
+ {y$5} + {x$4} +
+ ); +} + +``` + \ No newline at end of file diff --git a/compiler/forget/src/__tests__/fixtures/hir/reassignment-separate-scopes.js b/compiler/forget/src/__tests__/fixtures/hir/reassignment-separate-scopes.js new file mode 100644 index 0000000000..39afb78096 --- /dev/null +++ b/compiler/forget/src/__tests__/fixtures/hir/reassignment-separate-scopes.js @@ -0,0 +1,25 @@ +function foo(a, b, c) { + let x = []; + if (a) { + x.push(a); + } + let y =
{x}
; + + switch (b) { + case 0: { + x = []; + x.push(b); + break; + } + default: { + x = []; + x.push(c); + } + } + return ( +
+ {y} + {x} +
+ ); +}