From 4732b6033167bb7c3c3331d6975b5ed2ed5de8ef Mon Sep 17 00:00:00 2001 From: Eduardo Speroni Date: Thu, 30 Jul 2026 09:38:26 -0300 Subject: [PATCH 1/5] refactor: move embedded runtime JS to real .js files compiled in via js2c The ~26KB of JavaScript previously embedded as C++ string literals now lives in NativeScript/runtime/js/*.js. A "Generate RuntimeBuiltins" build phase runs tools/js2c.mjs to emit a generated source table, and call sites go through BuiltinLoader::RunBuiltin, which sets proper internal/.js script origins and shares an in-process bytecode cache across isolates so workers stop re-parsing the builtins. --- .gitignore | 3 + NativeScript/runtime/BuiltinLoader.cpp | 83 +++++++++++ NativeScript/runtime/BuiltinLoader.h | 23 +++ NativeScript/runtime/ClassBuilder.mm | 24 +--- NativeScript/runtime/ErrorEvents.cpp | 93 +----------- NativeScript/runtime/Events.cpp | 141 +------------------ NativeScript/runtime/Helpers.mm | 35 +---- NativeScript/runtime/InlineFunctions.cpp | 129 +---------------- NativeScript/runtime/ModuleInternal.mm | 27 +--- NativeScript/runtime/PromiseProxy.cpp | 81 +---------- NativeScript/runtime/Runtime.mm | 76 +--------- NativeScript/runtime/TSHelpers.cpp | 130 +---------------- NativeScript/runtime/WeakRef.cpp | 23 +-- NativeScript/runtime/js/blob-url.js | 59 ++++++++ NativeScript/runtime/js/class-extends.js | 13 ++ NativeScript/runtime/js/error-events.js | 81 +++++++++++ NativeScript/runtime/js/events.js | 129 +++++++++++++++++ NativeScript/runtime/js/inline-functions.js | 101 +++++++++++++ NativeScript/runtime/js/promise-proxy.js | 69 +++++++++ NativeScript/runtime/js/require-factory.js | 10 ++ NativeScript/runtime/js/smart-stringify.js | 19 +++ NativeScript/runtime/js/ts-helpers.js | 107 ++++++++++++++ NativeScript/runtime/js/weak-ref.js | 9 ++ package.json | 3 +- tools/js2c-inputs.xcfilelist | 11 ++ tools/js2c-outputs.xcfilelist | 2 + tools/js2c.mjs | 148 ++++++++++++++++++++ v8ios.xcodeproj/project.pbxproj | 37 +++++ 28 files changed, 945 insertions(+), 721 deletions(-) create mode 100644 NativeScript/runtime/BuiltinLoader.cpp create mode 100644 NativeScript/runtime/BuiltinLoader.h create mode 100644 NativeScript/runtime/js/blob-url.js create mode 100644 NativeScript/runtime/js/class-extends.js create mode 100644 NativeScript/runtime/js/error-events.js create mode 100644 NativeScript/runtime/js/events.js create mode 100644 NativeScript/runtime/js/inline-functions.js create mode 100644 NativeScript/runtime/js/promise-proxy.js create mode 100644 NativeScript/runtime/js/require-factory.js create mode 100644 NativeScript/runtime/js/smart-stringify.js create mode 100644 NativeScript/runtime/js/ts-helpers.js create mode 100644 NativeScript/runtime/js/weak-ref.js create mode 100644 tools/js2c-inputs.xcfilelist create mode 100644 tools/js2c-outputs.xcfilelist create mode 100644 tools/js2c.mjs diff --git a/.gitignore b/.gitignore index fbfa1d78..01fd062c 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,9 @@ Thumbs.db # VSCode .vscode +# Generated by tools/js2c.mjs (Xcode "Generate RuntimeBuiltins" build phase) +NativeScript/runtime/generated/ + # Other node_modules/ package-lock.json diff --git a/NativeScript/runtime/BuiltinLoader.cpp b/NativeScript/runtime/BuiltinLoader.cpp new file mode 100644 index 00000000..e89dc175 --- /dev/null +++ b/NativeScript/runtime/BuiltinLoader.cpp @@ -0,0 +1,83 @@ +#include "BuiltinLoader.h" + +#include +#include + +#include "Helpers.h" + +using namespace v8; + +namespace tns { + +namespace { + +// Process-wide bytecode cache shared across isolates (main + workers). +std::mutex builtinCacheMutex; +std::vector builtinCache[static_cast(BuiltinId::kCount)]; + +} // namespace + +MaybeLocal BuiltinLoader::RunBuiltin(Local context, + BuiltinId id) { + Isolate* isolate = v8::Isolate::GetCurrent(); + const BuiltinSource& builtin = GetBuiltinSource(id); + const unsigned index = static_cast(id); + + // Copy the blob out so the shared slot can be refreshed concurrently while + // this compile still reads from the copy. + std::vector blob; + { + std::lock_guard lock(builtinCacheMutex); + blob = builtinCache[index]; + } + + ScriptOrigin origin(tns::ToV8String(isolate, builtin.name), + 0, // line offset + 0, // column offset + false, // shared_cross_origin + -1, // script_id + Local(), + false, // is_opaque + false, // is_wasm + false // is_module + ); + Local sourceText = tns::ToV8String( + isolate, builtin.source, static_cast(builtin.length)); + + Local