collapse some common code

This commit is contained in:
Pat Hickey
2021-10-21 12:09:18 -07:00
parent 6c70b81ff5
commit d3deaae99d

View File

@@ -126,6 +126,11 @@ impl Instance {
typecheck_externs(store.0, module, imports)?; typecheck_externs(store.0, module, imports)?;
Instantiator::new(store.0, module, ImportSource::Externs(imports))? Instantiator::new(store.0, module, ImportSource::Externs(imports))?
}; };
assert!(
!store.0.async_support(),
"cannot use `new` when async support is enabled on the config"
);
i.run(&mut store) i.run(&mut store)
} }
@@ -162,7 +167,14 @@ impl Instance {
typecheck_externs(store.0, module, imports)?; typecheck_externs(store.0, module, imports)?;
Instantiator::new(store.0, module, ImportSource::Externs(imports))? Instantiator::new(store.0, module, ImportSource::Externs(imports))?
}; };
i.run_async(&mut store).await let mut store = store.as_context_mut();
assert!(
store.0.async_support(),
"cannot use `new_async` without enabling async support on the config"
);
store
.on_fiber(|store| i.run(&mut store.as_context_mut()))
.await?
} }
pub(crate) fn from_wasmtime(handle: InstanceData, store: &mut StoreOpaque) -> Instance { pub(crate) fn from_wasmtime(handle: InstanceData, store: &mut StoreOpaque) -> Instance {
@@ -472,13 +484,6 @@ impl<'a> Instantiator<'a> {
} }
fn run<T>(&mut self, store: &mut StoreContextMut<'_, T>) -> Result<Instance, Error> { fn run<T>(&mut self, store: &mut StoreContextMut<'_, T>) -> Result<Instance, Error> {
assert!(
!store.0.async_support(),
"cannot use `new` when async support is enabled on the config"
);
// NB: this is the same code as `run_async`. It's intentionally
// small but should be kept in sync (modulo the async bits).
loop { loop {
if let Some((instance, start, toplevel)) = self.step(store.0)? { if let Some((instance, start, toplevel)) = self.step(store.0)? {
if let Some(start) = start { if let Some(start) = start {
@@ -491,33 +496,6 @@ impl<'a> Instantiator<'a> {
} }
} }
#[cfg(feature = "async")]
async fn run_async<T>(&mut self, store: &mut StoreContextMut<'_, T>) -> Result<Instance, Error>
where
T: Send,
{
assert!(
store.0.async_support(),
"cannot use `new_async` without enabling async support on the config"
);
// NB: this is the same code as `run`. It's intentionally
// small but should be kept in sync (modulo the async bits).
store
.on_fiber(|store| loop {
let step = self.step(store.0)?;
if let Some((instance, start, toplevel)) = step {
if let Some(start) = start {
Instantiator::start_raw(store, instance, start)?
}
if toplevel {
break Ok(instance);
}
}
})
.await?
}
/// Processes the next initializer for the next instance being created /// Processes the next initializer for the next instance being created
/// without running any wasm code. /// without running any wasm code.
/// ///
@@ -1002,7 +980,15 @@ impl<T> InstancePre<T> {
ImportSource::Definitions(&self.items), ImportSource::Definitions(&self.items),
)? )?
}; };
i.run_async(&mut store.as_context_mut()).await
let mut store = store.as_context_mut();
assert!(
store.0.async_support(),
"cannot use `new_async` without enabling async support on the config"
);
store
.on_fiber(|store| i.run(&mut store.as_context_mut()))
.await?
} }
fn ensure_comes_from_same_store(&self, store: &StoreOpaque) -> Result<()> { fn ensure_comes_from_same_store(&self, store: &StoreOpaque) -> Result<()> {