summaryrefslogtreecommitdiff
path: root/core/runtime.rs
diff options
context:
space:
mode:
Diffstat (limited to 'core/runtime.rs')
-rw-r--r--core/runtime.rs74
1 files changed, 73 insertions, 1 deletions
diff --git a/core/runtime.rs b/core/runtime.rs
index d4a9c697c..377137a01 100644
--- a/core/runtime.rs
+++ b/core/runtime.rs
@@ -629,7 +629,11 @@ impl JsRuntime {
Rc::into_raw(state_rc.clone()) as *mut c_void,
);
- let module_map_rc = Rc::new(RefCell::new(ModuleMap::new(loader, op_state)));
+ let module_map_rc = Rc::new(RefCell::new(ModuleMap::new(
+ loader,
+ op_state,
+ snapshot_options == SnapshotOptions::Load,
+ )));
if let Some(module_map_data) = module_map_data {
let scope =
&mut v8::HandleScope::with_context(&mut isolate, global_context);
@@ -4928,4 +4932,72 @@ Deno.core.ops.op_async_serialize_object_with_numbers_as_keys({
)
.is_ok());
}
+
+ #[tokio::test]
+ async fn cant_load_internal_module_when_snapshot_is_loaded_and_not_snapshotting(
+ ) {
+ #[derive(Default)]
+ struct ModsLoader;
+
+ impl ModuleLoader for ModsLoader {
+ fn resolve(
+ &self,
+ specifier: &str,
+ referrer: &str,
+ _kind: ResolutionKind,
+ ) -> Result<ModuleSpecifier, Error> {
+ assert_eq!(specifier, "file:///main.js");
+ assert_eq!(referrer, ".");
+ let s = crate::resolve_import(specifier, referrer).unwrap();
+ Ok(s)
+ }
+
+ fn load(
+ &self,
+ _module_specifier: &ModuleSpecifier,
+ _maybe_referrer: Option<ModuleSpecifier>,
+ _is_dyn_import: bool,
+ ) -> Pin<Box<ModuleSourceFuture>> {
+ let source = r#"
+ // 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";
+ "#;
+
+ async move {
+ Ok(ModuleSource {
+ code: source.as_bytes().to_vec().into_boxed_slice(),
+ module_url_specified: "file:///main.js".to_string(),
+ module_url_found: "file:///main.js".to_string(),
+ module_type: ModuleType::JavaScript,
+ })
+ }
+ .boxed_local()
+ }
+ }
+
+ let snapshot = {
+ let runtime = JsRuntime::new(RuntimeOptions {
+ will_snapshot: true,
+ ..Default::default()
+ });
+ let snap: &[u8] = &runtime.snapshot();
+ Vec::from(snap).into_boxed_slice()
+ };
+
+ let mut runtime2 = JsRuntime::new(RuntimeOptions {
+ module_loader: Some(Rc::new(ModsLoader)),
+ startup_snapshot: Some(Snapshot::Boxed(snapshot)),
+ ..Default::default()
+ });
+
+ let err = runtime2
+ .load_main_module(&crate::resolve_url("file:///main.js").unwrap(), None)
+ .await
+ .unwrap_err();
+ assert_eq!(
+ err.to_string(),
+ "Cannot load internal module from external code"
+ );
+ }
}