summaryrefslogtreecommitdiff
path: root/crates/parser/src
diff options
context:
space:
mode:
authorHenry Gressmann <mail@henrygressmann.de>2024-05-11 21:07:41 +0200
committerHenry Gressmann <mail@henrygressmann.de>2024-05-11 22:55:38 +0200
commitb2b39468325b9ed7043fed48a15a77b83b13d63e (patch)
tree2fd26b72b784dc284edd48c0ac188c441db8c156 /crates/parser/src
parent868aa006b7f1eabffd4aec3a03555012148a7df1 (diff)
chore: simplify code
Signed-off-by: Henry Gressmann <mail@henrygressmann.de>
Diffstat (limited to 'crates/parser/src')
-rw-r--r--crates/parser/src/conversion.rs52
-rw-r--r--crates/parser/src/visit.rs58
2 files changed, 39 insertions, 71 deletions
diff --git a/crates/parser/src/conversion.rs b/crates/parser/src/conversion.rs
index e94986d..4e4434b 100644
--- a/crates/parser/src/conversion.rs
+++ b/crates/parser/src/conversion.rs
@@ -83,12 +83,11 @@ pub(crate) fn convert_module_import(import: wasmparser::Import<'_>) -> Result<Im
size_initial: ty.initial.try_into().map_err(|_| {
crate::ParseError::UnsupportedOperator(format!("Table size initial is too large: {}", ty.initial))
})?,
- size_max: if let Some(max) = ty.maximum {
- Some(max.try_into().map_err(|_| {
+ size_max: match ty.maximum {
+ Some(max) => Some(max.try_into().map_err(|_| {
crate::ParseError::UnsupportedOperator(format!("Table size max is too large: {}", max))
- })?)
- } else {
- None
+ })?),
+ None => None,
},
}),
wasmparser::TypeRef::Memory(ty) => ImportKind::Memory(convert_module_memory(ty)?),
@@ -105,10 +104,7 @@ pub(crate) fn convert_module_import(import: wasmparser::Import<'_>) -> Result<Im
pub(crate) fn convert_module_memories<T: IntoIterator<Item = wasmparser::Result<wasmparser::MemoryType>>>(
memory_types: T,
) -> Result<Vec<MemoryType>> {
- let memory_type =
- memory_types.into_iter().map(|memory| convert_module_memory(memory?)).collect::<Result<Vec<_>>>()?;
-
- Ok(memory_type)
+ memory_types.into_iter().map(|memory| convert_module_memory(memory?)).collect::<Result<Vec<_>>>()
}
pub(crate) fn convert_module_memory(memory: wasmparser::MemoryType) -> Result<MemoryType> {
@@ -125,26 +121,23 @@ pub(crate) fn convert_module_memory(memory: wasmparser::MemoryType) -> Result<Me
pub(crate) fn convert_module_tables<'a, T: IntoIterator<Item = wasmparser::Result<wasmparser::Table<'a>>>>(
table_types: T,
) -> Result<Vec<TableType>> {
- let table_type = table_types.into_iter().map(|table| convert_module_table(table?)).collect::<Result<Vec<_>>>()?;
- Ok(table_type)
+ table_types.into_iter().map(|table| convert_module_table(table?)).collect::<Result<Vec<_>>>()
}
pub(crate) fn convert_module_table(table: wasmparser::Table<'_>) -> Result<TableType> {
- let ty = convert_reftype(&table.ty.element_type);
-
let size_initial = table.ty.initial.try_into().map_err(|_| {
crate::ParseError::UnsupportedOperator(format!("Table size initial is too large: {}", table.ty.initial))
})?;
- let size_max = if let Some(max) = table.ty.maximum {
- Some(
+
+ let size_max = match table.ty.maximum {
+ Some(max) => Some(
max.try_into()
.map_err(|_| crate::ParseError::UnsupportedOperator(format!("Table size max is too large: {}", max)))?,
- )
- } else {
- None
+ ),
+ None => None,
};
- Ok(TableType { element_type: ty, size_initial: size_initial, size_max })
+ Ok(TableType { element_type: convert_reftype(&table.ty.element_type), size_initial: size_initial, size_max })
}
pub(crate) fn convert_module_globals<'a, T: IntoIterator<Item = wasmparser::Result<wasmparser::Global<'a>>>>(
@@ -208,12 +201,8 @@ pub(crate) fn convert_module_type(ty: wasmparser::RecGroup) -> Result<FuncType>
));
}
let ty = types.next().unwrap().unwrap_func();
-
- let params =
- ty.params().iter().map(|p| Ok(convert_valtype(p))).collect::<Result<Vec<ValType>>>()?.into_boxed_slice();
-
- let results =
- ty.results().iter().map(|p| Ok(convert_valtype(p))).collect::<Result<Vec<ValType>>>()?.into_boxed_slice();
+ let params = ty.params().iter().map(convert_valtype).collect::<Vec<ValType>>().into_boxed_slice();
+ let results = ty.results().iter().map(convert_valtype).collect::<Vec<ValType>>().into_boxed_slice();
Ok(FuncType { params, results })
}
@@ -235,14 +224,13 @@ pub(crate) fn convert_reftype(reftype: &wasmparser::RefType) -> ValType {
}
pub(crate) fn convert_valtype(valtype: &wasmparser::ValType) -> ValType {
- use wasmparser::ValType::*;
match valtype {
- I32 => ValType::I32,
- I64 => ValType::I64,
- F32 => ValType::F32,
- F64 => ValType::F64,
- Ref(r) => convert_reftype(r),
- V128 => unimplemented!("128-bit values are not supported yet"),
+ wasmparser::ValType::I32 => ValType::I32,
+ wasmparser::ValType::I64 => ValType::I64,
+ wasmparser::ValType::F32 => ValType::F32,
+ wasmparser::ValType::F64 => ValType::F64,
+ wasmparser::ValType::Ref(r) => convert_reftype(r),
+ wasmparser::ValType::V128 => unimplemented!("128-bit values are not supported yet"),
}
}
diff --git a/crates/parser/src/visit.rs b/crates/parser/src/visit.rs
index c3afee7..8b9e15d 100644
--- a/crates/parser/src/visit.rs
+++ b/crates/parser/src/visit.rs
@@ -3,7 +3,7 @@ use crate::{conversion::convert_blocktype, Result};
use crate::conversion::{convert_heaptype, convert_memarg, convert_valtype};
use alloc::string::ToString;
use alloc::{boxed::Box, format, vec::Vec};
-use tinywasm_types::{BlockArgsPacked, Instruction};
+use tinywasm_types::Instruction;
use wasmparser::{FuncValidator, FunctionBody, VisitOperator, WasmModuleResources};
struct ValidateThenVisit<'a, T, U>(T, &'a mut U);
@@ -65,16 +65,14 @@ macro_rules! define_primitive_operands {
($($name:ident, $instr:expr, $ty:ty),*) => {
$(
fn $name(&mut self, arg: $ty) -> Self::Output {
- self.instructions.push($instr(arg));
- Ok(())
+ Ok(self.instructions.push($instr(arg)))
}
)*
};
($($name:ident, $instr:expr, $ty:ty, $ty2:ty),*) => {
$(
fn $name(&mut self, arg: $ty, arg2: $ty) -> Self::Output {
- self.instructions.push($instr(arg, arg2));
- Ok(())
+ Ok(self.instructions.push($instr(arg, arg2)))
}
)*
};
@@ -112,8 +110,7 @@ impl FunctionBuilder {
#[inline]
fn visit(&mut self, op: Instruction) -> Result<()> {
- self.instructions.push(op);
- Ok(())
+ Ok(self.instructions.push(op))
}
}
@@ -162,7 +159,7 @@ impl<'a> wasmparser::VisitOperator<'a> for FunctionBuilder {
visit_i64_load16_u, I64Load16U,
visit_i64_load32_s, I64Load32S,
visit_i64_load32_u, I64Load32U,
- // visit_i32_store, I32Store,
+ // visit_i32_store, I32Store, custom implementation
visit_i64_store, I64Store,
visit_f32_store, F32Store,
visit_f64_store, F64Store,
@@ -325,15 +322,7 @@ impl<'a> wasmparser::VisitOperator<'a> for FunctionBuilder {
let arg = convert_memarg(memarg);
let i32store = Instruction::I32Store { offset: arg.offset, mem_addr: arg.mem_addr };
- if self.instructions.len() < 3 {
- return self.visit(i32store);
- }
-
- #[cold]
- fn cold() {}
-
- if arg.mem_addr > 0xFF || arg.offset > 0xFFFF_FFFF {
- cold();
+ if self.instructions.len() < 3 || arg.mem_addr > 0xFF || arg.offset > 0xFFFF_FFFF {
return self.visit(i32store);
}
@@ -353,31 +342,22 @@ impl<'a> wasmparser::VisitOperator<'a> for FunctionBuilder {
}
fn visit_local_get(&mut self, idx: u32) -> Self::Output {
- if let Some(instruction) = self.instructions.last_mut() {
- match instruction {
- Instruction::LocalGet(a) => *instruction = Instruction::LocalGet2(*a, idx),
- Instruction::LocalGet2(a, b) => *instruction = Instruction::LocalGet3(*a, *b, idx),
- Instruction::LocalTee(a) => *instruction = Instruction::LocalTeeGet(*a, idx),
- _ => return self.visit(Instruction::LocalGet(idx)),
- };
- Ok(())
- } else {
- self.visit(Instruction::LocalGet(idx))
- }
+ let Some(instruction) = self.instructions.last_mut() else {
+ return self.visit(Instruction::LocalGet(idx));
+ };
+
+ match instruction {
+ Instruction::LocalGet(a) => *instruction = Instruction::LocalGet2(*a, idx),
+ Instruction::LocalGet2(a, b) => *instruction = Instruction::LocalGet3(*a, *b, idx),
+ Instruction::LocalTee(a) => *instruction = Instruction::LocalTeeGet(*a, idx),
+ _ => return self.visit(Instruction::LocalGet(idx)),
+ };
+
+ Ok(())
}
fn visit_local_set(&mut self, idx: u32) -> Self::Output {
self.visit(Instruction::LocalSet(idx))
- // if let Some(instruction) = self.instructions.last_mut() {
- // match instruction {
- // // Needs more testing, seems to make performance worse
- // // Instruction::LocalGet(a) => *instruction = Instruction::LocalGetSet(*a, idx),
- // _ => return self.visit(Instruction::LocalSet(idx)),
- // };
- // // Ok(())
- // } else {
- // self.visit(Instruction::LocalSet(idx))
- // }
}
fn visit_local_tee(&mut self, idx: u32) -> Self::Output {
@@ -426,7 +406,7 @@ impl<'a> wasmparser::VisitOperator<'a> for FunctionBuilder {
fn visit_if(&mut self, ty: wasmparser::BlockType) -> Self::Output {
self.label_ptrs.push(self.instructions.len());
- self.visit(Instruction::If(BlockArgsPacked::new(convert_blocktype(ty)), 0, 0))
+ self.visit(Instruction::If(convert_blocktype(ty).into(), 0, 0))
}
fn visit_else(&mut self) -> Self::Output {