Commit Graph
24 Commits
Author SHA1 Message Date
Jan Kassens b1006e12cd Invariant for use before definition of reactive values (#662) 2022-10-13 16:17:39 -04:00
Joseph Savona 0000ab6ca4 [new-arch] HIR cleanup per discussion
* Renames `Capability` to `Effect` and clarifies the kinds as Freeze, Read, and 
Mutate. The real intent of what we're inferring/representing is "what effect 
does this reference to the value have on its value". Ie freeze freezes the 
value, mutate mutates it. 

* Consolidates Capability and EffectKind into Effect 

* Renames some properties on Place for clarity 

* Adds `value: ValueKind` to Place, which indicates the (merged) kind of the 
value at that place at that point in the program. 

* Changes HIR printing to show the effect and the value kind 

* Simplifies some inference logic
2022-10-13 11:23:14 -07:00
mofeiZ 73059d9a4f [Playground][Nit] Add delete + overtype for autoclosing brackets
Fix for papercut: playground should now be smart about autoclosing brackets. 

Before: 


https://user-images.githubusercontent.com/34200447/195653419-0eb529e4-0aed-4894-9db6-bfe1554aaded.mov 

Now: 


https://user-images.githubusercontent.com/34200447/195653738-07abed36-d9e8-4842-bac5-9e84b72c0704.mov
2022-10-13 13:16:56 -04:00
Joseph Savona 144e856264 Cleanup reverse postordering
Splits out the reverse postorder logic from `shrink` into a separate method.
2022-10-13 07:58:06 -07:00
Sathya Gunasekaran b01fbfa7fb Change function parameters to type Place
So that we can infer a Capability of Freeze for components
2022-10-13 11:29:58 +01:00
Joseph Savona 5149ce0fbb [new-arch] Store HIR blocks in reverse postorder
* Changes HIR to store blocks in reverse postorder, which allows forward data 
flow analysis to iterate the blocks in order and (in the absence of loops) see 
all predecessors before visiting a successor. 

* Updates reference kind inference to exploit this ordering 

Note that the approach of modifying the ordering in `mapTerminalSuccessors()` 
feels gross, i'd like to split this up a bit.
2022-10-12 16:11:15 -07:00
Joseph Savona 3d4130140a [new-arch] Scaffolding and fixtures for mutability lifetime inference
Scaffolds out mutable lifetime inference and the potential two-pass approach, 
with motivating examples. Also adds some fixtures that collectively demonstrate 
a bunch of cases of aliasing: 

* direct assignment `a = b` 

* property assignment `a.b = b` 

* array literals `a = [b]` 

* object literals `a = {b}` 

* mutable arguments to the same call `foo(mut a, mut b)` 

* return values aliasing arguments `a = foo(mut b)` 

* aliasing that occurs only after multiple loop iterations 

All of these fixtures use an empty `if (varName) {}` as a way to check that an 
otherwise readonly usage of a variable is correctly inferred as mutable.
2022-10-12 10:54:09 -07:00
Joseph Savona 94adcf91b1 [new-arch] Cleanup unused analysis (#651) 2022-10-11 12:00:45 -07:00
Joseph Savona beb6e1431c [new-arch] Improve reference-kind analysis
This implements an alternative approach to reference kind inference in the new 
architecture based on feedback. Here, we track an environment that maps 
top-level identifiers (IdentifierId) to the "kind" of value stored: immutable, 
mutable, frozen, or maybe-frozen. We then do a forward data flow analysis 
updating this environment based on the semantics of each instruction combined 
with the types of values present. For example a reference of a value in a 
"mutable" position is inferred as readonly if the value is known to be frozen or 
immutable. Similarly, a usage of a reference in a "freeze" position is inferred 
as a freeze if the value is not yet definitively frozen, and inferred as 
readonly if the value is already frozen. 

When multiple control paths converge we merge the previous and new incoming 
environments, and only reprocess the block if the environment changed relative 
to the previous value. This has some noticeable benefits over the previous 
version: 

* We now infer precisely where `makeReadOnly()` calls need to be inserted, aka 
points where a value needs to be frozen may not yet be frozen. 

* We track immutable values and can infer their usage as readonly rather than 
mutable. 

* The system handles aliasing by representing values as distinct from variables, 
so that we can handle situations such as: 

```javascript 

const a = [];  // env: {a: value0; value0: mutable} 

const b = a;   // env: {a: value0, b: value0; value0: mutable} 

freeze(a);     // env: {a: value0, b: value0; value0: frozen} 

mayMutate(b);  // ordinarily inferred as a mutable reference, but we know its 
readonly 

```
2022-10-11 11:32:49 -07:00
Jan Kassens 7f17dd84d1 Import useMemoCache from unstable name
I didn't make this an option as it's unclear we'll really need this. We can 
always add an option later, I think. 

This is the name that's available on facebook.com at the moment.
2022-10-11 13:16:01 -04:00
Jan Kassens e575e22925 Add hash of Babel plugin to Jest transform
Jest caches based on the hash of the babel config. This caused us to not break 
that cache when the we made changes to the plugin. 

Fixes #643
2022-10-06 16:59:12 -04:00
Xuan Huang (黄玄) b605fc1ab3 [BE] Even more permissive ref annotation comment
Allow `readOnly` and `writable` or even `WriTaBlE`. 

commit-id:f6f77fd8
2022-10-05 18:42:16 -04:00
Xuan Huang (黄玄) a574d15985 [Fix] Control Dep Should Only Add To Defs
Control dep should only affect how things are invalidated, which are modeled as 
defs including declarations, writable uses to variables and expressions. 

Closes #633 

commit-id:41bd6fe5
2022-10-05 18:42:11 -04:00
Xuan Huang (黄玄) 19b08e67ad [Bailout] When Inputs Detected In DepGraph Cycle
Inputs occured in depGraph cycle is dangenrous and should be treated as an 
invariant since Forget _may_ generate broken code in this case, despite that 
technically this is a stricter then what we needed for the particular case of 
#633 and #634 and there   could be case that this is safe (like many `cfg-`   
tests that I have to mark as `bailout.`) 

I expect the next diff will fix them though. 

commit-id:0b13ed02
2022-10-05 18:42:10 -04:00
Joseph Savona cbbfba27b4 [new-arch][easy] Handle declarations (let/const) through codegen
Distinguishes between `LValue` and `Place`. For the most part this is the same 
data structure (LValue composes Place), but it's helpful to distinguish them 
since LValue has other properties such as the kind of declaration. The 
representations may diverge more in the future. 

This change lets us correctly emit code for variable declarations: previously we 
didn't emit `let` or `const`.
2022-10-06 08:56:20 -07:00
Joseph Savona 90ab346505 [new-arch][easy] Codegen for switch statements
Flushes out basic codegen for switch statements. This is more indication that we 
can recover nearly the original source even for complex control-flow, given the 
right IR design.
2022-10-05 19:45:05 -07:00
Joseph Savona f5f9143381 [new-architecture] Reassignment-safe frozenness inference
NOTE: this improves the equivalent of "ref kind inference" in the new 
architecture. I'd appreciate review here on the algorithm in particular, but in 
general my plan is to try to implement this on the current architecture. 

The previous InferMutability reference kind inference didn't properly handle 
capturing or reassignment combined with control flow. This is a new version 
(i'll clean up to delete InferMutability entirely) that is less ambitious but 
fully accurate (i hope, hence WIP): 

* Annotates all references of frozen variables as frozen. This includes 
following reassignment, so if you do `const x = props.x; foo(x);` we know that 
`x` is frozen because it derived from a frozen value. This even works 
conditionally, so if `x` is conditionally assigned to some value derived from eg 
props, and you later use `x`, that will be marked as frozen even if it could 
have other values at runtime (since it must conservatively assume a frozen value 
flowed in at runtime). 

* Annotates references that may mutate as mutable. 

* Annotates references that are not frozen, but not mutated _at this reference 
site_, as readonly. It's possible that a readonly usage is followed by a mutable 
usage, since we don't yet know the "lifetime" of the mutability. 

The notable difference from the previous attempt is that we do not attempt to 
find the point at which a formerly-mutable values becomes readonly (and 
therefore eligible for caching). That requires pointer analysis, let's discuss 
offline.
2022-10-05 13:56:13 -07:00
Xuan Huang (黄玄) e877f89dda Allow comment annotation to be spaced
I.e. `/* readonly */` is fine too 

commit-id:1437395a
2022-10-05 13:30:25 -04:00
Xuan Huang (黄玄) 83f3999a2e Support var declaration hoisting
Var declarations were treated identical as other declarations which cause code 
relying on them getting hoisted now triggers runtime exception on TDZ. 

This diff fixed that by generating `var` for `var` so they can be hoisted as 
usual. 

commit-id:00ab02f6
2022-10-05 13:23:37 -04:00
Mofei Zhang 896ef251b4 patch makeReadOnly into playground 2022-10-03 14:37:24 -04:00
Mofei Zhang 4e0639c2dc Add makeReadOnly codegen into the compiler 2022-10-03 14:37:23 -04:00
Mofei Zhang 72775fba10 makeReadOnly implementation
Added utility package to track mutations to objects marked as "read-only".
2022-09-29 14:17:38 -04:00
Joseph SavonaandFacebook GitHub Bot 3158146989 POC of new expression-oriented inference model for memoization within control-flow (#589)
* [hir] Core data types and lowering for new model

* Handle more expressions, including using babel for binding resolution

* test setup with pretty printing of ir

* Basic codegen and improved pretty printing

* avoid else block when if has no fallthrough

* emit function declarations with mapped name/params

* start of scope analysis

* saving state pre-run

* add slightly more complex example and flush out lowering/printing (jsx, new, variables)

* Various improvements:
* Convert logical expressions (|| and &&) to control flow, accounting
  for lazy evaluation semantics.
* Handle expression statements
* Improve printing of HIR for unsupported node kinds
* Handle more cases of JSX by falling by to OtherStatement to wrap
  subtrees at coarse granularity.

* improve HIR printing, lowering of expression statements

* handle object expression printing

* improve IR model for values/places along w codegen

* more test cases

* start of mutability inference

* passable but still incorrect mutability inference

* improved mutability inference, should cover most cases now

* visualization of reference graph

* correctly flow mutability backwards (have to actually set the capability)

* separate visualization in output

* consolidate on frozen/readonly/mutable capabilities

* cleanup

* conditional reassignment test (not quite working)

* hack to output svg files for debugging

* handle conditional reassignment

* improve capture analysis

* treat jsx as (interior) mutable; handle memberexpression lvalues

* lots of comments; hook return is frozen

* update main comment

* inference for switch, which reveals a bug

* fix yarn.lock
2024-03-25 10:39:47 +00:00
Xuan Huang (黄玄)andFacebook GitHub Bot a33c0b897c Initial commit 2024-03-25 10:39:47 +00:00