Skip to content

Commit

Permalink
[compiler] Test fixture: non-reactive phi creates 'dangling ref' scope
Browse files Browse the repository at this point in the history
ghstack-source-id: 5dba5c0b1d2e17c1d8d8a88a363f28ad7ac4746a
Pull Request resolved: #31103
  • Loading branch information
mofeiZ committed Sep 30, 2024
1 parent 1fe2f2b commit 096e343
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@

## Input

```javascript
import { CONST_TRUE, Stringify, setProperty } from "shared-runtime";

function Component({arg}) {
const obj = CONST_TRUE ? {inner: {value: "hello"}} : null;
const boxedInner = [obj?.inner];
useHook();
setProperty(obj, arg);
if (boxedInner[0] !== obj?.inner) {
throw new Error("invariant broken");
}
return <Stringify obj={obj} inner={boxedInner} />;
}

export const FIXTURE_ENTRYPOINT = {
fn: Component,
params: [{arg: 0}],
sequentialRenders: [{arg: 0}, {arg: 1}]
}

```
## Code
```javascript
import { c as _c } from "react/compiler-runtime";
import { CONST_TRUE, Stringify, setProperty } from "shared-runtime";

function Component(t0) {
const $ = _c(5);
const { arg } = t0;
const obj = CONST_TRUE ? { inner: { value: "hello" } } : null;
const t1 = obj?.inner;
let t2;
if ($[0] !== t1) {
t2 = [t1];
$[0] = t1;
$[1] = t2;
} else {
t2 = $[1];
}
const boxedInner = t2;
useHook();
setProperty(obj, arg);
if (boxedInner[0] !== obj?.inner) {
throw new Error("invariant broken");
}
let t3;
if ($[2] !== obj || $[3] !== boxedInner) {
t3 = <Stringify obj={obj} inner={boxedInner} />;
$[2] = obj;
$[3] = boxedInner;
$[4] = t3;
} else {
t3 = $[4];
}
return t3;
}

export const FIXTURE_ENTRYPOINT = {
fn: Component,
params: [{ arg: 0 }],
sequentialRenders: [{ arg: 0 }, { arg: 1 }],
};

```
### Eval output
(kind: ok) [[ (exception in render) ReferenceError: useHook is not defined ]]
[[ (exception in render) ReferenceError: useHook is not defined ]]
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { CONST_TRUE, Stringify, mutate, useIdentity } from "shared-runtime";

/**
* Fixture showing an edge case for ReactiveScope variable propagation.
*
* Found differences in evaluator results
* Non-forget (expected):
* <div>{"obj":{"inner":{"value":"hello"},"wat0":"joe"},"inner":["[[ cyclic ref *2 ]]"]}</div>
* <div>{"obj":{"inner":{"value":"hello"},"wat0":"joe"},"inner":["[[ cyclic ref *2 ]]"]}</div>
* Forget:
* <div>{"obj":{"inner":{"value":"hello"},"wat0":"joe"},"inner":["[[ cyclic ref *2 ]]"]}</div>
* [[ (exception in render) Error: invariant broken ]]
*
*/
function Component() {
const obj = CONST_TRUE ? {inner: {value: "hello"}} : null;
const boxedInner = [obj?.inner];
useIdentity(null);
mutate(obj);
if (boxedInner[0] !== obj?.inner) {
throw new Error("invariant broken");
}
return <Stringify obj={obj} inner={boxedInner} />;
}

export const FIXTURE_ENTRYPOINT = {
fn: Component,
params: [{arg: 0}],
sequentialRenders: [{arg: 0}, {arg: 1}]
}
1 change: 1 addition & 0 deletions compiler/packages/snap/src/SproutTodoFilter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,7 @@ const skipFilter = new Set([
'fbt/bug-fbt-plural-multiple-mixed-call-tag',
'bug-invalid-hoisting-functionexpr',
'bug-try-catch-maybe-null-dependency',
'bug-invalid-phi-as-dependency',
'reduce-reactive-deps/bug-infer-function-cond-access-not-hoisted',
'reduce-reactive-deps/bug-merge-uncond-optional-chain-and-cond',
'original-reactive-scopes-fork/bug-nonmutating-capture-in-unsplittable-memo-block',
Expand Down

0 comments on commit 096e343

Please sign in to comment.