1use crate::ir::id::{DataSegmentID, ElementID, FieldID, FunctionID, GlobalID, LocalID, TypeID};
8use crate::ir::module::module_types::HeapType;
9use crate::ir::types::{BlockType, FuncInstrMode, InstrumentationMode};
10use crate::Location;
11use wasmparser::MemArg;
12use wasmparser::Operator;
13
14pub trait Instrumenter<'a> {
16 fn finish_instr(&mut self);
18 fn curr_instrument_mode(&self) -> &Option<InstrumentationMode>;
20
21 fn set_instrument_mode_at(&mut self, mode: InstrumentationMode, loc: Location);
23
24 fn curr_func_instrument_mode(&self) -> &Option<FuncInstrMode>;
26
27 fn set_func_instrument_mode(&mut self, mode: FuncInstrMode);
29
30 fn func_entry(&mut self) -> &mut Self {
34 self.set_func_instrument_mode(FuncInstrMode::Entry);
35 self
36 }
37
38 fn func_exit(&mut self) -> &mut Self {
40 self.set_func_instrument_mode(FuncInstrMode::Exit);
41 self
42 }
43
44 fn clear_instr_at(&mut self, loc: Location, mode: InstrumentationMode);
47
48 fn add_instr_at(&mut self, loc: Location, instr: Operator<'a>);
50
51 fn before_at(&mut self, loc: Location) -> &mut Self {
53 self.set_instrument_mode_at(InstrumentationMode::Before, loc);
54 self
55 }
56
57 fn after_at(&mut self, loc: Location) -> &mut Self {
59 self.set_instrument_mode_at(InstrumentationMode::After, loc);
60 self
61 }
62
63 fn alternate_at(&mut self, loc: Location) -> &mut Self {
65 self.set_instrument_mode_at(InstrumentationMode::Alternate, loc);
66 self
67 }
68
69 fn empty_alternate_at(&mut self, loc: Location) -> &mut Self;
71
72 fn semantic_after_at(&mut self, loc: Location) -> &mut Self {
74 self.set_instrument_mode_at(InstrumentationMode::SemanticAfter, loc);
75 self
76 }
77
78 fn block_entry_at(&mut self, loc: Location) -> &mut Self {
80 self.set_instrument_mode_at(InstrumentationMode::BlockEntry, loc);
81 self
82 }
83
84 fn block_exit_at(&mut self, loc: Location) -> &mut Self {
86 self.set_instrument_mode_at(InstrumentationMode::BlockExit, loc);
87 self
88 }
89
90 fn block_alt_at(&mut self, loc: Location) -> &mut Self {
92 self.set_instrument_mode_at(InstrumentationMode::BlockAlt, loc);
93 self
94 }
95
96 fn empty_block_alt_at(&mut self, loc: Location) -> &mut Self;
98
99 fn get_injected_val(&self, idx: usize) -> &Operator;
101}
102
103pub trait Inject<'a> {
105 fn inject(&mut self, instr: Operator<'a>);
107
108 fn inject_all(&mut self, instrs: &[Operator<'a>]) -> &mut Self {
110 instrs.iter().for_each(|instr| {
111 self.inject(instr.to_owned());
112 });
113 self
114 }
115}
116
117pub trait InjectAt<'a> {
119 fn inject_at(&mut self, idx: usize, mode: InstrumentationMode, instr: Operator<'a>);
121}
122
123#[allow(dead_code)]
124pub trait Opcode<'a>: Inject<'a> {
129 fn call(&mut self, idx: FunctionID) -> &mut Self {
132 self.inject(Operator::Call {
133 function_index: *idx,
134 });
135 self
136 }
137
138 fn return_stmt(&mut self) -> &mut Self {
140 self.inject(Operator::Return);
141 self
142 }
143
144 fn nop(&mut self) -> &mut Self {
146 self.inject(Operator::Nop);
147 self
148 }
149
150 fn unreachable(&mut self) -> &mut Self {
152 self.inject(Operator::Unreachable);
153 self
154 }
155
156 fn select(&mut self) -> &mut Self {
158 self.inject(Operator::Select);
159 self
160 }
161
162 fn if_stmt(&mut self, block_type: BlockType) -> &mut Self {
164 self.inject(Operator::If {
165 blockty: wasmparser::BlockType::from(block_type),
166 });
167 self
168 }
169
170 fn else_stmt(&mut self) -> &mut Self {
172 self.inject(Operator::Else);
173 self
174 }
175
176 fn end(&mut self) -> &mut Self {
178 self.inject(Operator::End);
179 self
180 }
181
182 fn block(&mut self, block_type: BlockType) -> &mut Self {
184 self.inject(Operator::Block {
185 blockty: wasmparser::BlockType::from(block_type),
186 });
187 self
188 }
189
190 fn loop_stmt(&mut self, block_type: BlockType) -> &mut Self {
192 self.inject(Operator::Loop {
193 blockty: wasmparser::BlockType::from(block_type),
194 });
195 self
196 }
197
198 fn br(&mut self, relative_depth: u32) -> &mut Self {
200 self.inject(Operator::Br { relative_depth });
201 self
202 }
203
204 fn br_if(&mut self, relative_depth: u32) -> &mut Self {
206 self.inject(Operator::BrIf { relative_depth });
207 self
208 }
209
210 fn local_get(&mut self, idx: LocalID) -> &mut Self {
213 self.inject(Operator::LocalGet { local_index: *idx });
214 self
215 }
216
217 fn local_set(&mut self, idx: LocalID) -> &mut Self {
219 self.inject(Operator::LocalSet { local_index: *idx });
220 self
221 }
222
223 fn local_tee(&mut self, idx: LocalID) -> &mut Self {
224 self.inject(Operator::LocalTee { local_index: *idx });
225 self
226 }
227
228 fn i32_const(&mut self, value: i32) -> &mut Self {
231 self.inject(Operator::I32Const { value });
232 self
233 }
234
235 fn i32_add(&mut self) -> &mut Self {
237 self.inject(Operator::I32Add);
238 self
239 }
240
241 fn i32_sub(&mut self) -> &mut Self {
243 self.inject(Operator::I32Sub);
244 self
245 }
246
247 fn i32_mul(&mut self) -> &mut Self {
249 self.inject(Operator::I32Mul);
250 self
251 }
252
253 fn i32_div_signed(&mut self) -> &mut Self {
255 self.inject(Operator::I32DivS);
256 self
257 }
258
259 fn i32_div_unsigned(&mut self) -> &mut Self {
261 self.inject(Operator::I32DivU);
262 self
263 }
264
265 fn i32_rem_unsigned(&mut self) -> &mut Self {
267 self.inject(Operator::I32RemU);
268 self
269 }
270
271 fn i32_rem_signed(&mut self) -> &mut Self {
273 self.inject(Operator::I32RemS);
274 self
275 }
276
277 fn i32_and(&mut self) -> &mut Self {
279 self.inject(Operator::I32And);
280 self
281 }
282
283 fn i32_or(&mut self) -> &mut Self {
285 self.inject(Operator::I32Or);
286 self
287 }
288
289 fn i32_xor(&mut self) -> &mut Self {
291 self.inject(Operator::I32Xor);
292 self
293 }
294
295 fn i32_shl(&mut self) -> &mut Self {
297 self.inject(Operator::I32Shl);
298 self
299 }
300
301 fn i32_shr_signed(&mut self) -> &mut Self {
303 self.inject(Operator::I32ShrS);
304 self
305 }
306
307 fn i32_shr_unsigned(&mut self) -> &mut Self {
309 self.inject(Operator::I32ShrU);
310 self
311 }
312
313 fn i32_rotl(&mut self) -> &mut Self {
315 self.inject(Operator::I32Rotl);
316 self
317 }
318
319 fn i32_rotr(&mut self) -> &mut Self {
321 self.inject(Operator::I32Rotr);
322 self
323 }
324
325 fn i32_eq(&mut self) -> &mut Self {
327 self.inject(Operator::I32Eq);
328 self
329 }
330
331 fn i32_eqz(&mut self) -> &mut Self {
333 self.inject(Operator::I32Eqz);
334 self
335 }
336
337 fn i32_ne(&mut self) -> &mut Self {
339 self.inject(Operator::I32Ne);
340 self
341 }
342
343 fn i32_lt_unsigned(&mut self) -> &mut Self {
345 self.inject(Operator::I32LtU);
346 self
347 }
348
349 fn i32_lt_signed(&mut self) -> &mut Self {
351 self.inject(Operator::I32LtS);
352 self
353 }
354
355 fn i32_gt_unsigned(&mut self) -> &mut Self {
357 self.inject(Operator::I32GtU);
358 self
359 }
360
361 fn i32_gt_signed(&mut self) -> &mut Self {
363 self.inject(Operator::I32GtS);
364 self
365 }
366
367 fn i32_lte_unsigned(&mut self) -> &mut Self {
369 self.inject(Operator::I32LeU);
370 self
371 }
372
373 fn i32_lte_signed(&mut self) -> &mut Self {
375 self.inject(Operator::I32LeS);
376 self
377 }
378
379 fn i32_gte_unsigned(&mut self) -> &mut Self {
381 self.inject(Operator::I32GeU);
382 self
383 }
384
385 fn i32_gte_signed(&mut self) -> &mut Self {
387 self.inject(Operator::I32GeS);
388 self
389 }
390
391 fn i32_wrap_i64(&mut self) -> &mut Self {
392 self.inject(Operator::I32WrapI64);
393 self
394 }
395
396 fn i32_extend_8s(&mut self) -> &mut Self {
398 self.inject(Operator::I32Extend8S);
399 self
400 }
401
402 fn i32_extend_16s(&mut self) -> &mut Self {
404 self.inject(Operator::I32Extend16S);
405 self
406 }
407
408 fn i32_trunc_f32s(&mut self) -> &mut Self {
410 self.inject(Operator::I32TruncF32S);
411 self
412 }
413
414 fn i32_trunc_f32u(&mut self) -> &mut Self {
416 self.inject(Operator::I32TruncF32U);
417 self
418 }
419
420 fn i32_trunc_f64s(&mut self) -> &mut Self {
422 self.inject(Operator::I32TruncF64S);
423 self
424 }
425
426 fn i32_trunc_f64u(&mut self) -> &mut Self {
428 self.inject(Operator::I32TruncF64U);
429 self
430 }
431
432 fn i32_reinterpret_f32(&mut self) -> &mut Self {
434 self.inject(Operator::I32ReinterpretF32);
435 self
436 }
437
438 fn i64_const(&mut self, value: i64) -> &mut Self {
440 self.inject(Operator::I64Const { value });
441 self
442 }
443
444 fn i64_add(&mut self) -> &mut Self {
446 self.inject(Operator::I64Add);
447 self
448 }
449
450 fn i64_sub(&mut self) -> &mut Self {
452 self.inject(Operator::I64Sub);
453 self
454 }
455
456 fn i64_mul(&mut self) -> &mut Self {
458 self.inject(Operator::I64Mul);
459 self
460 }
461
462 fn i64_div_signed(&mut self) -> &mut Self {
464 self.inject(Operator::I64DivS);
465 self
466 }
467
468 fn i64_div_unsigned(&mut self) -> &mut Self {
470 self.inject(Operator::I64DivU);
471 self
472 }
473
474 fn i64_rem_unsigned(&mut self) -> &mut Self {
476 self.inject(Operator::I64RemU);
477 self
478 }
479
480 fn i64_rem_signed(&mut self) -> &mut Self {
482 self.inject(Operator::I64RemS);
483 self
484 }
485
486 fn i64_and(&mut self) -> &mut Self {
488 self.inject(Operator::I64And);
489 self
490 }
491
492 fn i64_or(&mut self) -> &mut Self {
494 self.inject(Operator::I64Or);
495 self
496 }
497
498 fn i64_xor(&mut self) -> &mut Self {
500 self.inject(Operator::I64Xor);
501 self
502 }
503
504 fn i64_shl(&mut self) -> &mut Self {
506 self.inject(Operator::I64Shl);
507 self
508 }
509
510 fn i64_shr_signed(&mut self) -> &mut Self {
512 self.inject(Operator::I64ShrS);
513 self
514 }
515
516 fn i64_shr_unsigned(&mut self) -> &mut Self {
518 self.inject(Operator::I64ShrU);
519 self
520 }
521
522 fn i64_rotl(&mut self) -> &mut Self {
524 self.inject(Operator::I64Rotl);
525 self
526 }
527
528 fn i64_rotr(&mut self) -> &mut Self {
530 self.inject(Operator::I64Rotr);
531 self
532 }
533
534 fn i64_eq(&mut self) -> &mut Self {
536 self.inject(Operator::I64Eq);
537 self
538 }
539
540 fn i64_eqz(&mut self) -> &mut Self {
542 self.inject(Operator::I64Eqz);
543 self
544 }
545
546 fn i64_ne(&mut self) -> &mut Self {
548 self.inject(Operator::I64Ne);
549 self
550 }
551
552 fn i64_lt_unsigned(&mut self) -> &mut Self {
554 self.inject(Operator::I64LtU);
555 self
556 }
557
558 fn i64_lt_signed(&mut self) -> &mut Self {
560 self.inject(Operator::I64LtS);
561 self
562 }
563
564 fn i64_gt_unsigned(&mut self) -> &mut Self {
566 self.inject(Operator::I64GtU);
567 self
568 }
569
570 fn i64_gt_signed(&mut self) -> &mut Self {
572 self.inject(Operator::I64GtS);
573 self
574 }
575
576 fn i64_lte_unsigned(&mut self) -> &mut Self {
578 self.inject(Operator::I64LeU);
579 self
580 }
581
582 fn i64_lte_signed(&mut self) -> &mut Self {
584 self.inject(Operator::I64LeS);
585 self
586 }
587
588 fn i64_gte_unsigned(&mut self) -> &mut Self {
590 self.inject(Operator::I64GeU);
591 self
592 }
593
594 fn i64_gte_signed(&mut self) -> &mut Self {
596 self.inject(Operator::I64GeS);
597 self
598 }
599
600 fn i64_extend_i32u(&mut self) -> &mut Self {
602 self.inject(Operator::I64ExtendI32U);
603 self
604 }
605
606 fn i64_extend_i32s(&mut self) -> &mut Self {
608 self.inject(Operator::I64ExtendI32S);
609 self
610 }
611
612 fn i64_trunc_f32s(&mut self) -> &mut Self {
614 self.inject(Operator::I64TruncF32S);
615 self
616 }
617
618 fn i64_trunc_f32u(&mut self) -> &mut Self {
620 self.inject(Operator::I64TruncF32U);
621 self
622 }
623
624 fn i64_trunc_f64s(&mut self) -> &mut Self {
626 self.inject(Operator::I64TruncF64S);
627 self
628 }
629
630 fn i64_trunc_f64u(&mut self) -> &mut Self {
632 self.inject(Operator::I64TruncF64U);
633 self
634 }
635
636 fn i64_reinterpret_f64(&mut self) -> &mut Self {
638 self.inject(Operator::I64ReinterpretF64);
639 self
640 }
641
642 fn f32_const(&mut self, val: f32) -> &mut Self {
645 self.inject(Operator::F32Const {
646 value: wasmparser::Ieee32::from(val),
647 });
648 self
649 }
650
651 fn f32_abs(&mut self) -> &mut Self {
653 self.inject(Operator::F32Abs);
654 self
655 }
656
657 fn f32_ceil(&mut self) -> &mut Self {
659 self.inject(Operator::F32Ceil);
660 self
661 }
662
663 fn f32_floor(&mut self) -> &mut Self {
665 self.inject(Operator::F32Floor);
666 self
667 }
668
669 fn f32_trunc(&mut self) -> &mut Self {
671 self.inject(Operator::F32Trunc);
672 self
673 }
674
675 fn f32_sqrt(&mut self) -> &mut Self {
677 self.inject(Operator::F32Sqrt);
678 self
679 }
680
681 fn f32_add(&mut self) -> &mut Self {
683 self.inject(Operator::F32Add);
684 self
685 }
686
687 fn f32_sub(&mut self) -> &mut Self {
689 self.inject(Operator::F32Sub);
690 self
691 }
692
693 fn f32_mul(&mut self) -> &mut Self {
695 self.inject(Operator::F32Mul);
696 self
697 }
698
699 fn f32_div(&mut self) -> &mut Self {
701 self.inject(Operator::F32Div);
702 self
703 }
704
705 fn f32_min(&mut self) -> &mut Self {
707 self.inject(Operator::F32Min);
708 self
709 }
710
711 fn f32_max(&mut self) -> &mut Self {
713 self.inject(Operator::F32Max);
714 self
715 }
716
717 fn f32_eq(&mut self) -> &mut Self {
719 self.inject(Operator::F32Eq);
720 self
721 }
722
723 fn f32_ne(&mut self) -> &mut Self {
725 self.inject(Operator::F32Ne);
726 self
727 }
728
729 fn f32_gt(&mut self) -> &mut Self {
731 self.inject(Operator::F32Gt);
732 self
733 }
734
735 fn f32_ge(&mut self) -> &mut Self {
737 self.inject(Operator::F32Ge);
738 self
739 }
740
741 fn f32_lt(&mut self) -> &mut Self {
743 self.inject(Operator::F32Lt);
744 self
745 }
746
747 fn f32_le(&mut self) -> &mut Self {
749 self.inject(Operator::F32Le);
750 self
751 }
752
753 fn f32_convert_i32s(&mut self) -> &mut Self {
755 self.inject(Operator::F32ConvertI32S);
756 self
757 }
758
759 fn f32_convert_i32u(&mut self) -> &mut Self {
761 self.inject(Operator::F32ConvertI32U);
762 self
763 }
764
765 fn f32_convert_i64s(&mut self) -> &mut Self {
767 self.inject(Operator::F32ConvertI64S);
768 self
769 }
770
771 fn f32_convert_i64u(&mut self) -> &mut Self {
773 self.inject(Operator::F32ConvertI64U);
774 self
775 }
776
777 fn f32_demote_f64(&mut self) -> &mut Self {
779 self.inject(Operator::F32DemoteF64);
780 self
781 }
782
783 fn f32_reinterpret_i32(&mut self) -> &mut Self {
785 self.inject(Operator::F32ReinterpretI32);
786 self
787 }
788
789 fn f32_copysign(&mut self) -> &mut Self {
791 self.inject(Operator::F32Copysign);
792 self
793 }
794
795 fn f64_const(&mut self, val: f64) -> &mut Self {
797 self.inject(Operator::F64Const {
798 value: wasmparser::Ieee64::from(val),
799 });
800 self
801 }
802
803 fn f64_abs(&mut self) -> &mut Self {
805 self.inject(Operator::F64Abs);
806 self
807 }
808
809 fn f64_ceil(&mut self) -> &mut Self {
811 self.inject(Operator::F64Ceil);
812 self
813 }
814
815 fn f64_floor(&mut self) -> &mut Self {
817 self.inject(Operator::F64Floor);
818 self
819 }
820
821 fn f64_trunc(&mut self) -> &mut Self {
823 self.inject(Operator::F64Trunc);
824 self
825 }
826
827 fn f64_sqrt(&mut self) -> &mut Self {
829 self.inject(Operator::F64Sqrt);
830 self
831 }
832
833 fn f64_add(&mut self) -> &mut Self {
835 self.inject(Operator::F64Add);
836 self
837 }
838
839 fn f64_sub(&mut self) -> &mut Self {
841 self.inject(Operator::F64Sub);
842 self
843 }
844
845 fn f64_mul(&mut self) -> &mut Self {
847 self.inject(Operator::F64Mul);
848 self
849 }
850
851 fn f64_div(&mut self) -> &mut Self {
853 self.inject(Operator::F64Div);
854 self
855 }
856
857 fn f64_min(&mut self) -> &mut Self {
859 self.inject(Operator::F64Min);
860 self
861 }
862
863 fn f64_max(&mut self) -> &mut Self {
865 self.inject(Operator::F64Max);
866 self
867 }
868
869 fn f64_eq(&mut self) -> &mut Self {
871 self.inject(Operator::F64Eq);
872 self
873 }
874
875 fn f64_ne(&mut self) -> &mut Self {
877 self.inject(Operator::F64Ne);
878 self
879 }
880
881 fn f64_gt(&mut self) -> &mut Self {
883 self.inject(Operator::F64Gt);
884 self
885 }
886
887 fn f64_ge(&mut self) -> &mut Self {
889 self.inject(Operator::F64Ge);
890 self
891 }
892
893 fn f64_lt(&mut self) -> &mut Self {
895 self.inject(Operator::F64Lt);
896 self
897 }
898
899 fn f64_le(&mut self) -> &mut Self {
901 self.inject(Operator::F64Le);
902 self
903 }
904
905 fn f64_reinterpret_i64(&mut self) -> &mut Self {
907 self.inject(Operator::F64ReinterpretI64);
908 self
909 }
910
911 fn f64_promote_f32(&mut self) -> &mut Self {
913 self.inject(Operator::F64PromoteF32);
914 self
915 }
916
917 fn f64_convert_i32s(&mut self) -> &mut Self {
919 self.inject(Operator::F64ConvertI32S);
920 self
921 }
922
923 fn f64_convert_i32u(&mut self) -> &mut Self {
925 self.inject(Operator::F64ConvertI32U);
926 self
927 }
928
929 fn f64_convert_i64s(&mut self) -> &mut Self {
931 self.inject(Operator::F64ConvertI64S);
932 self
933 }
934
935 fn f64_convert_i64u(&mut self) -> &mut Self {
937 self.inject(Operator::F64ConvertI64U);
938 self
939 }
940
941 fn f64_copysign(&mut self) -> &mut Self {
943 self.inject(Operator::F64Copysign);
944 self
945 }
946
947 fn memory_init(&mut self, data_index: u32, mem: u32) -> &mut Self {
950 self.inject(Operator::MemoryInit { data_index, mem });
951 self
952 }
953
954 fn memory_size(&mut self, mem: u32) -> &mut Self {
956 self.inject(Operator::MemorySize { mem });
957 self
958 }
959
960 fn memory_grow(&mut self, mem: u32) -> &mut Self {
962 self.inject(Operator::MemoryGrow { mem });
963 self
964 }
965
966 fn memory_fill(&mut self, mem: u32) -> &mut Self {
968 self.inject(Operator::MemoryFill { mem });
969 self
970 }
971
972 fn memory_copy(&mut self, dst_mem: u32, src_mem: u32) -> &mut Self {
974 self.inject(Operator::MemoryCopy { dst_mem, src_mem });
975 self
976 }
977
978 fn memory_discard(&mut self, mem: u32) -> &mut Self {
980 self.inject(Operator::MemoryDiscard { mem });
981 self
982 }
983 fn data_drop(&mut self, data_index: u32) -> &mut Self {
985 self.inject(Operator::DataDrop { data_index });
986 self
987 }
988
989 fn drop(&mut self) -> &mut Self {
992 self.inject(Operator::Drop);
993 self
994 }
995
996 fn i32_load8_s(&mut self, memarg: MemArg) -> &mut Self {
1001 self.inject(Operator::I32Load8S { memarg });
1002 self
1003 }
1004
1005 fn i32_load8_u(&mut self, memarg: MemArg) -> &mut Self {
1007 self.inject(Operator::I32Load8U { memarg });
1008 self
1009 }
1010
1011 fn i32_load16_s(&mut self, memarg: MemArg) -> &mut Self {
1013 self.inject(Operator::I32Load16S { memarg });
1014 self
1015 }
1016
1017 fn i32_load16_u(&mut self, memarg: MemArg) -> &mut Self {
1019 self.inject(Operator::I32Load16U { memarg });
1020 self
1021 }
1022
1023 fn i32_load(&mut self, memarg: MemArg) -> &mut Self {
1025 self.inject(Operator::I32Load { memarg });
1026 self
1027 }
1028
1029 fn i32_store(&mut self, memarg: MemArg) -> &mut Self {
1030 self.inject(Operator::I32Store { memarg });
1031 self
1032 }
1033 fn i32_store8(&mut self, memarg: MemArg) -> &mut Self {
1034 self.inject(Operator::I32Store8 { memarg });
1035 self
1036 }
1037 fn i32_store16(&mut self, memarg: MemArg) -> &mut Self {
1038 self.inject(Operator::I32Store16 { memarg });
1039 self
1040 }
1041
1042 fn i64_load8_s(&mut self, memarg: MemArg) -> &mut Self {
1044 self.inject(Operator::I64Load8S { memarg });
1045 self
1046 }
1047
1048 fn i64_load8_u(&mut self, memarg: MemArg) -> &mut Self {
1050 self.inject(Operator::I64Load8U { memarg });
1051 self
1052 }
1053
1054 fn i64_load16_s(&mut self, memarg: MemArg) -> &mut Self {
1056 self.inject(Operator::I64Load16S { memarg });
1057 self
1058 }
1059
1060 fn i64_load16_u(&mut self, memarg: MemArg) -> &mut Self {
1062 self.inject(Operator::I64Load16U { memarg });
1063 self
1064 }
1065
1066 fn i64_load32_s(&mut self, memarg: MemArg) -> &mut Self {
1068 self.inject(Operator::I64Load32S { memarg });
1069 self
1070 }
1071
1072 fn i64_load32_u(&mut self, memarg: MemArg) -> &mut Self {
1074 self.inject(Operator::I64Load32U { memarg });
1075 self
1076 }
1077
1078 fn i64_load(&mut self, memarg: MemArg) -> &mut Self {
1080 self.inject(Operator::I64Load { memarg });
1081 self
1082 }
1083
1084 fn i64_store(&mut self, memarg: MemArg) -> &mut Self {
1085 self.inject(Operator::I64Store { memarg });
1086 self
1087 }
1088
1089 fn f32_load(&mut self, memarg: MemArg) -> &mut Self {
1091 self.inject(Operator::F32Load { memarg });
1092 self
1093 }
1094
1095 fn f32_store(&mut self, memarg: MemArg) -> &mut Self {
1096 self.inject(Operator::F32Store { memarg });
1097 self
1098 }
1099
1100 fn f64_load(&mut self, memarg: MemArg) -> &mut Self {
1102 self.inject(Operator::F64Load { memarg });
1103 self
1104 }
1105
1106 fn f64_store(&mut self, memarg: MemArg) -> &mut Self {
1108 self.inject(Operator::F64Store { memarg });
1109 self
1110 }
1111
1112 fn global_get(&mut self, idx: GlobalID) -> &mut Self {
1114 self.inject(Operator::GlobalGet { global_index: *idx });
1115 self
1116 }
1117
1118 fn global_set(&mut self, idx: GlobalID) -> &mut Self {
1120 self.inject(Operator::GlobalSet { global_index: *idx });
1121 self
1122 }
1123
1124 fn ref_null(&mut self, heap_type: HeapType) -> &mut Self {
1126 self.inject(Operator::RefNull {
1127 hty: wasmparser::HeapType::from(heap_type),
1128 });
1129 self
1130 }
1131
1132 fn ref_is_null(&mut self) -> &mut Self {
1133 self.inject(Operator::RefIsNull);
1134 self
1135 }
1136
1137 fn ref_func(&mut self, function_index: u32) -> &mut Self {
1138 self.inject(Operator::RefFunc { function_index });
1139 self
1140 }
1141
1142 fn ref_eq(&mut self) -> &mut Self {
1143 self.inject(Operator::RefEq);
1144 self
1145 }
1146
1147 fn ref_as_non_null(&mut self) -> &mut Self {
1148 self.inject(Operator::RefAsNonNull);
1149 self
1150 }
1151
1152 fn struct_new(&mut self, struct_type_index: TypeID) -> &mut Self {
1153 self.inject(Operator::StructNew {
1154 struct_type_index: *struct_type_index,
1155 });
1156 self
1157 }
1158
1159 fn struct_new_default(&mut self, struct_type_index: TypeID) -> &mut Self {
1160 self.inject(Operator::StructNewDefault {
1161 struct_type_index: *struct_type_index,
1162 });
1163 self
1164 }
1165
1166 fn struct_get(&mut self, struct_type_index: TypeID, field_index: FieldID) -> &mut Self {
1167 self.inject(Operator::StructGet {
1168 struct_type_index: *struct_type_index,
1169 field_index: *field_index,
1170 });
1171 self
1172 }
1173
1174 fn struct_get_s(&mut self, struct_type_index: TypeID, field_index: FieldID) -> &mut Self {
1175 self.inject(Operator::StructGetS {
1176 struct_type_index: *struct_type_index,
1177 field_index: *field_index,
1178 });
1179 self
1180 }
1181
1182 fn struct_get_u(&mut self, struct_type_index: TypeID, field_index: FieldID) -> &mut Self {
1183 self.inject(Operator::StructGetU {
1184 struct_type_index: *struct_type_index,
1185 field_index: *field_index,
1186 });
1187 self
1188 }
1189
1190 fn struct_set(&mut self, struct_type_index: TypeID, field_index: FieldID) -> &mut Self {
1191 self.inject(Operator::StructSet {
1192 struct_type_index: *struct_type_index,
1193 field_index: *field_index,
1194 });
1195 self
1196 }
1197
1198 fn array_new(&mut self, array_type_index: TypeID) -> &mut Self {
1199 self.inject(Operator::ArrayNew {
1200 array_type_index: *array_type_index,
1201 });
1202 self
1203 }
1204
1205 fn array_new_default(&mut self, array_type_index: TypeID) -> &mut Self {
1206 self.inject(Operator::ArrayNewDefault {
1207 array_type_index: *array_type_index,
1208 });
1209 self
1210 }
1211
1212 fn array_new_fixed(&mut self, array_type_index: TypeID, array_size: u32) -> &mut Self {
1213 self.inject(Operator::ArrayNewFixed {
1214 array_type_index: *array_type_index,
1215 array_size,
1216 });
1217 self
1218 }
1219
1220 fn array_new_data(
1222 &mut self,
1223 array_type_index: TypeID,
1224 array_data_index: DataSegmentID,
1225 ) -> &mut Self {
1226 self.inject(Operator::ArrayNewData {
1227 array_type_index: *array_type_index,
1228 array_data_index: *array_data_index,
1229 });
1230 self
1231 }
1232
1233 fn array_new_elem(
1234 &mut self,
1235 array_type_index: TypeID,
1236 array_elem_index: ElementID,
1237 ) -> &mut Self {
1238 self.inject(Operator::ArrayNewElem {
1239 array_type_index: *array_type_index,
1240 array_elem_index: *array_elem_index,
1241 });
1242 self
1243 }
1244
1245 fn array_get(&mut self, array_type_index: TypeID) -> &mut Self {
1246 self.inject(Operator::ArrayGet {
1247 array_type_index: *array_type_index,
1248 });
1249 self
1250 }
1251
1252 fn array_get_s(&mut self, array_type_index: TypeID) -> &mut Self {
1253 self.inject(Operator::ArrayGetS {
1254 array_type_index: *array_type_index,
1255 });
1256 self
1257 }
1258
1259 fn array_get_u(&mut self, array_type_index: TypeID) -> &mut Self {
1260 self.inject(Operator::ArrayGetU {
1261 array_type_index: *array_type_index,
1262 });
1263 self
1264 }
1265
1266 fn array_set(&mut self, array_type_index: TypeID) -> &mut Self {
1267 self.inject(Operator::ArraySet {
1268 array_type_index: *array_type_index,
1269 });
1270 self
1271 }
1272
1273 fn array_len(&mut self) -> &mut Self {
1274 self.inject(Operator::ArrayLen);
1275 self
1276 }
1277
1278 fn array_fill(&mut self, array_type_index: TypeID) -> &mut Self {
1279 self.inject(Operator::ArrayFill {
1280 array_type_index: *array_type_index,
1281 });
1282 self
1283 }
1284
1285 fn array_copy(
1286 &mut self,
1287 array_type_index_dest: TypeID,
1288 array_type_index_src: TypeID,
1289 ) -> &mut Self {
1290 self.inject(Operator::ArrayCopy {
1291 array_type_index_dst: *array_type_index_dest,
1292 array_type_index_src: *array_type_index_src,
1293 });
1294 self
1295 }
1296
1297 fn array_init_data(
1298 &mut self,
1299 array_type_index: TypeID,
1300 array_data_index: DataSegmentID,
1301 ) -> &mut Self {
1302 self.inject(Operator::ArrayInitData {
1303 array_type_index: *array_type_index,
1304 array_data_index: *array_data_index,
1305 });
1306 self
1307 }
1308
1309 fn array_init_elem(
1310 &mut self,
1311 array_type_index: TypeID,
1312 array_elem_index: ElementID,
1313 ) -> &mut Self {
1314 self.inject(Operator::ArrayInitElem {
1315 array_type_index: *array_type_index,
1316 array_elem_index: *array_elem_index,
1317 });
1318 self
1319 }
1320
1321 fn ref_test(&mut self, heap_type: HeapType) -> &mut Self {
1322 self.inject(Operator::RefTestNonNull {
1323 hty: wasmparser::HeapType::from(heap_type),
1324 });
1325 self
1326 }
1327
1328 fn ref_test_null(&mut self, heap_type: HeapType) -> &mut Self {
1329 self.inject(Operator::RefTestNullable {
1330 hty: wasmparser::HeapType::from(heap_type),
1331 });
1332 self
1333 }
1334
1335 fn ref_cast(&mut self, heap_type: HeapType) -> &mut Self {
1336 self.inject(Operator::RefCastNonNull {
1337 hty: wasmparser::HeapType::from(heap_type),
1338 });
1339 self
1340 }
1341
1342 fn ref_cast_null(&mut self, heap_type: HeapType) -> &mut Self {
1343 self.inject(Operator::RefCastNullable {
1344 hty: wasmparser::HeapType::from(heap_type),
1345 });
1346 self
1347 }
1348
1349 fn any_convert_extern(&mut self) -> &mut Self {
1350 self.inject(Operator::AnyConvertExtern);
1351 self
1352 }
1353
1354 fn extern_convert_any(&mut self) -> &mut Self {
1355 self.inject(Operator::ExternConvertAny);
1356 self
1357 }
1358
1359 fn ref_i31(&mut self) -> &mut Self {
1360 self.inject(Operator::RefI31);
1361 self
1362 }
1363
1364 fn i31_get_s(&mut self) -> &mut Self {
1365 self.inject(Operator::I31GetS);
1366 self
1367 }
1368
1369 fn i31_get_u(&mut self) -> &mut Self {
1370 self.inject(Operator::I31GetU);
1371 self
1372 }
1373}
1374
1375#[allow(dead_code)]
1376pub trait MacroOpcode<'a>: Inject<'a> {
1381 fn u32_const(&mut self, value: u32) -> &mut Self {
1386 let i32_val = value as i32;
1387 self.inject(Operator::I32Const { value: i32_val });
1388 self
1389 }
1390 fn u64_const(&mut self, value: u64) -> &mut Self {
1395 let i64_val = value as i64;
1396 self.inject(Operator::I64Const { value: i64_val });
1397 self
1398 }
1399}