Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Run getConstants method statements on main queue
Summary: If a NativeModule requires main queue setup, its `getConstants()` method must be executed on the main thead. The legacy NativeModule infra takes care of this for us. With TurboModules, however, all synchronous methods, including `getConstants()`, execute on the JS thread. Therefore, if a TurboModule requires main queue setup, and exports constants, we must execute its `getConstants()` method body on the main queue explicitly. **Notes:** - The changes in this diff should be a noop when TurboModules is off, because `RCTUnsafeExecuteOnMainQueueSync` synchronously execute its block on the current thread if the current thread is the main thread. - If a NativeModule doens't have the `requiresMainQueueSetup` method, but has the `constantsToExport` method, both NativeModules and TurboModules assume that it requires main queue setup. ## Script ``` const exec = require("../lib/exec"); const abspath = require("../lib/abspath"); const relpath = require("../lib/relpath"); const readFile = (filename) => require("fs").readFileSync(filename, "utf8"); const writeFile = (filename, content) => require("fs").writeFileSync(filename, content); function main() { const tmFiles = exec("cd ~/fbsource && xbgs -n 10000 -l constantsToExport") .split("\n") .filter(Boolean); const filesWithoutConstantsToExport = []; const filesWithConstantsToExportButNotGetConstants = []; const filesExplicitlyNotRequiringMainQueueSetup = []; tmFiles .filter((filename) => { if (filename.includes("microsoft-fork-of-react-native")) { return false; } return /\.mm?$/.test(filename); }) .map(abspath) .forEach((filename) => { const code = readFile(filename); const relFilename = relpath(filename); if (!/constantsToExport\s*{/.test(code)) { filesWithoutConstantsToExport.push(relFilename); return; } if (!/getConstants\s*{/.test(code)) { filesWithConstantsToExportButNotGetConstants.push(relFilename); return; } if (/requiresMainQueueSetup\s*{/.test(code)) { const requiresMainQueueSetupRegex = /requiresMainQueueSetup\s*{\s*return\s+(?<requiresMainQueueSetup>YES|NO)/; const requiresMainQueueSetupRegexMatch = requiresMainQueueSetupRegex.exec( code ); if (!requiresMainQueueSetupRegexMatch) { throw new Error( "Detected requiresMainQueueSetup method in file " + relFilename + " but was unable to parse the method return value" ); } const { requiresMainQueueSetup, } = requiresMainQueueSetupRegexMatch.groups; if (requiresMainQueueSetup == "NO") { filesExplicitlyNotRequiringMainQueueSetup.push(relFilename); return; } } const getConstantsTypeRegex = () => /-\s*\((?<type>.*)\)getConstants\s*{/; const getConstantsTypeRegexMatch = getConstantsTypeRegex().exec(code); if (!getConstantsTypeRegexMatch) { throw new Error( `Failed to parse return type of getConstants method in file ${relFilename}` ); } const getConstantsType = getConstantsTypeRegexMatch.groups.type; const getConstantsBody = code .split(getConstantsTypeRegex())[2] .split("\n}")[0]; const newGetConstantsBody = ` __block ${getConstantsType} constants; RCTUnsafeExecuteOnMainQueueSync(^{${getConstantsBody .replace(/\n/g, "\n ") .replace(/_bridge/g, "self->_bridge") .replace(/return /g, "constants = ")} }); return constants; `; writeFile( filename, code .replace(getConstantsBody, newGetConstantsBody) .replace("#import", "#import <React/RCTUtils.h>\n#import") ); }); console.log("Files without constantsToExport: "); filesWithoutConstantsToExport.forEach((file) => console.log(file)); console.log(); console.log("Files with constantsToExport but no getConstants: "); filesWithConstantsToExportButNotGetConstants.forEach((file) => console.log(file) ); console.log(); console.log("Files with requiresMainQueueSetup = NO: "); filesExplicitlyNotRequiringMainQueueSetup.forEach((file) => console.log(file) ); } if (!module.parent) { main(); } ``` Changelog: [Internal] Reviewed By: fkgozali Differential Revision: D21797048 fbshipit-source-id: a822a858fecdbe976e6197f8339e509dc7cd917f
- Loading branch information