Skip to content

Commit

Permalink
[compiler] Improve handling of refs
Browse files Browse the repository at this point in the history
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)`.

ghstack-source-id: afb0b0cb014ffcf21ef4d0ede6511330fd975ec3
Pull Request resolved: #30902
  • Loading branch information
mvitousek committed Sep 16, 2024
1 parent c8a7cab commit 1e68a0a
Show file tree
Hide file tree
Showing 7 changed files with 579 additions and 264 deletions.
Loading

0 comments on commit 1e68a0a

Please sign in to comment.