[compiler] Improve handling of refs
Stack from ghstack (oldest at bottom):
- #30917
- -> #30902
- #30912
Summary:
This change expands our handling of refs to build an understanding of nested refs within objects and functions that may return refs. It builds a special-purpose type system within the ref analysis that gives a very lightweight structural type to objects and array expressions (merging the types of all their members), and then propagating those types throughout the analysis (e.g., if ref has type Ref, then { x: ref } and [ref] have type Structural(value=Ref) and {x: ref}.anything and [ref][anything] have type Ref).
This allows us to support structures that contain refs, and functions that operate over them, being created and passed around during rendering without at runtime accessing a ref value.
The analysis here uses a fixpoint to allow types to be fully propagated through the system, and we defend against diverging by widening the type of a variable if it could grow infinitely: so, in something like
let x = ref;
while (condition) {
x = [x]
}
we end up giving x the type Structural(value=Ref).
The latest updates on your projects. Learn more about Vercel for Git ↗︎
| Name | Status | Preview | Comments | Updated (UTC) |
|---|---|---|---|---|
| react-compiler-playground | ✅ Ready (Inspect) | Visit Preview | 💬 Add feedback | Sep 16, 2024 6:03pm |
Internal sync results
A few runtime errors that need to be addressed before this can land but a significant reduction in bailouts
Updated sync results from the top of this stack at #30917 (including some unrelated PRs), looks good