Improved error handling.
This commit is contained in:
@@ -6,7 +6,6 @@ use target_lexicon::HOST;
|
|||||||
use wasmtime_environ::{translate_signature, MemoryPlan, MemoryStyle, TablePlan, TableStyle};
|
use wasmtime_environ::{translate_signature, MemoryPlan, MemoryStyle, TablePlan, TableStyle};
|
||||||
use wasmtime_execute::{ExportValue, Resolver, VMGlobal, VMMemory, VMTable};
|
use wasmtime_execute::{ExportValue, Resolver, VMGlobal, VMMemory, VMTable};
|
||||||
|
|
||||||
#[allow(clippy::print_stdout)]
|
|
||||||
extern "C" fn spectest_print() {}
|
extern "C" fn spectest_print() {}
|
||||||
|
|
||||||
#[allow(clippy::print_stdout)]
|
#[allow(clippy::print_stdout)]
|
||||||
|
|||||||
@@ -26,12 +26,21 @@ impl Instances {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn instantiate(&mut self, isa: &isa::TargetIsa, module: ModuleBinary) -> InstanceWorld {
|
fn instantiate(
|
||||||
InstanceWorld::new(&mut self.code, isa, &module.into_vec(), &mut self.spectest).unwrap()
|
&mut self,
|
||||||
|
isa: &isa::TargetIsa,
|
||||||
|
module: ModuleBinary,
|
||||||
|
) -> Result<InstanceWorld, String> {
|
||||||
|
InstanceWorld::new(&mut self.code, isa, &module.into_vec(), &mut self.spectest)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn define_unnamed_module(&mut self, isa: &isa::TargetIsa, module: ModuleBinary) {
|
pub fn define_unnamed_module(
|
||||||
self.current = Some(self.instantiate(isa, module));
|
&mut self,
|
||||||
|
isa: &isa::TargetIsa,
|
||||||
|
module: ModuleBinary,
|
||||||
|
) -> Result<(), String> {
|
||||||
|
self.current = Some(self.instantiate(isa, module)?);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn define_named_module(
|
pub fn define_named_module(
|
||||||
@@ -39,9 +48,10 @@ impl Instances {
|
|||||||
isa: &isa::TargetIsa,
|
isa: &isa::TargetIsa,
|
||||||
name: String,
|
name: String,
|
||||||
module: ModuleBinary,
|
module: ModuleBinary,
|
||||||
) {
|
) -> Result<(), String> {
|
||||||
let world = self.instantiate(isa, module);
|
let world = self.instantiate(isa, module)?;
|
||||||
self.namespace.insert(name, world);
|
self.namespace.insert(name, world);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn perform_action(
|
pub fn perform_action(
|
||||||
@@ -117,10 +127,16 @@ pub fn wast_buffer(name: &str, isa: &isa::TargetIsa, wast: &[u8]) -> Result<(),
|
|||||||
match kind {
|
match kind {
|
||||||
CommandKind::Module { module, name } => {
|
CommandKind::Module { module, name } => {
|
||||||
if let Some(name) = name {
|
if let Some(name) = name {
|
||||||
instances.define_named_module(isa, name, module.clone());
|
instances.define_named_module(isa, name, module.clone())?;
|
||||||
}
|
}
|
||||||
|
|
||||||
instances.define_unnamed_module(isa, module)
|
instances.define_unnamed_module(isa, module)?;
|
||||||
|
}
|
||||||
|
CommandKind::Register {
|
||||||
|
name: _name,
|
||||||
|
as_name: _as_name,
|
||||||
|
} => {
|
||||||
|
println!("{}:{}: TODO: Implement register", name, line);
|
||||||
}
|
}
|
||||||
CommandKind::PerformAction(action) => match instances.perform_action(isa, action)? {
|
CommandKind::PerformAction(action) => match instances.perform_action(isa, action)? {
|
||||||
ActionOutcome::Returned { .. } => {}
|
ActionOutcome::Returned { .. } => {}
|
||||||
@@ -166,7 +182,7 @@ pub fn wast_buffer(name: &str, isa: &isa::TargetIsa, wast: &[u8]) -> Result<(),
|
|||||||
message: trap_message,
|
message: trap_message,
|
||||||
} => {
|
} => {
|
||||||
println!(
|
println!(
|
||||||
"{}:{}: TODO: Check the trap message: expected {}, got {}",
|
"{}:{}: TODO: Check the assert_trap message: expected {}, got {}",
|
||||||
name, line, message, trap_message
|
name, line, message, trap_message
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -180,7 +196,7 @@ pub fn wast_buffer(name: &str, isa: &isa::TargetIsa, wast: &[u8]) -> Result<(),
|
|||||||
),
|
),
|
||||||
ActionOutcome::Trapped { message } => {
|
ActionOutcome::Trapped { message } => {
|
||||||
println!(
|
println!(
|
||||||
"{}:{}: TODO: Check the exhaustion message: {}",
|
"{}:{}: TODO: Check the assert_exhaustion message: {}",
|
||||||
name, line, message
|
name, line, message
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -252,8 +268,41 @@ pub fn wast_buffer(name: &str, isa: &isa::TargetIsa, wast: &[u8]) -> Result<(),
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
command => {
|
CommandKind::AssertInvalid {
|
||||||
println!("{}:{}: TODO: implement {:?}", name, line, command);
|
module: _module,
|
||||||
|
message: _message,
|
||||||
|
} => {
|
||||||
|
println!("{}:{}: TODO: Implement assert_invalid", name, line);
|
||||||
|
}
|
||||||
|
CommandKind::AssertMalformed {
|
||||||
|
module: _module,
|
||||||
|
message: _message,
|
||||||
|
} => {
|
||||||
|
println!("{}:{}: TODO: Implement assert_malformed", name, line);
|
||||||
|
}
|
||||||
|
CommandKind::AssertUninstantiable { module, message } => {
|
||||||
|
let _err = instances
|
||||||
|
.define_unnamed_module(isa, module)
|
||||||
|
.expect_err(&format!(
|
||||||
|
"{}:{}: uninstantiable module was successfully instantiated",
|
||||||
|
name, line
|
||||||
|
));
|
||||||
|
println!(
|
||||||
|
"{}:{}: TODO: Check the assert_uninstantiable message: {}",
|
||||||
|
name, line, message
|
||||||
|
);
|
||||||
|
}
|
||||||
|
CommandKind::AssertUnlinkable { module, message } => {
|
||||||
|
let _err = instances
|
||||||
|
.define_unnamed_module(isa, module)
|
||||||
|
.expect_err(&format!(
|
||||||
|
"{}:{}: unlinkable module was successfully linked",
|
||||||
|
name, line
|
||||||
|
));
|
||||||
|
println!(
|
||||||
|
"{}:{}: TODO: Check the assert_unlinkable message: {}",
|
||||||
|
name, line, message
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user