From f4e4171ebe848bfcd846c480a4bb82a08c74e24d Mon Sep 17 00:00:00 2001 From: David Wendt Date: Thu, 14 Nov 2019 14:52:13 -0500 Subject: [PATCH] Make spawned futures falliable, and report those errors. --- core/src/avm1.rs | 14 ++++++++++---- core/src/backend/navigator.rs | 8 ++++++-- desktop/src/navigator.rs | 5 ++++- web/src/navigator.rs | 8 ++++++-- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/core/src/avm1.rs b/core/src/avm1.rs index 918db73c0..ca8971d5a 100644 --- a/core/src/avm1.rs +++ b/core/src/avm1.rs @@ -1638,7 +1638,7 @@ impl<'gc> Avm1<'gc> { let slot = self.forcibly_root_object(context.layers[level_id].object().as_object()?); context.navigator.spawn_future(Box::pin(async move { - let data = fetch.await.unwrap(); + let data = fetch.await?; let movie = Arc::new(SwfMovie::from_data(&data)); player.lock().unwrap().update(|avm, uc| { @@ -1660,6 +1660,8 @@ impl<'gc> Avm1<'gc> { crate::character::Character::MorphShape(morph_shape), ); } + + Ok(()) }) })); @@ -1713,14 +1715,16 @@ impl<'gc> Avm1<'gc> { let slot = self.forcibly_root_object(target_obj); context.navigator.spawn_future(Box::pin(async move { - let data = fetch.await.unwrap(); + let data = fetch.await?; player.lock().unwrap().update(|avm, uc| { let that = avm.unroot_object(slot); for (k, v) in form_urlencoded::parse(&data) { - that.set(&k, v.into_owned().into(), avm, uc); + that.set(&k, v.into_owned().into(), avm, uc)?; } + + Ok(()) }) })); } @@ -1733,7 +1737,7 @@ impl<'gc> Avm1<'gc> { let slot = self.forcibly_root_object(clip_target.object().as_object()?); context.navigator.spawn_future(Box::pin(async move { - let data = fetch.await.unwrap(); + let data = fetch.await?; let movie = Arc::new(SwfMovie::from_data(&data)); player.lock().unwrap().update(|avm, uc| { @@ -1755,6 +1759,8 @@ impl<'gc> Avm1<'gc> { crate::character::Character::MorphShape(morph_shape), ); } + + Ok(()) }) })) } diff --git a/core/src/backend/navigator.rs b/core/src/backend/navigator.rs index 7aa5ee2fb..5fbe86367 100644 --- a/core/src/backend/navigator.rs +++ b/core/src/backend/navigator.rs @@ -69,7 +69,7 @@ pub trait NavigatorBackend { /// /// TODO: For some reason, `wasm_bindgen_futures` wants unpinnable futures. /// This seems highly limiting. - fn spawn_future(&mut self, future: Pin + 'static>>); + fn spawn_future(&mut self, future: Pin> + 'static>>); } /// A null implementation for platforms that do not live in a web browser. @@ -100,5 +100,9 @@ impl NavigatorBackend for NullNavigatorBackend { Box::pin(async { Err("Fetch IO not implemented".into()) }) } - fn spawn_future(&mut self, _future: Pin + 'static>>) {} + fn spawn_future( + &mut self, + _future: Pin> + 'static>>, + ) { + } } diff --git a/desktop/src/navigator.rs b/desktop/src/navigator.rs index d8d6643e9..eedcae2ba 100644 --- a/desktop/src/navigator.rs +++ b/desktop/src/navigator.rs @@ -67,7 +67,10 @@ impl NavigatorBackend for ExternalNavigatorBackend { Box::pin(async { Err("Fetch not implemented on desktop!".into()) }) } - fn spawn_future(&mut self, _future: Pin + 'static>>) { + fn spawn_future( + &mut self, + _future: Pin> + 'static>>, + ) { unimplemented!(); } } diff --git a/web/src/navigator.rs b/web/src/navigator.rs index 1ac743c8d..2bc6fe8d6 100644 --- a/web/src/navigator.rs +++ b/web/src/navigator.rs @@ -99,7 +99,11 @@ impl NavigatorBackend for WebNavigatorBackend { }) } - fn spawn_future(&mut self, future: Pin + 'static>>) { - spawn_local(future) + fn spawn_future(&mut self, future: Pin> + 'static>>) { + spawn_local(async move { + if let Err(e) = future.await { + log::error!("Asynchronous error occured: {}", e); + } + }) } }