From 0e8723c3bb9566542f009994484b30c3da72ede7 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 2 Nov 2023 18:48:07 +0000 Subject: [PATCH] Patch facebook/metro#1130 to profile module init (#1796) --- patches/metro+0.76.8.patch | 44 +++++++++++++++++++++ patches/metro-transform-worker+0.76.8.patch | 41 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 patches/metro+0.76.8.patch create mode 100644 patches/metro-transform-worker+0.76.8.patch diff --git a/patches/metro+0.76.8.patch b/patches/metro+0.76.8.patch new file mode 100644 index 00000000..f8ef67c8 --- /dev/null +++ b/patches/metro+0.76.8.patch @@ -0,0 +1,44 @@ +diff --git a/node_modules/metro/src/ModuleGraph/worker/JsFileWrapping.js b/node_modules/metro/src/ModuleGraph/worker/JsFileWrapping.js +index 48a1409..ef185c9 100644 +--- a/node_modules/metro/src/ModuleGraph/worker/JsFileWrapping.js ++++ b/node_modules/metro/src/ModuleGraph/worker/JsFileWrapping.js +@@ -70,14 +70,19 @@ function wrapModule( + importDefaultName, + importAllName, + dependencyMapName, +- globalPrefix ++ globalPrefix, ++ moduleFactoryName + ) { + const params = buildParameters( + importDefaultName, + importAllName, + dependencyMapName + ); +- const factory = functionFromProgram(fileAst.program, params); ++ const factory = functionFromProgram( ++ fileAst.program, ++ params, ++ moduleFactoryName ++ ); + const def = t.callExpression(t.identifier(`${globalPrefix}__d`), [factory]); + const ast = t.file(t.program([t.expressionStatement(def)])); + const requireName = renameRequires(ast); +@@ -107,7 +112,16 @@ function wrapJson(source, globalPrefix) { + "});", + ].join("\n"); + } +-function functionFromProgram(program, parameters) { ++const JS_INVALID_IDENT_RE = /[^a-zA-Z0-9$_]/g; ++function functionFromProgram(program, parameters, moduleFactoryName) { ++ let identifier; ++ if (typeof moduleFactoryName === "string" && moduleFactoryName !== "") { ++ // Keep the name readable so it shows up in profiler traces. ++ // Add an unlikely suffix to avoid collisions with the module code. ++ identifier = t.identifier( ++ `${moduleFactoryName.replace(JS_INVALID_IDENT_RE, "_")}__module_factory__` ++ ); ++ } + return t.functionExpression( + undefined, + parameters.map(makeIdentifier), diff --git a/patches/metro-transform-worker+0.76.8.patch b/patches/metro-transform-worker+0.76.8.patch new file mode 100644 index 00000000..d835eee0 --- /dev/null +++ b/patches/metro-transform-worker+0.76.8.patch @@ -0,0 +1,41 @@ +diff --git a/node_modules/metro-transform-worker/src/index.js b/node_modules/metro-transform-worker/src/index.js +index 27d4cb3..fd71f47 100644 +--- a/node_modules/metro-transform-worker/src/index.js ++++ b/node_modules/metro-transform-worker/src/index.js +@@ -190,6 +190,10 @@ async function transformJS(file, { config, options, projectRoot }) { + let dependencyMapName = ""; + let dependencies; + let wrappedAst; ++ const minify = ++ options.minify && ++ options.unstable_transformProfile !== "hermes-canary" && ++ options.unstable_transformProfile !== "hermes-stable"; + + // If the module to transform is a script (meaning that is not part of the + // dependency graph and it code will just be prepended to the bundle modules), +@@ -229,19 +233,20 @@ async function transformJS(file, { config, options, projectRoot }) { + if (config.unstable_disableModuleWrapping === true) { + wrappedAst = ast; + } else { ++ let moduleFactoryName; ++ if (options.dev && !minify) { ++ moduleFactoryName = file.filename; ++ } + ({ ast: wrappedAst } = JsFileWrapping.wrapModule( + ast, + importDefault, + importAll, + dependencyMapName, +- config.globalPrefix ++ config.globalPrefix, ++ moduleFactoryName + )); + } + } +- const minify = +- options.minify && +- options.unstable_transformProfile !== "hermes-canary" && +- options.unstable_transformProfile !== "hermes-stable"; + const reserved = []; + if (config.unstable_dependencyMapReservedName != null) { + reserved.push(config.unstable_dependencyMapReservedName);