diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/isolate.rs | 64 |
1 files changed, 56 insertions, 8 deletions
diff --git a/core/isolate.rs b/core/isolate.rs index fe6e613c2..e0acbfd9f 100644 --- a/core/isolate.rs +++ b/core/isolate.rs @@ -440,10 +440,7 @@ impl Isolate { libdeno::deno_mod_new(self.libdeno_isolate, main, name_ptr, source_ptr) }; - self.check_last_exception().map(|_| id).map_err(|err| { - assert_eq!(id, 0); - err - }) + self.check_last_exception().map(|_| id) } pub fn mod_get_imports(&self, id: deno_mod) -> Vec<String> { @@ -503,10 +500,7 @@ impl Isolate { err_str_ptr, ) }; - self.check_last_exception().map_err(|err| { - assert_eq!(id, 0); - err - }) + self.check_last_exception() } fn poll_dyn_imports(&mut self) -> Poll<(), ErrBox> { @@ -1013,6 +1007,60 @@ pub mod tests { } #[test] + fn dyn_import_err2() { + use std::convert::TryInto; + // Import multiple modules to demonstrate that after failed dynamic import + // another dynamic import can still be run + run_in_task(|| { + let count = Arc::new(AtomicUsize::new(0)); + let count_ = count.clone(); + let mut isolate = Isolate::new(StartupData::None, false); + isolate.set_dyn_import(move |_, specifier, referrer| { + let c = count_.fetch_add(1, Ordering::Relaxed); + match c { + 0 => assert_eq!(specifier, "foo1.js"), + 1 => assert_eq!(specifier, "foo2.js"), + 2 => assert_eq!(specifier, "foo3.js"), + _ => unreachable!(), + } + assert_eq!(referrer, "dyn_import_error.js"); + + let source_code_info = SourceCodeInfo { + module_url_specified: specifier.to_owned(), + module_url_found: specifier.to_owned(), + code: "# not valid JS".to_owned(), + }; + let stream = MockImportStream(vec![ + Ok(RecursiveLoadEvent::Fetch(source_code_info)), + Ok(RecursiveLoadEvent::Instantiate(c.try_into().unwrap())), + ]); + Box::new(stream) + }); + + js_check(isolate.execute( + "dyn_import_error.js", + r#" + (async () => { + await import("foo1.js"); + })(); + (async () => { + await import("foo2.js"); + })(); + (async () => { + await import("foo3.js"); + })(); + "#, + )); + + assert_eq!(count.load(Ordering::Relaxed), 3); + // Now each poll should return error + assert!(isolate.poll().is_err()); + assert!(isolate.poll().is_err()); + assert!(isolate.poll().is_err()); + }) + } + + #[test] fn dyn_import_ok() { run_in_task(|| { let count = Arc::new(AtomicUsize::new(0)); |