1use crate::CoreTypeEncoder;
7use core::convert::Infallible;
8use core::error::Error as StdError;
9
10#[cfg(feature = "component-model")]
11mod component;
12
13#[cfg(feature = "component-model")]
14pub use self::component::*;
15
16#[cfg(feature = "wasmparser")]
17use alloc::vec::Vec;
18
19#[allow(missing_docs)] pub trait Reencode {
21 type Error;
22
23 fn data_index(&mut self, data: u32) -> Result<u32, Error<Self::Error>> {
24 Ok(utils::data_index(self, data))
25 }
26
27 fn element_index(&mut self, element: u32) -> Result<u32, Error<Self::Error>> {
28 Ok(utils::element_index(self, element))
29 }
30
31 fn function_index(&mut self, func: u32) -> Result<u32, Error<Self::Error>> {
32 Ok(utils::function_index(self, func))
33 }
34
35 fn global_index(&mut self, global: u32) -> Result<u32, Error<Self::Error>> {
36 Ok(utils::global_index(self, global))
37 }
38
39 fn memory_index(&mut self, memory: u32) -> Result<u32, Error<Self::Error>> {
40 Ok(utils::memory_index(self, memory))
41 }
42
43 fn table_index(&mut self, table: u32) -> Result<u32, Error<Self::Error>> {
44 Ok(utils::table_index(self, table))
45 }
46
47 fn tag_index(&mut self, tag: u32) -> Result<u32, Error<Self::Error>> {
48 Ok(utils::tag_index(self, tag))
49 }
50
51 fn type_index(&mut self, ty: u32) -> Result<u32, Error<Self::Error>> {
52 Ok(utils::type_index(self, ty))
53 }
54
55 fn type_index_unpacked(
56 &mut self,
57 ty: wasmparser::UnpackedIndex,
58 ) -> Result<u32, Error<Self::Error>> {
59 utils::type_index_unpacked(self, ty)
60 }
61
62 fn external_index(
63 &mut self,
64 kind: wasmparser::ExternalKind,
65 index: u32,
66 ) -> Result<u32, Error<Self::Error>> {
67 match kind {
68 wasmparser::ExternalKind::Func | wasmparser::ExternalKind::FuncExact => {
69 self.function_index(index)
70 }
71 wasmparser::ExternalKind::Table => self.table_index(index),
72 wasmparser::ExternalKind::Memory => self.memory_index(index),
73 wasmparser::ExternalKind::Global => self.global_index(index),
74 wasmparser::ExternalKind::Tag => self.tag_index(index),
75 }
76 }
77
78 fn abstract_heap_type(
79 &mut self,
80 value: wasmparser::AbstractHeapType,
81 ) -> Result<crate::AbstractHeapType, Error<Self::Error>> {
82 Ok(utils::abstract_heap_type(self, value))
83 }
84
85 fn array_type(
86 &mut self,
87 array_ty: wasmparser::ArrayType,
88 ) -> Result<crate::ArrayType, Error<Self::Error>> {
89 utils::array_type(self, array_ty)
90 }
91
92 fn block_type(
93 &mut self,
94 arg: wasmparser::BlockType,
95 ) -> Result<crate::BlockType, Error<Self::Error>> {
96 utils::block_type(self, arg)
97 }
98
99 fn const_expr(
100 &mut self,
101 const_expr: wasmparser::ConstExpr,
102 ) -> Result<crate::ConstExpr, Error<Self::Error>> {
103 utils::const_expr(self, const_expr)
104 }
105
106 fn catch(&mut self, arg: wasmparser::Catch) -> Result<crate::Catch, Error<Self::Error>> {
107 utils::catch(self, arg)
108 }
109
110 fn composite_type(
111 &mut self,
112 composite_ty: wasmparser::CompositeType,
113 ) -> Result<crate::CompositeType, Error<Self::Error>> {
114 utils::composite_type(self, composite_ty)
115 }
116
117 fn entity_type(
118 &mut self,
119 type_ref: wasmparser::TypeRef,
120 ) -> Result<crate::EntityType, Error<Self::Error>> {
121 utils::entity_type(self, type_ref)
122 }
123
124 fn export_kind(
125 &mut self,
126 external_kind: wasmparser::ExternalKind,
127 ) -> Result<crate::ExportKind, Error<Self::Error>> {
128 Ok(utils::export_kind(self, external_kind))
129 }
130
131 fn field_type(
132 &mut self,
133 field_ty: wasmparser::FieldType,
134 ) -> Result<crate::FieldType, Error<Self::Error>> {
135 utils::field_type(self, field_ty)
136 }
137
138 fn func_type(
139 &mut self,
140 func_ty: wasmparser::FuncType,
141 ) -> Result<crate::FuncType, Error<Self::Error>> {
142 utils::func_type(self, func_ty)
143 }
144
145 fn cont_type(
146 &mut self,
147 cont_ty: wasmparser::ContType,
148 ) -> Result<crate::ContType, Error<Self::Error>> {
149 utils::cont_type(self, cont_ty)
150 }
151
152 fn global_type(
153 &mut self,
154 global_ty: wasmparser::GlobalType,
155 ) -> Result<crate::GlobalType, Error<Self::Error>> {
156 utils::global_type(self, global_ty)
157 }
158
159 fn handle(&mut self, on: wasmparser::Handle) -> Result<crate::Handle, Error<Self::Error>> {
160 utils::handle(self, on)
161 }
162
163 fn heap_type(
164 &mut self,
165 heap_type: wasmparser::HeapType,
166 ) -> Result<crate::HeapType, Error<Self::Error>> {
167 utils::heap_type(self, heap_type)
168 }
169
170 fn instruction<'a>(
171 &mut self,
172 arg: wasmparser::Operator<'a>,
173 ) -> Result<crate::Instruction<'a>, Error<Self::Error>> {
174 utils::instruction(self, arg)
175 }
176
177 fn memory_type(
178 &mut self,
179 memory_ty: wasmparser::MemoryType,
180 ) -> Result<crate::MemoryType, Error<Self::Error>> {
181 Ok(utils::memory_type(self, memory_ty))
182 }
183
184 fn ieee32_arg(&mut self, arg: wasmparser::Ieee32) -> Result<crate::Ieee32, Error<Self::Error>> {
185 Ok(utils::ieee32_arg(self, arg))
186 }
187
188 fn ieee64_arg(&mut self, arg: wasmparser::Ieee64) -> Result<crate::Ieee64, Error<Self::Error>> {
189 Ok(utils::ieee64_arg(self, arg))
190 }
191
192 fn mem_arg(&mut self, arg: wasmparser::MemArg) -> Result<crate::MemArg, Error<Self::Error>> {
193 utils::mem_arg(self, arg)
194 }
195
196 fn ordering(
197 &mut self,
198 arg: wasmparser::Ordering,
199 ) -> Result<crate::Ordering, Error<Self::Error>> {
200 Ok(utils::ordering(self, arg))
201 }
202
203 fn ref_type(
204 &mut self,
205 ref_type: wasmparser::RefType,
206 ) -> Result<crate::RefType, Error<Self::Error>> {
207 utils::ref_type(self, ref_type)
208 }
209
210 fn storage_type(
211 &mut self,
212 storage_ty: wasmparser::StorageType,
213 ) -> Result<crate::StorageType, Error<Self::Error>> {
214 utils::storage_type(self, storage_ty)
215 }
216
217 fn struct_type(
218 &mut self,
219 struct_ty: wasmparser::StructType,
220 ) -> Result<crate::StructType, Error<Self::Error>> {
221 utils::struct_type(self, struct_ty)
222 }
223
224 fn sub_type(
225 &mut self,
226 sub_ty: wasmparser::SubType,
227 ) -> Result<crate::SubType, Error<Self::Error>> {
228 utils::sub_type(self, sub_ty)
229 }
230
231 fn table_type(
232 &mut self,
233 table_ty: wasmparser::TableType,
234 ) -> Result<crate::TableType, Error<Self::Error>> {
235 utils::table_type(self, table_ty)
236 }
237
238 fn tag_kind(
239 &mut self,
240 kind: wasmparser::TagKind,
241 ) -> Result<crate::TagKind, Error<Self::Error>> {
242 Ok(utils::tag_kind(self, kind))
243 }
244
245 fn tag_type(
246 &mut self,
247 tag_ty: wasmparser::TagType,
248 ) -> Result<crate::TagType, Error<Self::Error>> {
249 utils::tag_type(self, tag_ty)
250 }
251
252 fn val_type(
253 &mut self,
254 val_ty: wasmparser::ValType,
255 ) -> Result<crate::ValType, Error<Self::Error>> {
256 utils::val_type(self, val_ty)
257 }
258
259 fn val_types(
260 &mut self,
261 val_tys: Vec<wasmparser::ValType>,
262 ) -> Result<Vec<crate::ValType>, Error<Self::Error>> {
263 val_tys
264 .iter()
265 .map(|ty| utils::val_type(self, *ty))
266 .collect()
267 }
268
269 fn parse_custom_section(
272 &mut self,
273 module: &mut crate::Module,
274 section: wasmparser::CustomSectionReader<'_>,
275 ) -> Result<(), Error<Self::Error>> {
276 utils::parse_custom_section(self, module, section)
277 }
278
279 fn custom_section<'a>(
282 &mut self,
283 section: wasmparser::CustomSectionReader<'a>,
284 ) -> Result<crate::CustomSection<'a>, Error<Self::Error>> {
285 Ok(utils::custom_section(self, section))
286 }
287
288 fn parse_code_section(
291 &mut self,
292 code: &mut crate::CodeSection,
293 section: wasmparser::CodeSectionReader<'_>,
294 ) -> Result<(), Error<Self::Error>> {
295 utils::parse_code_section(self, code, section)
296 }
297
298 fn parse_function_body(
300 &mut self,
301 code: &mut crate::CodeSection,
302 func: wasmparser::FunctionBody<'_>,
303 ) -> Result<(), Error<Self::Error>> {
304 utils::parse_function_body(self, code, func)
305 }
306
307 fn new_function_with_parsed_locals(
310 &mut self,
311 func: &wasmparser::FunctionBody<'_>,
312 ) -> Result<crate::Function, Error<Self::Error>> {
313 utils::new_function_with_parsed_locals(self, func)
314 }
315
316 fn parse_instruction<'a>(
318 &mut self,
319 reader: &mut wasmparser::OperatorsReader<'a>,
320 ) -> Result<crate::Instruction<'a>, Error<Self::Error>> {
321 utils::parse_instruction(self, reader)
322 }
323
324 fn parse_data_section(
327 &mut self,
328 data: &mut crate::DataSection,
329 section: wasmparser::DataSectionReader<'_>,
330 ) -> Result<(), Error<Self::Error>> {
331 utils::parse_data_section(self, data, section)
332 }
333
334 fn parse_data(
336 &mut self,
337 data: &mut crate::DataSection,
338 datum: wasmparser::Data<'_>,
339 ) -> Result<(), Error<Self::Error>> {
340 utils::parse_data(self, data, datum)
341 }
342
343 fn parse_element_section(
346 &mut self,
347 elements: &mut crate::ElementSection,
348 section: wasmparser::ElementSectionReader<'_>,
349 ) -> Result<(), Error<Self::Error>> {
350 utils::parse_element_section(self, elements, section)
351 }
352
353 fn parse_element(
356 &mut self,
357 elements: &mut crate::ElementSection,
358 element: wasmparser::Element<'_>,
359 ) -> Result<(), Error<Self::Error>> {
360 utils::parse_element(self, elements, element)
361 }
362
363 fn element_items<'a>(
364 &mut self,
365 items: wasmparser::ElementItems<'a>,
366 ) -> Result<crate::Elements<'a>, Error<Self::Error>> {
367 utils::element_items(self, items)
368 }
369
370 fn parse_export_section(
373 &mut self,
374 exports: &mut crate::ExportSection,
375 section: wasmparser::ExportSectionReader<'_>,
376 ) -> Result<(), Error<Self::Error>> {
377 utils::parse_export_section(self, exports, section)
378 }
379
380 fn parse_export(
383 &mut self,
384 exports: &mut crate::ExportSection,
385 export: wasmparser::Export<'_>,
386 ) -> Result<(), Error<Self::Error>> {
387 utils::parse_export(self, exports, export)
388 }
389
390 fn parse_function_section(
393 &mut self,
394 functions: &mut crate::FunctionSection,
395 section: wasmparser::FunctionSectionReader<'_>,
396 ) -> Result<(), Error<Self::Error>> {
397 utils::parse_function_section(self, functions, section)
398 }
399
400 fn parse_global_section(
403 &mut self,
404 globals: &mut crate::GlobalSection,
405 section: wasmparser::GlobalSectionReader<'_>,
406 ) -> Result<(), Error<Self::Error>> {
407 utils::parse_global_section(self, globals, section)
408 }
409
410 fn parse_global(
413 &mut self,
414 globals: &mut crate::GlobalSection,
415 global: wasmparser::Global<'_>,
416 ) -> Result<(), Error<Self::Error>> {
417 utils::parse_global(self, globals, global)
418 }
419
420 fn parse_import_section(
423 &mut self,
424 imports: &mut crate::ImportSection,
425 section: wasmparser::ImportSectionReader<'_>,
426 ) -> Result<(), Error<Self::Error>> {
427 utils::parse_import_section(self, imports, section)
428 }
429
430 fn parse_imports(
433 &mut self,
434 import_section: &mut crate::ImportSection,
435 imports: wasmparser::Imports<'_>,
436 ) -> Result<(), Error<Self::Error>> {
437 utils::parse_imports(self, import_section, imports)
438 }
439
440 fn parse_import(
443 &mut self,
444 imports: &mut crate::ImportSection,
445 import: wasmparser::Import<'_>,
446 ) -> Result<(), Error<Self::Error>> {
447 utils::parse_import(self, imports, import)
448 }
449
450 fn parse_memory_section(
453 &mut self,
454 memories: &mut crate::MemorySection,
455 section: wasmparser::MemorySectionReader<'_>,
456 ) -> Result<(), Error<Self::Error>> {
457 utils::parse_memory_section(self, memories, section)
458 }
459
460 fn parse_table_section(
463 &mut self,
464 tables: &mut crate::TableSection,
465 section: wasmparser::TableSectionReader<'_>,
466 ) -> Result<(), Error<Self::Error>> {
467 utils::parse_table_section(self, tables, section)
468 }
469
470 fn parse_table(
472 &mut self,
473 tables: &mut crate::TableSection,
474 table: wasmparser::Table<'_>,
475 ) -> Result<(), Error<Self::Error>> {
476 utils::parse_table(self, tables, table)
477 }
478
479 fn parse_tag_section(
482 &mut self,
483 tags: &mut crate::TagSection,
484 section: wasmparser::TagSectionReader<'_>,
485 ) -> Result<(), Error<Self::Error>> {
486 utils::parse_tag_section(self, tags, section)
487 }
488
489 fn parse_type_section(
492 &mut self,
493 types: &mut crate::TypeSection,
494 section: wasmparser::TypeSectionReader<'_>,
495 ) -> Result<(), Error<Self::Error>> {
496 utils::parse_type_section(self, types, section)
497 }
498
499 fn parse_recursive_type_group(
501 &mut self,
502 encoder: CoreTypeEncoder,
503 rec_group: wasmparser::RecGroup,
504 ) -> Result<(), Error<Self::Error>> {
505 utils::parse_recursive_type_group(self, encoder, rec_group)
506 }
507
508 fn parse_unknown_section(
509 &mut self,
510 module: &mut crate::Module,
511 id: u8,
512 contents: &[u8],
513 ) -> Result<(), Error<Self::Error>> {
514 utils::parse_unknown_section(self, module, id, contents)
515 }
516
517 fn intersperse_section_hook(
535 &mut self,
536 module: &mut crate::Module,
537 after: Option<crate::SectionId>,
538 before: Option<crate::SectionId>,
539 ) -> Result<(), Error<Self::Error>> {
540 utils::intersperse_section_hook(self, module, after, before)
541 }
542
543 fn parse_core_module(
544 &mut self,
545 module: &mut crate::Module,
546 parser: wasmparser::Parser,
547 data: &[u8],
548 ) -> Result<(), Error<Self::Error>> {
549 utils::parse_core_module(self, module, parser, data)
550 }
551
552 fn custom_name_section(
553 &mut self,
554 section: wasmparser::NameSectionReader<'_>,
555 ) -> Result<crate::NameSection, Error<Self::Error>> {
556 utils::custom_name_section(self, section)
557 }
558
559 fn parse_custom_name_subsection(
560 &mut self,
561 names: &mut crate::NameSection,
562 section: wasmparser::Name<'_>,
563 ) -> Result<(), Error<Self::Error>> {
564 utils::parse_custom_name_subsection(self, names, section)
565 }
566
567 fn data_count(&mut self, count: u32) -> Result<u32, Error<Self::Error>> {
568 Ok(count)
569 }
570
571 fn start_section(&mut self, start: u32) -> Result<u32, Error<Self::Error>> {
572 self.function_index(start)
573 }
574}
575
576#[derive(Debug)]
578pub enum Error<E = Infallible> {
579 CanonicalizedHeapTypeReference,
583 InvalidConstExpr,
586 InvalidCodeSectionSize,
588 UnexpectedNonCoreModuleSection,
590 UnexpectedNonComponentSection,
592 UnsupportedCoreTypeInComponent,
594 ParseError(wasmparser::BinaryReaderError),
596 UserError(E),
598}
599
600impl<E> From<wasmparser::BinaryReaderError> for Error<E> {
601 fn from(err: wasmparser::BinaryReaderError) -> Self {
602 Self::ParseError(err)
603 }
604}
605
606impl<E: core::fmt::Display> core::fmt::Display for Error<E> {
607 fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
608 match self {
609 Self::ParseError(_e) => {
610 write!(fmt, "There was an error when parsing")
611 }
612 Self::UserError(e) => write!(fmt, "{e}"),
613 Self::InvalidConstExpr => write!(fmt, "The const expression was invalid"),
614 Self::UnexpectedNonCoreModuleSection => write!(
615 fmt,
616 "There was a section that does not belong in a core wasm module"
617 ),
618 Self::UnexpectedNonComponentSection => write!(
619 fmt,
620 "There was a section that does not belong in a component"
621 ),
622 Self::CanonicalizedHeapTypeReference => write!(
623 fmt,
624 "There was a canonicalized heap type reference without type index information"
625 ),
626 Self::UnsupportedCoreTypeInComponent => {
627 fmt.write_str("unsupported core type in a component")
628 }
629 Self::InvalidCodeSectionSize => fmt.write_str("invalid code section size"),
630 }
631 }
632}
633
634impl<E: 'static + StdError> StdError for Error<E> {
635 fn source(&self) -> Option<&(dyn StdError + 'static)> {
636 match self {
637 Self::ParseError(e) => Some(e),
638 Self::UserError(e) => Some(e),
639 Self::InvalidConstExpr
640 | Self::CanonicalizedHeapTypeReference
641 | Self::UnexpectedNonCoreModuleSection
642 | Self::UnexpectedNonComponentSection
643 | Self::UnsupportedCoreTypeInComponent
644 | Self::InvalidCodeSectionSize => None,
645 }
646 }
647}
648
649#[derive(Debug)]
652pub struct RoundtripReencoder;
653
654impl Reencode for RoundtripReencoder {
655 type Error = Infallible;
656}
657
658#[allow(missing_docs)] pub mod utils {
660 use super::{Error, Reencode};
661 use crate::{CoreTypeEncoder, Encode, Imports};
662 use alloc::vec::Vec;
663 use core::ops::Range;
664
665 pub fn parse_core_module<T: ?Sized + Reencode>(
666 reencoder: &mut T,
667 module: &mut crate::Module,
668 parser: wasmparser::Parser,
669 data: &[u8],
670 ) -> Result<(), Error<T::Error>> {
671 fn handle_intersperse_section_hook<T: ?Sized + Reencode>(
672 reencoder: &mut T,
673 module: &mut crate::Module,
674 last_section: &mut Option<crate::SectionId>,
675 next_section: Option<crate::SectionId>,
676 ) -> Result<(), Error<T::Error>> {
677 let after = core::mem::replace(last_section, next_section);
678 let before = next_section;
679 reencoder.intersperse_section_hook(module, after, before)
680 }
681
682 let orig_offset = parser.offset() as usize;
689 let get_original_section = |range: Range<usize>| {
690 data.get(range.start - orig_offset..range.end - orig_offset)
691 .ok_or(Error::InvalidCodeSectionSize)
692 };
693 let mut last_section = None;
694
695 for section in parser.parse_all(data) {
696 match section? {
697 wasmparser::Payload::Version {
698 encoding: wasmparser::Encoding::Module,
699 ..
700 } => (),
701 wasmparser::Payload::Version { .. } => {
702 return Err(Error::UnexpectedNonCoreModuleSection);
703 }
704 wasmparser::Payload::TypeSection(section) => {
705 handle_intersperse_section_hook(
706 reencoder,
707 module,
708 &mut last_section,
709 Some(crate::SectionId::Type),
710 )?;
711 let mut types = crate::TypeSection::new();
712 reencoder.parse_type_section(&mut types, section)?;
713 module.section(&types);
714 }
715 wasmparser::Payload::ImportSection(section) => {
716 handle_intersperse_section_hook(
717 reencoder,
718 module,
719 &mut last_section,
720 Some(crate::SectionId::Import),
721 )?;
722 let mut imports = crate::ImportSection::new();
723 reencoder.parse_import_section(&mut imports, section)?;
724 module.section(&imports);
725 }
726 wasmparser::Payload::FunctionSection(section) => {
727 handle_intersperse_section_hook(
728 reencoder,
729 module,
730 &mut last_section,
731 Some(crate::SectionId::Function),
732 )?;
733 let mut functions = crate::FunctionSection::new();
734 reencoder.parse_function_section(&mut functions, section)?;
735 module.section(&functions);
736 }
737 wasmparser::Payload::TableSection(section) => {
738 handle_intersperse_section_hook(
739 reencoder,
740 module,
741 &mut last_section,
742 Some(crate::SectionId::Table),
743 )?;
744 let mut tables = crate::TableSection::new();
745 reencoder.parse_table_section(&mut tables, section)?;
746 module.section(&tables);
747 }
748 wasmparser::Payload::MemorySection(section) => {
749 handle_intersperse_section_hook(
750 reencoder,
751 module,
752 &mut last_section,
753 Some(crate::SectionId::Memory),
754 )?;
755 let mut memories = crate::MemorySection::new();
756 reencoder.parse_memory_section(&mut memories, section)?;
757 module.section(&memories);
758 }
759 wasmparser::Payload::TagSection(section) => {
760 handle_intersperse_section_hook(
761 reencoder,
762 module,
763 &mut last_section,
764 Some(crate::SectionId::Tag),
765 )?;
766 let mut tags = crate::TagSection::new();
767 reencoder.parse_tag_section(&mut tags, section)?;
768 module.section(&tags);
769 }
770 wasmparser::Payload::GlobalSection(section) => {
771 handle_intersperse_section_hook(
772 reencoder,
773 module,
774 &mut last_section,
775 Some(crate::SectionId::Global),
776 )?;
777 let mut globals = crate::GlobalSection::new();
778 reencoder.parse_global_section(&mut globals, section)?;
779 module.section(&globals);
780 }
781 wasmparser::Payload::ExportSection(section) => {
782 handle_intersperse_section_hook(
783 reencoder,
784 module,
785 &mut last_section,
786 Some(crate::SectionId::Export),
787 )?;
788 let mut exports = crate::ExportSection::new();
789 reencoder.parse_export_section(&mut exports, section)?;
790 module.section(&exports);
791 }
792 wasmparser::Payload::StartSection { func, .. } => {
793 handle_intersperse_section_hook(
794 reencoder,
795 module,
796 &mut last_section,
797 Some(crate::SectionId::Start),
798 )?;
799 module.section(&crate::StartSection {
800 function_index: reencoder.start_section(func)?,
801 });
802 }
803 wasmparser::Payload::ElementSection(section) => {
804 handle_intersperse_section_hook(
805 reencoder,
806 module,
807 &mut last_section,
808 Some(crate::SectionId::Element),
809 )?;
810 let mut elements = crate::ElementSection::new();
811 reencoder.parse_element_section(&mut elements, section)?;
812 module.section(&elements);
813 }
814 wasmparser::Payload::DataCountSection { count, .. } => {
815 handle_intersperse_section_hook(
816 reencoder,
817 module,
818 &mut last_section,
819 Some(crate::SectionId::DataCount),
820 )?;
821 let count = reencoder.data_count(count)?;
822 module.section(&crate::DataCountSection { count });
823 }
824 wasmparser::Payload::DataSection(section) => {
825 handle_intersperse_section_hook(
826 reencoder,
827 module,
828 &mut last_section,
829 Some(crate::SectionId::Data),
830 )?;
831 let mut data = crate::DataSection::new();
832 reencoder.parse_data_section(&mut data, section)?;
833 module.section(&data);
834 }
835 wasmparser::Payload::CodeSectionStart { range, .. } => {
836 handle_intersperse_section_hook(
837 reencoder,
838 module,
839 &mut last_section,
840 Some(crate::SectionId::Code),
841 )?;
842 let mut codes = crate::CodeSection::new();
843
844 let section = get_original_section(range.clone())?;
851 let reader = wasmparser::BinaryReader::new(section, range.start);
852 let section = wasmparser::CodeSectionReader::new(reader)?;
853 reencoder.parse_code_section(&mut codes, section)?;
854 module.section(&codes);
855 }
856
857 wasmparser::Payload::CodeSectionEntry(_) => {}
861
862 #[cfg(feature = "component-model")]
863 wasmparser::Payload::ModuleSection { .. }
864 | wasmparser::Payload::InstanceSection(_)
865 | wasmparser::Payload::CoreTypeSection(_)
866 | wasmparser::Payload::ComponentSection { .. }
867 | wasmparser::Payload::ComponentInstanceSection(_)
868 | wasmparser::Payload::ComponentAliasSection(_)
869 | wasmparser::Payload::ComponentTypeSection(_)
870 | wasmparser::Payload::ComponentCanonicalSection(_)
871 | wasmparser::Payload::ComponentStartSection { .. }
872 | wasmparser::Payload::ComponentImportSection(_)
873 | wasmparser::Payload::ComponentExportSection(_) => {
874 return Err(Error::UnexpectedNonCoreModuleSection);
875 }
876 wasmparser::Payload::CustomSection(section) => {
877 reencoder.parse_custom_section(module, section)?;
878 }
879 wasmparser::Payload::End(_) => {
880 handle_intersperse_section_hook(reencoder, module, &mut last_section, None)?;
881 }
882
883 other => match other.as_section() {
884 Some((id, range)) => {
885 let section = get_original_section(range)?;
886 reencoder.parse_unknown_section(module, id, section)?;
887 }
888 None => unreachable!(),
889 },
890 }
891 }
892
893 Ok(())
894 }
895
896 pub fn intersperse_section_hook<T: ?Sized + Reencode>(
914 _reencoder: &mut T,
915 _module: &mut crate::Module,
916 _after: Option<crate::SectionId>,
917 _before: Option<crate::SectionId>,
918 ) -> Result<(), Error<T::Error>> {
919 Ok(())
920 }
921
922 pub fn memory_index<T: ?Sized + Reencode>(_reencoder: &mut T, memory: u32) -> u32 {
923 memory
924 }
925
926 pub fn ieee32_arg<T: ?Sized + Reencode>(
927 _reencoder: &mut T,
928 arg: wasmparser::Ieee32,
929 ) -> crate::Ieee32 {
930 crate::Ieee32(arg.bits())
931 }
932
933 pub fn ieee64_arg<T: ?Sized + Reencode>(
934 _reencoder: &mut T,
935 arg: wasmparser::Ieee64,
936 ) -> crate::Ieee64 {
937 crate::Ieee64(arg.bits())
938 }
939
940 pub fn mem_arg<T: ?Sized + Reencode>(
941 reencoder: &mut T,
942 arg: wasmparser::MemArg,
943 ) -> Result<crate::MemArg, Error<T::Error>> {
944 Ok(crate::MemArg {
945 offset: arg.offset,
946 align: arg.align.into(),
947 memory_index: reencoder.memory_index(arg.memory)?,
948 })
949 }
950
951 pub fn ordering<T: ?Sized + Reencode>(
952 _reencoder: &mut T,
953 arg: wasmparser::Ordering,
954 ) -> crate::Ordering {
955 match arg {
956 wasmparser::Ordering::SeqCst => crate::Ordering::SeqCst,
957 wasmparser::Ordering::AcqRel => crate::Ordering::AcqRel,
958 }
959 }
960
961 pub fn function_index<T: ?Sized + Reencode>(_reencoder: &mut T, func: u32) -> u32 {
962 func
963 }
964
965 pub fn tag_index<T: ?Sized + Reencode>(_reencoder: &mut T, tag: u32) -> u32 {
966 tag
967 }
968
969 pub fn catch<T: ?Sized + Reencode>(
970 reencoder: &mut T,
971 arg: wasmparser::Catch,
972 ) -> Result<crate::Catch, Error<T::Error>> {
973 Ok(match arg {
974 wasmparser::Catch::One { tag, label } => crate::Catch::One {
975 tag: reencoder.tag_index(tag)?,
976 label,
977 },
978 wasmparser::Catch::OneRef { tag, label } => crate::Catch::OneRef {
979 tag: reencoder.tag_index(tag)?,
980 label,
981 },
982 wasmparser::Catch::All { label } => crate::Catch::All { label },
983 wasmparser::Catch::AllRef { label } => crate::Catch::AllRef { label },
984 })
985 }
986
987 pub fn handle<T: ?Sized + Reencode>(
988 reencoder: &mut T,
989 arg: wasmparser::Handle,
990 ) -> Result<crate::Handle, Error<T::Error>> {
991 Ok(match arg {
992 wasmparser::Handle::OnLabel { tag, label } => crate::Handle::OnLabel {
993 tag: reencoder.tag_index(tag)?,
994 label,
995 },
996 wasmparser::Handle::OnSwitch { tag } => crate::Handle::OnSwitch {
997 tag: reencoder.tag_index(tag)?,
998 },
999 })
1000 }
1001
1002 pub fn parse_custom_section<T: ?Sized + Reencode>(
1005 reencoder: &mut T,
1006 module: &mut crate::Module,
1007 section: wasmparser::CustomSectionReader<'_>,
1008 ) -> Result<(), Error<T::Error>> {
1009 match section.as_known() {
1010 wasmparser::KnownCustom::Name(name) => {
1011 module.section(&reencoder.custom_name_section(name)?);
1012 }
1013 _ => {
1014 module.section(&reencoder.custom_section(section)?);
1015 }
1016 }
1017 Ok(())
1018 }
1019
1020 pub fn custom_section<'a, T: ?Sized + Reencode>(
1023 _reencoder: &mut T,
1024 section: wasmparser::CustomSectionReader<'a>,
1025 ) -> crate::CustomSection<'a> {
1026 crate::CustomSection {
1027 data: section.data().into(),
1028 name: section.name().into(),
1029 }
1030 }
1031
1032 pub fn export_kind<T: ?Sized + Reencode>(
1033 _reencoder: &mut T,
1034 external_kind: wasmparser::ExternalKind,
1035 ) -> crate::ExportKind {
1036 match external_kind {
1037 wasmparser::ExternalKind::Func | wasmparser::ExternalKind::FuncExact => {
1038 crate::ExportKind::Func
1039 }
1040 wasmparser::ExternalKind::Table => crate::ExportKind::Table,
1041 wasmparser::ExternalKind::Memory => crate::ExportKind::Memory,
1042 wasmparser::ExternalKind::Global => crate::ExportKind::Global,
1043 wasmparser::ExternalKind::Tag => crate::ExportKind::Tag,
1044 }
1045 }
1046
1047 pub fn memory_type<T: ?Sized + Reencode>(
1048 _reencoder: &mut T,
1049 memory_ty: wasmparser::MemoryType,
1050 ) -> crate::MemoryType {
1051 crate::MemoryType {
1052 minimum: memory_ty.initial,
1053 maximum: memory_ty.maximum,
1054 memory64: memory_ty.memory64,
1055 shared: memory_ty.shared,
1056 page_size_log2: memory_ty.page_size_log2,
1057 }
1058 }
1059
1060 pub fn tag_kind<T: ?Sized + Reencode>(
1061 _reencoder: &mut T,
1062 kind: wasmparser::TagKind,
1063 ) -> crate::TagKind {
1064 match kind {
1065 wasmparser::TagKind::Exception => crate::TagKind::Exception,
1066 }
1067 }
1068
1069 pub fn type_index<T: ?Sized + Reencode>(_reencoder: &mut T, ty: u32) -> u32 {
1070 ty
1071 }
1072
1073 pub fn type_index_unpacked<T: ?Sized + Reencode>(
1074 reencoder: &mut T,
1075 ty: wasmparser::UnpackedIndex,
1076 ) -> Result<u32, Error<T::Error>> {
1077 ty.as_module_index()
1078 .ok_or(Error::CanonicalizedHeapTypeReference)
1079 .and_then(|ty| reencoder.type_index(ty))
1080 }
1081
1082 pub fn tag_type<T: ?Sized + Reencode>(
1083 reencoder: &mut T,
1084 tag_ty: wasmparser::TagType,
1085 ) -> Result<crate::TagType, Error<T::Error>> {
1086 Ok(crate::TagType {
1087 kind: reencoder.tag_kind(tag_ty.kind)?,
1088 func_type_idx: reencoder.type_index(tag_ty.func_type_idx)?,
1089 })
1090 }
1091
1092 pub fn abstract_heap_type<T: ?Sized + Reencode>(
1093 _reencoder: &mut T,
1094 value: wasmparser::AbstractHeapType,
1095 ) -> crate::AbstractHeapType {
1096 use wasmparser::AbstractHeapType::*;
1097 match value {
1098 Func => crate::AbstractHeapType::Func,
1099 Extern => crate::AbstractHeapType::Extern,
1100 Any => crate::AbstractHeapType::Any,
1101 None => crate::AbstractHeapType::None,
1102 NoExtern => crate::AbstractHeapType::NoExtern,
1103 NoFunc => crate::AbstractHeapType::NoFunc,
1104 Eq => crate::AbstractHeapType::Eq,
1105 Struct => crate::AbstractHeapType::Struct,
1106 Array => crate::AbstractHeapType::Array,
1107 I31 => crate::AbstractHeapType::I31,
1108 Exn => crate::AbstractHeapType::Exn,
1109 NoExn => crate::AbstractHeapType::NoExn,
1110 Cont => crate::AbstractHeapType::Cont,
1111 NoCont => crate::AbstractHeapType::NoCont,
1112 }
1113 }
1114
1115 pub fn parse_type_section<T: ?Sized + Reencode>(
1118 reencoder: &mut T,
1119 types: &mut crate::TypeSection,
1120 section: wasmparser::TypeSectionReader<'_>,
1121 ) -> Result<(), Error<T::Error>> {
1122 for rec_group in section {
1123 reencoder.parse_recursive_type_group(types.ty(), rec_group?)?;
1124 }
1125 Ok(())
1126 }
1127
1128 pub fn parse_recursive_type_group<T: ?Sized + Reencode>(
1130 reencoder: &mut T,
1131 encoder: CoreTypeEncoder,
1132 rec_group: wasmparser::RecGroup,
1133 ) -> Result<(), Error<T::Error>> {
1134 if rec_group.is_explicit_rec_group() {
1135 let subtypes = rec_group
1136 .into_types()
1137 .map(|t| reencoder.sub_type(t))
1138 .collect::<Result<Vec<_>, _>>()?;
1139 encoder.rec(subtypes);
1140 } else {
1141 let ty = rec_group.into_types().next().unwrap();
1142 encoder.subtype(&reencoder.sub_type(ty)?);
1143 }
1144 Ok(())
1145 }
1146
1147 pub fn sub_type<T: ?Sized + Reencode>(
1148 reencoder: &mut T,
1149 sub_ty: wasmparser::SubType,
1150 ) -> Result<crate::SubType, Error<T::Error>> {
1151 Ok(crate::SubType {
1152 is_final: sub_ty.is_final,
1153 supertype_idx: sub_ty
1154 .supertype_idx
1155 .map(|i| reencoder.type_index_unpacked(i.unpack()))
1156 .transpose()?,
1157 composite_type: reencoder.composite_type(sub_ty.composite_type)?,
1158 })
1159 }
1160
1161 pub fn composite_type<T: ?Sized + Reencode>(
1162 reencoder: &mut T,
1163 composite_ty: wasmparser::CompositeType,
1164 ) -> Result<crate::CompositeType, Error<T::Error>> {
1165 let inner = match composite_ty.inner {
1166 wasmparser::CompositeInnerType::Func(f) => {
1167 crate::CompositeInnerType::Func(reencoder.func_type(f)?)
1168 }
1169 wasmparser::CompositeInnerType::Array(a) => {
1170 crate::CompositeInnerType::Array(reencoder.array_type(a)?)
1171 }
1172 wasmparser::CompositeInnerType::Struct(s) => {
1173 crate::CompositeInnerType::Struct(reencoder.struct_type(s)?)
1174 }
1175 wasmparser::CompositeInnerType::Cont(c) => {
1176 crate::CompositeInnerType::Cont(reencoder.cont_type(c)?)
1177 }
1178 };
1179 Ok(crate::CompositeType {
1180 inner,
1181 shared: composite_ty.shared,
1182 descriptor: composite_ty
1183 .descriptor_idx
1184 .map(|i| reencoder.type_index_unpacked(i.unpack()))
1185 .transpose()?,
1186 describes: composite_ty
1187 .describes_idx
1188 .map(|i| reencoder.type_index_unpacked(i.unpack()))
1189 .transpose()?,
1190 })
1191 }
1192
1193 pub fn func_type<T: ?Sized + Reencode>(
1194 reencoder: &mut T,
1195 func_ty: wasmparser::FuncType,
1196 ) -> Result<crate::FuncType, Error<T::Error>> {
1197 let mut buf = Vec::with_capacity(func_ty.params().len() + func_ty.results().len());
1198 for ty in func_ty.params().iter().chain(func_ty.results()).copied() {
1199 buf.push(reencoder.val_type(ty)?);
1200 }
1201 Ok(crate::FuncType::from_parts(
1202 buf.into(),
1203 func_ty.params().len(),
1204 ))
1205 }
1206
1207 pub fn array_type<T: ?Sized + Reencode>(
1208 reencoder: &mut T,
1209 array_ty: wasmparser::ArrayType,
1210 ) -> Result<crate::ArrayType, Error<T::Error>> {
1211 Ok(crate::ArrayType(reencoder.field_type(array_ty.0)?))
1212 }
1213
1214 pub fn struct_type<T: ?Sized + Reencode>(
1215 reencoder: &mut T,
1216 struct_ty: wasmparser::StructType,
1217 ) -> Result<crate::StructType, Error<T::Error>> {
1218 Ok(crate::StructType {
1219 fields: struct_ty
1220 .fields
1221 .iter()
1222 .map(|field_ty| reencoder.field_type(*field_ty))
1223 .collect::<Result<_, _>>()?,
1224 })
1225 }
1226
1227 pub fn field_type<T: ?Sized + Reencode>(
1228 reencoder: &mut T,
1229 field_ty: wasmparser::FieldType,
1230 ) -> Result<crate::FieldType, Error<T::Error>> {
1231 Ok(crate::FieldType {
1232 element_type: reencoder.storage_type(field_ty.element_type)?,
1233 mutable: field_ty.mutable,
1234 })
1235 }
1236
1237 pub fn storage_type<T: ?Sized + Reencode>(
1238 reencoder: &mut T,
1239 storage_ty: wasmparser::StorageType,
1240 ) -> Result<crate::StorageType, Error<T::Error>> {
1241 Ok(match storage_ty {
1242 wasmparser::StorageType::I8 => crate::StorageType::I8,
1243 wasmparser::StorageType::I16 => crate::StorageType::I16,
1244 wasmparser::StorageType::Val(v) => crate::StorageType::Val(reencoder.val_type(v)?),
1245 })
1246 }
1247
1248 pub fn cont_type<T: ?Sized + Reencode>(
1249 reencoder: &mut T,
1250 cont_ty: wasmparser::ContType,
1251 ) -> Result<crate::ContType, Error<T::Error>> {
1252 Ok(crate::ContType(
1253 reencoder.type_index_unpacked(cont_ty.0.unpack())?,
1254 ))
1255 }
1256
1257 pub fn val_type<T: ?Sized + Reencode>(
1258 reencoder: &mut T,
1259 val_ty: wasmparser::ValType,
1260 ) -> Result<crate::ValType, Error<T::Error>> {
1261 Ok(match val_ty {
1262 wasmparser::ValType::I32 => crate::ValType::I32,
1263 wasmparser::ValType::I64 => crate::ValType::I64,
1264 wasmparser::ValType::F32 => crate::ValType::F32,
1265 wasmparser::ValType::F64 => crate::ValType::F64,
1266 wasmparser::ValType::V128 => crate::ValType::V128,
1267 wasmparser::ValType::Ref(r) => crate::ValType::Ref(reencoder.ref_type(r)?),
1268 })
1269 }
1270
1271 pub fn ref_type<T: ?Sized + Reencode>(
1272 reencoder: &mut T,
1273 ref_type: wasmparser::RefType,
1274 ) -> Result<crate::RefType, Error<T::Error>> {
1275 Ok(crate::RefType {
1276 nullable: ref_type.is_nullable(),
1277 heap_type: reencoder.heap_type(ref_type.heap_type())?,
1278 })
1279 }
1280
1281 pub fn heap_type<T: ?Sized + Reencode>(
1282 reencoder: &mut T,
1283 heap_type: wasmparser::HeapType,
1284 ) -> Result<crate::HeapType, Error<T::Error>> {
1285 Ok(match heap_type {
1286 wasmparser::HeapType::Concrete(i) => {
1287 crate::HeapType::Concrete(reencoder.type_index_unpacked(i)?)
1288 }
1289 wasmparser::HeapType::Exact(i) => {
1290 crate::HeapType::Exact(reencoder.type_index_unpacked(i)?)
1291 }
1292 wasmparser::HeapType::Abstract { shared, ty } => crate::HeapType::Abstract {
1293 shared,
1294 ty: reencoder.abstract_heap_type(ty)?,
1295 },
1296 })
1297 }
1298
1299 pub fn parse_table_section<T: ?Sized + Reencode>(
1302 reencoder: &mut T,
1303 tables: &mut crate::TableSection,
1304 section: wasmparser::TableSectionReader<'_>,
1305 ) -> Result<(), Error<T::Error>> {
1306 for table in section {
1307 reencoder.parse_table(tables, table?)?;
1308 }
1309 Ok(())
1310 }
1311
1312 pub fn parse_table<T: ?Sized + Reencode>(
1314 reencoder: &mut T,
1315 tables: &mut crate::TableSection,
1316 table: wasmparser::Table<'_>,
1317 ) -> Result<(), Error<T::Error>> {
1318 let ty = reencoder.table_type(table.ty)?;
1319 match table.init {
1320 wasmparser::TableInit::RefNull => {
1321 tables.table(ty);
1322 }
1323 wasmparser::TableInit::Expr(e) => {
1324 tables.table_with_init(ty, &reencoder.const_expr(e)?);
1325 }
1326 }
1327 Ok(())
1328 }
1329
1330 pub fn table_type<T: ?Sized + Reencode>(
1331 reencoder: &mut T,
1332 table_ty: wasmparser::TableType,
1333 ) -> Result<crate::TableType, Error<T::Error>> {
1334 Ok(crate::TableType {
1335 element_type: reencoder.ref_type(table_ty.element_type)?,
1336 minimum: table_ty.initial,
1337 maximum: table_ty.maximum,
1338 table64: table_ty.table64,
1339 shared: table_ty.shared,
1340 })
1341 }
1342
1343 pub fn parse_tag_section<T: ?Sized + Reencode>(
1346 reencoder: &mut T,
1347 tags: &mut crate::TagSection,
1348 section: wasmparser::TagSectionReader<'_>,
1349 ) -> Result<(), Error<T::Error>> {
1350 for tag in section {
1351 let tag = tag?;
1352 tags.tag(reencoder.tag_type(tag)?);
1353 }
1354 Ok(())
1355 }
1356
1357 pub fn parse_export_section<T: ?Sized + Reencode>(
1360 reencoder: &mut T,
1361 exports: &mut crate::ExportSection,
1362 section: wasmparser::ExportSectionReader<'_>,
1363 ) -> Result<(), Error<T::Error>> {
1364 for export in section {
1365 reencoder.parse_export(exports, export?)?;
1366 }
1367 Ok(())
1368 }
1369
1370 pub fn parse_export<T: ?Sized + Reencode>(
1373 reencoder: &mut T,
1374 exports: &mut crate::ExportSection,
1375 export: wasmparser::Export<'_>,
1376 ) -> Result<(), Error<T::Error>> {
1377 exports.export(
1378 export.name,
1379 reencoder.export_kind(export.kind)?,
1380 reencoder.external_index(export.kind, export.index)?,
1381 );
1382 Ok(())
1383 }
1384
1385 pub fn parse_global_section<T: ?Sized + Reencode>(
1388 reencoder: &mut T,
1389 globals: &mut crate::GlobalSection,
1390 section: wasmparser::GlobalSectionReader<'_>,
1391 ) -> Result<(), Error<T::Error>> {
1392 for global in section {
1393 reencoder.parse_global(globals, global?)?;
1394 }
1395 Ok(())
1396 }
1397
1398 pub fn parse_global<T: ?Sized + Reencode>(
1401 reencoder: &mut T,
1402 globals: &mut crate::GlobalSection,
1403 global: wasmparser::Global<'_>,
1404 ) -> Result<(), Error<T::Error>> {
1405 globals.global(
1406 reencoder.global_type(global.ty)?,
1407 &reencoder.const_expr(global.init_expr)?,
1408 );
1409 Ok(())
1410 }
1411
1412 pub fn global_type<T: ?Sized + Reencode>(
1413 reencoder: &mut T,
1414 global_ty: wasmparser::GlobalType,
1415 ) -> Result<crate::GlobalType, Error<T::Error>> {
1416 Ok(crate::GlobalType {
1417 val_type: reencoder.val_type(global_ty.content_type)?,
1418 mutable: global_ty.mutable,
1419 shared: global_ty.shared,
1420 })
1421 }
1422
1423 pub fn entity_type<T: ?Sized + Reencode>(
1424 reencoder: &mut T,
1425 type_ref: wasmparser::TypeRef,
1426 ) -> Result<crate::EntityType, Error<T::Error>> {
1427 Ok(match type_ref {
1428 wasmparser::TypeRef::Func(i) => crate::EntityType::Function(reencoder.type_index(i)?),
1429 wasmparser::TypeRef::FuncExact(i) => {
1430 crate::EntityType::FunctionExact(reencoder.type_index(i)?)
1431 }
1432 wasmparser::TypeRef::Table(t) => crate::EntityType::Table(reencoder.table_type(t)?),
1433 wasmparser::TypeRef::Memory(m) => crate::EntityType::Memory(reencoder.memory_type(m)?),
1434 wasmparser::TypeRef::Global(g) => crate::EntityType::Global(reencoder.global_type(g)?),
1435 wasmparser::TypeRef::Tag(t) => crate::EntityType::Tag(reencoder.tag_type(t)?),
1436 })
1437 }
1438
1439 pub fn parse_import_section<T: ?Sized + Reencode>(
1442 reencoder: &mut T,
1443 import_section: &mut crate::ImportSection,
1444 section: wasmparser::ImportSectionReader<'_>,
1445 ) -> Result<(), Error<T::Error>> {
1446 for imports in section {
1447 let imports = imports?;
1448 reencoder.parse_imports(import_section, imports)?;
1449 }
1450 Ok(())
1451 }
1452
1453 pub fn parse_imports<T: ?Sized + Reencode>(
1456 reencoder: &mut T,
1457 import_section: &mut crate::ImportSection,
1458 imports: wasmparser::Imports<'_>,
1459 ) -> Result<(), Error<T::Error>> {
1460 import_section.imports(match imports {
1461 wasmparser::Imports::Single(_, import) => Imports::Single(crate::Import {
1462 module: import.module,
1463 name: import.name,
1464 ty: reencoder.entity_type(import.ty)?,
1465 }),
1466 wasmparser::Imports::Compact1 { module, items } => {
1467 let mut new_items: Vec<crate::ImportCompact> = Vec::new();
1468 for item in items {
1469 let item = item?;
1470 new_items.push(crate::ImportCompact {
1471 name: item.name,
1472 ty: reencoder.entity_type(item.ty)?,
1473 })
1474 }
1475 Imports::Compact1 {
1476 module: module,
1477 items: new_items.into(),
1478 }
1479 }
1480 wasmparser::Imports::Compact2 { module, ty, names } => {
1481 let names = names.into_iter().collect::<wasmparser::Result<Vec<_>>>()?;
1482 Imports::Compact2 {
1483 module: module,
1484 ty: reencoder.entity_type(ty)?,
1485 names: names.into(),
1486 }
1487 }
1488 });
1489 Ok(())
1490 }
1491
1492 pub fn parse_import<T: ?Sized + Reencode>(
1495 reencoder: &mut T,
1496 imports: &mut crate::ImportSection,
1497 import: wasmparser::Import<'_>,
1498 ) -> Result<(), Error<T::Error>> {
1499 reencoder.parse_imports(imports, wasmparser::Imports::Single(0, import))?;
1500 Ok(())
1501 }
1502
1503 pub fn parse_memory_section<T: ?Sized + Reencode>(
1506 reencoder: &mut T,
1507 memories: &mut crate::MemorySection,
1508 section: wasmparser::MemorySectionReader<'_>,
1509 ) -> Result<(), Error<T::Error>> {
1510 for memory in section {
1511 let memory = memory?;
1512 memories.memory(reencoder.memory_type(memory)?);
1513 }
1514 Ok(())
1515 }
1516
1517 pub fn parse_function_section<T: ?Sized + Reencode>(
1520 reencoder: &mut T,
1521 functions: &mut crate::FunctionSection,
1522 section: wasmparser::FunctionSectionReader<'_>,
1523 ) -> Result<(), Error<T::Error>> {
1524 for func in section {
1525 functions.function(reencoder.type_index(func?)?);
1526 }
1527 Ok(())
1528 }
1529
1530 pub fn parse_data_section<T: ?Sized + Reencode>(
1533 reencoder: &mut T,
1534 data: &mut crate::DataSection,
1535 section: wasmparser::DataSectionReader<'_>,
1536 ) -> Result<(), Error<T::Error>> {
1537 for datum in section {
1538 reencoder.parse_data(data, datum?)?;
1539 }
1540 Ok(())
1541 }
1542
1543 pub fn parse_data<T: ?Sized + Reencode>(
1545 reencoder: &mut T,
1546 data: &mut crate::DataSection,
1547 datum: wasmparser::Data<'_>,
1548 ) -> Result<(), Error<T::Error>> {
1549 match datum.kind {
1550 wasmparser::DataKind::Active {
1551 memory_index,
1552 offset_expr,
1553 } => data.active(
1554 reencoder.memory_index(memory_index)?,
1555 &reencoder.const_expr(offset_expr)?,
1556 datum.data.iter().copied(),
1557 ),
1558 wasmparser::DataKind::Passive => data.passive(datum.data.iter().copied()),
1559 };
1560 Ok(())
1561 }
1562
1563 pub fn parse_element_section<T: ?Sized + Reencode>(
1566 reencoder: &mut T,
1567 elements: &mut crate::ElementSection,
1568 section: wasmparser::ElementSectionReader<'_>,
1569 ) -> Result<(), Error<T::Error>> {
1570 for element in section {
1571 reencoder.parse_element(elements, element?)?;
1572 }
1573 Ok(())
1574 }
1575
1576 pub fn parse_element<T: ?Sized + Reencode>(
1579 reencoder: &mut T,
1580 elements: &mut crate::ElementSection,
1581 element: wasmparser::Element<'_>,
1582 ) -> Result<(), Error<T::Error>> {
1583 let elems = reencoder.element_items(element.items)?;
1584 match element.kind {
1585 wasmparser::ElementKind::Active {
1586 table_index,
1587 offset_expr,
1588 } => elements.active(
1589 match (
1599 table_index,
1600 reencoder.table_index(table_index.unwrap_or(0))?,
1601 ) {
1602 (None, 0) => None,
1603 (_, n) => Some(n),
1604 },
1605 &reencoder.const_expr(offset_expr)?,
1606 elems,
1607 ),
1608 wasmparser::ElementKind::Passive => elements.passive(elems),
1609 wasmparser::ElementKind::Declared => elements.declared(elems),
1610 };
1611 Ok(())
1612 }
1613
1614 pub fn element_items<'a, T: ?Sized + Reencode>(
1615 reencoder: &mut T,
1616 items: wasmparser::ElementItems<'a>,
1617 ) -> Result<crate::Elements<'a>, Error<T::Error>> {
1618 Ok(match items {
1619 wasmparser::ElementItems::Functions(f) => {
1620 let mut funcs = Vec::new();
1621 for func in f {
1622 funcs.push(reencoder.function_index(func?)?);
1623 }
1624 crate::Elements::Functions(funcs.into())
1625 }
1626 wasmparser::ElementItems::Expressions(ty, e) => {
1627 let mut exprs = Vec::new();
1628 for expr in e {
1629 exprs.push(reencoder.const_expr(expr?)?);
1630 }
1631 crate::Elements::Expressions(reencoder.ref_type(ty)?, exprs.into())
1632 }
1633 })
1634 }
1635
1636 pub fn table_index<T: ?Sized + Reencode>(_reencoder: &mut T, table: u32) -> u32 {
1637 table
1638 }
1639
1640 pub fn global_index<T: ?Sized + Reencode>(_reencoder: &mut T, global: u32) -> u32 {
1641 global
1642 }
1643
1644 pub fn data_index<T: ?Sized + Reencode>(_reencoder: &mut T, data: u32) -> u32 {
1645 data
1646 }
1647
1648 pub fn element_index<T: ?Sized + Reencode>(_reencoder: &mut T, element: u32) -> u32 {
1649 element
1650 }
1651
1652 pub fn const_expr<T: ?Sized + Reencode>(
1653 reencoder: &mut T,
1654 const_expr: wasmparser::ConstExpr,
1655 ) -> Result<crate::ConstExpr, Error<T::Error>> {
1656 let mut ops = const_expr.get_operators_reader();
1657 let mut bytes = Vec::new();
1658
1659 while !ops.is_end_then_eof() {
1660 let insn = reencoder.parse_instruction(&mut ops)?;
1661 insn.encode(&mut bytes);
1662 }
1663
1664 Ok(crate::ConstExpr::raw(bytes))
1665 }
1666
1667 pub fn block_type<T: ?Sized + Reencode>(
1668 reencoder: &mut T,
1669 arg: wasmparser::BlockType,
1670 ) -> Result<crate::BlockType, Error<T::Error>> {
1671 match arg {
1672 wasmparser::BlockType::Empty => Ok(crate::BlockType::Empty),
1673 wasmparser::BlockType::FuncType(n) => {
1674 Ok(crate::BlockType::FunctionType(reencoder.type_index(n)?))
1675 }
1676 wasmparser::BlockType::Type(t) => Ok(crate::BlockType::Result(reencoder.val_type(t)?)),
1677 }
1678 }
1679
1680 pub fn instruction<'a, T: ?Sized + Reencode>(
1681 reencoder: &mut T,
1682 arg: wasmparser::Operator<'a>,
1683 ) -> Result<crate::Instruction<'a>, Error<T::Error>> {
1684 use crate::Instruction;
1685 use alloc::borrow::Cow;
1686
1687 macro_rules! translate {
1688 ($( @$proposal:ident $op:ident $({ $($arg:ident: $argty:ty),* })? => $visit:ident ($($ann:tt)*))*) => {
1689 Ok(match arg {
1690 $(
1691 wasmparser::Operator::$op $({ $($arg),* })? => {
1692 $(
1693 $(let $arg = translate!(map $arg $arg);)*
1694 )?
1695 translate!(build $op $($($arg)*)?)
1696 }
1697 )*
1698 unexpected => unreachable!("encountered unexpected Wasm operator: {unexpected:?}"),
1699 })
1700 };
1701
1702 (map $arg:ident tag_index) => (reencoder.tag_index($arg)?);
1706 (map $arg:ident function_index) => (reencoder.function_index($arg)?);
1707 (map $arg:ident table) => (reencoder.table_index($arg)?);
1708 (map $arg:ident table_index) => (reencoder.table_index($arg)?);
1709 (map $arg:ident dst_table) => (reencoder.table_index($arg)?);
1710 (map $arg:ident src_table) => (reencoder.table_index($arg)?);
1711 (map $arg:ident type_index) => (reencoder.type_index($arg)?);
1712 (map $arg:ident array_type_index) => (reencoder.type_index($arg)?);
1713 (map $arg:ident array_type_index_dst) => (reencoder.type_index($arg)?);
1714 (map $arg:ident array_type_index_src) => (reencoder.type_index($arg)?);
1715 (map $arg:ident struct_type_index) => (reencoder.type_index($arg)?);
1716 (map $arg:ident global_index) => (reencoder.global_index($arg)?);
1717 (map $arg:ident mem) => (reencoder.memory_index($arg)?);
1718 (map $arg:ident src_mem) => (reencoder.memory_index($arg)?);
1719 (map $arg:ident dst_mem) => (reencoder.memory_index($arg)?);
1720 (map $arg:ident data_index) => (reencoder.data_index($arg)?);
1721 (map $arg:ident elem_index) => (reencoder.element_index($arg)?);
1722 (map $arg:ident array_data_index) => (reencoder.data_index($arg)?);
1723 (map $arg:ident array_elem_index) => (reencoder.element_index($arg)?);
1724 (map $arg:ident blockty) => (reencoder.block_type($arg)?);
1725 (map $arg:ident relative_depth) => ($arg);
1726 (map $arg:ident targets) => ((
1727 $arg
1728 .targets()
1729 .collect::<Result<Vec<_>, wasmparser::BinaryReaderError>>()?
1730 .into(),
1731 $arg.default(),
1732 ));
1733 (map $arg:ident ty) => (reencoder.val_type($arg)?);
1734 (map $arg:ident tys) => (reencoder.val_types($arg)?);
1735 (map $arg:ident hty) => (reencoder.heap_type($arg)?);
1736 (map $arg:ident from_ref_type) => (reencoder.ref_type($arg)?);
1737 (map $arg:ident to_ref_type) => (reencoder.ref_type($arg)?);
1738 (map $arg:ident memarg) => (reencoder.mem_arg($arg)?);
1739 (map $arg:ident ordering) => (reencoder.ordering($arg)?);
1740 (map $arg:ident local_index) => ($arg);
1741 (map $arg:ident value) => ($arg);
1742 (map $arg:ident lane) => ($arg);
1743 (map $arg:ident lanes) => ($arg);
1744 (map $arg:ident array_size) => ($arg);
1745 (map $arg:ident field_index) => ($arg);
1746 (map $arg:ident try_table) => ($arg);
1747 (map $arg:ident argument_index) => (reencoder.type_index($arg)?);
1748 (map $arg:ident result_index) => (reencoder.type_index($arg)?);
1749 (map $arg:ident cont_type_index) => (reencoder.type_index($arg)?);
1750 (map $arg:ident resume_table) => ((
1751 $arg.handlers.into_iter()
1752 .map(|h| reencoder.handle(h))
1753 .collect::<Result<Vec<_>, _>>()?
1754 .into()
1755 ));
1756
1757 (build $op:ident) => (Instruction::$op);
1762 (build BrTable $arg:ident) => (Instruction::BrTable($arg.0, $arg.1));
1763 (build TypedSelectMulti $arg:ident) => (Instruction::TypedSelectMulti(Cow::from($arg)));
1764 (build I32Const $arg:ident) => (Instruction::I32Const($arg));
1765 (build I64Const $arg:ident) => (Instruction::I64Const($arg));
1766 (build F32Const $arg:ident) => (Instruction::F32Const($arg.into()));
1767 (build F64Const $arg:ident) => (Instruction::F64Const($arg.into()));
1768 (build V128Const $arg:ident) => (Instruction::V128Const($arg.i128()));
1769 (build TryTable $table:ident) => (Instruction::TryTable(reencoder.block_type($table.ty)?, {
1770 $table.catches.into_iter()
1771 .map(|c| reencoder.catch(c))
1772 .collect::<Result<Vec<_>, _>>()?
1773 .into()
1774 }));
1775 (build $op:ident $arg:ident) => (Instruction::$op($arg));
1776 (build $op:ident $($arg:ident)*) => (Instruction::$op { $($arg),* });
1777 }
1778
1779 wasmparser::for_each_operator!(translate)
1780 }
1781
1782 pub fn parse_code_section<T: ?Sized + Reencode>(
1785 reencoder: &mut T,
1786 code: &mut crate::CodeSection,
1787 section: wasmparser::CodeSectionReader<'_>,
1788 ) -> Result<(), Error<T::Error>> {
1789 for func in section {
1790 reencoder.parse_function_body(code, func?)?;
1791 }
1792 Ok(())
1793 }
1794
1795 pub fn parse_function_body<T: ?Sized + Reencode>(
1797 reencoder: &mut T,
1798 code: &mut crate::CodeSection,
1799 func: wasmparser::FunctionBody<'_>,
1800 ) -> Result<(), Error<T::Error>> {
1801 let mut f = reencoder.new_function_with_parsed_locals(&func)?;
1802 let mut reader = func.get_operators_reader()?;
1803 while !reader.eof() {
1804 f.instruction(&reencoder.parse_instruction(&mut reader)?);
1805 }
1806 code.function(&f);
1807 Ok(())
1808 }
1809
1810 pub fn new_function_with_parsed_locals<T: ?Sized + Reencode>(
1813 reencoder: &mut T,
1814 func: &wasmparser::FunctionBody<'_>,
1815 ) -> Result<crate::Function, Error<T::Error>> {
1816 let mut locals = Vec::new();
1817 for pair in func.get_locals_reader()? {
1818 let (cnt, ty) = pair?;
1819 locals.push((cnt, reencoder.val_type(ty)?));
1820 }
1821 Ok(crate::Function::new(locals))
1822 }
1823
1824 pub fn parse_instruction<'a, T: ?Sized + Reencode>(
1826 reencoder: &mut T,
1827 reader: &mut wasmparser::OperatorsReader<'a>,
1828 ) -> Result<crate::Instruction<'a>, Error<T::Error>> {
1829 let instruction = reencoder.instruction(reader.read()?)?;
1830 Ok(instruction)
1831 }
1832
1833 pub fn parse_unknown_section<T: ?Sized + Reencode>(
1834 _reencoder: &mut T,
1835 module: &mut crate::Module,
1836 id: u8,
1837 contents: &[u8],
1838 ) -> Result<(), Error<T::Error>> {
1839 module.section(&crate::RawSection { id, data: contents });
1840 Ok(())
1841 }
1842
1843 pub fn custom_name_section<T: ?Sized + Reencode>(
1844 reencoder: &mut T,
1845 section: wasmparser::NameSectionReader<'_>,
1846 ) -> Result<crate::NameSection, Error<T::Error>> {
1847 let mut ret = crate::NameSection::new();
1848 for subsection in section {
1849 reencoder.parse_custom_name_subsection(&mut ret, subsection?)?;
1850 }
1851 Ok(ret)
1852 }
1853
1854 pub fn parse_custom_name_subsection<T: ?Sized + Reencode>(
1855 reencoder: &mut T,
1856 names: &mut crate::NameSection,
1857 section: wasmparser::Name<'_>,
1858 ) -> Result<(), Error<T::Error>> {
1859 match section {
1860 wasmparser::Name::Module { name, .. } => {
1861 names.module(name);
1862 }
1863 wasmparser::Name::Function(map) => {
1864 names.functions(&name_map(map, |i| reencoder.function_index(i))?);
1865 }
1866 wasmparser::Name::Type(map) => {
1867 names.types(&name_map(map, |i| reencoder.type_index(i))?);
1868 }
1869 wasmparser::Name::Local(map) => {
1870 names.locals(&indirect_name_map(map, |i| reencoder.function_index(i))?);
1871 }
1872 wasmparser::Name::Label(map) => {
1873 names.labels(&indirect_name_map(map, |i| reencoder.function_index(i))?);
1874 }
1875 wasmparser::Name::Table(map) => {
1876 names.tables(&name_map(map, |i| reencoder.table_index(i))?);
1877 }
1878 wasmparser::Name::Memory(map) => {
1879 names.memories(&name_map(map, |i| reencoder.memory_index(i))?);
1880 }
1881 wasmparser::Name::Global(map) => {
1882 names.globals(&name_map(map, |i| reencoder.global_index(i))?);
1883 }
1884 wasmparser::Name::Element(map) => {
1885 names.elements(&name_map(map, |i| reencoder.element_index(i))?);
1886 }
1887 wasmparser::Name::Data(map) => {
1888 names.data(&name_map(map, |i| reencoder.data_index(i))?);
1889 }
1890 wasmparser::Name::Tag(map) => {
1891 names.tags(&name_map(map, |i| reencoder.tag_index(i))?);
1892 }
1893 wasmparser::Name::Field(map) => {
1894 names.fields(&indirect_name_map(map, |i| reencoder.type_index(i))?);
1895 }
1896 wasmparser::Name::Unknown { ty, data, .. } => {
1897 names.raw(ty, data);
1898 }
1899 }
1900 Ok(())
1901 }
1902
1903 pub fn name_map<E>(
1904 map: wasmparser::NameMap<'_>,
1905 mut map_index: impl FnMut(u32) -> Result<u32, Error<E>>,
1906 ) -> Result<crate::NameMap, Error<E>> {
1907 let mut ret = crate::NameMap::new();
1908 for naming in map {
1909 let naming = naming?;
1910 ret.append(map_index(naming.index)?, naming.name);
1911 }
1912 Ok(ret)
1913 }
1914
1915 pub fn indirect_name_map<E>(
1916 map: wasmparser::IndirectNameMap<'_>,
1917 mut map_index: impl FnMut(u32) -> Result<u32, Error<E>>,
1918 ) -> Result<crate::IndirectNameMap, Error<E>> {
1919 let mut ret = crate::IndirectNameMap::new();
1920 for naming in map {
1921 let naming = naming?;
1922 ret.append(
1923 map_index(naming.index)?,
1924 &name_map(naming.names, |i| Ok(i))?,
1925 );
1926 }
1927 Ok(ret)
1928 }
1929}
1930
1931impl From<wasmparser::Ieee32> for crate::Ieee32 {
1932 fn from(arg: wasmparser::Ieee32) -> Self {
1933 utils::ieee32_arg(&mut RoundtripReencoder, arg)
1934 }
1935}
1936
1937impl From<wasmparser::Ieee64> for crate::Ieee64 {
1938 fn from(arg: wasmparser::Ieee64) -> Self {
1939 utils::ieee64_arg(&mut RoundtripReencoder, arg)
1940 }
1941}
1942
1943impl TryFrom<wasmparser::MemArg> for crate::MemArg {
1944 type Error = Error;
1945 fn try_from(arg: wasmparser::MemArg) -> Result<Self, Self::Error> {
1946 RoundtripReencoder.mem_arg(arg)
1947 }
1948}
1949
1950impl From<wasmparser::Ordering> for crate::Ordering {
1951 fn from(arg: wasmparser::Ordering) -> Self {
1952 utils::ordering(&mut RoundtripReencoder, arg)
1953 }
1954}
1955
1956impl TryFrom<wasmparser::BlockType> for crate::BlockType {
1957 type Error = Error;
1958
1959 fn try_from(arg: wasmparser::BlockType) -> Result<Self, Self::Error> {
1960 RoundtripReencoder.block_type(arg)
1961 }
1962}
1963
1964impl<'a> TryFrom<wasmparser::Operator<'a>> for crate::Instruction<'a> {
1965 type Error = Error;
1966
1967 fn try_from(arg: wasmparser::Operator<'a>) -> Result<Self, Self::Error> {
1968 RoundtripReencoder.instruction(arg)
1969 }
1970}
1971
1972impl TryFrom<wasmparser::Catch> for crate::Catch {
1973 type Error = Error;
1974
1975 fn try_from(arg: wasmparser::Catch) -> Result<Self, Self::Error> {
1976 RoundtripReencoder.catch(arg)
1977 }
1978}
1979
1980impl<'a> TryFrom<wasmparser::ConstExpr<'a>> for crate::ConstExpr {
1981 type Error = Error;
1982
1983 fn try_from(const_expr: wasmparser::ConstExpr) -> Result<Self, Self::Error> {
1984 RoundtripReencoder.const_expr(const_expr)
1985 }
1986}
1987
1988impl<'a> From<wasmparser::CustomSectionReader<'a>> for crate::CustomSection<'a> {
1989 fn from(section: wasmparser::CustomSectionReader<'a>) -> Self {
1990 utils::custom_section(&mut RoundtripReencoder, section)
1991 }
1992}
1993
1994impl From<wasmparser::ExternalKind> for crate::ExportKind {
1995 fn from(external_kind: wasmparser::ExternalKind) -> Self {
1996 utils::export_kind(&mut RoundtripReencoder, external_kind)
1997 }
1998}
1999
2000impl TryFrom<wasmparser::GlobalType> for crate::GlobalType {
2001 type Error = Error;
2002
2003 fn try_from(global_ty: wasmparser::GlobalType) -> Result<Self, Self::Error> {
2004 RoundtripReencoder.global_type(global_ty)
2005 }
2006}
2007
2008impl TryFrom<wasmparser::Handle> for crate::Handle {
2009 type Error = Error;
2010 fn try_from(arg: wasmparser::Handle) -> Result<Self, Self::Error> {
2011 RoundtripReencoder.handle(arg)
2012 }
2013}
2014
2015impl TryFrom<wasmparser::TypeRef> for crate::EntityType {
2016 type Error = Error;
2017
2018 fn try_from(type_ref: wasmparser::TypeRef) -> Result<Self, Self::Error> {
2019 RoundtripReencoder.entity_type(type_ref)
2020 }
2021}
2022
2023impl From<wasmparser::MemoryType> for crate::MemoryType {
2024 fn from(memory_ty: wasmparser::MemoryType) -> Self {
2025 utils::memory_type(&mut RoundtripReencoder, memory_ty)
2026 }
2027}
2028
2029impl TryFrom<wasmparser::TableType> for crate::TableType {
2030 type Error = Error;
2031
2032 fn try_from(table_ty: wasmparser::TableType) -> Result<Self, Self::Error> {
2033 RoundtripReencoder.table_type(table_ty)
2034 }
2035}
2036
2037impl From<wasmparser::TagKind> for crate::TagKind {
2038 fn from(kind: wasmparser::TagKind) -> Self {
2039 utils::tag_kind(&mut RoundtripReencoder, kind)
2040 }
2041}
2042
2043impl TryFrom<wasmparser::TagType> for crate::TagType {
2044 type Error = Error;
2045 fn try_from(tag_ty: wasmparser::TagType) -> Result<Self, Self::Error> {
2046 RoundtripReencoder.tag_type(tag_ty)
2047 }
2048}
2049
2050impl TryFrom<wasmparser::SubType> for crate::SubType {
2051 type Error = Error;
2052
2053 fn try_from(sub_ty: wasmparser::SubType) -> Result<Self, Self::Error> {
2054 RoundtripReencoder.sub_type(sub_ty)
2055 }
2056}
2057
2058impl TryFrom<wasmparser::CompositeType> for crate::CompositeType {
2059 type Error = Error;
2060
2061 fn try_from(composite_ty: wasmparser::CompositeType) -> Result<Self, Self::Error> {
2062 RoundtripReencoder.composite_type(composite_ty)
2063 }
2064}
2065
2066impl TryFrom<wasmparser::FuncType> for crate::FuncType {
2067 type Error = Error;
2068
2069 fn try_from(func_ty: wasmparser::FuncType) -> Result<Self, Self::Error> {
2070 RoundtripReencoder.func_type(func_ty)
2071 }
2072}
2073
2074impl TryFrom<wasmparser::ArrayType> for crate::ArrayType {
2075 type Error = Error;
2076
2077 fn try_from(array_ty: wasmparser::ArrayType) -> Result<Self, Self::Error> {
2078 RoundtripReencoder.array_type(array_ty)
2079 }
2080}
2081
2082impl TryFrom<wasmparser::StructType> for crate::StructType {
2083 type Error = Error;
2084
2085 fn try_from(struct_ty: wasmparser::StructType) -> Result<Self, Self::Error> {
2086 RoundtripReencoder.struct_type(struct_ty)
2087 }
2088}
2089
2090impl TryFrom<wasmparser::FieldType> for crate::FieldType {
2091 type Error = Error;
2092
2093 fn try_from(field_ty: wasmparser::FieldType) -> Result<Self, Self::Error> {
2094 RoundtripReencoder.field_type(field_ty)
2095 }
2096}
2097
2098impl TryFrom<wasmparser::StorageType> for crate::StorageType {
2099 type Error = Error;
2100
2101 fn try_from(storage_ty: wasmparser::StorageType) -> Result<Self, Self::Error> {
2102 RoundtripReencoder.storage_type(storage_ty)
2103 }
2104}
2105
2106impl TryFrom<wasmparser::ValType> for crate::ValType {
2107 type Error = Error;
2108
2109 fn try_from(val_ty: wasmparser::ValType) -> Result<Self, Self::Error> {
2110 RoundtripReencoder.val_type(val_ty)
2111 }
2112}
2113
2114impl TryFrom<wasmparser::RefType> for crate::RefType {
2115 type Error = Error;
2116
2117 fn try_from(ref_type: wasmparser::RefType) -> Result<Self, Self::Error> {
2118 RoundtripReencoder.ref_type(ref_type)
2119 }
2120}
2121
2122impl TryFrom<wasmparser::HeapType> for crate::HeapType {
2123 type Error = Error;
2124
2125 fn try_from(heap_type: wasmparser::HeapType) -> Result<Self, Self::Error> {
2126 crate::reencode::utils::heap_type(&mut crate::reencode::RoundtripReencoder, heap_type)
2127 }
2128}
2129
2130impl From<wasmparser::AbstractHeapType> for crate::AbstractHeapType {
2131 fn from(value: wasmparser::AbstractHeapType) -> Self {
2132 utils::abstract_heap_type(&mut RoundtripReencoder, value)
2133 }
2134}