From abe84227f52a4dcc435fb46085eb0fd991f056b3 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Fri, 10 Aug 2018 11:35:42 -0700 Subject: [PATCH] Adds a flag for Array.prototype method nested optimized functions (#2404) Summary: Release notes: adds a `arrayNestedOptimizedFunctionsEnabled` flag to enable nested optimized functions derived from Array.prototype methods (like `map`) and Array.from This PR puts the existing (unstable) work for Array prototype methods behind a flag. The flag is enabled by default in React and serializer tests. Pull Request resolved: https://github.com/facebook/prepack/pull/2404 Differential Revision: D9272747 Pulled By: trueadm fbshipit-source-id: d7e53656a12cd6cff680a9ef0e2580a93d56e34e --- scripts/debug-fb-www.js | 1 + scripts/test-runner.js | 4 ++++ src/options.js | 1 + src/prepack-options.js | 3 +++ src/realm.js | 2 ++ src/values/ArrayValue.js | 2 +- test/react/setupReactTests.js | 1 + .../additional-functions/NestedOptimizedFunction17.js | 2 ++ test/serializer/optimized-functions/ArrayFrom3.js | 2 ++ test/serializer/optimized-functions/ArrayFrom6.js | 1 + test/serializer/optimized-functions/ArrayFrom7.js | 1 + test/serializer/optimized-functions/ArrayFrom8.js | 1 + test/serializer/optimized-functions/ArrayFrom9.js | 1 + .../DefineOptFuncInsideFuncInsideOptFunc.js | 1 + test/serializer/optimized-functions/Issue2358.js | 2 ++ test/serializer/optimized-functions/Issue2359-1.js | 2 ++ test/serializer/optimized-functions/Issue2392-1.js | 2 ++ test/serializer/optimized-functions/Issue2392-2.js | 2 ++ test/serializer/optimized-functions/Issue2398.js | 2 ++ 19 files changed, 32 insertions(+), 1 deletion(-) diff --git a/scripts/debug-fb-www.js b/scripts/debug-fb-www.js index b4cc6b7a3..a300f6d56 100644 --- a/scripts/debug-fb-www.js +++ b/scripts/debug-fb-www.js @@ -74,6 +74,7 @@ let prepackOptions = { reactOutput: "jsx", reactVerbose: true, reactOptimizeNestedFunctions: false, + arrayNestedOptimizedFunctionsEnabled: false, inlineExpressions: true, invariantLevel: 0, abstractValueImpliesMax: 1000, diff --git a/scripts/test-runner.js b/scripts/test-runner.js index c9f3a512a..347c9ed9a 100644 --- a/scripts/test-runner.js +++ b/scripts/test-runner.js @@ -363,7 +363,11 @@ function runTest(name, code, options: PrepackOptions, args) { internalDebug: true, serialize: true, uniqueSuffix: "", + arrayNestedOptimizedFunctionsEnabled: false, }): any): PrepackOptions); // Since PrepackOptions is an exact type I have to cast + if (code.includes("// arrayNestedOptimizedFunctionsEnabled")) { + options.arrayNestedOptimizedFunctionsEnabled = true; + } if (code.includes("// throws introspection error")) { try { let realmOptions = { diff --git a/src/options.js b/src/options.js index fef529e1e..d0217792e 100644 --- a/src/options.js +++ b/src/options.js @@ -59,6 +59,7 @@ export type RealmOptions = { reactOptimizeNestedFunctions?: boolean, stripFlow?: boolean, abstractValueImpliesMax?: number, + arrayNestedOptimizedFunctionsEnabled?: boolean, }; export type SerializerOptions = { diff --git a/src/prepack-options.js b/src/prepack-options.js index 18ada43c0..0660a3875 100644 --- a/src/prepack-options.js +++ b/src/prepack-options.js @@ -61,6 +61,7 @@ export type PrepackOptions = {| debuggerConfigArgs?: DebuggerConfigArguments, debugReproArgs?: DebugReproArguments, onParse?: BabelNodeFile => void, + arrayNestedOptimizedFunctionsEnabled?: boolean, |}; export function getRealmOptions({ @@ -87,6 +88,7 @@ export function getRealmOptions({ abstractValueImpliesMax, debuggerConfigArgs, debugReproArgs, + arrayNestedOptimizedFunctionsEnabled, }: PrepackOptions): RealmOptions { return { compatibility, @@ -112,6 +114,7 @@ export function getRealmOptions({ abstractValueImpliesMax, debuggerConfigArgs, debugReproArgs, + arrayNestedOptimizedFunctionsEnabled, }; } diff --git a/src/realm.js b/src/realm.js index 97b2e16b1..46f376b81 100644 --- a/src/realm.js +++ b/src/realm.js @@ -337,6 +337,7 @@ export class Realm { this.debugNames = opts.debugNames; this._checkedObjectIds = new Map(); this.optimizedFunctions = new Map(); + this.arrayNestedOptimizedFunctionsEnabled = opts.arrayNestedOptimizedFunctionsEnabled || false; } statistics: RealmStatistics; @@ -482,6 +483,7 @@ export class Realm { _checkedObjectIds: Map; optimizedFunctions: Map; + arrayNestedOptimizedFunctionsEnabled: boolean; // to force flow to type the annotations isCompatibleWith(compatibility: Compatibility): boolean { diff --git a/src/values/ArrayValue.js b/src/values/ArrayValue.js index a5a1d5deb..72a7b4e1f 100644 --- a/src/values/ArrayValue.js +++ b/src/values/ArrayValue.js @@ -80,7 +80,7 @@ function createArrayWithWidenedNumericProperty( let abstractArrayValue = new ArrayValue(realm, intrinsicName); if (possibleNestedOptimizedFunctions !== undefined) { - if (!realm.react.enabled || realm.react.optimizeNestedFunctions) { + if (realm.arrayNestedOptimizedFunctionsEnabled && (!realm.react.enabled || realm.react.optimizeNestedFunctions)) { evaluatePossibleNestedOptimizedFunctionsAndStoreEffects( realm, abstractArrayValue, diff --git a/test/react/setupReactTests.js b/test/react/setupReactTests.js index 813ebd9e1..d53c92ff4 100644 --- a/test/react/setupReactTests.js +++ b/test/react/setupReactTests.js @@ -133,6 +133,7 @@ ${source} reactEnabled: true, reactOutput: useJSXOutput ? "jsx" : "create-element", reactOptimizeNestedFunctions: true, + arrayNestedOptimizedFunctionsEnabled: true, inlineExpressions: true, invariantLevel: 0, stripFlow: true, diff --git a/test/serializer/additional-functions/NestedOptimizedFunction17.js b/test/serializer/additional-functions/NestedOptimizedFunction17.js index 31e17ed2e..ef5d1703e 100644 --- a/test/serializer/additional-functions/NestedOptimizedFunction17.js +++ b/test/serializer/additional-functions/NestedOptimizedFunction17.js @@ -1,3 +1,5 @@ +// arrayNestedOptimizedFunctionsEnabled + function fn(props, cond, cond2, cond3) { var arr = Array.from(props.x); var newObj; diff --git a/test/serializer/optimized-functions/ArrayFrom3.js b/test/serializer/optimized-functions/ArrayFrom3.js index 59ac4687e..050c5f3a8 100644 --- a/test/serializer/optimized-functions/ArrayFrom3.js +++ b/test/serializer/optimized-functions/ArrayFrom3.js @@ -1,3 +1,5 @@ +// arrayNestedOptimizedFunctionsEnabled + function fn(x, y) { var edges = Array.from(x); var items = edges diff --git a/test/serializer/optimized-functions/ArrayFrom6.js b/test/serializer/optimized-functions/ArrayFrom6.js index 2aff88db9..8c162275e 100644 --- a/test/serializer/optimized-functions/ArrayFrom6.js +++ b/test/serializer/optimized-functions/ArrayFrom6.js @@ -1,4 +1,5 @@ // does not contain:// this function should be inlined +// arrayNestedOptimizedFunctionsEnabled (function() { function add(a, b) { diff --git a/test/serializer/optimized-functions/ArrayFrom7.js b/test/serializer/optimized-functions/ArrayFrom7.js index 131d7673a..97f4f2dbb 100644 --- a/test/serializer/optimized-functions/ArrayFrom7.js +++ b/test/serializer/optimized-functions/ArrayFrom7.js @@ -1,4 +1,5 @@ // does not contain:// this function should be inlined +// arrayNestedOptimizedFunctionsEnabled (function() { var obj = { diff --git a/test/serializer/optimized-functions/ArrayFrom8.js b/test/serializer/optimized-functions/ArrayFrom8.js index be5d9c9a0..3734ce3b0 100644 --- a/test/serializer/optimized-functions/ArrayFrom8.js +++ b/test/serializer/optimized-functions/ArrayFrom8.js @@ -1,4 +1,5 @@ // does contain:// this function should not be inlined +// arrayNestedOptimizedFunctionsEnabled (function() { var obj = { diff --git a/test/serializer/optimized-functions/ArrayFrom9.js b/test/serializer/optimized-functions/ArrayFrom9.js index 3da127908..594b6d864 100644 --- a/test/serializer/optimized-functions/ArrayFrom9.js +++ b/test/serializer/optimized-functions/ArrayFrom9.js @@ -1,4 +1,5 @@ // does contain:// this function should not be inlined +// arrayNestedOptimizedFunctionsEnabled (function() { function add(a, b) { diff --git a/test/serializer/optimized-functions/DefineOptFuncInsideFuncInsideOptFunc.js b/test/serializer/optimized-functions/DefineOptFuncInsideFuncInsideOptFunc.js index e68b02534..40f78eebf 100644 --- a/test/serializer/optimized-functions/DefineOptFuncInsideFuncInsideOptFunc.js +++ b/test/serializer/optimized-functions/DefineOptFuncInsideFuncInsideOptFunc.js @@ -1,3 +1,4 @@ +// arrayNestedOptimizedFunctionsEnabled // skip lint // The original issue here was that nested is defined inside of fn2 which is a non-optimized function // called by fn (an optimized function). That caused Prepack to not detect that nested was nested diff --git a/test/serializer/optimized-functions/Issue2358.js b/test/serializer/optimized-functions/Issue2358.js index 838340c00..915c85749 100644 --- a/test/serializer/optimized-functions/Issue2358.js +++ b/test/serializer/optimized-functions/Issue2358.js @@ -1,3 +1,5 @@ +// arrayNestedOptimizedFunctionsEnabled + function fn(x, y, obj, cond) { var arr = Array.from(x); var arr2 = Array.from(y); diff --git a/test/serializer/optimized-functions/Issue2359-1.js b/test/serializer/optimized-functions/Issue2359-1.js index e7130d1c2..963b65f01 100644 --- a/test/serializer/optimized-functions/Issue2359-1.js +++ b/test/serializer/optimized-functions/Issue2359-1.js @@ -1,3 +1,5 @@ +// arrayNestedOptimizedFunctionsEnabled + function fn(x, cond, abstractFunc) { var arr = Array.from(x); diff --git a/test/serializer/optimized-functions/Issue2392-1.js b/test/serializer/optimized-functions/Issue2392-1.js index d9a1caf85..3f6bb6122 100644 --- a/test/serializer/optimized-functions/Issue2392-1.js +++ b/test/serializer/optimized-functions/Issue2392-1.js @@ -1,3 +1,5 @@ +// arrayNestedOptimizedFunctionsEnabled + function fn(x, obj, cond, cond4) { var arr = Array.from(x); diff --git a/test/serializer/optimized-functions/Issue2392-2.js b/test/serializer/optimized-functions/Issue2392-2.js index e7fd82dac..4ed3a86f5 100644 --- a/test/serializer/optimized-functions/Issue2392-2.js +++ b/test/serializer/optimized-functions/Issue2392-2.js @@ -1,3 +1,5 @@ +// arrayNestedOptimizedFunctionsEnabled + function fn(x, obj, cond, cond2, cond3, cond4) { var arr = Array.from(x); var a; diff --git a/test/serializer/optimized-functions/Issue2398.js b/test/serializer/optimized-functions/Issue2398.js index 6165bef7d..fbbf8ef6d 100644 --- a/test/serializer/optimized-functions/Issue2398.js +++ b/test/serializer/optimized-functions/Issue2398.js @@ -1,3 +1,5 @@ +// arrayNestedOptimizedFunctionsEnabled + function fn(props, cond) { var arr = Array.from(props.x); var newObj;