This commit is contained in:
Rerumu 2022-06-25 17:41:03 -04:00
parent a0354816cf
commit 7aefbc3a2e
3 changed files with 32 additions and 18 deletions

View File

@ -6,7 +6,7 @@ use std::{
use wasm_ast::module::{Module, TypeInfo}; use wasm_ast::module::{Module, TypeInfo};
use wast::{ use wast::{
core::{Expression, Instruction}, core::{Expression, Instruction},
AssertExpression, WastExecute, WastInvoke, AssertExpression, WastExecute, WastInvoke, Wat,
}; };
use target::{get_name_from_id, Target}; use target::{get_name_from_id, Target};
@ -72,7 +72,7 @@ impl Target for LuaJIT {
writeln!(w) writeln!(w)
} }
fn write_assert_trap(data: &WastExecute, w: &mut dyn Write) -> Result<()> { fn write_assert_trap(data: &mut WastExecute, w: &mut dyn Write) -> Result<()> {
match data { match data {
WastExecute::Invoke(data) => { WastExecute::Invoke(data) => {
Self::write_call_of("assert_trap", data, w)?; Self::write_call_of("assert_trap", data, w)?;
@ -85,16 +85,22 @@ impl Target for LuaJIT {
write!(w, r#"loaded["{name}"].global_list["{global}"].value"#)?; write!(w, r#"loaded["{name}"].global_list["{global}"].value"#)?;
writeln!(w, ", nil)") writeln!(w, ", nil)")
} }
WastExecute::Wat(_) => { WastExecute::Wat(data) => {
// FIXME: Assert the `start` function let bytes = match data {
Wat::Module(ast) => ast.encode().unwrap(),
Wat::Component(_) => unimplemented!(),
};
let data = Module::from_data(&bytes);
Ok(()) write!(w, "assert_trap((function() ")?;
codegen_luajit::from_module_untyped(&data, w)?;
writeln!(w, " end)(), linked)")
} }
} }
} }
fn write_assert_return( fn write_assert_return(
data: &WastExecute, data: &mut WastExecute,
result: &[AssertExpression], result: &[AssertExpression],
w: &mut dyn Write, w: &mut dyn Write,
) -> Result<()> { ) -> Result<()> {

View File

@ -6,7 +6,7 @@ use std::{
use wasm_ast::module::{Module, TypeInfo}; use wasm_ast::module::{Module, TypeInfo};
use wast::{ use wast::{
core::{Expression, Instruction}, core::{Expression, Instruction},
AssertExpression, WastExecute, WastInvoke, AssertExpression, WastExecute, WastInvoke, Wat,
}; };
use target::{get_name_from_id, Target}; use target::{get_name_from_id, Target};
@ -85,7 +85,7 @@ impl Target for Luau {
writeln!(w) writeln!(w)
} }
fn write_assert_trap(data: &WastExecute, w: &mut dyn Write) -> Result<()> { fn write_assert_trap(data: &mut WastExecute, w: &mut dyn Write) -> Result<()> {
match data { match data {
WastExecute::Invoke(data) => { WastExecute::Invoke(data) => {
Self::write_call_of("assert_trap", data, w)?; Self::write_call_of("assert_trap", data, w)?;
@ -98,16 +98,22 @@ impl Target for Luau {
write!(w, r#"loaded["{name}"].global_list["{global}"].value"#)?; write!(w, r#"loaded["{name}"].global_list["{global}"].value"#)?;
writeln!(w, ", nil)") writeln!(w, ", nil)")
} }
WastExecute::Wat(_) => { WastExecute::Wat(data) => {
// FIXME: Assert the `start` function let bytes = match data {
Wat::Module(ast) => ast.encode().unwrap(),
Wat::Component(_) => unimplemented!(),
};
let data = Module::from_data(&bytes);
Ok(()) write!(w, "assert_trap((function() ")?;
codegen_luau::from_module_untyped(&data, w)?;
writeln!(w, " end)(), linked)")
} }
} }
} }
fn write_assert_return( fn write_assert_return(
data: &WastExecute, data: &mut WastExecute,
result: &[AssertExpression], result: &[AssertExpression],
w: &mut dyn Write, w: &mut dyn Write,
) -> Result<()> { ) -> Result<()> {

View File

@ -61,10 +61,10 @@ pub trait Target: Sized {
fn write_invoke(data: &WastInvoke, w: &mut dyn Write) -> Result<()>; fn write_invoke(data: &WastInvoke, w: &mut dyn Write) -> Result<()>;
fn write_assert_trap(data: &WastExecute, w: &mut dyn Write) -> Result<()>; fn write_assert_trap(data: &mut WastExecute, w: &mut dyn Write) -> Result<()>;
fn write_assert_return( fn write_assert_return(
data: &WastExecute, data: &mut WastExecute,
result: &[AssertExpression], result: &[AssertExpression],
w: &mut dyn Write, w: &mut dyn Write,
) -> Result<()>; ) -> Result<()>;
@ -94,11 +94,13 @@ pub trait Target: Sized {
WastDirective::Invoke(data) => { WastDirective::Invoke(data) => {
Self::write_invoke(&data, w)?; Self::write_invoke(&data, w)?;
} }
WastDirective::AssertTrap { exec, .. } => { WastDirective::AssertTrap { mut exec, .. } => {
Self::write_assert_trap(&exec, w)?; Self::write_assert_trap(&mut exec, w)?;
} }
WastDirective::AssertReturn { exec, results, .. } => { WastDirective::AssertReturn {
Self::write_assert_return(&exec, &results, w)?; mut exec, results, ..
} => {
Self::write_assert_return(&mut exec, &results, w)?;
} }
WastDirective::AssertExhaustion { call, .. } => { WastDirective::AssertExhaustion { call, .. } => {
Self::write_assert_exhaustion(&call, w)?; Self::write_assert_exhaustion(&call, w)?;