summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/extensions.rs12
-rw-r--r--core/modules.rs30
-rw-r--r--core/runtime.rs51
-rw-r--r--core/snapshot_util.rs20
4 files changed, 83 insertions, 30 deletions
diff --git a/core/extensions.rs b/core/extensions.rs
index 16cca924d..e497b8003 100644
--- a/core/extensions.rs
+++ b/core/extensions.rs
@@ -43,6 +43,7 @@ impl OpDecl {
pub struct Extension {
js_files: Option<Vec<ExtensionFileSource>>,
esm_files: Option<Vec<ExtensionFileSource>>,
+ esm_entry_point: Option<&'static str>,
ops: Option<Vec<OpDecl>>,
opstate_fn: Option<Box<OpStateFn>>,
middleware_fn: Option<Box<OpMiddlewareFn>>,
@@ -100,6 +101,10 @@ impl Extension {
}
}
+ pub fn get_esm_entry_point(&self) -> Option<&'static str> {
+ self.esm_entry_point
+ }
+
/// Called at JsRuntime startup to initialize ops in the isolate.
pub fn init_ops(&mut self) -> Option<Vec<OpDecl>> {
// TODO(@AaronO): maybe make op registration idempotent
@@ -158,6 +163,7 @@ impl Extension {
pub struct ExtensionBuilder {
js: Vec<ExtensionFileSource>,
esm: Vec<ExtensionFileSource>,
+ esm_entry_point: Option<&'static str>,
ops: Vec<OpDecl>,
state: Option<Box<OpStateFn>>,
middleware: Option<Box<OpMiddlewareFn>>,
@@ -197,6 +203,11 @@ impl ExtensionBuilder {
self
}
+ pub fn esm_entry_point(&mut self, entry_point: &'static str) -> &mut Self {
+ self.esm_entry_point = Some(entry_point);
+ self
+ }
+
pub fn ops(&mut self, ops: Vec<OpDecl>) -> &mut Self {
self.ops.extend(ops);
self
@@ -234,6 +245,7 @@ impl ExtensionBuilder {
Extension {
js_files,
esm_files,
+ esm_entry_point: self.esm_entry_point.take(),
ops,
opstate_fn: self.state.take(),
middleware_fn: self.middleware.take(),
diff --git a/core/modules.rs b/core/modules.rs
index b604e8c13..1f427508a 100644
--- a/core/modules.rs
+++ b/core/modules.rs
@@ -275,21 +275,27 @@ pub struct NoopModuleLoader;
impl ModuleLoader for NoopModuleLoader {
fn resolve(
&self,
- _specifier: &str,
- _referrer: &str,
+ specifier: &str,
+ referrer: &str,
_kind: ResolutionKind,
) -> Result<ModuleSpecifier, Error> {
- Err(generic_error("Module loading is not supported"))
+ Err(generic_error(
+ format!("Module loading is not supported; attempted to resolve: \"{specifier}\" from \"{referrer}\"")
+ ))
}
fn load(
&self,
- _module_specifier: &ModuleSpecifier,
- _maybe_referrer: Option<ModuleSpecifier>,
+ module_specifier: &ModuleSpecifier,
+ maybe_referrer: Option<ModuleSpecifier>,
_is_dyn_import: bool,
) -> Pin<Box<ModuleSourceFuture>> {
- async { Err(generic_error("Module loading is not supported")) }
- .boxed_local()
+ let err = generic_error(
+ format!(
+ "Module loading is not supported; attempted to load: \"{module_specifier}\" from \"{maybe_referrer:?}\"",
+ )
+ );
+ async move { Err(err) }.boxed_local()
}
}
@@ -2720,14 +2726,20 @@ if (import.meta.url != 'file:///main_with_code.js') throw Error();
.resolve("file://foo", "file://bar", ResolutionKind::Import)
.err()
.map(|e| e.to_string()),
- Some("Module loading is not supported".to_string())
+ Some(
+ "Module loading is not supported; attempted to resolve: \"file://foo\" from \"file://bar\""
+ .to_string()
+ )
);
assert_eq!(
loader
.resolve("file://foo", "internal:bar", ResolutionKind::Import)
.err()
.map(|e| e.to_string()),
- Some("Module loading is not supported".to_string())
+ Some(
+ "Module loading is not supported; attempted to resolve: \"file://foo\" from \"internal:bar\""
+ .to_string()
+ )
);
assert_eq!(
resolve_helper(
diff --git a/core/runtime.rs b/core/runtime.rs
index d922d0ca5..0127e80e6 100644
--- a/core/runtime.rs
+++ b/core/runtime.rs
@@ -829,26 +829,39 @@ impl JsRuntime {
/// Initializes JS of provided Extensions in the given realm
fn init_extension_js(&mut self, realm: &JsRealm) -> Result<(), Error> {
+ fn load_and_evaluate_module(
+ runtime: &mut JsRuntime,
+ file_source: &ExtensionFileSource,
+ ) -> Result<(), Error> {
+ futures::executor::block_on(async {
+ let id = runtime
+ .load_side_module(
+ &ModuleSpecifier::parse(&file_source.specifier)?,
+ None,
+ )
+ .await?;
+ let receiver = runtime.mod_evaluate(id);
+ runtime.run_event_loop(false).await?;
+ receiver.await?
+ })
+ .with_context(|| format!("Couldn't execute '{}'", file_source.specifier))
+ }
+
// Take extensions to avoid double-borrow
let extensions = std::mem::take(&mut self.extensions_with_js);
for ext in &extensions {
{
let esm_files = ext.get_esm_sources();
- for file_source in esm_files {
- futures::executor::block_on(async {
- let id = self
- .load_side_module(
- &ModuleSpecifier::parse(&file_source.specifier)?,
- None,
- )
- .await?;
- let receiver = self.mod_evaluate(id);
- self.run_event_loop(false).await?;
- receiver.await?
- })
- .with_context(|| {
- format!("Couldn't execute '{}'", file_source.specifier)
- })?;
+ if let Some(entry_point) = ext.get_esm_entry_point() {
+ let file_source = esm_files
+ .iter()
+ .find(|file| file.specifier == entry_point)
+ .unwrap();
+ load_and_evaluate_module(self, file_source)?;
+ } else {
+ for file_source in esm_files {
+ load_and_evaluate_module(self, file_source)?;
+ }
}
}
@@ -1770,7 +1783,11 @@ impl JsRuntime {
.map(|handle| v8::Local::new(tc_scope, handle))
.expect("ModuleInfo not found");
let mut status = module.get_status();
- assert_eq!(status, v8::ModuleStatus::Instantiated);
+ assert_eq!(
+ status,
+ v8::ModuleStatus::Instantiated,
+ "Module not instantiated {id}"
+ );
let (sender, receiver) = oneshot::channel();
@@ -4974,7 +4991,7 @@ Deno.core.ops.op_async_serialize_object_with_numbers_as_keys({
_is_dyn_import: bool,
) -> Pin<Box<ModuleSourceFuture>> {
let source = r#"
- // This module doesn't really exist, just verifying that we'll get
+ // This module doesn't really exist, just verifying that we'll get
// an error when specifier starts with "internal:".
import { core } from "internal:core.js";
"#;
diff --git a/core/snapshot_util.rs b/core/snapshot_util.rs
index 0a1793b51..7e22395e0 100644
--- a/core/snapshot_util.rs
+++ b/core/snapshot_util.rs
@@ -22,6 +22,7 @@ pub struct CreateSnapshotOptions {
}
pub fn create_snapshot(create_snapshot_options: CreateSnapshotOptions) {
+ let start = std::time::Instant::now();
let js_runtime = JsRuntime::new(RuntimeOptions {
will_snapshot: true,
startup_snapshot: create_snapshot_options.startup_snapshot,
@@ -33,7 +34,12 @@ pub fn create_snapshot(create_snapshot_options: CreateSnapshotOptions) {
let snapshot = js_runtime.snapshot();
let snapshot_slice: &[u8] = &snapshot;
- println!("Snapshot size: {}", snapshot_slice.len());
+ println!(
+ "Snapshot size: {}, took {}s ({})",
+ snapshot_slice.len(),
+ start.elapsed().as_secs_f64(),
+ create_snapshot_options.snapshot_path.display()
+ );
let maybe_compressed_snapshot: Box<dyn AsRef<[u8]>> =
if let Some(compression_cb) = create_snapshot_options.compression_cb {
@@ -47,7 +53,12 @@ pub fn create_snapshot(create_snapshot_options: CreateSnapshotOptions) {
(compression_cb)(&mut vec, snapshot_slice);
- println!("Snapshot compressed size: {}", vec.len());
+ println!(
+ "Snapshot compressed size: {}, took {}s ({})",
+ vec.len(),
+ start.elapsed().as_secs_f64(),
+ create_snapshot_options.snapshot_path.display()
+ );
Box::new(vec)
} else {
@@ -60,8 +71,9 @@ pub fn create_snapshot(create_snapshot_options: CreateSnapshotOptions) {
)
.unwrap();
println!(
- "Snapshot written to: {} ",
- create_snapshot_options.snapshot_path.display()
+ "Snapshot written to: {}, took: {}s",
+ create_snapshot_options.snapshot_path.display(),
+ start.elapsed().as_secs_f64()
);
}