prepack/test/react
Dominic Gannaway 06736f0df5 Rearchitect evaluatePure and side-effect tracking (#2587)
Summary:
Release notes: the side-effect detection system within pure scopes has been improved

This PR revamps the entire `evaluatePure` system. The old system had so many small issues with it was the cause of many edge-cases that were hard to patch up. Specifically, the PR makes the following changes:

- `realm.evaluatePure` -> `realm.evaluateWithPureScope` and now can only be used a single instance. Nesting further `realm.evaluateWithPureScope` calls will trigger an invariant and is strictly forbidden. Furthermore, it now only takes a single argument – the function you're wrapped around.
- All places that used pure scope wrappers have been updated to conditionally enable it depending if the `realm.isInPureScope()` returns `true` or `false`.
- `realm.evaluateFunctionForPureEffects` has been added, this works like `evaluateForEffects` except it requires a root function and a callback for side-effects. The callback for side-effects works like the old callback that was `evaluatePure`.
- `realm.evaluateFunctionForPureEffectsInGlobalEnv` has been added a convenience wrapper around `realm.evaluateFunctionForPureEffects`.
- When we leak bindings, we no longer set their value to `undefined` or `realm.intrinsics.undefined`. We now set the value to a special "leaked abstract", specifically – `realm.intrinsics.__leakedValue` – like `topValue` and `bottomValue`.

Unsurprisingly, this now fixes a host of bugs that existed before. Including fixes for https://github.com/facebook/prepack/issues/2598, https://github.com/facebook/prepack/issues/2579, https://github.com/facebook/prepack/issues/2446, https://github.com/facebook/prepack/issues/2599 and probably many other issues too.

The logic for detection of side-effects works very differently from before but after speaking to sebmarkbage last week, he pointed me in this direction to track side-effects rather than how we did it before. We now find side-effects from a given set of effects, rather than in an ad-hoc manor as mutations occur on objects/bindings. This PR requires https://github.com/facebook/prepack/pull/2596 as a dependency as it re-uses the logic.

Closes https://github.com/facebook/prepack/pull/2587. Fixes https://github.com/facebook/prepack/issues/2598. Fixes https://github.com/facebook/prepack/issues/2579. Fixes https://github.com/facebook/prepack/issues/2446. Fixes https://github.com/facebook/prepack/issues/2599.
Pull Request resolved: https://github.com/facebook/prepack/pull/2600

Differential Revision: D10368159

Pulled By: trueadm

fbshipit-source-id: ded248f5cfd8648913cae9b9c697d723a82c59ab
2018-10-12 15:45:50 -07:00
..
__snapshots__ Rearchitect evaluatePure and side-effect tracking (#2587) 2018-10-12 15:45:50 -07:00
AssignSpread Make React tests fast (#2187) 2018-07-02 11:25:58 -07:00
ClassComponents Fix React branch serialization issues (#2318) 2018-07-25 09:55:21 -07:00
FactoryComponents Make React tests fast (#2187) 2018-07-02 11:25:58 -07:00
FBMocks Adds React pe-functional-components benchmark and some React SSR changes (#2560) 2018-09-24 03:56:52 -07:00
FirstRenderOnly Reduce React bloat on equivalent objects with similar temporal alias trees (#2193) 2018-07-05 05:09:30 -07:00
FunctionalComponents Rearchitect evaluatePure and side-effect tracking (#2587) 2018-10-12 15:45:50 -07:00
ReactDOM Make React tests fast (#2187) 2018-07-02 11:25:58 -07:00
ReactNative Run Prettier checks on CI (#2212) 2018-07-10 09:55:23 -07:00
Reconciliation Fix for ReactElement temporals in React branches (#2597) 2018-10-10 06:54:57 -07:00
RenderProps Make React tests fast (#2187) 2018-07-02 11:25:58 -07:00
ServerRendering Adds React pe-functional-components benchmark and some React SSR changes (#2560) 2018-09-24 03:56:52 -07:00
Throw Add basic support for throws in React (#2502) 2018-08-29 18:37:03 -07:00
AssignSpread-test.js Make React tests fast (#2187) 2018-07-02 11:25:58 -07:00
ClassComponents-test.js Fix React branch serialization issues (#2318) 2018-07-25 09:55:21 -07:00
FactoryComponents-test.js Make React tests fast (#2187) 2018-07-02 11:25:58 -07:00
FBMocks-test.js Adds React pe-functional-components benchmark and some React SSR changes (#2560) 2018-09-24 03:56:52 -07:00
FirstRenderOnly-test.js Reduce React bloat on equivalent objects with similar temporal alias trees (#2193) 2018-07-05 05:09:30 -07:00
FunctionalComponents-test.js Rearchitect evaluatePure and side-effect tracking (#2587) 2018-10-12 15:45:50 -07:00
ReactDOM-test.js Make React tests fast (#2187) 2018-07-02 11:25:58 -07:00
ReactNative-test.js Run Prettier checks on CI (#2212) 2018-07-10 09:55:23 -07:00
Reconciliation-test.js Fix for ReactElement temporals in React branches (#2597) 2018-10-10 06:54:57 -07:00
RenderProps-test.js Make React tests fast (#2187) 2018-07-02 11:25:58 -07:00
ServerRendering-test.js Adds React pe-functional-components benchmark and some React SSR changes (#2560) 2018-09-24 03:56:52 -07:00
setupReactTests.js Add basic support for throws in React (#2502) 2018-08-29 18:37:03 -07:00
Throw-test.js Add basic support for throws in React (#2502) 2018-08-29 18:37:03 -07:00