use crate::ir::id::{DataSegmentID, ElementID, FieldID, FunctionID, GlobalID, LocalID, TypeID};
use crate::ir::module::module_types::HeapType;
use crate::ir::types::{BlockType, FuncInstrMode, InstrumentationMode};
use crate::Location;
use wasmparser::MemArg;
use wasmparser::Operator;
pub trait Instrumenter<'a> {
fn finish_instr(&mut self);
fn curr_instrument_mode(&self) -> &Option<InstrumentationMode>;
fn set_instrument_mode_at(&mut self, mode: InstrumentationMode, loc: Location);
fn curr_func_instrument_mode(&self) -> &Option<FuncInstrMode>;
fn set_func_instrument_mode(&mut self, mode: FuncInstrMode);
fn curr_instr_len(&self) -> usize;
fn func_entry(&mut self) -> &mut Self {
self.set_func_instrument_mode(FuncInstrMode::Entry);
self
}
fn func_exit(&mut self) -> &mut Self {
self.set_func_instrument_mode(FuncInstrMode::Exit);
self
}
fn clear_instr_at(&mut self, loc: Location, mode: InstrumentationMode);
fn add_instr_at(&mut self, loc: Location, instr: Operator<'a>);
fn before_at(&mut self, loc: Location) -> &mut Self {
self.set_instrument_mode_at(InstrumentationMode::Before, loc);
self
}
fn after_at(&mut self, loc: Location) -> &mut Self {
self.set_instrument_mode_at(InstrumentationMode::After, loc);
self
}
fn alternate_at(&mut self, loc: Location) -> &mut Self {
self.set_instrument_mode_at(InstrumentationMode::Alternate, loc);
self
}
fn empty_alternate_at(&mut self, loc: Location) -> &mut Self;
fn semantic_after_at(&mut self, loc: Location) -> &mut Self {
self.set_instrument_mode_at(InstrumentationMode::SemanticAfter, loc);
self
}
fn block_entry_at(&mut self, loc: Location) -> &mut Self {
self.set_instrument_mode_at(InstrumentationMode::BlockEntry, loc);
self
}
fn block_exit_at(&mut self, loc: Location) -> &mut Self {
self.set_instrument_mode_at(InstrumentationMode::BlockExit, loc);
self
}
fn block_alt_at(&mut self, loc: Location) -> &mut Self {
self.set_instrument_mode_at(InstrumentationMode::BlockAlt, loc);
self
}
fn empty_block_alt_at(&mut self, loc: Location) -> &mut Self;
fn append_tag_at(&mut self, data: Vec<u8>, loc: Location) -> &mut Self;
fn get_injected_val(&self, idx: usize) -> &Operator;
}
pub trait Inject<'a> {
fn inject(&mut self, instr: Operator<'a>);
fn inject_all(&mut self, instrs: &[Operator<'a>]) -> &mut Self {
instrs.iter().for_each(|instr| {
self.inject(instr.to_owned());
});
self
}
}
pub trait InjectAt<'a> {
fn inject_at(&mut self, idx: usize, mode: InstrumentationMode, instr: Operator<'a>);
}
#[allow(dead_code)]
pub trait Opcode<'a>: Inject<'a> {
fn call(&mut self, idx: FunctionID) -> &mut Self {
self.inject(Operator::Call {
function_index: *idx,
});
self
}
fn return_stmt(&mut self) -> &mut Self {
self.inject(Operator::Return);
self
}
fn nop(&mut self) -> &mut Self {
self.inject(Operator::Nop);
self
}
fn unreachable(&mut self) -> &mut Self {
self.inject(Operator::Unreachable);
self
}
fn select(&mut self) -> &mut Self {
self.inject(Operator::Select);
self
}
fn if_stmt(&mut self, block_type: BlockType) -> &mut Self {
self.inject(Operator::If {
blockty: wasmparser::BlockType::from(block_type),
});
self
}
fn else_stmt(&mut self) -> &mut Self {
self.inject(Operator::Else);
self
}
fn end(&mut self) -> &mut Self {
self.inject(Operator::End);
self
}
fn block(&mut self, block_type: BlockType) -> &mut Self {
self.inject(Operator::Block {
blockty: wasmparser::BlockType::from(block_type),
});
self
}
fn loop_stmt(&mut self, block_type: BlockType) -> &mut Self {
self.inject(Operator::Loop {
blockty: wasmparser::BlockType::from(block_type),
});
self
}
fn br(&mut self, relative_depth: u32) -> &mut Self {
self.inject(Operator::Br { relative_depth });
self
}
fn br_if(&mut self, relative_depth: u32) -> &mut Self {
self.inject(Operator::BrIf { relative_depth });
self
}
fn local_get(&mut self, idx: LocalID) -> &mut Self {
self.inject(Operator::LocalGet { local_index: *idx });
self
}
fn local_set(&mut self, idx: LocalID) -> &mut Self {
self.inject(Operator::LocalSet { local_index: *idx });
self
}
fn local_tee(&mut self, idx: LocalID) -> &mut Self {
self.inject(Operator::LocalTee { local_index: *idx });
self
}
fn i32_const(&mut self, value: i32) -> &mut Self {
self.inject(Operator::I32Const { value });
self
}
fn i32_add(&mut self) -> &mut Self {
self.inject(Operator::I32Add);
self
}
fn i32_sub(&mut self) -> &mut Self {
self.inject(Operator::I32Sub);
self
}
fn i32_mul(&mut self) -> &mut Self {
self.inject(Operator::I32Mul);
self
}
fn i32_div_signed(&mut self) -> &mut Self {
self.inject(Operator::I32DivS);
self
}
fn i32_div_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I32DivU);
self
}
fn i32_rem_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I32RemU);
self
}
fn i32_rem_signed(&mut self) -> &mut Self {
self.inject(Operator::I32RemS);
self
}
fn i32_and(&mut self) -> &mut Self {
self.inject(Operator::I32And);
self
}
fn i32_or(&mut self) -> &mut Self {
self.inject(Operator::I32Or);
self
}
fn i32_xor(&mut self) -> &mut Self {
self.inject(Operator::I32Xor);
self
}
fn i32_shl(&mut self) -> &mut Self {
self.inject(Operator::I32Shl);
self
}
fn i32_shr_signed(&mut self) -> &mut Self {
self.inject(Operator::I32ShrS);
self
}
fn i32_shr_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I32ShrU);
self
}
fn i32_rotl(&mut self) -> &mut Self {
self.inject(Operator::I32Rotl);
self
}
fn i32_rotr(&mut self) -> &mut Self {
self.inject(Operator::I32Rotr);
self
}
fn i32_eq(&mut self) -> &mut Self {
self.inject(Operator::I32Eq);
self
}
fn i32_eqz(&mut self) -> &mut Self {
self.inject(Operator::I32Eqz);
self
}
fn i32_ne(&mut self) -> &mut Self {
self.inject(Operator::I32Ne);
self
}
fn i32_lt_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I32LtU);
self
}
fn i32_lt_signed(&mut self) -> &mut Self {
self.inject(Operator::I32LtS);
self
}
fn i32_gt_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I32GtU);
self
}
fn i32_gt_signed(&mut self) -> &mut Self {
self.inject(Operator::I32GtS);
self
}
fn i32_lte_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I32LeU);
self
}
fn i32_lte_signed(&mut self) -> &mut Self {
self.inject(Operator::I32LeS);
self
}
fn i32_gte_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I32GeU);
self
}
fn i32_gte_signed(&mut self) -> &mut Self {
self.inject(Operator::I32GeS);
self
}
fn i32_wrap_i64(&mut self) -> &mut Self {
self.inject(Operator::I32WrapI64);
self
}
fn i32_extend_8s(&mut self) -> &mut Self {
self.inject(Operator::I32Extend8S);
self
}
fn i32_extend_16s(&mut self) -> &mut Self {
self.inject(Operator::I32Extend16S);
self
}
fn i32_trunc_f32s(&mut self) -> &mut Self {
self.inject(Operator::I32TruncF32S);
self
}
fn i32_trunc_f32u(&mut self) -> &mut Self {
self.inject(Operator::I32TruncF32U);
self
}
fn i32_trunc_f64s(&mut self) -> &mut Self {
self.inject(Operator::I32TruncF64S);
self
}
fn i32_trunc_f64u(&mut self) -> &mut Self {
self.inject(Operator::I32TruncF64U);
self
}
fn i32_reinterpret_f32(&mut self) -> &mut Self {
self.inject(Operator::I32ReinterpretF32);
self
}
fn i64_const(&mut self, value: i64) -> &mut Self {
self.inject(Operator::I64Const { value });
self
}
fn i64_add(&mut self) -> &mut Self {
self.inject(Operator::I64Add);
self
}
fn i64_sub(&mut self) -> &mut Self {
self.inject(Operator::I64Sub);
self
}
fn i64_mul(&mut self) -> &mut Self {
self.inject(Operator::I64Mul);
self
}
fn i64_div_signed(&mut self) -> &mut Self {
self.inject(Operator::I64DivS);
self
}
fn i64_div_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I64DivU);
self
}
fn i64_rem_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I64RemU);
self
}
fn i64_rem_signed(&mut self) -> &mut Self {
self.inject(Operator::I64RemS);
self
}
fn i64_and(&mut self) -> &mut Self {
self.inject(Operator::I64And);
self
}
fn i64_or(&mut self) -> &mut Self {
self.inject(Operator::I64Or);
self
}
fn i64_xor(&mut self) -> &mut Self {
self.inject(Operator::I64Xor);
self
}
fn i64_shl(&mut self) -> &mut Self {
self.inject(Operator::I64Shl);
self
}
fn i64_shr_signed(&mut self) -> &mut Self {
self.inject(Operator::I64ShrS);
self
}
fn i64_shr_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I64ShrU);
self
}
fn i64_rotl(&mut self) -> &mut Self {
self.inject(Operator::I64Rotl);
self
}
fn i64_rotr(&mut self) -> &mut Self {
self.inject(Operator::I64Rotr);
self
}
fn i64_eq(&mut self) -> &mut Self {
self.inject(Operator::I64Eq);
self
}
fn i64_eqz(&mut self) -> &mut Self {
self.inject(Operator::I64Eqz);
self
}
fn i64_ne(&mut self) -> &mut Self {
self.inject(Operator::I64Ne);
self
}
fn i64_lt_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I64LtU);
self
}
fn i64_lt_signed(&mut self) -> &mut Self {
self.inject(Operator::I64LtS);
self
}
fn i64_gt_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I64GtU);
self
}
fn i64_gt_signed(&mut self) -> &mut Self {
self.inject(Operator::I64GtS);
self
}
fn i64_lte_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I64LeU);
self
}
fn i64_lte_signed(&mut self) -> &mut Self {
self.inject(Operator::I64LeS);
self
}
fn i64_gte_unsigned(&mut self) -> &mut Self {
self.inject(Operator::I64GeU);
self
}
fn i64_gte_signed(&mut self) -> &mut Self {
self.inject(Operator::I64GeS);
self
}
fn i64_extend_i32u(&mut self) -> &mut Self {
self.inject(Operator::I64ExtendI32U);
self
}
fn i64_extend_i32s(&mut self) -> &mut Self {
self.inject(Operator::I64ExtendI32S);
self
}
fn i64_trunc_f32s(&mut self) -> &mut Self {
self.inject(Operator::I64TruncF32S);
self
}
fn i64_trunc_f32u(&mut self) -> &mut Self {
self.inject(Operator::I64TruncF32U);
self
}
fn i64_trunc_f64s(&mut self) -> &mut Self {
self.inject(Operator::I64TruncF64S);
self
}
fn i64_trunc_f64u(&mut self) -> &mut Self {
self.inject(Operator::I64TruncF64U);
self
}
fn i64_reinterpret_f64(&mut self) -> &mut Self {
self.inject(Operator::I64ReinterpretF64);
self
}
fn f32_const(&mut self, val: f32) -> &mut Self {
self.inject(Operator::F32Const {
value: wasmparser::Ieee32::from(val),
});
self
}
fn f32_abs(&mut self) -> &mut Self {
self.inject(Operator::F32Abs);
self
}
fn f32_ceil(&mut self) -> &mut Self {
self.inject(Operator::F32Ceil);
self
}
fn f32_floor(&mut self) -> &mut Self {
self.inject(Operator::F32Floor);
self
}
fn f32_trunc(&mut self) -> &mut Self {
self.inject(Operator::F32Trunc);
self
}
fn f32_sqrt(&mut self) -> &mut Self {
self.inject(Operator::F32Sqrt);
self
}
fn f32_add(&mut self) -> &mut Self {
self.inject(Operator::F32Add);
self
}
fn f32_sub(&mut self) -> &mut Self {
self.inject(Operator::F32Sub);
self
}
fn f32_mul(&mut self) -> &mut Self {
self.inject(Operator::F32Mul);
self
}
fn f32_div(&mut self) -> &mut Self {
self.inject(Operator::F32Div);
self
}
fn f32_min(&mut self) -> &mut Self {
self.inject(Operator::F32Min);
self
}
fn f32_max(&mut self) -> &mut Self {
self.inject(Operator::F32Max);
self
}
fn f32_eq(&mut self) -> &mut Self {
self.inject(Operator::F32Eq);
self
}
fn f32_ne(&mut self) -> &mut Self {
self.inject(Operator::F32Ne);
self
}
fn f32_gt(&mut self) -> &mut Self {
self.inject(Operator::F32Gt);
self
}
fn f32_ge(&mut self) -> &mut Self {
self.inject(Operator::F32Ge);
self
}
fn f32_lt(&mut self) -> &mut Self {
self.inject(Operator::F32Lt);
self
}
fn f32_le(&mut self) -> &mut Self {
self.inject(Operator::F32Le);
self
}
fn f32_convert_i32s(&mut self) -> &mut Self {
self.inject(Operator::F32ConvertI32S);
self
}
fn f32_convert_i32u(&mut self) -> &mut Self {
self.inject(Operator::F32ConvertI32U);
self
}
fn f32_convert_i64s(&mut self) -> &mut Self {
self.inject(Operator::F32ConvertI64S);
self
}
fn f32_convert_i64u(&mut self) -> &mut Self {
self.inject(Operator::F32ConvertI64U);
self
}
fn f32_demote_f64(&mut self) -> &mut Self {
self.inject(Operator::F32DemoteF64);
self
}
fn f32_reinterpret_i32(&mut self) -> &mut Self {
self.inject(Operator::F32ReinterpretI32);
self
}
fn f32_copysign(&mut self) -> &mut Self {
self.inject(Operator::F32Copysign);
self
}
fn f64_const(&mut self, val: f64) -> &mut Self {
self.inject(Operator::F64Const {
value: wasmparser::Ieee64::from(val),
});
self
}
fn f64_abs(&mut self) -> &mut Self {
self.inject(Operator::F64Abs);
self
}
fn f64_ceil(&mut self) -> &mut Self {
self.inject(Operator::F64Ceil);
self
}
fn f64_floor(&mut self) -> &mut Self {
self.inject(Operator::F64Floor);
self
}
fn f64_trunc(&mut self) -> &mut Self {
self.inject(Operator::F64Trunc);
self
}
fn f64_sqrt(&mut self) -> &mut Self {
self.inject(Operator::F64Sqrt);
self
}
fn f64_add(&mut self) -> &mut Self {
self.inject(Operator::F64Add);
self
}
fn f64_sub(&mut self) -> &mut Self {
self.inject(Operator::F64Sub);
self
}
fn f64_mul(&mut self) -> &mut Self {
self.inject(Operator::F64Mul);
self
}
fn f64_div(&mut self) -> &mut Self {
self.inject(Operator::F64Div);
self
}
fn f64_min(&mut self) -> &mut Self {
self.inject(Operator::F64Min);
self
}
fn f64_max(&mut self) -> &mut Self {
self.inject(Operator::F64Max);
self
}
fn f64_eq(&mut self) -> &mut Self {
self.inject(Operator::F64Eq);
self
}
fn f64_ne(&mut self) -> &mut Self {
self.inject(Operator::F64Ne);
self
}
fn f64_gt(&mut self) -> &mut Self {
self.inject(Operator::F64Gt);
self
}
fn f64_ge(&mut self) -> &mut Self {
self.inject(Operator::F64Ge);
self
}
fn f64_lt(&mut self) -> &mut Self {
self.inject(Operator::F64Lt);
self
}
fn f64_le(&mut self) -> &mut Self {
self.inject(Operator::F64Le);
self
}
fn f64_reinterpret_i64(&mut self) -> &mut Self {
self.inject(Operator::F64ReinterpretI64);
self
}
fn f64_promote_f32(&mut self) -> &mut Self {
self.inject(Operator::F64PromoteF32);
self
}
fn f64_convert_i32s(&mut self) -> &mut Self {
self.inject(Operator::F64ConvertI32S);
self
}
fn f64_convert_i32u(&mut self) -> &mut Self {
self.inject(Operator::F64ConvertI32U);
self
}
fn f64_convert_i64s(&mut self) -> &mut Self {
self.inject(Operator::F64ConvertI64S);
self
}
fn f64_convert_i64u(&mut self) -> &mut Self {
self.inject(Operator::F64ConvertI64U);
self
}
fn f64_copysign(&mut self) -> &mut Self {
self.inject(Operator::F64Copysign);
self
}
fn memory_init(&mut self, data_index: u32, mem: u32) -> &mut Self {
self.inject(Operator::MemoryInit { data_index, mem });
self
}
fn memory_size(&mut self, mem: u32) -> &mut Self {
self.inject(Operator::MemorySize { mem });
self
}
fn memory_grow(&mut self, mem: u32) -> &mut Self {
self.inject(Operator::MemoryGrow { mem });
self
}
fn memory_fill(&mut self, mem: u32) -> &mut Self {
self.inject(Operator::MemoryFill { mem });
self
}
fn memory_copy(&mut self, dst_mem: u32, src_mem: u32) -> &mut Self {
self.inject(Operator::MemoryCopy { dst_mem, src_mem });
self
}
fn memory_discard(&mut self, mem: u32) -> &mut Self {
self.inject(Operator::MemoryDiscard { mem });
self
}
fn data_drop(&mut self, data_index: u32) -> &mut Self {
self.inject(Operator::DataDrop { data_index });
self
}
fn drop(&mut self) -> &mut Self {
self.inject(Operator::Drop);
self
}
fn i32_load8_s(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I32Load8S { memarg });
self
}
fn i32_load8_u(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I32Load8U { memarg });
self
}
fn i32_load16_s(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I32Load16S { memarg });
self
}
fn i32_load16_u(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I32Load16U { memarg });
self
}
fn i32_load(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I32Load { memarg });
self
}
fn i32_store(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I32Store { memarg });
self
}
fn i32_store8(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I32Store8 { memarg });
self
}
fn i32_store16(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I32Store16 { memarg });
self
}
fn i64_load8_s(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I64Load8S { memarg });
self
}
fn i64_load8_u(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I64Load8U { memarg });
self
}
fn i64_load16_s(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I64Load16S { memarg });
self
}
fn i64_load16_u(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I64Load16U { memarg });
self
}
fn i64_load32_s(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I64Load32S { memarg });
self
}
fn i64_load32_u(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I64Load32U { memarg });
self
}
fn i64_load(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I64Load { memarg });
self
}
fn i64_store(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::I64Store { memarg });
self
}
fn f32_load(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::F32Load { memarg });
self
}
fn f32_store(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::F32Store { memarg });
self
}
fn f64_load(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::F64Load { memarg });
self
}
fn f64_store(&mut self, memarg: MemArg) -> &mut Self {
self.inject(Operator::F64Store { memarg });
self
}
fn global_get(&mut self, idx: GlobalID) -> &mut Self {
self.inject(Operator::GlobalGet { global_index: *idx });
self
}
fn global_set(&mut self, idx: GlobalID) -> &mut Self {
self.inject(Operator::GlobalSet { global_index: *idx });
self
}
fn ref_null(&mut self, heap_type: HeapType) -> &mut Self {
self.inject(Operator::RefNull {
hty: wasmparser::HeapType::from(heap_type),
});
self
}
fn ref_is_null(&mut self) -> &mut Self {
self.inject(Operator::RefIsNull);
self
}
fn ref_func(&mut self, function_index: u32) -> &mut Self {
self.inject(Operator::RefFunc { function_index });
self
}
fn ref_eq(&mut self) -> &mut Self {
self.inject(Operator::RefEq);
self
}
fn ref_as_non_null(&mut self) -> &mut Self {
self.inject(Operator::RefAsNonNull);
self
}
fn struct_new(&mut self, struct_type_index: TypeID) -> &mut Self {
self.inject(Operator::StructNew {
struct_type_index: *struct_type_index,
});
self
}
fn struct_new_default(&mut self, struct_type_index: TypeID) -> &mut Self {
self.inject(Operator::StructNewDefault {
struct_type_index: *struct_type_index,
});
self
}
fn struct_get(&mut self, struct_type_index: TypeID, field_index: FieldID) -> &mut Self {
self.inject(Operator::StructGet {
struct_type_index: *struct_type_index,
field_index: *field_index,
});
self
}
fn struct_get_s(&mut self, struct_type_index: TypeID, field_index: FieldID) -> &mut Self {
self.inject(Operator::StructGetS {
struct_type_index: *struct_type_index,
field_index: *field_index,
});
self
}
fn struct_get_u(&mut self, struct_type_index: TypeID, field_index: FieldID) -> &mut Self {
self.inject(Operator::StructGetU {
struct_type_index: *struct_type_index,
field_index: *field_index,
});
self
}
fn struct_set(&mut self, struct_type_index: TypeID, field_index: FieldID) -> &mut Self {
self.inject(Operator::StructSet {
struct_type_index: *struct_type_index,
field_index: *field_index,
});
self
}
fn array_new(&mut self, array_type_index: TypeID) -> &mut Self {
self.inject(Operator::ArrayNew {
array_type_index: *array_type_index,
});
self
}
fn array_new_default(&mut self, array_type_index: TypeID) -> &mut Self {
self.inject(Operator::ArrayNewDefault {
array_type_index: *array_type_index,
});
self
}
fn array_new_fixed(&mut self, array_type_index: TypeID, array_size: u32) -> &mut Self {
self.inject(Operator::ArrayNewFixed {
array_type_index: *array_type_index,
array_size,
});
self
}
fn array_new_data(
&mut self,
array_type_index: TypeID,
array_data_index: DataSegmentID,
) -> &mut Self {
self.inject(Operator::ArrayNewData {
array_type_index: *array_type_index,
array_data_index: *array_data_index,
});
self
}
fn array_new_elem(
&mut self,
array_type_index: TypeID,
array_elem_index: ElementID,
) -> &mut Self {
self.inject(Operator::ArrayNewElem {
array_type_index: *array_type_index,
array_elem_index: *array_elem_index,
});
self
}
fn array_get(&mut self, array_type_index: TypeID) -> &mut Self {
self.inject(Operator::ArrayGet {
array_type_index: *array_type_index,
});
self
}
fn array_get_s(&mut self, array_type_index: TypeID) -> &mut Self {
self.inject(Operator::ArrayGetS {
array_type_index: *array_type_index,
});
self
}
fn array_get_u(&mut self, array_type_index: TypeID) -> &mut Self {
self.inject(Operator::ArrayGetU {
array_type_index: *array_type_index,
});
self
}
fn array_set(&mut self, array_type_index: TypeID) -> &mut Self {
self.inject(Operator::ArraySet {
array_type_index: *array_type_index,
});
self
}
fn array_len(&mut self) -> &mut Self {
self.inject(Operator::ArrayLen);
self
}
fn array_fill(&mut self, array_type_index: TypeID) -> &mut Self {
self.inject(Operator::ArrayFill {
array_type_index: *array_type_index,
});
self
}
fn array_copy(
&mut self,
array_type_index_dest: TypeID,
array_type_index_src: TypeID,
) -> &mut Self {
self.inject(Operator::ArrayCopy {
array_type_index_dst: *array_type_index_dest,
array_type_index_src: *array_type_index_src,
});
self
}
fn array_init_data(
&mut self,
array_type_index: TypeID,
array_data_index: DataSegmentID,
) -> &mut Self {
self.inject(Operator::ArrayInitData {
array_type_index: *array_type_index,
array_data_index: *array_data_index,
});
self
}
fn array_init_elem(
&mut self,
array_type_index: TypeID,
array_elem_index: ElementID,
) -> &mut Self {
self.inject(Operator::ArrayInitElem {
array_type_index: *array_type_index,
array_elem_index: *array_elem_index,
});
self
}
fn ref_test(&mut self, heap_type: HeapType) -> &mut Self {
self.inject(Operator::RefTestNonNull {
hty: wasmparser::HeapType::from(heap_type),
});
self
}
fn ref_test_null(&mut self, heap_type: HeapType) -> &mut Self {
self.inject(Operator::RefTestNullable {
hty: wasmparser::HeapType::from(heap_type),
});
self
}
fn ref_cast(&mut self, heap_type: HeapType) -> &mut Self {
self.inject(Operator::RefCastNonNull {
hty: wasmparser::HeapType::from(heap_type),
});
self
}
fn ref_cast_null(&mut self, heap_type: HeapType) -> &mut Self {
self.inject(Operator::RefCastNullable {
hty: wasmparser::HeapType::from(heap_type),
});
self
}
fn any_convert_extern(&mut self) -> &mut Self {
self.inject(Operator::AnyConvertExtern);
self
}
fn extern_convert_any(&mut self) -> &mut Self {
self.inject(Operator::ExternConvertAny);
self
}
fn ref_i31(&mut self) -> &mut Self {
self.inject(Operator::RefI31);
self
}
fn i31_get_s(&mut self) -> &mut Self {
self.inject(Operator::I31GetS);
self
}
fn i31_get_u(&mut self) -> &mut Self {
self.inject(Operator::I31GetU);
self
}
}
#[allow(dead_code)]
pub trait MacroOpcode<'a>: Inject<'a> {
fn u32_const(&mut self, value: u32) -> &mut Self {
let i32_val = value as i32;
self.inject(Operator::I32Const { value: i32_val });
self
}
fn u64_const(&mut self, value: u64) -> &mut Self {
let i64_val = value as i64;
self.inject(Operator::I64Const { value: i64_val });
self
}
}