Skip to content

Commit ffc0ec3

Browse files
committed
implement FuncTranslator::visit_loop trait method
1 parent 475eba4 commit ffc0ec3

File tree

1 file changed

+15
-2
lines changed
  • crates/wasmi/src/engine/translator/func2

1 file changed

+15
-2
lines changed

crates/wasmi/src/engine/translator/func2/visit.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,21 @@ impl<'a> VisitOperator<'a> for FuncTranslator {
8484
Ok(())
8585
}
8686

87-
fn visit_loop(&mut self, _block_ty: wasmparser::BlockType) -> Self::Output {
88-
todo!()
87+
fn visit_loop(&mut self, block_ty: wasmparser::BlockType) -> Self::Output {
88+
if !self.reachable {
89+
self.stack.push_unreachable(UnreachableControlFrame::Loop)?;
90+
return Ok(());
91+
}
92+
let block_ty = BlockType::new(block_ty, &self.module);
93+
let len_params = block_ty.len_params(&self.engine);
94+
let continue_label = self.labels.new_label();
95+
let consume_fuel = self.stack.consume_fuel_instr();
96+
self.copy_branch_params(usize::from(len_params), consume_fuel)?;
97+
self.pin_label(continue_label);
98+
let consume_fuel = self.instrs.push_consume_fuel_instr()?;
99+
self.stack
100+
.push_loop(block_ty, continue_label, consume_fuel)?;
101+
Ok(())
89102
}
90103

91104
fn visit_if(&mut self, _block_ty: wasmparser::BlockType) -> Self::Output {

0 commit comments

Comments
 (0)