Skip to content

Commit 0798ef2

Browse files
committed
add FuncTranslator::push_instr_with_result utility
1 parent 52fe118 commit 0798ef2

1 file changed

Lines changed: 40 additions & 41 deletions

File tree

  • crates/wasmi/src/engine/translator/func2

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

Lines changed: 40 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,25 @@ impl FuncTranslator {
387387
Ok(())
388388
}
389389

390+
/// Pushes the `instr` to the function with the associated `fuel_costs`.
391+
fn push_instr_with_result(
392+
&mut self,
393+
result_ty: ValType,
394+
make_instr: impl FnOnce(Reg) -> Instruction,
395+
fuel_costs: impl FnOnce(&FuelCostsProvider) -> u64,
396+
) -> Result<(), Error> {
397+
let consume_fuel_instr = self.stack.consume_fuel_instr();
398+
let expected_iidx = self.instrs.next_instr();
399+
let result = self
400+
.layout
401+
.temp_to_reg(self.stack.push_temp(result_ty, Some(expected_iidx))?)?;
402+
let actual_iidx =
403+
self.instrs
404+
.push_instr(make_instr(result), consume_fuel_instr, fuel_costs)?;
405+
assert_eq!(expected_iidx, actual_iidx);
406+
Ok(())
407+
}
408+
390409
/// Encodes a generic return instruction.
391410
fn encode_return(&mut self, consume_fuel: Option<Instr>) -> Result<Instr, Error> {
392411
let len_results = self.func_type_with(FuncType::len_results);
@@ -714,21 +733,12 @@ impl FuncTranslator {
714733
.push_immediate(consteval(input.val().into()).into())?;
715734
return Ok(());
716735
}
717-
let consume_fuel_instr = self.stack.consume_fuel_instr();
718736
let input = self.layout.operand_to_reg(input)?;
719-
let iidx = self.instrs.next_instr();
720-
let result = self
721-
.layout
722-
.temp_to_reg(self.stack.push_temp(<R as Typed>::TY, Some(iidx))?)?;
723-
assert_eq!(
724-
self.instrs.push_instr(
725-
make_instr(result, input),
726-
consume_fuel_instr,
727-
FuelCostsProvider::base
728-
)?,
729-
iidx
730-
);
731-
Ok(())
737+
self.push_instr_with_result(
738+
<R as Typed>::TY,
739+
|result| make_instr(result, input),
740+
FuelCostsProvider::base,
741+
)
732742
}
733743

734744
/// Translates a commutative binary Wasm operator to Wasmi bytecode.
@@ -743,7 +753,6 @@ impl FuncTranslator {
743753
R: Into<TypedVal> + Typed,
744754
{
745755
bail_unreachable!(self);
746-
let consume_fuel = self.stack.consume_fuel_instr();
747756
match self.stack.pop2() {
748757
(Operand::Immediate(lhs), Operand::Immediate(rhs)) => {
749758
let value = consteval(lhs.val().into(), rhs.val().into());
@@ -752,40 +761,30 @@ impl FuncTranslator {
752761
}
753762
(val, Operand::Immediate(imm)) | (Operand::Immediate(imm), val) => {
754763
let lhs = self.layout.operand_to_reg(val)?;
755-
let iidx = self.instrs.next_instr();
756-
let result = self
757-
.layout
758-
.temp_to_reg(self.stack.push_temp(<R as Typed>::TY, Some(iidx))?)?;
759-
let instr = match T::from(imm.val()).try_into() {
760-
Ok(rhs) => make_instr_imm16(result, lhs, rhs),
764+
let rhs16 = match T::from(imm.val()).try_into() {
765+
Ok(rhs) => Ok(rhs),
761766
Err(_) => {
762767
let rhs = self.layout.const_to_reg(imm.val())?;
763-
make_instr(result, lhs, rhs)
768+
Err(rhs)
764769
}
765770
};
766-
assert_eq!(
767-
self.instrs
768-
.push_instr(instr, consume_fuel, FuelCostsProvider::base)?,
769-
iidx
770-
);
771-
Ok(())
771+
self.push_instr_with_result(
772+
<R as Typed>::TY,
773+
|result| match rhs16 {
774+
Ok(rhs) => make_instr_imm16(result, lhs, rhs),
775+
Err(rhs) => make_instr(result, lhs, rhs),
776+
},
777+
FuelCostsProvider::base,
778+
)
772779
}
773780
(lhs, rhs) => {
774781
let lhs = self.layout.operand_to_reg(lhs)?;
775782
let rhs = self.layout.operand_to_reg(rhs)?;
776-
let iidx = self.instrs.next_instr();
777-
let result = self
778-
.layout
779-
.temp_to_reg(self.stack.push_temp(<R as Typed>::TY, Some(iidx))?)?;
780-
assert_eq!(
781-
self.instrs.push_instr(
782-
make_instr(result, lhs, rhs),
783-
consume_fuel,
784-
FuelCostsProvider::base
785-
)?,
786-
iidx
787-
);
788-
Ok(())
783+
self.push_instr_with_result(
784+
<R as Typed>::TY,
785+
|result| make_instr(result, lhs, rhs),
786+
FuelCostsProvider::base,
787+
)
789788
}
790789
}
791790
}

0 commit comments

Comments
 (0)