diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/modules.rs | 39 | ||||
-rw-r--r-- | core/runtime.rs | 13 |
2 files changed, 43 insertions, 9 deletions
diff --git a/core/modules.rs b/core/modules.rs index b35e691c5..414423be2 100644 --- a/core/modules.rs +++ b/core/modules.rs @@ -5,10 +5,12 @@ use rusty_v8 as v8; use crate::error::generic_error; use crate::error::AnyError; use crate::module_specifier::ModuleSpecifier; +use crate::OpState; use futures::future::FutureExt; use futures::stream::FuturesUnordered; use futures::stream::Stream; use futures::stream::TryStreamExt; +use std::cell::RefCell; use std::collections::HashMap; use std::collections::HashSet; use std::future::Future; @@ -74,6 +76,7 @@ pub trait ModuleLoader { /// dynamic imports altogether. fn load( &self, + op_state: Rc<RefCell<OpState>>, module_specifier: &ModuleSpecifier, maybe_referrer: Option<ModuleSpecifier>, is_dyn_import: bool, @@ -89,6 +92,7 @@ pub trait ModuleLoader { /// It's not required to implement this method. fn prepare_load( &self, + _op_state: Rc<RefCell<OpState>>, _load_id: ModuleLoadId, _module_specifier: &ModuleSpecifier, _maybe_referrer: Option<String>, @@ -114,6 +118,7 @@ impl ModuleLoader for NoopModuleLoader { fn load( &self, + _op_state: Rc<RefCell<OpState>>, _module_specifier: &ModuleSpecifier, _maybe_referrer: Option<ModuleSpecifier>, _is_dyn_import: bool, @@ -140,6 +145,7 @@ pub enum LoadState { /// This future is used to implement parallel async module loading. pub struct RecursiveModuleLoad { + op_state: Rc<RefCell<OpState>>, kind: Kind, // TODO(bartlomieju): in future this value should // be randomized @@ -154,16 +160,18 @@ pub struct RecursiveModuleLoad { impl RecursiveModuleLoad { /// Starts a new parallel load of the given URL of the main module. pub fn main( + op_state: Rc<RefCell<OpState>>, specifier: &str, code: Option<String>, loader: Rc<dyn ModuleLoader>, ) -> Self { let kind = Kind::Main; let state = LoadState::ResolveMain(specifier.to_owned(), code); - Self::new(kind, state, loader) + Self::new(op_state, kind, state, loader) } pub fn dynamic_import( + op_state: Rc<RefCell<OpState>>, specifier: &str, referrer: &str, loader: Rc<dyn ModuleLoader>, @@ -171,17 +179,23 @@ impl RecursiveModuleLoad { let kind = Kind::DynamicImport; let state = LoadState::ResolveImport(specifier.to_owned(), referrer.to_owned()); - Self::new(kind, state, loader) + Self::new(op_state, kind, state, loader) } pub fn is_dynamic_import(&self) -> bool { self.kind != Kind::Main } - fn new(kind: Kind, state: LoadState, loader: Rc<dyn ModuleLoader>) -> Self { + fn new( + op_state: Rc<RefCell<OpState>>, + kind: Kind, + state: LoadState, + loader: Rc<dyn ModuleLoader>, + ) -> Self { Self { id: NEXT_LOAD_ID.fetch_add(1, Ordering::SeqCst), root_module_id: None, + op_state, kind, state, loader, @@ -212,6 +226,7 @@ impl RecursiveModuleLoad { let prepare_result = self .loader .prepare_load( + self.op_state.clone(), self.id, &module_specifier, maybe_referrer, @@ -248,7 +263,12 @@ impl RecursiveModuleLoad { } _ => self .loader - .load(&module_specifier, None, self.is_dynamic_import()) + .load( + self.op_state.clone(), + &module_specifier, + None, + self.is_dynamic_import(), + ) .boxed_local(), }; @@ -264,10 +284,12 @@ impl RecursiveModuleLoad { referrer: ModuleSpecifier, ) { if !self.is_pending.contains(&specifier) { - let fut = - self - .loader - .load(&specifier, Some(referrer), self.is_dynamic_import()); + let fut = self.loader.load( + self.op_state.clone(), + &specifier, + Some(referrer), + self.is_dynamic_import(), + ); self.pending.push(fut.boxed_local()); self.is_pending.insert(specifier); } @@ -577,6 +599,7 @@ mod tests { fn load( &self, + _op_state: Rc<RefCell<OpState>>, module_specifier: &ModuleSpecifier, _maybe_referrer: Option<ModuleSpecifier>, _is_dyn_import: bool, diff --git a/core/runtime.rs b/core/runtime.rs index e0a840c1a..9c076efd1 100644 --- a/core/runtime.rs +++ b/core/runtime.rs @@ -624,6 +624,7 @@ impl JsRuntimeState { debug!("dyn_import specifier {} referrer {} ", specifier, referrer); let load = RecursiveModuleLoad::dynamic_import( + self.op_state.clone(), specifier, referrer, self.loader.clone(), @@ -1207,7 +1208,12 @@ impl JsRuntime { state.loader.clone() }; - let load = RecursiveModuleLoad::main(&specifier.to_string(), code, loader); + let load = RecursiveModuleLoad::main( + self.op_state(), + &specifier.to_string(), + code, + loader, + ); let (_load_id, prepare_result) = load.prepare().await; let mut load = prepare_result?; @@ -1890,6 +1896,7 @@ pub mod tests { fn load( &self, + _op_state: Rc<RefCell<OpState>>, _module_specifier: &ModuleSpecifier, _maybe_referrer: Option<ModuleSpecifier>, _is_dyn_import: bool, @@ -1999,6 +2006,7 @@ pub mod tests { fn load( &self, + _op_state: Rc<RefCell<OpState>>, _module_specifier: &ModuleSpecifier, _maybe_referrer: Option<ModuleSpecifier>, _is_dyn_import: bool, @@ -2059,6 +2067,7 @@ pub mod tests { fn load( &self, + _op_state: Rc<RefCell<OpState>>, specifier: &ModuleSpecifier, _maybe_referrer: Option<ModuleSpecifier>, _is_dyn_import: bool, @@ -2074,6 +2083,7 @@ pub mod tests { fn prepare_load( &self, + _op_state: Rc<RefCell<OpState>>, _load_id: ModuleLoadId, _module_specifier: &ModuleSpecifier, _maybe_referrer: Option<String>, @@ -2179,6 +2189,7 @@ pub mod tests { fn load( &self, + _op_state: Rc<RefCell<OpState>>, _module_specifier: &ModuleSpecifier, _maybe_referrer: Option<ModuleSpecifier>, _is_dyn_import: bool, |