From 7aefbc3a2eabe04a53121c5d1d67fcc589212467 Mon Sep 17 00:00:00 2001 From: Rerumu Date: Sat, 25 Jun 2022 17:41:03 -0400 Subject: [PATCH] Fix #14 --- dev-test/tests/luajit_translate.rs | 18 ++++++++++++------ dev-test/tests/luau_translate.rs | 18 ++++++++++++------ dev-test/tests/target.rs | 14 ++++++++------ 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/dev-test/tests/luajit_translate.rs b/dev-test/tests/luajit_translate.rs index afb5f13..40af167 100644 --- a/dev-test/tests/luajit_translate.rs +++ b/dev-test/tests/luajit_translate.rs @@ -6,7 +6,7 @@ use std::{ use wasm_ast::module::{Module, TypeInfo}; use wast::{ core::{Expression, Instruction}, - AssertExpression, WastExecute, WastInvoke, + AssertExpression, WastExecute, WastInvoke, Wat, }; use target::{get_name_from_id, Target}; @@ -72,7 +72,7 @@ impl Target for LuaJIT { 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 { WastExecute::Invoke(data) => { 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"#)?; writeln!(w, ", nil)") } - WastExecute::Wat(_) => { - // FIXME: Assert the `start` function + WastExecute::Wat(data) => { + 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( - data: &WastExecute, + data: &mut WastExecute, result: &[AssertExpression], w: &mut dyn Write, ) -> Result<()> { diff --git a/dev-test/tests/luau_translate.rs b/dev-test/tests/luau_translate.rs index 5bb5452..2bb95a6 100644 --- a/dev-test/tests/luau_translate.rs +++ b/dev-test/tests/luau_translate.rs @@ -6,7 +6,7 @@ use std::{ use wasm_ast::module::{Module, TypeInfo}; use wast::{ core::{Expression, Instruction}, - AssertExpression, WastExecute, WastInvoke, + AssertExpression, WastExecute, WastInvoke, Wat, }; use target::{get_name_from_id, Target}; @@ -85,7 +85,7 @@ impl Target for Luau { 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 { WastExecute::Invoke(data) => { 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"#)?; writeln!(w, ", nil)") } - WastExecute::Wat(_) => { - // FIXME: Assert the `start` function + WastExecute::Wat(data) => { + 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( - data: &WastExecute, + data: &mut WastExecute, result: &[AssertExpression], w: &mut dyn Write, ) -> Result<()> { diff --git a/dev-test/tests/target.rs b/dev-test/tests/target.rs index 6e06387..9843c5f 100644 --- a/dev-test/tests/target.rs +++ b/dev-test/tests/target.rs @@ -61,10 +61,10 @@ pub trait Target: Sized { 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( - data: &WastExecute, + data: &mut WastExecute, result: &[AssertExpression], w: &mut dyn Write, ) -> Result<()>; @@ -94,11 +94,13 @@ pub trait Target: Sized { WastDirective::Invoke(data) => { Self::write_invoke(&data, w)?; } - WastDirective::AssertTrap { exec, .. } => { - Self::write_assert_trap(&exec, w)?; + WastDirective::AssertTrap { mut exec, .. } => { + Self::write_assert_trap(&mut exec, w)?; } - WastDirective::AssertReturn { exec, results, .. } => { - Self::write_assert_return(&exec, &results, w)?; + WastDirective::AssertReturn { + mut exec, results, .. + } => { + Self::write_assert_return(&mut exec, &results, w)?; } WastDirective::AssertExhaustion { call, .. } => { Self::write_assert_exhaustion(&call, w)?;