-
Notifications
You must be signed in to change notification settings - Fork 47.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
compiler: Known hooks/nonescaping scopes dont count as pruned #29820
Changes from all commits
c59c335
21724a5
8241eec
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
|
||
## Input | ||
|
||
```javascript | ||
// @flow | ||
function Component() { | ||
return ( | ||
<div | ||
className={stylex( | ||
// this value is a) in its own scope, b) non-reactive, and c) non-escaping | ||
// its scope gets pruned bc it's non-escaping, but this doesn't mean we need to | ||
// create a temporary for it | ||
flags.feature("feature-name") ? styles.featureNameStyle : null | ||
)} | ||
></div> | ||
); | ||
} | ||
|
||
``` | ||
|
||
## Code | ||
|
||
```javascript | ||
import { c as _c } from "react/compiler-runtime"; | ||
function Component() { | ||
const $ = _c(1); | ||
let t0; | ||
if ($[0] === Symbol.for("react.memo_cache_sentinel")) { | ||
t0 = ( | ||
<div | ||
className={stylex( | ||
flags.feature("feature-name") ? styles.featureNameStyle : null, | ||
)} | ||
/> | ||
); | ||
Comment on lines
+28
to
+35
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This output matches what we have on main today. Whereas with the previous PR in the stack the output was: const t0 = flags.feature("feature-name") ? styles.featureNameStyle : null;
let t1;
if ($[0] !== t0) {
t1 = stylex(t0);
$[0] = t0;
$[1] = t1;
} else {
t1 = $[1];
}
let t2;
if ($[2] !== t1) {
t2 = <div className={t1} />;
$[2] = t1;
$[3] = t2;
} else {
t2 = $[3];
}
return t2; Way more code and 4 cache slots instead of 1. |
||
$[0] = t0; | ||
} else { | ||
t0 = $[0]; | ||
} | ||
return t0; | ||
} | ||
|
||
``` | ||
|
||
### Eval output | ||
(kind: exception) Fixture not implemented |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
// @flow | ||
function Component() { | ||
return ( | ||
<div | ||
className={stylex( | ||
// this value is a) in its own scope, b) non-reactive, and c) non-escaping | ||
// its scope gets pruned bc it's non-escaping, but this doesn't mean we need to | ||
// create a temporary for it | ||
flags.feature("feature-name") ? styles.featureNameStyle : null | ||
)} | ||
></div> | ||
); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -39,7 +39,7 @@ export const FIXTURE_ENTRYPOINT = { | |
```javascript | ||
import { c as _c } from "react/compiler-runtime"; | ||
function Component(props) { | ||
const $ = _c(2); | ||
const $ = _c(1); | ||
|
||
const a = []; | ||
const b = []; | ||
|
@@ -53,12 +53,11 @@ function Component(props) { | |
x = 1; | ||
} | ||
let t0; | ||
if ($[0] !== x) { | ||
if ($[0] === Symbol.for("react.memo_cache_sentinel")) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
t0 = [x]; | ||
$[0] = x; | ||
$[1] = t0; | ||
$[0] = t0; | ||
} else { | ||
t0 = $[1]; | ||
t0 = $[0]; | ||
} | ||
return t0; | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this logic is now in FlattenScopesWithHooksOrUse, and also takes account of
use()
and not just hooks