mirror of
https://github.com/denoland/deno.git
synced 2024-11-24 15:19:26 -05:00
perf(core): use static specifier in ExtensionFileSource (#18271)
Relanding #18264 ------- Co-authored-by: Divy Srivastava <dj.srivastava23@gmail.com>
This commit is contained in:
parent
4c1f3daa83
commit
d33369c6c7
10 changed files with 46 additions and 43 deletions
|
@ -12,7 +12,7 @@ use deno_core::ExtensionFileSourceCode;
|
||||||
fn setup() -> Vec<Extension> {
|
fn setup() -> Vec<Extension> {
|
||||||
vec![Extension::builder("bench_setup")
|
vec![Extension::builder("bench_setup")
|
||||||
.js(vec![ExtensionFileSource {
|
.js(vec![ExtensionFileSource {
|
||||||
specifier: "setup.js".to_string(),
|
specifier: "ext:bench_setup/setup.js",
|
||||||
code: ExtensionFileSourceCode::IncludedInBinary(
|
code: ExtensionFileSourceCode::IncludedInBinary(
|
||||||
r#"
|
r#"
|
||||||
const hello = "hello world\n";
|
const hello = "hello world\n";
|
||||||
|
|
|
@ -320,7 +320,7 @@ deno_core::extension!(
|
||||||
],
|
],
|
||||||
customizer = |ext: &mut ExtensionBuilder| {
|
customizer = |ext: &mut ExtensionBuilder| {
|
||||||
ext.esm(vec![ExtensionFileSource {
|
ext.esm(vec![ExtensionFileSource {
|
||||||
specifier: "runtime/js/99_main.js".to_string(),
|
specifier: "ext:cli/runtime/js/99_main.js",
|
||||||
code: ExtensionFileSourceCode::LoadedFromFsDuringSnapshot(
|
code: ExtensionFileSourceCode::LoadedFromFsDuringSnapshot(
|
||||||
std::path::PathBuf::from(deno_runtime::js::PATH_FOR_99_MAIN_JS),
|
std::path::PathBuf::from(deno_runtime::js::PATH_FOR_99_MAIN_JS),
|
||||||
),
|
),
|
||||||
|
|
|
@ -37,7 +37,7 @@ impl ExtensionFileSourceCode {
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct ExtensionFileSource {
|
pub struct ExtensionFileSource {
|
||||||
pub specifier: String,
|
pub specifier: &'static str,
|
||||||
pub code: ExtensionFileSourceCode,
|
pub code: ExtensionFileSourceCode,
|
||||||
}
|
}
|
||||||
pub type OpFnRef = v8::FunctionCallback;
|
pub type OpFnRef = v8::FunctionCallback;
|
||||||
|
@ -189,11 +189,11 @@ macro_rules! extension {
|
||||||
#[allow(unused_variables)]
|
#[allow(unused_variables)]
|
||||||
fn with_js(ext: &mut $crate::ExtensionBuilder) {
|
fn with_js(ext: &mut $crate::ExtensionBuilder) {
|
||||||
$( ext.esm(
|
$( ext.esm(
|
||||||
$crate::include_js_files!( $( dir $dir_esm , )? $( $esm , )* )
|
$crate::include_js_files!( $name $( dir $dir_esm , )? $( $esm , )* )
|
||||||
); )?
|
); )?
|
||||||
$(
|
$(
|
||||||
ext.esm(vec![ExtensionFileSource {
|
ext.esm(vec![ExtensionFileSource {
|
||||||
specifier: "ext:setup".to_string(),
|
specifier: "ext:setup",
|
||||||
code: ExtensionFileSourceCode::IncludedInBinary($esm_setup_script),
|
code: ExtensionFileSourceCode::IncludedInBinary($esm_setup_script),
|
||||||
}]);
|
}]);
|
||||||
)?
|
)?
|
||||||
|
@ -201,7 +201,7 @@ macro_rules! extension {
|
||||||
ext.esm_entry_point($esm_entry_point);
|
ext.esm_entry_point($esm_entry_point);
|
||||||
)?
|
)?
|
||||||
$( ext.js(
|
$( ext.js(
|
||||||
$crate::include_js_files!( $( dir $dir_js , )? $( $js , )* )
|
$crate::include_js_files!( $name $( dir $dir_js , )? $( $js , )* )
|
||||||
); )?
|
); )?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -451,28 +451,11 @@ pub struct ExtensionBuilder {
|
||||||
|
|
||||||
impl ExtensionBuilder {
|
impl ExtensionBuilder {
|
||||||
pub fn js(&mut self, js_files: Vec<ExtensionFileSource>) -> &mut Self {
|
pub fn js(&mut self, js_files: Vec<ExtensionFileSource>) -> &mut Self {
|
||||||
let js_files =
|
|
||||||
// TODO(bartlomieju): if we're automatically remapping here, then we should
|
|
||||||
// use a different result struct that `ExtensionFileSource` as it's confusing
|
|
||||||
// when (and why) the remapping happens.
|
|
||||||
js_files.into_iter().map(|file_source| ExtensionFileSource {
|
|
||||||
specifier: format!("ext:{}/{}", self.name, file_source.specifier),
|
|
||||||
code: file_source.code,
|
|
||||||
});
|
|
||||||
self.js.extend(js_files);
|
self.js.extend(js_files);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn esm(&mut self, esm_files: Vec<ExtensionFileSource>) -> &mut Self {
|
pub fn esm(&mut self, esm_files: Vec<ExtensionFileSource>) -> &mut Self {
|
||||||
let esm_files = esm_files
|
|
||||||
.into_iter()
|
|
||||||
// TODO(bartlomieju): if we're automatically remapping here, then we should
|
|
||||||
// use a different result struct that `ExtensionFileSource` as it's confusing
|
|
||||||
// when (and why) the remapping happens.
|
|
||||||
.map(|file_source| ExtensionFileSource {
|
|
||||||
specifier: format!("ext:{}/{}", self.name, file_source.specifier),
|
|
||||||
code: file_source.code,
|
|
||||||
});
|
|
||||||
self.esm.extend(esm_files);
|
self.esm.extend(esm_files);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
@ -584,10 +567,10 @@ impl ExtensionBuilder {
|
||||||
#[cfg(not(feature = "include_js_files_for_snapshotting"))]
|
#[cfg(not(feature = "include_js_files_for_snapshotting"))]
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! include_js_files {
|
macro_rules! include_js_files {
|
||||||
(dir $dir:literal, $($file:literal,)+) => {
|
($name:ident dir $dir:literal, $($file:literal,)+) => {
|
||||||
vec![
|
vec![
|
||||||
$($crate::ExtensionFileSource {
|
$($crate::ExtensionFileSource {
|
||||||
specifier: concat!($file).to_string(),
|
specifier: concat!("ext:", stringify!($name), "/", $file),
|
||||||
code: $crate::ExtensionFileSourceCode::IncludedInBinary(
|
code: $crate::ExtensionFileSourceCode::IncludedInBinary(
|
||||||
include_str!(concat!($dir, "/", $file)
|
include_str!(concat!($dir, "/", $file)
|
||||||
)),
|
)),
|
||||||
|
@ -595,10 +578,10 @@ macro_rules! include_js_files {
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
($($file:literal,)+) => {
|
($name:ident $($file:literal,)+) => {
|
||||||
vec![
|
vec![
|
||||||
$($crate::ExtensionFileSource {
|
$($crate::ExtensionFileSource {
|
||||||
specifier: $file.to_string(),
|
specifier: concat!("ext:", stringify!($name), "/", $file),
|
||||||
code: $crate::ExtensionFileSourceCode::IncludedInBinary(
|
code: $crate::ExtensionFileSourceCode::IncludedInBinary(
|
||||||
include_str!($file)
|
include_str!($file)
|
||||||
),
|
),
|
||||||
|
@ -610,10 +593,10 @@ macro_rules! include_js_files {
|
||||||
#[cfg(feature = "include_js_files_for_snapshotting")]
|
#[cfg(feature = "include_js_files_for_snapshotting")]
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! include_js_files {
|
macro_rules! include_js_files {
|
||||||
(dir $dir:literal, $($file:literal,)+) => {
|
($name:ident dir $dir:literal, $($file:literal,)+) => {
|
||||||
vec![
|
vec![
|
||||||
$($crate::ExtensionFileSource {
|
$($crate::ExtensionFileSource {
|
||||||
specifier: concat!($file).to_string(),
|
specifier: concat!("ext:", stringify!($name), "/", $file),
|
||||||
code: $crate::ExtensionFileSourceCode::LoadedFromFsDuringSnapshot(
|
code: $crate::ExtensionFileSourceCode::LoadedFromFsDuringSnapshot(
|
||||||
std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join($dir).join($file)
|
std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join($dir).join($file)
|
||||||
),
|
),
|
||||||
|
@ -621,10 +604,10 @@ macro_rules! include_js_files {
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
($($file:literal,)+) => {
|
($name:ident $($file:literal,)+) => {
|
||||||
vec![
|
vec![
|
||||||
$($crate::ExtensionFileSource {
|
$($crate::ExtensionFileSource {
|
||||||
specifier: $file.to_string(),
|
specifier: concat!("ext:", stringify!($name), "/", $file),
|
||||||
code: $crate::ExtensionFileSourceCode::LoadedFromFsDuringSnapshot(
|
code: $crate::ExtensionFileSourceCode::LoadedFromFsDuringSnapshot(
|
||||||
std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join($file)
|
std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join($file)
|
||||||
),
|
),
|
||||||
|
|
|
@ -432,7 +432,7 @@ impl ModuleLoader for ExtModuleLoader {
|
||||||
if let Some(file_source) = maybe_file_source {
|
if let Some(file_source) = maybe_file_source {
|
||||||
{
|
{
|
||||||
let mut used_esm_sources = self.used_esm_sources.borrow_mut();
|
let mut used_esm_sources = self.used_esm_sources.borrow_mut();
|
||||||
let used = used_esm_sources.get_mut(&file_source.specifier).unwrap();
|
let used = used_esm_sources.get_mut(file_source.specifier).unwrap();
|
||||||
*used = true;
|
*used = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1047,13 +1047,23 @@ impl ModuleMap {
|
||||||
let main = v8::Boolean::new(scope, info.main);
|
let main = v8::Boolean::new(scope, info.main);
|
||||||
module_info_arr.set_index(scope, 1, main.into());
|
module_info_arr.set_index(scope, 1, main.into());
|
||||||
|
|
||||||
let name = v8::String::new(scope, &info.name).unwrap();
|
let name = v8::String::new_from_one_byte(
|
||||||
|
scope,
|
||||||
|
info.name.as_bytes(),
|
||||||
|
v8::NewStringType::Normal,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
module_info_arr.set_index(scope, 2, name.into());
|
module_info_arr.set_index(scope, 2, name.into());
|
||||||
|
|
||||||
let array_len = 2 * info.requests.len() as i32;
|
let array_len = 2 * info.requests.len() as i32;
|
||||||
let requests_arr = v8::Array::new(scope, array_len);
|
let requests_arr = v8::Array::new(scope, array_len);
|
||||||
for (i, request) in info.requests.iter().enumerate() {
|
for (i, request) in info.requests.iter().enumerate() {
|
||||||
let specifier = v8::String::new(scope, &request.specifier).unwrap();
|
let specifier = v8::String::new_from_one_byte(
|
||||||
|
scope,
|
||||||
|
request.specifier.as_bytes(),
|
||||||
|
v8::NewStringType::Normal,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
requests_arr.set_index(scope, 2 * i as u32, specifier.into());
|
requests_arr.set_index(scope, 2 * i as u32, specifier.into());
|
||||||
|
|
||||||
let asserted_module_type =
|
let asserted_module_type =
|
||||||
|
@ -1079,7 +1089,12 @@ impl ModuleMap {
|
||||||
let arr = v8::Array::new(scope, 3);
|
let arr = v8::Array::new(scope, 3);
|
||||||
|
|
||||||
let (specifier, asserted_module_type) = elem.0;
|
let (specifier, asserted_module_type) = elem.0;
|
||||||
let specifier = v8::String::new(scope, specifier).unwrap();
|
let specifier = v8::String::new_from_one_byte(
|
||||||
|
scope,
|
||||||
|
specifier.as_bytes(),
|
||||||
|
v8::NewStringType::Normal,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
arr.set_index(scope, 0, specifier.into());
|
arr.set_index(scope, 0, specifier.into());
|
||||||
|
|
||||||
let asserted_module_type =
|
let asserted_module_type =
|
||||||
|
@ -1088,7 +1103,12 @@ impl ModuleMap {
|
||||||
|
|
||||||
let symbolic_module: v8::Local<v8::Value> = match &elem.1 {
|
let symbolic_module: v8::Local<v8::Value> = match &elem.1 {
|
||||||
SymbolicModule::Alias(alias) => {
|
SymbolicModule::Alias(alias) => {
|
||||||
let alias = v8::String::new(scope, alias).unwrap();
|
let alias = v8::String::new_from_one_byte(
|
||||||
|
scope,
|
||||||
|
alias.as_bytes(),
|
||||||
|
v8::NewStringType::Normal,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
alias.into()
|
alias.into()
|
||||||
}
|
}
|
||||||
SymbolicModule::Mod(id) => {
|
SymbolicModule::Mod(id) => {
|
||||||
|
|
|
@ -712,7 +712,7 @@ impl JsRuntime {
|
||||||
futures::executor::block_on(async {
|
futures::executor::block_on(async {
|
||||||
let id = runtime
|
let id = runtime
|
||||||
.load_side_module(
|
.load_side_module(
|
||||||
&ModuleSpecifier::parse(&file_source.specifier)?,
|
&ModuleSpecifier::parse(file_source.specifier)?,
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
@ -748,7 +748,7 @@ impl JsRuntime {
|
||||||
// TODO(@AaronO): use JsRuntime::execute_static() here to move src off heap
|
// TODO(@AaronO): use JsRuntime::execute_static() here to move src off heap
|
||||||
realm.execute_script(
|
realm.execute_script(
|
||||||
self.v8_isolate(),
|
self.v8_isolate(),
|
||||||
&file_source.specifier,
|
file_source.specifier,
|
||||||
&file_source.code.load()?,
|
&file_source.code.load()?,
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ fn setup() -> Vec<Extension> {
|
||||||
deno_url::deno_url::init_ops_and_esm(),
|
deno_url::deno_url::init_ops_and_esm(),
|
||||||
Extension::builder("bench_setup")
|
Extension::builder("bench_setup")
|
||||||
.esm(vec![ExtensionFileSource {
|
.esm(vec![ExtensionFileSource {
|
||||||
specifier: "ext:setup".to_string(),
|
specifier: "ext:bench_setup/setup",
|
||||||
code: ExtensionFileSourceCode::IncludedInBinary(
|
code: ExtensionFileSourceCode::IncludedInBinary(
|
||||||
r#"import { URL } from "ext:deno_url/00_url.js";
|
r#"import { URL } from "ext:deno_url/00_url.js";
|
||||||
globalThis.URL = URL;
|
globalThis.URL = URL;
|
||||||
|
|
|
@ -33,7 +33,7 @@ fn setup() -> Vec<Extension> {
|
||||||
),
|
),
|
||||||
Extension::builder("bench_setup")
|
Extension::builder("bench_setup")
|
||||||
.esm(vec![ExtensionFileSource {
|
.esm(vec![ExtensionFileSource {
|
||||||
specifier: "ext:setup".to_string(),
|
specifier: "ext:bench_setup/setup",
|
||||||
code: ExtensionFileSourceCode::IncludedInBinary(
|
code: ExtensionFileSourceCode::IncludedInBinary(
|
||||||
r#"
|
r#"
|
||||||
import { TextDecoder } from "ext:deno_web/08_text_encoding.js";
|
import { TextDecoder } from "ext:deno_web/08_text_encoding.js";
|
||||||
|
|
|
@ -29,7 +29,7 @@ fn setup() -> Vec<Extension> {
|
||||||
Extension::builder("bench_setup")
|
Extension::builder("bench_setup")
|
||||||
.esm(vec![
|
.esm(vec![
|
||||||
ExtensionFileSource {
|
ExtensionFileSource {
|
||||||
specifier: "ext:setup".to_string(),
|
specifier: "ext:bench_setup/setup",
|
||||||
code: ExtensionFileSourceCode::IncludedInBinary(r#"
|
code: ExtensionFileSourceCode::IncludedInBinary(r#"
|
||||||
import { setTimeout, handleTimerMacrotask } from "ext:deno_web/02_timers.js";
|
import { setTimeout, handleTimerMacrotask } from "ext:deno_web/02_timers.js";
|
||||||
globalThis.setTimeout = setTimeout;
|
globalThis.setTimeout = setTimeout;
|
||||||
|
|
|
@ -14,7 +14,7 @@ fn setup() -> Vec<Extension> {
|
||||||
deno_webidl::deno_webidl::init_ops_and_esm(),
|
deno_webidl::deno_webidl::init_ops_and_esm(),
|
||||||
Extension::builder("deno_webidl_bench")
|
Extension::builder("deno_webidl_bench")
|
||||||
.esm(vec![ExtensionFileSource {
|
.esm(vec![ExtensionFileSource {
|
||||||
specifier: "ext:setup".to_string(),
|
specifier: "ext:deno_webidl_bench/setup.js",
|
||||||
code: ExtensionFileSourceCode::IncludedInBinary(include_str!(
|
code: ExtensionFileSourceCode::IncludedInBinary(include_str!(
|
||||||
"dict.js"
|
"dict.js"
|
||||||
)),
|
)),
|
||||||
|
|
|
@ -248,7 +248,7 @@ mod startup_snapshot {
|
||||||
deps = [runtime],
|
deps = [runtime],
|
||||||
customizer = |ext: &mut deno_core::ExtensionBuilder| {
|
customizer = |ext: &mut deno_core::ExtensionBuilder| {
|
||||||
ext.esm(vec![ExtensionFileSource {
|
ext.esm(vec![ExtensionFileSource {
|
||||||
specifier: "js/99_main.js".to_string(),
|
specifier: "ext:runtime_main/js/99_main.js",
|
||||||
code: deno_core::ExtensionFileSourceCode::IncludedInBinary(
|
code: deno_core::ExtensionFileSourceCode::IncludedInBinary(
|
||||||
include_str!("js/99_main.js"),
|
include_str!("js/99_main.js"),
|
||||||
),
|
),
|
||||||
|
|
Loading…
Reference in a new issue