summaryrefslogtreecommitdiff
path: root/crates/parser/src/visit.rs
diff options
context:
space:
mode:
authorHenry Gressmann <mail@henrygressmann.de>2024-07-01 23:17:57 +0200
committerHenry Gressmann <mail@henrygressmann.de>2024-07-01 23:17:57 +0200
commit3361f928658652bd7178f37851c9dd9fadb077c8 (patch)
tree7ebf8c6e8b99820c4a37900d24184d5828f2b913 /crates/parser/src/visit.rs
parent4425733bdfb516ca2530e6199c2c95ece91b627d (diff)
chore: refactor executor, add LocalCopy instructions
Signed-off-by: Henry Gressmann <mail@henrygressmann.de>
Diffstat (limited to 'crates/parser/src/visit.rs')
-rw-r--r--crates/parser/src/visit.rs33
1 files changed, 33 insertions, 0 deletions
diff --git a/crates/parser/src/visit.rs b/crates/parser/src/visit.rs
index e9844aa..1f282f7 100644
--- a/crates/parser/src/visit.rs
+++ b/crates/parser/src/visit.rs
@@ -122,6 +122,7 @@ macro_rules! impl_visit_operator {
(@@sign_extension $($rest:tt)* ) => {};
(@@saturating_float_to_int $($rest:tt)* ) => {};
(@@bulk_memory $($rest:tt)* ) => {};
+ (@@tail_call $($rest:tt)* ) => {};
(@@$proposal:ident $op:ident $({ $($arg:ident: $argty:ty),* })? => $visit:ident) => {
#[cold]
fn $visit(&mut self $($(,$arg: $argty)*)?) {
@@ -317,6 +318,14 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild
visit_i64_trunc_sat_f64_u, Instruction::I64TruncSatF64U
}
+ fn visit_return_call(&mut self, function_index: u32) -> Self::Output {
+ self.instructions.push(Instruction::ReturnCall(function_index));
+ }
+
+ fn visit_return_call_indirect(&mut self, type_index: u32, table_index: u32) -> Self::Output {
+ self.instructions.push(Instruction::ReturnCallIndirect(type_index, table_index));
+ }
+
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 t {
@@ -385,6 +394,30 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild
return;
};
+ match self.instructions.last() {
+ Some(Instruction::LocalGet32(from))
+ | Some(Instruction::LocalGet64(from))
+ | Some(Instruction::LocalGet128(from))
+ | Some(Instruction::LocalGetRef(from)) => {
+ let from = *from;
+ self.instructions.pop();
+ // validation will ensure that the last instruction is the correct local.get
+ match self.validator.get_operand_type(0) {
+ Some(Some(t)) => self.instructions.push(match t {
+ wasmparser::ValType::I32 => Instruction::LocalCopy32(from, resolved_idx),
+ wasmparser::ValType::F32 => Instruction::LocalCopy32(from, resolved_idx),
+ wasmparser::ValType::I64 => Instruction::LocalCopy64(from, resolved_idx),
+ wasmparser::ValType::F64 => Instruction::LocalCopy64(from, resolved_idx),
+ wasmparser::ValType::V128 => Instruction::LocalCopy128(from, resolved_idx),
+ wasmparser::ValType::Ref(_) => Instruction::LocalCopyRef(from, resolved_idx),
+ }),
+ _ => self.visit_unreachable(),
+ }
+ return;
+ }
+ _ => {}
+ }
+
match self.validator.get_operand_type(0) {
Some(Some(t)) => self.instructions.push(match t {
wasmparser::ValType::I32 => Instruction::LocalSet32(resolved_idx),