summaryrefslogtreecommitdiff
path: root/cli/factory.rs
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2024-02-20 16:29:57 -0500
committerGitHub <noreply@github.com>2024-02-20 21:29:57 +0000
commitf90889e5ee19e0ddcd9c1dbcce98720e417dd83e (patch)
treee44392e9506ba8cddc4c142d304f43879a418152 /cli/factory.rs
parentdbc4a4d6327062918b3bc41dc3f60c84ae3c620b (diff)
perf(jsr): fast check cache and lazy fast check graph (#22485)
Diffstat (limited to 'cli/factory.rs')
-rw-r--r--cli/factory.rs116
1 files changed, 77 insertions, 39 deletions
diff --git a/cli/factory.rs b/cli/factory.rs
index 2797afb29..9f3719510 100644
--- a/cli/factory.rs
+++ b/cli/factory.rs
@@ -22,6 +22,7 @@ use crate::file_fetcher::FileFetcher;
use crate::graph_util::FileWatcherReporter;
use crate::graph_util::ModuleGraphBuilder;
use crate::graph_util::ModuleGraphContainer;
+use crate::graph_util::ModuleGraphCreator;
use crate::http_util::HttpClient;
use crate::module_loader::CliModuleLoaderFactory;
use crate::module_loader::ModuleLoadPreparer;
@@ -55,6 +56,7 @@ use crate::worker::CliMainWorkerOptions;
use std::path::PathBuf;
use deno_core::error::AnyError;
+use deno_core::futures::FutureExt;
use deno_core::parking_lot::Mutex;
use deno_core::FeatureChecker;
@@ -116,6 +118,7 @@ impl<T> Default for Deferred<T> {
}
impl<T> Deferred<T> {
+ #[inline(always)]
pub fn get_or_try_init(
&self,
create: impl FnOnce() -> Result<T, AnyError>,
@@ -123,12 +126,16 @@ impl<T> Deferred<T> {
self.0.get_or_try_init(create)
}
+ #[inline(always)]
pub fn get_or_init(&self, create: impl FnOnce() -> T) -> &T {
self.0.get_or_init(create)
}
pub async fn get_or_try_init_async(
&self,
+ // some futures passed here are boxed because it was discovered
+ // that they were called a lot, causing other futures to get
+ // really big causing stack overflows on Windows
create: impl Future<Output = Result<T, AnyError>>,
) -> Result<&T, AnyError> {
if self.0.get().is_none() {
@@ -164,6 +171,7 @@ struct CliFactoryServices {
resolver: Deferred<Arc<CliGraphResolver>>,
maybe_file_watcher_reporter: Deferred<Option<FileWatcherReporter>>,
module_graph_builder: Deferred<Arc<ModuleGraphBuilder>>,
+ module_graph_creator: Deferred<Arc<ModuleGraphCreator>>,
module_load_preparer: Deferred<Arc<ModuleLoadPreparer>>,
node_code_translator: Deferred<Arc<CliNodeCodeTranslator>>,
node_resolver: Deferred<Arc<NodeResolver>>,
@@ -212,14 +220,16 @@ impl CliFactory {
let caches = Arc::new(Caches::new(self.deno_dir_provider().clone()));
// Warm up the caches we know we'll likely need based on the CLI mode
match self.options.sub_command() {
- DenoSubcommand::Run(_) => {
+ DenoSubcommand::Run(_)
+ | DenoSubcommand::Bench(_)
+ | DenoSubcommand::Test(_)
+ | DenoSubcommand::Check(_) => {
_ = caches.dep_analysis_db();
_ = caches.node_analysis_db();
- }
- DenoSubcommand::Check(_) => {
- _ = caches.dep_analysis_db();
- _ = caches.node_analysis_db();
- _ = caches.type_checking_cache_db();
+ if self.options.type_check_mode().is_true() {
+ _ = caches.fast_check_db();
+ _ = caches.type_checking_cache_db();
+ }
}
_ => {}
}
@@ -437,7 +447,7 @@ impl CliFactory {
npm_registry_url: crate::args::npm_registry_default_url().to_owned(),
})
}).await
- })
+ }.boxed_local())
.await
}
@@ -471,32 +481,37 @@ impl CliFactory {
self
.services
.resolver
- .get_or_try_init_async(async {
- Ok(Arc::new(CliGraphResolver::new(CliGraphResolverOptions {
- fs: self.fs().clone(),
- cjs_resolutions: Some(self.cjs_resolutions().clone()),
- sloppy_imports_resolver: if self.options.unstable_sloppy_imports() {
- Some(SloppyImportsResolver::new(self.fs().clone()))
- } else {
- None
- },
- node_resolver: Some(self.node_resolver().await?.clone()),
- npm_resolver: if self.options.no_npm() {
- None
- } else {
- Some(self.npm_resolver().await?.clone())
- },
- package_json_deps_provider: self.package_json_deps_provider().clone(),
- maybe_jsx_import_source_config: self
- .options
- .to_maybe_jsx_import_source_config()?,
- maybe_import_map: self.maybe_import_map().await?.clone(),
- maybe_vendor_dir: self.options.vendor_dir_path(),
- bare_node_builtins_enabled: self
- .options
- .unstable_bare_node_builtins(),
- })))
- })
+ .get_or_try_init_async(
+ async {
+ Ok(Arc::new(CliGraphResolver::new(CliGraphResolverOptions {
+ fs: self.fs().clone(),
+ cjs_resolutions: Some(self.cjs_resolutions().clone()),
+ sloppy_imports_resolver: if self.options.unstable_sloppy_imports() {
+ Some(SloppyImportsResolver::new(self.fs().clone()))
+ } else {
+ None
+ },
+ node_resolver: Some(self.node_resolver().await?.clone()),
+ npm_resolver: if self.options.no_npm() {
+ None
+ } else {
+ Some(self.npm_resolver().await?.clone())
+ },
+ package_json_deps_provider: self
+ .package_json_deps_provider()
+ .clone(),
+ maybe_jsx_import_source_config: self
+ .options
+ .to_maybe_jsx_import_source_config()?,
+ maybe_import_map: self.maybe_import_map().await?.clone(),
+ maybe_vendor_dir: self.options.vendor_dir_path(),
+ bare_node_builtins_enabled: self
+ .options
+ .unstable_bare_node_builtins(),
+ })))
+ }
+ .boxed_local(),
+ )
.await
}
@@ -554,12 +569,15 @@ impl CliFactory {
self
.services
.node_resolver
- .get_or_try_init_async(async {
- Ok(Arc::new(NodeResolver::new(
- self.fs().clone(),
- self.npm_resolver().await?.clone().into_npm_resolver(),
- )))
- })
+ .get_or_try_init_async(
+ async {
+ Ok(Arc::new(NodeResolver::new(
+ self.fs().clone(),
+ self.npm_resolver().await?.clone().into_npm_resolver(),
+ )))
+ }
+ .boxed_local(),
+ )
.await
}
@@ -594,6 +612,7 @@ impl CliFactory {
Ok(Arc::new(TypeChecker::new(
self.caches()?.clone(),
self.options.clone(),
+ self.module_graph_builder().await?.clone(),
self.node_resolver().await?.clone(),
self.npm_resolver().await?.clone(),
)))
@@ -610,6 +629,7 @@ impl CliFactory {
.get_or_try_init_async(async {
Ok(Arc::new(ModuleGraphBuilder::new(
self.options.clone(),
+ self.caches()?.clone(),
self.fs().clone(),
self.resolver().await?.clone(),
self.npm_resolver().await?.clone(),
@@ -620,6 +640,24 @@ impl CliFactory {
self.emit_cache()?.clone(),
self.file_fetcher()?.clone(),
self.global_http_cache()?.clone(),
+ )))
+ })
+ .await
+ }
+
+ pub async fn module_graph_creator(
+ &self,
+ ) -> Result<&Arc<ModuleGraphCreator>, AnyError> {
+ self
+ .services
+ .module_graph_creator
+ .get_or_try_init_async(async {
+ Ok(Arc::new(ModuleGraphCreator::new(
+ self.options.clone(),
+ self.fs().clone(),
+ self.npm_resolver().await?.clone(),
+ self.module_graph_builder().await?.clone(),
+ self.maybe_lockfile().clone(),
self.type_checker().await?.clone(),
)))
})