[ez] Patch BuildHIR to match unlabeled breaks to switch and loops

This commit is contained in:
Mofei Zhang
2024-03-22 16:34:09 -04:00
parent f6472522da
commit ee93b62f51
10 changed files with 274 additions and 4 deletions
@@ -517,7 +517,11 @@ export default class HIRBuilder {
lookupBreak(label: string | null): BlockId {
for (let ii = this.#scopes.length - 1; ii >= 0; ii--) {
const scope = this.#scopes[ii];
if (label === null || label === scope.label) {
if (
(label === null &&
(scope.kind === "loop" || scope.kind === "switch")) ||
label === scope.label
) {
return scope.breakBlock;
}
}
@@ -8,7 +8,7 @@ function useHook(end) {
log.push(`${i} @A`);
bb0: {
if (i === end) {
break;
break bb0;
}
log.push(`${i} @B`);
}
@@ -59,4 +59,6 @@ export const FIXTURE_ENTRYPOINT = {
};
```
### Eval output
(kind: ok) ["0 @A","0 @B","0 @C","1 @A","1 @C"]
@@ -0,0 +1,19 @@
function useHook(end) {
const log = [];
for (let i = 0; i < end + 1; i++) {
log.push(`${i} @A`);
bb0: {
if (i === end) {
break bb0;
}
log.push(`${i} @B`);
}
log.push(`${i} @C`);
}
return log;
}
export const FIXTURE_ENTRYPOINT = {
fn: useHook,
params: [1],
};
@@ -0,0 +1,71 @@
## Input
```javascript
import { CONST_STRING0 } from "shared-runtime";
function useHook(cond) {
const log = [];
switch (CONST_STRING0) {
case CONST_STRING0:
log.push(`@A`);
bb0: {
if (cond) {
break bb0;
}
log.push(`@B`);
}
log.push(`@C`);
}
return log;
}
export const FIXTURE_ENTRYPOINT = {
fn: useHook,
params: [true],
};
```
## Code
```javascript
import { unstable_useMemoCache as useMemoCache } from "react";
import { CONST_STRING0 } from "shared-runtime";
function useHook(cond) {
const $ = useMemoCache(2);
let log;
if ($[0] !== cond) {
log = [];
switch (CONST_STRING0) {
case CONST_STRING0: {
log.push(`@A`);
bb3: {
if (cond) {
break bb3;
}
log.push(`@B`);
}
log.push(`@C`);
}
}
$[0] = cond;
$[1] = log;
} else {
log = $[1];
}
return log;
}
export const FIXTURE_ENTRYPOINT = {
fn: useHook,
params: [true],
};
```
### Eval output
(kind: ok) ["@A","@C"]
@@ -0,0 +1,22 @@
import { CONST_STRING0 } from "shared-runtime";
function useHook(cond) {
const log = [];
switch (CONST_STRING0) {
case CONST_STRING0:
log.push(`@A`);
bb0: {
if (cond) {
break bb0;
}
log.push(`@B`);
}
log.push(`@C`);
}
return log;
}
export const FIXTURE_ENTRYPOINT = {
fn: useHook,
params: [true],
};
@@ -0,0 +1,62 @@
## Input
```javascript
function useHook(end) {
const log = [];
for (let i = 0; i < end + 1; i++) {
log.push(`${i} @A`);
bb0: {
if (i === end) {
break;
}
log.push(`${i} @B`);
}
log.push(`${i} @C`);
}
return log;
}
export const FIXTURE_ENTRYPOINT = {
fn: useHook,
params: [1],
};
```
## Code
```javascript
import { unstable_useMemoCache as useMemoCache } from "react";
function useHook(end) {
const $ = useMemoCache(2);
let log;
if ($[0] !== end) {
log = [];
for (let i = 0; i < end + 1; i++) {
log.push(`${i} @A`);
if (i === end) {
break;
}
log.push(`${i} @B`);
log.push(`${i} @C`);
}
$[0] = end;
$[1] = log;
} else {
log = $[1];
}
return log;
}
export const FIXTURE_ENTRYPOINT = {
fn: useHook,
params: [1],
};
```
### Eval output
(kind: ok) ["0 @A","0 @B","0 @C","1 @A"]
@@ -0,0 +1,69 @@
## Input
```javascript
import { CONST_STRING0 } from "shared-runtime";
function useHook(cond) {
const log = [];
switch (CONST_STRING0) {
case CONST_STRING0:
log.push(`@A`);
bb0: {
if (cond) {
break;
}
log.push(`@B`);
}
log.push(`@C`);
}
return log;
}
export const FIXTURE_ENTRYPOINT = {
fn: useHook,
params: [true],
};
```
## Code
```javascript
import { unstable_useMemoCache as useMemoCache } from "react";
import { CONST_STRING0 } from "shared-runtime";
function useHook(cond) {
const $ = useMemoCache(2);
let log;
if ($[0] !== cond) {
log = [];
bb1: switch (CONST_STRING0) {
case CONST_STRING0: {
log.push(`@A`);
if (cond) {
break bb1;
}
log.push(`@B`);
log.push(`@C`);
}
}
$[0] = cond;
$[1] = log;
} else {
log = $[1];
}
return log;
}
export const FIXTURE_ENTRYPOINT = {
fn: useHook,
params: [true],
};
```
### Eval output
(kind: ok) ["@A"]
@@ -0,0 +1,22 @@
import { CONST_STRING0 } from "shared-runtime";
function useHook(cond) {
const log = [];
switch (CONST_STRING0) {
case CONST_STRING0:
log.push(`@A`);
bb0: {
if (cond) {
break;
}
log.push(`@B`);
}
log.push(`@C`);
}
return log;
}
export const FIXTURE_ENTRYPOINT = {
fn: useHook,
params: [true],
};
@@ -534,7 +534,6 @@ const skipFilter = new Set([
// bugs
"bug-reduce-reactive-deps-return-in-scope",
"bug-reduce-reactive-deps-break-in-scope",
"bug-unlabeled-break-within-label-loop",
// 'react-forget-runtime' not yet supported
"flag-enable-emit-hook-guards",