use alloc::{format, vec::Vec}; use tinywasm_types::{BlockArgs, Instruction, MemArg, ValType}; use crate::Result; fn convert_blocktype(blocktype: wasmparser::BlockType) -> BlockArgs { use wasmparser::BlockType::*; match blocktype { Empty => BlockArgs::Empty, Type(ty) => BlockArgs::Type(convert_valtype(ty)), FuncType(ty) => BlockArgs::FuncType(ty), } } fn convert_valtype(valtype: wasmparser::ValType) -> ValType { use wasmparser::ValType::*; match valtype { I32 => ValType::I32, I64 => ValType::I64, F32 => ValType::F32, F64 => ValType::F64, V128 => ValType::V128, FuncRef => ValType::FuncRef, ExternRef => ValType::ExternRef, } } fn convert_memarg(memarg: wasmparser::MemArg) -> MemArg { MemArg { offset: memarg.offset, align: memarg.align, } } pub fn process_operator(op: wasmparser::Operator<'_>) -> Result { use wasmparser::Operator::*; let v = match op { Unreachable => Instruction::Unreachable, Nop => Instruction::Nop, Block { blockty } => Instruction::Block(convert_blocktype(blockty)), Loop { blockty } => Instruction::Loop(convert_blocktype(blockty)), If { blockty } => Instruction::If(convert_blocktype(blockty)), Else => Instruction::Else, End => Instruction::End, Br { relative_depth } => Instruction::Br(relative_depth), BrIf { relative_depth } => Instruction::BrIf(relative_depth), BrTable { targets } => { let default = targets.default(); let targets = targets .targets() .map(|t| Ok(t?)) .collect::>>()?; Instruction::BrTable(targets, default) } Return => Instruction::Return, Call { function_index } => Instruction::Call(function_index), CallIndirect { type_index, table_index, .. } => Instruction::CallIndirect(type_index, table_index), Drop => Instruction::Drop, Select => Instruction::Select, LocalGet { local_index } => Instruction::LocalGet(local_index), LocalSet { local_index } => Instruction::LocalSet(local_index), LocalTee { local_index } => Instruction::LocalTee(local_index), GlobalGet { global_index } => Instruction::GlobalGet(global_index), GlobalSet { global_index } => Instruction::GlobalSet(global_index), MemorySize { .. } => Instruction::MemorySize, MemoryGrow { .. } => Instruction::MemoryGrow, I32Load { memarg } => Instruction::I32Load(convert_memarg(memarg)), I64Load { memarg } => Instruction::I64Load(convert_memarg(memarg)), F32Load { memarg } => Instruction::F32Load(convert_memarg(memarg)), F64Load { memarg } => Instruction::F64Load(convert_memarg(memarg)), I32Load8S { memarg } => Instruction::I32Load8S(convert_memarg(memarg)), I32Load8U { memarg } => Instruction::I32Load8U(convert_memarg(memarg)), I32Load16S { memarg } => Instruction::I32Load16S(convert_memarg(memarg)), I32Load16U { memarg } => Instruction::I32Load16U(convert_memarg(memarg)), I64Load8S { memarg } => Instruction::I64Load8S(convert_memarg(memarg)), I64Load8U { memarg } => Instruction::I64Load8U(convert_memarg(memarg)), I64Load16S { memarg } => Instruction::I64Load16S(convert_memarg(memarg)), I64Load16U { memarg } => Instruction::I64Load16U(convert_memarg(memarg)), I64Load32S { memarg } => Instruction::I64Load32S(convert_memarg(memarg)), I64Load32U { memarg } => Instruction::I64Load32U(convert_memarg(memarg)), I32Store { memarg } => Instruction::I32Store(convert_memarg(memarg)), I64Store { memarg } => Instruction::I64Store(convert_memarg(memarg)), F32Store { memarg } => Instruction::F32Store(convert_memarg(memarg)), F64Store { memarg } => Instruction::F64Store(convert_memarg(memarg)), I32Store8 { memarg } => Instruction::I32Store8(convert_memarg(memarg)), I32Store16 { memarg } => Instruction::I32Store16(convert_memarg(memarg)), I64Store8 { memarg } => Instruction::I64Store8(convert_memarg(memarg)), I64Store16 { memarg } => Instruction::I64Store16(convert_memarg(memarg)), I64Store32 { memarg } => Instruction::I64Store32(convert_memarg(memarg)), I32Eqz => Instruction::I32Eqz, I32Eq => Instruction::I32Eq, I32Ne => Instruction::I32Ne, I32LtS => Instruction::I32LtS, I32LtU => Instruction::I32LtU, I32GtS => Instruction::I32GtS, I32GtU => Instruction::I32GtU, I32LeS => Instruction::I32LeS, I32LeU => Instruction::I32LeU, I32GeS => Instruction::I32GeS, I32GeU => Instruction::I32GeU, I64Eqz => Instruction::I64Eqz, I64Eq => Instruction::I64Eq, I64Ne => Instruction::I64Ne, I64LtS => Instruction::I64LtS, I64LtU => Instruction::I64LtU, I64GtS => Instruction::I64GtS, I64GtU => Instruction::I64GtU, I64LeS => Instruction::I64LeS, I64LeU => Instruction::I64LeU, I64GeS => Instruction::I64GeS, I64GeU => Instruction::I64GeU, F32Eq => Instruction::F32Eq, F32Ne => Instruction::F32Ne, F32Lt => Instruction::F32Lt, F32Gt => Instruction::F32Gt, F32Le => Instruction::F32Le, F32Ge => Instruction::F32Ge, F64Eq => Instruction::F64Eq, F64Ne => Instruction::F64Ne, F64Lt => Instruction::F64Lt, F64Gt => Instruction::F64Gt, F64Le => Instruction::F64Le, F64Ge => Instruction::F64Ge, I32Clz => Instruction::I32Clz, I32Ctz => Instruction::I32Ctz, I32Popcnt => Instruction::I32Popcnt, I32Add => Instruction::I32Add, I32Sub => Instruction::I32Sub, I32Mul => Instruction::I32Mul, I32DivS => Instruction::I32DivS, I32DivU => Instruction::I32DivU, I32RemS => Instruction::I32RemS, I32RemU => Instruction::I32RemU, I32And => Instruction::I32And, I32Or => Instruction::I32Or, I32Xor => Instruction::I32Xor, I32Shl => Instruction::I32Shl, I32ShrS => Instruction::I32ShrS, I32ShrU => Instruction::I32ShrU, I32Rotl => Instruction::I32Rotl, I32Rotr => Instruction::I32Rotr, I64Clz => Instruction::I64Clz, I64Ctz => Instruction::I64Ctz, I64Popcnt => Instruction::I64Popcnt, I64Add => Instruction::I64Add, I64Sub => Instruction::I64Sub, I64Mul => Instruction::I64Mul, I64DivS => Instruction::I64DivS, I64DivU => Instruction::I64DivU, I64RemS => Instruction::I64RemS, I64RemU => Instruction::I64RemU, I64And => Instruction::I64And, I64Or => Instruction::I64Or, I64Xor => Instruction::I64Xor, I64Shl => Instruction::I64Shl, I64ShrS => Instruction::I64ShrS, I64ShrU => Instruction::I64ShrU, I64Rotl => Instruction::I64Rotl, I64Rotr => Instruction::I64Rotr, F32Abs => Instruction::F32Abs, F32Neg => Instruction::F32Neg, F32Ceil => Instruction::F32Ceil, F32Floor => Instruction::F32Floor, F32Trunc => Instruction::F32Trunc, F32Nearest => Instruction::F32Nearest, F32Sqrt => Instruction::F32Sqrt, F32Add => Instruction::F32Add, F32Sub => Instruction::F32Sub, F32Mul => Instruction::F32Mul, F32Div => Instruction::F32Div, F32Min => Instruction::F32Min, F32Max => Instruction::F32Max, F32Copysign => Instruction::F32Copysign, F64Abs => Instruction::F64Abs, F64Neg => Instruction::F64Neg, F64Ceil => Instruction::F64Ceil, F64Floor => Instruction::F64Floor, F64Trunc => Instruction::F64Trunc, F64Nearest => Instruction::F64Nearest, F64Sqrt => Instruction::F64Sqrt, F64Add => Instruction::F64Add, F64Sub => Instruction::F64Sub, F64Mul => Instruction::F64Mul, F64Div => Instruction::F64Div, F64Min => Instruction::F64Min, F64Max => Instruction::F64Max, F64Copysign => Instruction::F64Copysign, I32WrapI64 => Instruction::I32WrapI64, I32TruncF32S => Instruction::I32TruncF32S, I32TruncF32U => Instruction::I32TruncF32U, I32TruncF64S => Instruction::I32TruncF64S, I32TruncF64U => Instruction::I32TruncF64U, I64ExtendI32S => Instruction::I64ExtendI32S, I64ExtendI32U => Instruction::I64ExtendI32U, I64TruncF32S => Instruction::I64TruncF32S, I64TruncF32U => Instruction::I64TruncF32U, I64TruncF64S => Instruction::I64TruncF64S, I64TruncF64U => Instruction::I64TruncF64U, F32ConvertI32S => Instruction::F32ConvertI32S, F32ConvertI32U => Instruction::F32ConvertI32U, F32ConvertI64S => Instruction::F32ConvertI64S, F32ConvertI64U => Instruction::F32ConvertI64U, F32DemoteF64 => Instruction::F32DemoteF64, F64ConvertI32S => Instruction::F64ConvertI32S, F64ConvertI32U => Instruction::F64ConvertI32U, F64ConvertI64S => Instruction::F64ConvertI64S, F64ConvertI64U => Instruction::F64ConvertI64U, F64PromoteF32 => Instruction::F64PromoteF32, I32ReinterpretF32 => Instruction::I32ReinterpretF32, I64ReinterpretF64 => Instruction::I64ReinterpretF64, F32ReinterpretI32 => Instruction::F32ReinterpretI32, F64ReinterpretI64 => Instruction::F64ReinterpretI64, _ => { return Err(crate::ParseError::UnsupportedOperator(format!( "Unsupported instruction: {:?}", op ))) } }; Ok(v) }