From abec4b6cec6ced6c0500348ac5990486a4fe8287 Mon Sep 17 00:00:00 2001 From: Henry Gressmann Date: Fri, 28 Jun 2024 19:16:22 +0200 Subject: fix: fix 2.0 regressions introduced by 644395712a81c8f3fd56b6beafe9d3e09dfa9501 Signed-off-by: Henry Gressmann --- crates/parser/src/conversion.rs | 2 +- crates/parser/src/lib.rs | 2 +- crates/parser/src/visit.rs | 92 +++++++++++++++++++---------------------- 3 files changed, 45 insertions(+), 51 deletions(-) (limited to 'crates/parser/src') diff --git a/crates/parser/src/conversion.rs b/crates/parser/src/conversion.rs index f18b570..1d550f3 100644 --- a/crates/parser/src/conversion.rs +++ b/crates/parser/src/conversion.rs @@ -237,7 +237,7 @@ pub(crate) fn convert_reftype(reftype: &wasmparser::RefType) -> ValType { match reftype { _ if reftype.is_func_ref() => ValType::RefFunc, _ if reftype.is_extern_ref() => ValType::RefExtern, - _ => unimplemented!("Unsupported reference type: {:?}", reftype), + _ => unimplemented!("Unsupported reference type: {:?}, {:?}", reftype, reftype.heap_type()), } } diff --git a/crates/parser/src/lib.rs b/crates/parser/src/lib.rs index 0e8f976..8ea5a86 100644 --- a/crates/parser/src/lib.rs +++ b/crates/parser/src/lib.rs @@ -57,8 +57,8 @@ impl Parser { reference_types: true, sign_extension: true, saturating_float_to_int: true, + function_references: true, - function_references: false, component_model: false, component_model_nested_names: false, component_model_values: false, diff --git a/crates/parser/src/visit.rs b/crates/parser/src/visit.rs index 4e2fece..1db00ad 100644 --- a/crates/parser/src/visit.rs +++ b/crates/parser/src/visit.rs @@ -1,6 +1,6 @@ use crate::{conversion::convert_blocktype, Result}; -use crate::conversion::{convert_heaptype, convert_valtype}; +use crate::conversion::convert_heaptype; use alloc::string::ToString; use alloc::{boxed::Box, vec::Vec}; use tinywasm_types::{Instruction, MemoryArg}; @@ -319,14 +319,13 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild fn visit_global_set(&mut self, global_index: u32) -> Self::Output { match self.validator.get_operand_type(0) { - Some(Some(t)) => self.instructions.push(match convert_valtype(&t) { - tinywasm_types::ValType::I32 => Instruction::GlobalSet32(global_index), - tinywasm_types::ValType::F32 => Instruction::GlobalSet32(global_index), - tinywasm_types::ValType::I64 => Instruction::GlobalSet64(global_index), - tinywasm_types::ValType::F64 => Instruction::GlobalSet64(global_index), - tinywasm_types::ValType::V128 => Instruction::GlobalSet128(global_index), - tinywasm_types::ValType::RefExtern => Instruction::GlobalSetRef(global_index), - tinywasm_types::ValType::RefFunc => Instruction::GlobalSetRef(global_index), + Some(Some(t)) => self.instructions.push(match t { + wasmparser::ValType::I32 => Instruction::GlobalSet32(global_index), + wasmparser::ValType::F32 => Instruction::GlobalSet32(global_index), + wasmparser::ValType::I64 => Instruction::GlobalSet64(global_index), + wasmparser::ValType::F64 => Instruction::GlobalSet64(global_index), + wasmparser::ValType::V128 => Instruction::GlobalSet128(global_index), + wasmparser::ValType::Ref(_) => Instruction::GlobalSetRef(global_index), }), _ => self.visit_unreachable(), } @@ -334,14 +333,13 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild fn visit_drop(&mut self) -> Self::Output { match self.validator.get_operand_type(0) { - Some(Some(t)) => self.instructions.push(match convert_valtype(&t) { - tinywasm_types::ValType::I32 => Instruction::Drop32, - tinywasm_types::ValType::F32 => Instruction::Drop32, - tinywasm_types::ValType::I64 => Instruction::Drop64, - tinywasm_types::ValType::F64 => Instruction::Drop64, - tinywasm_types::ValType::V128 => Instruction::Drop128, - tinywasm_types::ValType::RefExtern => Instruction::DropRef, - tinywasm_types::ValType::RefFunc => Instruction::DropRef, + Some(Some(t)) => self.instructions.push(match t { + wasmparser::ValType::I32 => Instruction::Drop32, + wasmparser::ValType::F32 => Instruction::Drop32, + wasmparser::ValType::I64 => Instruction::Drop64, + wasmparser::ValType::F64 => Instruction::Drop64, + wasmparser::ValType::V128 => Instruction::Drop128, + wasmparser::ValType::Ref(_) => Instruction::DropRef, }), _ => self.visit_unreachable(), } @@ -361,14 +359,13 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild fn visit_local_get(&mut self, idx: u32) -> Self::Output { let resolved_idx = self.local_addr_map[idx as usize]; match self.validator.get_local_type(idx) { - Some(t) => self.instructions.push(match convert_valtype(&t) { - tinywasm_types::ValType::I32 => Instruction::LocalGet32(resolved_idx), - tinywasm_types::ValType::F32 => Instruction::LocalGet32(resolved_idx), - tinywasm_types::ValType::I64 => Instruction::LocalGet64(resolved_idx), - tinywasm_types::ValType::F64 => Instruction::LocalGet64(resolved_idx), - tinywasm_types::ValType::V128 => Instruction::LocalGet128(resolved_idx), - tinywasm_types::ValType::RefExtern => Instruction::LocalGetRef(resolved_idx), - tinywasm_types::ValType::RefFunc => Instruction::LocalGetRef(resolved_idx), + Some(t) => self.instructions.push(match t { + wasmparser::ValType::I32 => Instruction::LocalGet32(resolved_idx), + wasmparser::ValType::F32 => Instruction::LocalGet32(resolved_idx), + wasmparser::ValType::I64 => Instruction::LocalGet64(resolved_idx), + wasmparser::ValType::F64 => Instruction::LocalGet64(resolved_idx), + wasmparser::ValType::V128 => Instruction::LocalGet128(resolved_idx), + wasmparser::ValType::Ref(_) => Instruction::LocalGetRef(resolved_idx), }), _ => self.visit_unreachable(), } @@ -377,14 +374,13 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild fn visit_local_set(&mut self, idx: u32) -> Self::Output { let resolved_idx = self.local_addr_map[idx as usize]; match self.validator.get_operand_type(0) { - Some(Some(t)) => self.instructions.push(match convert_valtype(&t) { - tinywasm_types::ValType::I32 => Instruction::LocalSet32(resolved_idx), - tinywasm_types::ValType::F32 => Instruction::LocalSet32(resolved_idx), - tinywasm_types::ValType::I64 => Instruction::LocalSet64(resolved_idx), - tinywasm_types::ValType::F64 => Instruction::LocalSet64(resolved_idx), - tinywasm_types::ValType::V128 => Instruction::LocalSet128(resolved_idx), - tinywasm_types::ValType::RefExtern => Instruction::LocalSetRef(resolved_idx), - tinywasm_types::ValType::RefFunc => Instruction::LocalSetRef(resolved_idx), + Some(Some(t)) => self.instructions.push(match t { + wasmparser::ValType::I32 => Instruction::LocalSet32(resolved_idx), + wasmparser::ValType::F32 => Instruction::LocalSet32(resolved_idx), + wasmparser::ValType::I64 => Instruction::LocalSet64(resolved_idx), + wasmparser::ValType::F64 => Instruction::LocalSet64(resolved_idx), + wasmparser::ValType::V128 => Instruction::LocalSet128(resolved_idx), + wasmparser::ValType::Ref(_) => Instruction::LocalSetRef(resolved_idx), }), _ => self.visit_unreachable(), } @@ -393,14 +389,13 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild fn visit_local_tee(&mut self, idx: u32) -> Self::Output { let resolved_idx = self.local_addr_map[idx as usize]; match self.validator.get_operand_type(0) { - Some(Some(t)) => self.instructions.push(match convert_valtype(&t) { - tinywasm_types::ValType::I32 => Instruction::LocalTee32(resolved_idx), - tinywasm_types::ValType::F32 => Instruction::LocalTee32(resolved_idx), - tinywasm_types::ValType::I64 => Instruction::LocalTee64(resolved_idx), - tinywasm_types::ValType::F64 => Instruction::LocalTee64(resolved_idx), - tinywasm_types::ValType::V128 => Instruction::LocalTee128(resolved_idx), - tinywasm_types::ValType::RefExtern => Instruction::LocalTeeRef(resolved_idx), - tinywasm_types::ValType::RefFunc => Instruction::LocalTeeRef(resolved_idx), + Some(Some(t)) => self.instructions.push(match t { + wasmparser::ValType::I32 => Instruction::LocalTee32(resolved_idx), + wasmparser::ValType::F32 => Instruction::LocalTee32(resolved_idx), + wasmparser::ValType::I64 => Instruction::LocalTee64(resolved_idx), + wasmparser::ValType::F64 => Instruction::LocalTee64(resolved_idx), + wasmparser::ValType::V128 => Instruction::LocalTee128(resolved_idx), + wasmparser::ValType::Ref(_) => Instruction::LocalTeeRef(resolved_idx), }), _ => self.visit_unreachable(), } @@ -537,14 +532,13 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild } fn visit_typed_select(&mut self, ty: wasmparser::ValType) -> Self::Output { - self.instructions.push(match convert_valtype(&ty) { - tinywasm_types::ValType::I32 => Instruction::Select32, - tinywasm_types::ValType::F32 => Instruction::Select32, - tinywasm_types::ValType::I64 => Instruction::Select64, - tinywasm_types::ValType::F64 => Instruction::Select64, - tinywasm_types::ValType::V128 => Instruction::Select128, - tinywasm_types::ValType::RefExtern => Instruction::SelectRef, - tinywasm_types::ValType::RefFunc => Instruction::SelectRef, + self.instructions.push(match ty { + wasmparser::ValType::I32 => Instruction::Select32, + wasmparser::ValType::F32 => Instruction::Select32, + wasmparser::ValType::I64 => Instruction::Select64, + wasmparser::ValType::F64 => Instruction::Select64, + wasmparser::ValType::V128 => Instruction::Select128, + wasmparser::ValType::Ref(_) => Instruction::SelectRef, }) } -- cgit v1.3.1