mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 17:34:47 -05:00
refactor(core): change SourcePair to ExtensionFileSource (#17686)
This commit is contained in:
parent
49af1ab18d
commit
161a4fea47
8 changed files with 70 additions and 48 deletions
|
@ -6,12 +6,13 @@ use deno_bench_util::bencher::benchmark_group;
|
||||||
use deno_bench_util::bencher::Bencher;
|
use deno_bench_util::bencher::Bencher;
|
||||||
use deno_bench_util::BenchOptions;
|
use deno_bench_util::BenchOptions;
|
||||||
use deno_core::Extension;
|
use deno_core::Extension;
|
||||||
|
use deno_core::ExtensionFileSource;
|
||||||
|
|
||||||
fn setup() -> Vec<Extension> {
|
fn setup() -> Vec<Extension> {
|
||||||
vec![Extension::builder("bench_setup")
|
vec![Extension::builder("bench_setup")
|
||||||
.js(vec![(
|
.js(vec![ExtensionFileSource {
|
||||||
"setup.js",
|
specifier: "setup.js".to_string(),
|
||||||
r#"
|
code: r#"
|
||||||
const hello = "hello world\n";
|
const hello = "hello world\n";
|
||||||
const hello1k = hello.repeat(1e3);
|
const hello1k = hello.repeat(1e3);
|
||||||
const hello1m = hello.repeat(1e6);
|
const hello1m = hello.repeat(1e6);
|
||||||
|
@ -19,7 +20,7 @@ fn setup() -> Vec<Extension> {
|
||||||
const hello1kEncoded = Deno.core.encode(hello1k);
|
const hello1kEncoded = Deno.core.encode(hello1k);
|
||||||
const hello1mEncoded = Deno.core.encode(hello1m);
|
const hello1mEncoded = Deno.core.encode(hello1m);
|
||||||
"#,
|
"#,
|
||||||
)])
|
}])
|
||||||
.build()]
|
.build()]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,10 @@ use std::rc::Rc;
|
||||||
use std::task::Context;
|
use std::task::Context;
|
||||||
use v8::fast_api::FastFunction;
|
use v8::fast_api::FastFunction;
|
||||||
|
|
||||||
pub type SourcePair = (String, &'static str);
|
pub struct ExtensionFileSource {
|
||||||
|
pub specifier: String,
|
||||||
|
pub code: &'static str,
|
||||||
|
}
|
||||||
pub type OpFnRef = v8::FunctionCallback;
|
pub type OpFnRef = v8::FunctionCallback;
|
||||||
pub type OpMiddlewareFn = dyn Fn(OpDecl) -> OpDecl;
|
pub type OpMiddlewareFn = dyn Fn(OpDecl) -> OpDecl;
|
||||||
pub type OpStateFn = dyn Fn(&mut OpState) -> Result<(), Error>;
|
pub type OpStateFn = dyn Fn(&mut OpState) -> Result<(), Error>;
|
||||||
|
@ -37,8 +40,8 @@ impl OpDecl {
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct Extension {
|
pub struct Extension {
|
||||||
js_files: Option<Vec<SourcePair>>,
|
js_files: Option<Vec<ExtensionFileSource>>,
|
||||||
esm_files: Option<Vec<SourcePair>>,
|
esm_files: Option<Vec<ExtensionFileSource>>,
|
||||||
ops: Option<Vec<OpDecl>>,
|
ops: Option<Vec<OpDecl>>,
|
||||||
opstate_fn: Option<Box<OpStateFn>>,
|
opstate_fn: Option<Box<OpStateFn>>,
|
||||||
middleware_fn: Option<Box<OpMiddlewareFn>>,
|
middleware_fn: Option<Box<OpMiddlewareFn>>,
|
||||||
|
@ -82,14 +85,14 @@ impl Extension {
|
||||||
|
|
||||||
/// returns JS source code to be loaded into the isolate (either at snapshotting,
|
/// returns JS source code to be loaded into the isolate (either at snapshotting,
|
||||||
/// or at startup). as a vector of a tuple of the file name, and the source code.
|
/// or at startup). as a vector of a tuple of the file name, and the source code.
|
||||||
pub fn get_js_sources(&self) -> &[SourcePair] {
|
pub fn get_js_sources(&self) -> &[ExtensionFileSource] {
|
||||||
match &self.js_files {
|
match &self.js_files {
|
||||||
Some(files) => files,
|
Some(files) => files,
|
||||||
None => &[],
|
None => &[],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_esm_sources(&self) -> &[SourcePair] {
|
pub fn get_esm_sources(&self) -> &[ExtensionFileSource] {
|
||||||
match &self.esm_files {
|
match &self.esm_files {
|
||||||
Some(files) => files,
|
Some(files) => files,
|
||||||
None => &[],
|
None => &[],
|
||||||
|
@ -152,8 +155,8 @@ impl Extension {
|
||||||
// Provides a convenient builder pattern to declare Extensions
|
// Provides a convenient builder pattern to declare Extensions
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct ExtensionBuilder {
|
pub struct ExtensionBuilder {
|
||||||
js: Vec<SourcePair>,
|
js: Vec<ExtensionFileSource>,
|
||||||
esm: Vec<SourcePair>,
|
esm: Vec<ExtensionFileSource>,
|
||||||
ops: Vec<OpDecl>,
|
ops: Vec<OpDecl>,
|
||||||
state: Option<Box<OpStateFn>>,
|
state: Option<Box<OpStateFn>>,
|
||||||
middleware: Option<Box<OpMiddlewareFn>>,
|
middleware: Option<Box<OpMiddlewareFn>>,
|
||||||
|
@ -168,26 +171,27 @@ impl ExtensionBuilder {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn js(
|
pub fn js(&mut self, js_files: Vec<ExtensionFileSource>) -> &mut Self {
|
||||||
&mut self,
|
let js_files =
|
||||||
js_files: Vec<(&'static str, &'static str)>,
|
js_files.into_iter().map(|file_source| ExtensionFileSource {
|
||||||
) -> &mut Self {
|
specifier: format!("internal:{}/{}", self.name, file_source.specifier),
|
||||||
let js_files = js_files.into_iter().map(|source_pair| {
|
code: file_source.code,
|
||||||
let name = format!("internal:{}/{}", self.name, source_pair.0);
|
});
|
||||||
(name, source_pair.1)
|
|
||||||
});
|
|
||||||
self.js.extend(js_files);
|
self.js.extend(js_files);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn esm(
|
pub fn esm(&mut self, esm_files: Vec<ExtensionFileSource>) -> &mut Self {
|
||||||
&mut self,
|
let esm_files =
|
||||||
esm_files: Vec<(&'static str, &'static str)>,
|
esm_files
|
||||||
) -> &mut Self {
|
.into_iter()
|
||||||
let esm_files = esm_files.into_iter().map(|source_pair| {
|
.map(|file_source| ExtensionFileSource {
|
||||||
let name = format!("internal:{}/{}", self.name, source_pair.0);
|
specifier: format!(
|
||||||
(name, source_pair.1)
|
"internal:{}/{}",
|
||||||
});
|
self.name, file_source.specifier
|
||||||
|
),
|
||||||
|
code: file_source.code,
|
||||||
|
});
|
||||||
self.esm.extend(esm_files);
|
self.esm.extend(esm_files);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
@ -254,10 +258,10 @@ impl ExtensionBuilder {
|
||||||
macro_rules! include_js_files {
|
macro_rules! include_js_files {
|
||||||
($($file:literal,)+) => {
|
($($file:literal,)+) => {
|
||||||
vec![
|
vec![
|
||||||
$((
|
$($crate::ExtensionFileSource {
|
||||||
$file,
|
specifier: $file.to_string(),
|
||||||
include_str!($file),
|
code: include_str!($file),
|
||||||
),)+
|
},)+
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,6 +54,7 @@ pub use crate::async_cell::RcLike;
|
||||||
pub use crate::async_cell::RcRef;
|
pub use crate::async_cell::RcRef;
|
||||||
pub use crate::extensions::Extension;
|
pub use crate::extensions::Extension;
|
||||||
pub use crate::extensions::ExtensionBuilder;
|
pub use crate::extensions::ExtensionBuilder;
|
||||||
|
pub use crate::extensions::ExtensionFileSource;
|
||||||
pub use crate::extensions::OpDecl;
|
pub use crate::extensions::OpDecl;
|
||||||
pub use crate::extensions::OpMiddlewareFn;
|
pub use crate::extensions::OpMiddlewareFn;
|
||||||
pub use crate::flags::v8_set_flags;
|
pub use crate::flags::v8_set_flags;
|
||||||
|
|
|
@ -815,27 +815,33 @@ impl JsRuntime {
|
||||||
for ext in &extensions {
|
for ext in &extensions {
|
||||||
{
|
{
|
||||||
let js_files = ext.get_esm_sources();
|
let js_files = ext.get_esm_sources();
|
||||||
for (filename, source) in js_files {
|
for file_source in js_files {
|
||||||
futures::executor::block_on(async {
|
futures::executor::block_on(async {
|
||||||
let id = self
|
let id = self
|
||||||
.load_side_module(
|
.load_side_module(
|
||||||
&ModuleSpecifier::parse(filename)?,
|
&ModuleSpecifier::parse(&file_source.specifier)?,
|
||||||
Some(source.to_string()),
|
Some(file_source.code.to_string()),
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
let receiver = self.mod_evaluate(id);
|
let receiver = self.mod_evaluate(id);
|
||||||
self.run_event_loop(false).await?;
|
self.run_event_loop(false).await?;
|
||||||
receiver.await?
|
receiver.await?
|
||||||
})
|
})
|
||||||
.with_context(|| format!("Couldn't execute '{filename}'"))?;
|
.with_context(|| {
|
||||||
|
format!("Couldn't execute '{}'", file_source.specifier)
|
||||||
|
})?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
let js_files = ext.get_js_sources();
|
let js_files = ext.get_js_sources();
|
||||||
for (filename, source) in js_files {
|
for file_source in js_files {
|
||||||
// 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(self.v8_isolate(), filename, source)?;
|
realm.execute_script(
|
||||||
|
self.v8_isolate(),
|
||||||
|
&file_source.specifier,
|
||||||
|
file_source.code,
|
||||||
|
)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,18 +6,19 @@ use deno_bench_util::bencher::benchmark_group;
|
||||||
use deno_bench_util::bencher::Bencher;
|
use deno_bench_util::bencher::Bencher;
|
||||||
|
|
||||||
use deno_core::Extension;
|
use deno_core::Extension;
|
||||||
|
use deno_core::ExtensionFileSource;
|
||||||
|
|
||||||
fn setup() -> Vec<Extension> {
|
fn setup() -> Vec<Extension> {
|
||||||
vec![
|
vec![
|
||||||
deno_webidl::init(),
|
deno_webidl::init(),
|
||||||
deno_url::init(),
|
deno_url::init(),
|
||||||
Extension::builder("bench_setup")
|
Extension::builder("bench_setup")
|
||||||
.esm(vec![(
|
.esm(vec![ExtensionFileSource {
|
||||||
"internal:setup",
|
specifier: "internal:setup".to_string(),
|
||||||
r#"import { URL } from "internal:deno_url/00_url.js";
|
code: r#"import { URL } from "internal:deno_url/00_url.js";
|
||||||
globalThis.URL = URL;
|
globalThis.URL = URL;
|
||||||
"#,
|
"#,
|
||||||
)])
|
}])
|
||||||
.build(),
|
.build(),
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ use deno_bench_util::bench_or_profile;
|
||||||
use deno_bench_util::bencher::benchmark_group;
|
use deno_bench_util::bencher::benchmark_group;
|
||||||
use deno_bench_util::bencher::Bencher;
|
use deno_bench_util::bencher::Bencher;
|
||||||
use deno_core::Extension;
|
use deno_core::Extension;
|
||||||
|
use deno_core::ExtensionFileSource;
|
||||||
use deno_web::BlobStore;
|
use deno_web::BlobStore;
|
||||||
|
|
||||||
struct Permissions;
|
struct Permissions;
|
||||||
|
@ -29,14 +30,14 @@ fn setup() -> Vec<Extension> {
|
||||||
deno_console::init(),
|
deno_console::init(),
|
||||||
deno_web::init::<Permissions>(BlobStore::default(), None),
|
deno_web::init::<Permissions>(BlobStore::default(), None),
|
||||||
Extension::builder("bench_setup")
|
Extension::builder("bench_setup")
|
||||||
.esm(vec![(
|
.esm(vec![ExtensionFileSource {
|
||||||
"internal:setup",
|
specifier: "internal:setup".to_string(),
|
||||||
r#"
|
code: r#"
|
||||||
import { TextDecoder } from "internal:deno_web/08_text_encoding.js";
|
import { TextDecoder } from "internal:deno_web/08_text_encoding.js";
|
||||||
globalThis.TextDecoder = TextDecoder;
|
globalThis.TextDecoder = TextDecoder;
|
||||||
globalThis.hello12k = Deno.core.encode("hello world\n".repeat(1e3));
|
globalThis.hello12k = Deno.core.encode("hello world\n".repeat(1e3));
|
||||||
"#,
|
"#,
|
||||||
)])
|
}])
|
||||||
.state(|state| {
|
.state(|state| {
|
||||||
state.put(Permissions {});
|
state.put(Permissions {});
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -5,6 +5,7 @@ use deno_bench_util::bench_or_profile;
|
||||||
use deno_bench_util::bencher::benchmark_group;
|
use deno_bench_util::bencher::benchmark_group;
|
||||||
use deno_bench_util::bencher::Bencher;
|
use deno_bench_util::bencher::Bencher;
|
||||||
use deno_core::Extension;
|
use deno_core::Extension;
|
||||||
|
use deno_core::ExtensionFileSource;
|
||||||
use deno_web::BlobStore;
|
use deno_web::BlobStore;
|
||||||
|
|
||||||
struct Permissions;
|
struct Permissions;
|
||||||
|
@ -29,11 +30,14 @@ fn setup() -> Vec<Extension> {
|
||||||
deno_web::init::<Permissions>(BlobStore::default(), None),
|
deno_web::init::<Permissions>(BlobStore::default(), None),
|
||||||
Extension::builder("bench_setup")
|
Extension::builder("bench_setup")
|
||||||
.esm(vec![
|
.esm(vec![
|
||||||
("internal:setup", r#"
|
ExtensionFileSource {
|
||||||
|
specifier: "internal:setup".to_string(),
|
||||||
|
code: r#"
|
||||||
import { setTimeout, handleTimerMacrotask } from "internal:deno_web/02_timers.js";
|
import { setTimeout, handleTimerMacrotask } from "internal:deno_web/02_timers.js";
|
||||||
globalThis.setTimeout = setTimeout;
|
globalThis.setTimeout = setTimeout;
|
||||||
Deno.core.setMacrotaskCallback(handleTimerMacrotask);
|
Deno.core.setMacrotaskCallback(handleTimerMacrotask);
|
||||||
"#),
|
"#
|
||||||
|
},
|
||||||
])
|
])
|
||||||
.state(|state| {
|
.state(|state| {
|
||||||
state.put(Permissions{});
|
state.put(Permissions{});
|
||||||
|
|
|
@ -6,12 +6,16 @@ use deno_bench_util::bencher::benchmark_group;
|
||||||
use deno_bench_util::bencher::Bencher;
|
use deno_bench_util::bencher::Bencher;
|
||||||
|
|
||||||
use deno_core::Extension;
|
use deno_core::Extension;
|
||||||
|
use deno_core::ExtensionFileSource;
|
||||||
|
|
||||||
fn setup() -> Vec<Extension> {
|
fn setup() -> Vec<Extension> {
|
||||||
vec![
|
vec![
|
||||||
deno_webidl::init(),
|
deno_webidl::init(),
|
||||||
Extension::builder("deno_webidl_bench")
|
Extension::builder("deno_webidl_bench")
|
||||||
.esm(vec![("internal:setup", include_str!("dict.js"))])
|
.esm(vec![ExtensionFileSource {
|
||||||
|
specifier: "internal:setup".to_string(),
|
||||||
|
code: include_str!("dict.js"),
|
||||||
|
}])
|
||||||
.build(),
|
.build(),
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue