Skip to content

Commit 8cc7b59

Browse files
authored
feat: include if synchronous load in ModuleLoader (#1219)
Part of the fix for denoland/deno#26136 -- this will allow us to tell we're doing a sync import and then to use a different executor for deno_graph that doesn't spawn the future in the tokio runtime.
1 parent 5e8def2 commit 8cc7b59

File tree

11 files changed

+122
-74
lines changed

11 files changed

+122
-74
lines changed

core/examples/ts_module_loader.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ use deno_ast::MediaType;
1414
use deno_ast::ParseParams;
1515
use deno_ast::SourceMapOption;
1616
use deno_core::JsRuntime;
17+
use deno_core::ModuleLoadOptions;
1718
use deno_core::ModuleLoadReferrer;
1819
use deno_core::ModuleLoadResponse;
1920
use deno_core::ModuleLoader;
2021
use deno_core::ModuleSource;
2122
use deno_core::ModuleSourceCode;
2223
use deno_core::ModuleSpecifier;
2324
use deno_core::ModuleType;
24-
use deno_core::RequestedModuleType;
2525
use deno_core::ResolutionKind;
2626
use deno_core::RuntimeOptions;
2727
use deno_core::error::ModuleLoaderError;
@@ -52,8 +52,7 @@ impl ModuleLoader for TypescriptModuleLoader {
5252
&self,
5353
module_specifier: &ModuleSpecifier,
5454
_maybe_referrer: Option<&ModuleLoadReferrer>,
55-
_is_dyn_import: bool,
56-
_requested_module_type: RequestedModuleType,
55+
_options: ModuleLoadOptions,
5756
) -> ModuleLoadResponse {
5857
let source_maps = self.source_maps.clone();
5958
fn load(

core/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ pub use crate::modules::FsModuleLoader;
113113
pub use crate::modules::ModuleCodeBytes;
114114
pub use crate::modules::ModuleCodeString;
115115
pub use crate::modules::ModuleId;
116+
pub use crate::modules::ModuleLoadOptions;
116117
pub use crate::modules::ModuleLoadReferrer;
117118
pub use crate::modules::ModuleLoadResponse;
118119
pub use crate::modules::ModuleLoader;

core/modules/loaders.rs

Lines changed: 24 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,13 @@ pub enum ModuleLoadResponse {
3939
Async(Pin<Box<ModuleSourceFuture>>),
4040
}
4141

42+
pub struct ModuleLoadOptions {
43+
pub is_dynamic_import: bool,
44+
/// If this is a synchronous ES module load.
45+
pub is_synchronous: bool,
46+
pub requested_module_type: RequestedModuleType,
47+
}
48+
4249
#[derive(Debug, Clone)]
4350
pub struct ModuleLoadReferrer {
4451
pub specifier: ModuleSpecifier,
@@ -83,8 +90,7 @@ pub trait ModuleLoader {
8390
&self,
8491
module_specifier: &ModuleSpecifier,
8592
maybe_referrer: Option<&ModuleLoadReferrer>,
86-
is_dyn_import: bool,
87-
requested_module_type: RequestedModuleType,
93+
options: ModuleLoadOptions,
8894
) -> ModuleLoadResponse;
8995

9096
/// This hook can be used by implementors to do some preparation
@@ -99,8 +105,7 @@ pub trait ModuleLoader {
99105
&self,
100106
_module_specifier: &ModuleSpecifier,
101107
_maybe_referrer: Option<String>,
102-
_is_dyn_import: bool,
103-
_requested_module_type: RequestedModuleType,
108+
_options: ModuleLoadOptions,
104109
) -> Pin<Box<dyn Future<Output = Result<(), ModuleLoaderError>>>> {
105110
async { Ok(()) }.boxed_local()
106111
}
@@ -181,8 +186,7 @@ impl ModuleLoader for NoopModuleLoader {
181186
&self,
182187
_module_specifier: &ModuleSpecifier,
183188
_maybe_referrer: Option<&ModuleLoadReferrer>,
184-
_is_dyn_import: bool,
185-
_requested_module_type: RequestedModuleType,
189+
_options: ModuleLoadOptions,
186190
) -> ModuleLoadResponse {
187191
ModuleLoadResponse::Sync(Err(JsErrorBox::generic(
188192
"Module loading is not supported.",
@@ -280,8 +284,7 @@ impl ModuleLoader for ExtModuleLoader {
280284
&self,
281285
specifier: &ModuleSpecifier,
282286
_maybe_referrer: Option<&ModuleLoadReferrer>,
283-
_is_dyn_import: bool,
284-
_requested_module_type: RequestedModuleType,
287+
_options: ModuleLoadOptions,
285288
) -> ModuleLoadResponse {
286289
let mut sources = self.sources.borrow_mut();
287290
let source = match sources.remove(specifier.as_str()) {
@@ -310,8 +313,7 @@ impl ModuleLoader for ExtModuleLoader {
310313
&self,
311314
_specifier: &ModuleSpecifier,
312315
_maybe_referrer: Option<String>,
313-
_is_dyn_import: bool,
314-
_requested_module_type: RequestedModuleType,
316+
_options: ModuleLoadOptions,
315317
) -> Pin<Box<dyn Future<Output = Result<(), ModuleLoaderError>>>> {
316318
async { Ok(()) }.boxed_local()
317319
}
@@ -358,8 +360,7 @@ impl ModuleLoader for LazyEsmModuleLoader {
358360
&self,
359361
specifier: &ModuleSpecifier,
360362
_maybe_referrer: Option<&ModuleLoadReferrer>,
361-
_is_dyn_import: bool,
362-
_requested_module_type: RequestedModuleType,
363+
_options: ModuleLoadOptions,
363364
) -> ModuleLoadResponse {
364365
let mut sources = self.sources.borrow_mut();
365366
let source = match sources.remove(specifier.as_str()) {
@@ -383,8 +384,7 @@ impl ModuleLoader for LazyEsmModuleLoader {
383384
&self,
384385
_specifier: &ModuleSpecifier,
385386
_maybe_referrer: Option<String>,
386-
_is_dyn_import: bool,
387-
_requested_module_type: RequestedModuleType,
387+
_options: ModuleLoadOptions,
388388
) -> Pin<Box<dyn Future<Output = Result<(), ModuleLoaderError>>>> {
389389
async { Ok(()) }.boxed_local()
390390
}
@@ -421,8 +421,7 @@ impl ModuleLoader for FsModuleLoader {
421421
&self,
422422
module_specifier: &ModuleSpecifier,
423423
_maybe_referrer: Option<&ModuleLoadReferrer>,
424-
_is_dynamic: bool,
425-
requested_module_type: RequestedModuleType,
424+
options: ModuleLoadOptions,
426425
) -> ModuleLoadResponse {
427426
let module_specifier = module_specifier.clone();
428427
let fut = async move {
@@ -441,7 +440,7 @@ impl ModuleLoader for FsModuleLoader {
441440
} else if ext == "wasm" {
442441
ModuleType::Wasm
443442
} else {
444-
match &requested_module_type {
443+
match &options.requested_module_type {
445444
RequestedModuleType::Other(ty) => ModuleType::Other(ty.clone()),
446445
RequestedModuleType::Text => ModuleType::Text,
447446
RequestedModuleType::Bytes => ModuleType::Bytes,
@@ -455,7 +454,7 @@ impl ModuleLoader for FsModuleLoader {
455454
// If we loaded a JSON file, but the "requested_module_type" (that is computed from
456455
// import attributes) is not JSON we need to fail.
457456
if module_type == ModuleType::Json
458-
&& requested_module_type != RequestedModuleType::Json
457+
&& options.requested_module_type != RequestedModuleType::Json
459458
{
460459
return Err(JsErrorBox::generic("Attempted to load JSON module without specifying \"type\": \"json\" attribute in the import statement."));
461460
}
@@ -524,8 +523,7 @@ impl ModuleLoader for StaticModuleLoader {
524523
&self,
525524
module_specifier: &ModuleSpecifier,
526525
_maybe_referrer: Option<&ModuleLoadReferrer>,
527-
_is_dyn_import: bool,
528-
_requested_module_type: RequestedModuleType,
526+
_options: ModuleLoadOptions,
529527
) -> ModuleLoadResponse {
530528
let res = if let Some(code) = self.map.get(module_specifier) {
531529
Ok(ModuleSource::new(
@@ -593,16 +591,12 @@ impl<L: ModuleLoader> ModuleLoader for TestingModuleLoader<L> {
593591
&self,
594592
module_specifier: &ModuleSpecifier,
595593
maybe_referrer: Option<String>,
596-
is_dyn_import: bool,
597-
requested_module_type: RequestedModuleType,
594+
options: ModuleLoadOptions,
598595
) -> Pin<Box<dyn Future<Output = Result<(), ModuleLoaderError>>>> {
599596
self.prepare_count.set(self.prepare_count.get() + 1);
600-
self.loader.prepare_load(
601-
module_specifier,
602-
maybe_referrer,
603-
is_dyn_import,
604-
requested_module_type,
605-
)
597+
self
598+
.loader
599+
.prepare_load(module_specifier, maybe_referrer, options)
606600
}
607601

608602
fn finish_load(&self) {
@@ -614,17 +608,11 @@ impl<L: ModuleLoader> ModuleLoader for TestingModuleLoader<L> {
614608
&self,
615609
module_specifier: &ModuleSpecifier,
616610
maybe_referrer: Option<&ModuleLoadReferrer>,
617-
is_dyn_import: bool,
618-
requested_module_type: RequestedModuleType,
611+
options: ModuleLoadOptions,
619612
) -> ModuleLoadResponse {
620613
self.load_count.set(self.load_count.get() + 1);
621614
self.log.borrow_mut().push(module_specifier.clone());
622-
self.loader.load(
623-
module_specifier,
624-
maybe_referrer,
625-
is_dyn_import,
626-
requested_module_type,
627-
)
615+
self.loader.load(module_specifier, maybe_referrer, options)
628616
}
629617
}
630618

core/modules/map.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
use super::IntoModuleCodeString;
44
use super::IntoModuleName;
55
use super::ModuleConcreteError;
6+
use super::loaders::ModuleLoadOptions;
67
use super::module_map_data::ModuleMapSnapshotData;
8+
use super::recursive_load::SideModuleKind;
79
use crate::FastStaticString;
810
use crate::JsRuntime;
911
use crate::ModuleCodeBytes;
@@ -1064,9 +1066,13 @@ impl ModuleMap {
10641066
pub(crate) async fn load_side(
10651067
module_map_rc: Rc<ModuleMap>,
10661068
specifier: impl AsRef<str>,
1069+
kind: SideModuleKind,
10671070
) -> Result<RecursiveModuleLoad, CoreError> {
1068-
let load =
1069-
RecursiveModuleLoad::side(specifier.as_ref(), module_map_rc.clone());
1071+
let load = RecursiveModuleLoad::side(
1072+
specifier.as_ref(),
1073+
module_map_rc.clone(),
1074+
kind,
1075+
);
10701076
load.prepare().await?;
10711077
Ok(load)
10721078
}
@@ -2003,8 +2009,15 @@ impl ModuleMap {
20032009

20042010
let specifier = ModuleSpecifier::parse(module_specifier)?;
20052011

2006-
let load_response =
2007-
loader.load(&specifier, None, false, RequestedModuleType::None);
2012+
let load_response = loader.load(
2013+
&specifier,
2014+
None,
2015+
ModuleLoadOptions {
2016+
is_dynamic_import: false,
2017+
is_synchronous: false,
2018+
requested_module_type: RequestedModuleType::None,
2019+
},
2020+
);
20082021

20092022
let source = match load_response {
20102023
ModuleLoadResponse::Sync(result) => result,

core/modules/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ pub use loaders::ExtCodeCache;
2626
pub(crate) use loaders::ExtModuleLoader;
2727
pub use loaders::FsModuleLoader;
2828
pub(crate) use loaders::LazyEsmModuleLoader;
29+
pub use loaders::ModuleLoadOptions;
2930
pub use loaders::ModuleLoadReferrer;
3031
pub use loaders::ModuleLoadResponse;
3132
pub use loaders::ModuleLoader;
@@ -36,6 +37,7 @@ pub(crate) use map::ModuleMap;
3637
pub(crate) use map::script_origin;
3738
pub(crate) use map::synthetic_module_evaluation_steps;
3839
pub(crate) use module_map_data::ModuleMapSnapshotData;
40+
pub(crate) use recursive_load::SideModuleKind;
3941

4042
pub type ModuleId = usize;
4143
pub(crate) type ModuleLoadId = i32;

0 commit comments

Comments
 (0)