refactor(runtime): conditionally register Extension with source files (#18068)

Since we are snapshotting extension source at build time, there's no
need to define list of sources for the extension at runtime.

This commit changes "deno_node" extension by removing "init_polyfill"
function in favor of "init_polyfill_ops_and_esm()" and "init_polyfill_ops()".

The former is used during snapshot and when "deno_runtime" is compiled
with "dont_create_runtime_snapshot" cargo feature flag. The latter is used
when running a worker from an existing snapshot.

This is a start of a bigger refactor to all extensions - thanks to this
change, we don't have to iterate over all defined source files for extension at
runtime, and because of that we don't have to create a filepath for each of the
source files. It's not a big deal, but we are iterating over 300 files on each start,
and concatenating 3 strings before creating a "PathBuf" for ~200 of them.
This is already visible on the startup flamegraphs and should be avoided.
This commit is contained in:
Bartek Iwańczuk 2023-03-08 07:43:26 -04:00 committed by GitHub
parent 9eb987e46c
commit d24c6ea27f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 31 additions and 9 deletions

View file

@ -214,8 +214,7 @@ impl MainWorker {
CreateCache(Arc::new(create_cache_fn))
});
// Internal modules
let mut extensions: Vec<Extension> = vec![
let mut extensions = vec![
// Web APIs
deno_webidl::init(),
deno_console::init(),
@ -263,7 +262,6 @@ impl MainWorker {
options.unsafely_ignore_certificate_errors.clone(),
),
deno_napi::init::<PermissionsContainer>(),
deno_node::init_polyfill(),
deno_node::init::<PermissionsContainer>(options.npm_resolver),
ops::os::init(exit_code.clone()),
ops::permissions::init(),
@ -273,9 +271,18 @@ impl MainWorker {
deno_http::init(),
deno_flash::init::<PermissionsContainer>(unstable),
ops::http::init(),
// Permissions ext (worker specific state)
perm_ext,
];
// TODO(bartlomieju): finish this work, currently only `deno_node` is different
// as it has the most files
#[cfg(feature = "dont_create_runtime_snapshot")]
extensions.push(deno_node::init_polyfill_ops_and_esm());
#[cfg(not(feature = "dont_create_runtime_snapshot"))]
extensions.push(deno_node::init_polyfill_ops());
extensions.push(perm_ext);
extensions.extend(std::mem::take(&mut options.extensions));
#[cfg(not(feature = "dont_create_runtime_snapshot"))]