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::Error),
596 UserError(E),
598}
599
600impl<E> From<wasmparser::Error> for Error<E> {
601 fn from(err: wasmparser::Error) -> 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 mut last_section = None;
683
684 let start_offset = parser.offset();
685 let get_original_section = |range: Range<u64>| {
688 let start = range.start - start_offset;
689 let end = range.end - start_offset;
690 let Ok(end) = usize::try_from(end) else {
691 return Err(Error::InvalidCodeSectionSize);
692 };
693 let data_range = start as usize..end;
694 data.get(data_range).ok_or(Error::InvalidCodeSectionSize)
695 };
696 for section in parser.parse_all(data) {
697 match section? {
698 wasmparser::Payload::Version {
699 encoding: wasmparser::Encoding::Module,
700 ..
701 } => (),
702 wasmparser::Payload::Version { .. } => {
703 return Err(Error::UnexpectedNonCoreModuleSection);
704 }
705 wasmparser::Payload::TypeSection(section) => {
706 handle_intersperse_section_hook(
707 reencoder,
708 module,
709 &mut last_section,
710 Some(crate::SectionId::Type),
711 )?;
712 let mut types = crate::TypeSection::new();
713 reencoder.parse_type_section(&mut types, section)?;
714 module.section(&types);
715 }
716 wasmparser::Payload::ImportSection(section) => {
717 handle_intersperse_section_hook(
718 reencoder,
719 module,
720 &mut last_section,
721 Some(crate::SectionId::Import),
722 )?;
723 let mut imports = crate::ImportSection::new();
724 reencoder.parse_import_section(&mut imports, section)?;
725 module.section(&imports);
726 }
727 wasmparser::Payload::FunctionSection(section) => {
728 handle_intersperse_section_hook(
729 reencoder,
730 module,
731 &mut last_section,
732 Some(crate::SectionId::Function),
733 )?;
734 let mut functions = crate::FunctionSection::new();
735 reencoder.parse_function_section(&mut functions, section)?;
736 module.section(&functions);
737 }
738 wasmparser::Payload::TableSection(section) => {
739 handle_intersperse_section_hook(
740 reencoder,
741 module,
742 &mut last_section,
743 Some(crate::SectionId::Table),
744 )?;
745 let mut tables = crate::TableSection::new();
746 reencoder.parse_table_section(&mut tables, section)?;
747 module.section(&tables);
748 }
749 wasmparser::Payload::MemorySection(section) => {
750 handle_intersperse_section_hook(
751 reencoder,
752 module,
753 &mut last_section,
754 Some(crate::SectionId::Memory),
755 )?;
756 let mut memories = crate::MemorySection::new();
757 reencoder.parse_memory_section(&mut memories, section)?;
758 module.section(&memories);
759 }
760 wasmparser::Payload::TagSection(section) => {
761 handle_intersperse_section_hook(
762 reencoder,
763 module,
764 &mut last_section,
765 Some(crate::SectionId::Tag),
766 )?;
767 let mut tags = crate::TagSection::new();
768 reencoder.parse_tag_section(&mut tags, section)?;
769 module.section(&tags);
770 }
771 wasmparser::Payload::GlobalSection(section) => {
772 handle_intersperse_section_hook(
773 reencoder,
774 module,
775 &mut last_section,
776 Some(crate::SectionId::Global),
777 )?;
778 let mut globals = crate::GlobalSection::new();
779 reencoder.parse_global_section(&mut globals, section)?;
780 module.section(&globals);
781 }
782 wasmparser::Payload::ExportSection(section) => {
783 handle_intersperse_section_hook(
784 reencoder,
785 module,
786 &mut last_section,
787 Some(crate::SectionId::Export),
788 )?;
789 let mut exports = crate::ExportSection::new();
790 reencoder.parse_export_section(&mut exports, section)?;
791 module.section(&exports);
792 }
793 wasmparser::Payload::StartSection { func, .. } => {
794 handle_intersperse_section_hook(
795 reencoder,
796 module,
797 &mut last_section,
798 Some(crate::SectionId::Start),
799 )?;
800 module.section(&crate::StartSection {
801 function_index: reencoder.start_section(func)?,
802 });
803 }
804 wasmparser::Payload::ElementSection(section) => {
805 handle_intersperse_section_hook(
806 reencoder,
807 module,
808 &mut last_section,
809 Some(crate::SectionId::Element),
810 )?;
811 let mut elements = crate::ElementSection::new();
812 reencoder.parse_element_section(&mut elements, section)?;
813 module.section(&elements);
814 }
815 wasmparser::Payload::DataCountSection { count, .. } => {
816 handle_intersperse_section_hook(
817 reencoder,
818 module,
819 &mut last_section,
820 Some(crate::SectionId::DataCount),
821 )?;
822 let count = reencoder.data_count(count)?;
823 module.section(&crate::DataCountSection { count });
824 }
825 wasmparser::Payload::DataSection(section) => {
826 handle_intersperse_section_hook(
827 reencoder,
828 module,
829 &mut last_section,
830 Some(crate::SectionId::Data),
831 )?;
832 let mut data = crate::DataSection::new();
833 reencoder.parse_data_section(&mut data, section)?;
834 module.section(&data);
835 }
836 wasmparser::Payload::CodeSectionStart { range, .. } => {
837 handle_intersperse_section_hook(
838 reencoder,
839 module,
840 &mut last_section,
841 Some(crate::SectionId::Code),
842 )?;
843 let mut codes = crate::CodeSection::new();
844
845 let section = get_original_section(range.clone())?;
850 let reader = wasmparser::BinaryReader::new(section, range.start);
851 let section = wasmparser::CodeSectionReader::new(reader)?;
852 reencoder.parse_code_section(&mut codes, section)?;
853 module.section(&codes);
854 }
855
856 wasmparser::Payload::CodeSectionEntry(_) => {}
860
861 #[cfg(feature = "component-model")]
862 wasmparser::Payload::ModuleSection { .. }
863 | wasmparser::Payload::InstanceSection(_)
864 | wasmparser::Payload::CoreTypeSection(_)
865 | wasmparser::Payload::ComponentSection { .. }
866 | wasmparser::Payload::ComponentInstanceSection(_)
867 | wasmparser::Payload::ComponentAliasSection(_)
868 | wasmparser::Payload::ComponentTypeSection(_)
869 | wasmparser::Payload::ComponentCanonicalSection(_)
870 | wasmparser::Payload::ComponentStartSection { .. }
871 | wasmparser::Payload::ComponentImportSection(_)
872 | wasmparser::Payload::ComponentExportSection(_) => {
873 return Err(Error::UnexpectedNonCoreModuleSection);
874 }
875 wasmparser::Payload::CustomSection(section) => {
876 reencoder.parse_custom_section(module, section)?;
877 }
878 wasmparser::Payload::End(_) => {
879 handle_intersperse_section_hook(reencoder, module, &mut last_section, None)?;
880 }
881
882 other => match other.as_section() {
883 Some((id, range)) => {
884 let section = get_original_section(range)?;
885 reencoder.parse_unknown_section(module, id, section)?;
886 }
887 None => unreachable!(),
888 },
889 }
890 }
891
892 Ok(())
893 }
894
895 pub fn intersperse_section_hook<T: ?Sized + Reencode>(
913 _reencoder: &mut T,
914 _module: &mut crate::Module,
915 _after: Option<crate::SectionId>,
916 _before: Option<crate::SectionId>,
917 ) -> Result<(), Error<T::Error>> {
918 Ok(())
919 }
920
921 pub fn memory_index<T: ?Sized + Reencode>(_reencoder: &mut T, memory: u32) -> u32 {
922 memory
923 }
924
925 pub fn ieee32_arg<T: ?Sized + Reencode>(
926 _reencoder: &mut T,
927 arg: wasmparser::Ieee32,
928 ) -> crate::Ieee32 {
929 crate::Ieee32(arg.bits())
930 }
931
932 pub fn ieee64_arg<T: ?Sized + Reencode>(
933 _reencoder: &mut T,
934 arg: wasmparser::Ieee64,
935 ) -> crate::Ieee64 {
936 crate::Ieee64(arg.bits())
937 }
938
939 pub fn mem_arg<T: ?Sized + Reencode>(
940 reencoder: &mut T,
941 arg: wasmparser::MemArg,
942 ) -> Result<crate::MemArg, Error<T::Error>> {
943 Ok(crate::MemArg {
944 offset: arg.offset,
945 align: arg.align.into(),
946 memory_index: reencoder.memory_index(arg.memory)?,
947 })
948 }
949
950 pub fn ordering<T: ?Sized + Reencode>(
951 _reencoder: &mut T,
952 arg: wasmparser::Ordering,
953 ) -> crate::Ordering {
954 match arg {
955 wasmparser::Ordering::SeqCst => crate::Ordering::SeqCst,
956 wasmparser::Ordering::AcqRel => crate::Ordering::AcqRel,
957 }
958 }
959
960 pub fn function_index<T: ?Sized + Reencode>(_reencoder: &mut T, func: u32) -> u32 {
961 func
962 }
963
964 pub fn tag_index<T: ?Sized + Reencode>(_reencoder: &mut T, tag: u32) -> u32 {
965 tag
966 }
967
968 pub fn catch<T: ?Sized + Reencode>(
969 reencoder: &mut T,
970 arg: wasmparser::Catch,
971 ) -> Result<crate::Catch, Error<T::Error>> {
972 Ok(match arg {
973 wasmparser::Catch::One { tag, label } => crate::Catch::One {
974 tag: reencoder.tag_index(tag)?,
975 label,
976 },
977 wasmparser::Catch::OneRef { tag, label } => crate::Catch::OneRef {
978 tag: reencoder.tag_index(tag)?,
979 label,
980 },
981 wasmparser::Catch::All { label } => crate::Catch::All { label },
982 wasmparser::Catch::AllRef { label } => crate::Catch::AllRef { label },
983 })
984 }
985
986 pub fn handle<T: ?Sized + Reencode>(
987 reencoder: &mut T,
988 arg: wasmparser::Handle,
989 ) -> Result<crate::Handle, Error<T::Error>> {
990 Ok(match arg {
991 wasmparser::Handle::OnLabel { tag, label } => crate::Handle::OnLabel {
992 tag: reencoder.tag_index(tag)?,
993 label,
994 },
995 wasmparser::Handle::OnSwitch { tag } => crate::Handle::OnSwitch {
996 tag: reencoder.tag_index(tag)?,
997 },
998 })
999 }
1000
1001 pub fn parse_custom_section<T: ?Sized + Reencode>(
1004 reencoder: &mut T,
1005 module: &mut crate::Module,
1006 section: wasmparser::CustomSectionReader<'_>,
1007 ) -> Result<(), Error<T::Error>> {
1008 match section.as_known() {
1009 wasmparser::KnownCustom::Name(name) => {
1010 module.section(&reencoder.custom_name_section(name)?);
1011 }
1012 _ => {
1013 module.section(&reencoder.custom_section(section)?);
1014 }
1015 }
1016 Ok(())
1017 }
1018
1019 pub fn custom_section<'a, T: ?Sized + Reencode>(
1022 _reencoder: &mut T,
1023 section: wasmparser::CustomSectionReader<'a>,
1024 ) -> crate::CustomSection<'a> {
1025 crate::CustomSection {
1026 data: section.data().into(),
1027 name: section.name().into(),
1028 }
1029 }
1030
1031 pub fn export_kind<T: ?Sized + Reencode>(
1032 _reencoder: &mut T,
1033 external_kind: wasmparser::ExternalKind,
1034 ) -> crate::ExportKind {
1035 match external_kind {
1036 wasmparser::ExternalKind::Func | wasmparser::ExternalKind::FuncExact => {
1037 crate::ExportKind::Func
1038 }
1039 wasmparser::ExternalKind::Table => crate::ExportKind::Table,
1040 wasmparser::ExternalKind::Memory => crate::ExportKind::Memory,
1041 wasmparser::ExternalKind::Global => crate::ExportKind::Global,
1042 wasmparser::ExternalKind::Tag => crate::ExportKind::Tag,
1043 }
1044 }
1045
1046 pub fn memory_type<T: ?Sized + Reencode>(
1047 _reencoder: &mut T,
1048 memory_ty: wasmparser::MemoryType,
1049 ) -> crate::MemoryType {
1050 crate::MemoryType {
1051 minimum: memory_ty.initial,
1052 maximum: memory_ty.maximum,
1053 memory64: memory_ty.memory64,
1054 shared: memory_ty.shared,
1055 page_size_log2: memory_ty.page_size_log2,
1056 }
1057 }
1058
1059 pub fn tag_kind<T: ?Sized + Reencode>(
1060 _reencoder: &mut T,
1061 kind: wasmparser::TagKind,
1062 ) -> crate::TagKind {
1063 match kind {
1064 wasmparser::TagKind::Exception => crate::TagKind::Exception,
1065 }
1066 }
1067
1068 pub fn type_index<T: ?Sized + Reencode>(_reencoder: &mut T, ty: u32) -> u32 {
1069 ty
1070 }
1071
1072 pub fn type_index_unpacked<T: ?Sized + Reencode>(
1073 reencoder: &mut T,
1074 ty: wasmparser::UnpackedIndex,
1075 ) -> Result<u32, Error<T::Error>> {
1076 ty.as_module_index()
1077 .ok_or(Error::CanonicalizedHeapTypeReference)
1078 .and_then(|ty| reencoder.type_index(ty))
1079 }
1080
1081 pub fn tag_type<T: ?Sized + Reencode>(
1082 reencoder: &mut T,
1083 tag_ty: wasmparser::TagType,
1084 ) -> Result<crate::TagType, Error<T::Error>> {
1085 Ok(crate::TagType {
1086 kind: reencoder.tag_kind(tag_ty.kind)?,
1087 func_type_idx: reencoder.type_index(tag_ty.func_type_idx)?,
1088 })
1089 }
1090
1091 pub fn abstract_heap_type<T: ?Sized + Reencode>(
1092 _reencoder: &mut T,
1093 value: wasmparser::AbstractHeapType,
1094 ) -> crate::AbstractHeapType {
1095 use wasmparser::AbstractHeapType::*;
1096 match value {
1097 Func => crate::AbstractHeapType::Func,
1098 Extern => crate::AbstractHeapType::Extern,
1099 Any => crate::AbstractHeapType::Any,
1100 None => crate::AbstractHeapType::None,
1101 NoExtern => crate::AbstractHeapType::NoExtern,
1102 NoFunc => crate::AbstractHeapType::NoFunc,
1103 Eq => crate::AbstractHeapType::Eq,
1104 Struct => crate::AbstractHeapType::Struct,
1105 Array => crate::AbstractHeapType::Array,
1106 I31 => crate::AbstractHeapType::I31,
1107 Exn => crate::AbstractHeapType::Exn,
1108 NoExn => crate::AbstractHeapType::NoExn,
1109 Cont => crate::AbstractHeapType::Cont,
1110 NoCont => crate::AbstractHeapType::NoCont,
1111 }
1112 }
1113
1114 pub fn parse_type_section<T: ?Sized + Reencode>(
1117 reencoder: &mut T,
1118 types: &mut crate::TypeSection,
1119 section: wasmparser::TypeSectionReader<'_>,
1120 ) -> Result<(), Error<T::Error>> {
1121 for rec_group in section {
1122 reencoder.parse_recursive_type_group(types.ty(), rec_group?)?;
1123 }
1124 Ok(())
1125 }
1126
1127 pub fn parse_recursive_type_group<T: ?Sized + Reencode>(
1129 reencoder: &mut T,
1130 encoder: CoreTypeEncoder,
1131 rec_group: wasmparser::RecGroup,
1132 ) -> Result<(), Error<T::Error>> {
1133 if rec_group.is_explicit_rec_group() {
1134 let subtypes = rec_group
1135 .into_types()
1136 .map(|t| reencoder.sub_type(t))
1137 .collect::<Result<Vec<_>, _>>()?;
1138 encoder.rec(subtypes);
1139 } else {
1140 let ty = rec_group.into_types().next().unwrap();
1141 encoder.subtype(&reencoder.sub_type(ty)?);
1142 }
1143 Ok(())
1144 }
1145
1146 pub fn sub_type<T: ?Sized + Reencode>(
1147 reencoder: &mut T,
1148 sub_ty: wasmparser::SubType,
1149 ) -> Result<crate::SubType, Error<T::Error>> {
1150 Ok(crate::SubType {
1151 is_final: sub_ty.is_final,
1152 supertype_idx: sub_ty
1153 .supertype_idx
1154 .map(|i| reencoder.type_index_unpacked(i.unpack()))
1155 .transpose()?,
1156 composite_type: reencoder.composite_type(sub_ty.composite_type)?,
1157 })
1158 }
1159
1160 pub fn composite_type<T: ?Sized + Reencode>(
1161 reencoder: &mut T,
1162 composite_ty: wasmparser::CompositeType,
1163 ) -> Result<crate::CompositeType, Error<T::Error>> {
1164 let inner = match composite_ty.inner {
1165 wasmparser::CompositeInnerType::Func(f) => {
1166 crate::CompositeInnerType::Func(reencoder.func_type(f)?)
1167 }
1168 wasmparser::CompositeInnerType::Array(a) => {
1169 crate::CompositeInnerType::Array(reencoder.array_type(a)?)
1170 }
1171 wasmparser::CompositeInnerType::Struct(s) => {
1172 crate::CompositeInnerType::Struct(reencoder.struct_type(s)?)
1173 }
1174 wasmparser::CompositeInnerType::Cont(c) => {
1175 crate::CompositeInnerType::Cont(reencoder.cont_type(c)?)
1176 }
1177 };
1178 Ok(crate::CompositeType {
1179 inner,
1180 shared: composite_ty.shared,
1181 descriptor: composite_ty
1182 .descriptor_idx
1183 .map(|i| reencoder.type_index_unpacked(i.unpack()))
1184 .transpose()?,
1185 describes: composite_ty
1186 .describes_idx
1187 .map(|i| reencoder.type_index_unpacked(i.unpack()))
1188 .transpose()?,
1189 })
1190 }
1191
1192 pub fn func_type<T: ?Sized + Reencode>(
1193 reencoder: &mut T,
1194 func_ty: wasmparser::FuncType,
1195 ) -> Result<crate::FuncType, Error<T::Error>> {
1196 let mut buf = Vec::with_capacity(func_ty.params().len() + func_ty.results().len());
1197 for ty in func_ty.params().iter().chain(func_ty.results()).copied() {
1198 buf.push(reencoder.val_type(ty)?);
1199 }
1200 Ok(crate::FuncType::from_parts(
1201 buf.into(),
1202 func_ty.params().len(),
1203 ))
1204 }
1205
1206 pub fn array_type<T: ?Sized + Reencode>(
1207 reencoder: &mut T,
1208 array_ty: wasmparser::ArrayType,
1209 ) -> Result<crate::ArrayType, Error<T::Error>> {
1210 Ok(crate::ArrayType(reencoder.field_type(array_ty.0)?))
1211 }
1212
1213 pub fn struct_type<T: ?Sized + Reencode>(
1214 reencoder: &mut T,
1215 struct_ty: wasmparser::StructType,
1216 ) -> Result<crate::StructType, Error<T::Error>> {
1217 Ok(crate::StructType {
1218 fields: struct_ty
1219 .fields
1220 .iter()
1221 .map(|field_ty| reencoder.field_type(*field_ty))
1222 .collect::<Result<_, _>>()?,
1223 })
1224 }
1225
1226 pub fn field_type<T: ?Sized + Reencode>(
1227 reencoder: &mut T,
1228 field_ty: wasmparser::FieldType,
1229 ) -> Result<crate::FieldType, Error<T::Error>> {
1230 Ok(crate::FieldType {
1231 element_type: reencoder.storage_type(field_ty.element_type)?,
1232 mutable: field_ty.mutable,
1233 })
1234 }
1235
1236 pub fn storage_type<T: ?Sized + Reencode>(
1237 reencoder: &mut T,
1238 storage_ty: wasmparser::StorageType,
1239 ) -> Result<crate::StorageType, Error<T::Error>> {
1240 Ok(match storage_ty {
1241 wasmparser::StorageType::I8 => crate::StorageType::I8,
1242 wasmparser::StorageType::I16 => crate::StorageType::I16,
1243 wasmparser::StorageType::Val(v) => crate::StorageType::Val(reencoder.val_type(v)?),
1244 })
1245 }
1246
1247 pub fn cont_type<T: ?Sized + Reencode>(
1248 reencoder: &mut T,
1249 cont_ty: wasmparser::ContType,
1250 ) -> Result<crate::ContType, Error<T::Error>> {
1251 Ok(crate::ContType(
1252 reencoder.type_index_unpacked(cont_ty.0.unpack())?,
1253 ))
1254 }
1255
1256 pub fn val_type<T: ?Sized + Reencode>(
1257 reencoder: &mut T,
1258 val_ty: wasmparser::ValType,
1259 ) -> Result<crate::ValType, Error<T::Error>> {
1260 Ok(match val_ty {
1261 wasmparser::ValType::I32 => crate::ValType::I32,
1262 wasmparser::ValType::I64 => crate::ValType::I64,
1263 wasmparser::ValType::F32 => crate::ValType::F32,
1264 wasmparser::ValType::F64 => crate::ValType::F64,
1265 wasmparser::ValType::V128 => crate::ValType::V128,
1266 wasmparser::ValType::Ref(r) => crate::ValType::Ref(reencoder.ref_type(r)?),
1267 })
1268 }
1269
1270 pub fn ref_type<T: ?Sized + Reencode>(
1271 reencoder: &mut T,
1272 ref_type: wasmparser::RefType,
1273 ) -> Result<crate::RefType, Error<T::Error>> {
1274 Ok(crate::RefType {
1275 nullable: ref_type.is_nullable(),
1276 heap_type: reencoder.heap_type(ref_type.heap_type())?,
1277 })
1278 }
1279
1280 pub fn heap_type<T: ?Sized + Reencode>(
1281 reencoder: &mut T,
1282 heap_type: wasmparser::HeapType,
1283 ) -> Result<crate::HeapType, Error<T::Error>> {
1284 Ok(match heap_type {
1285 wasmparser::HeapType::Concrete(i) => {
1286 crate::HeapType::Concrete(reencoder.type_index_unpacked(i)?)
1287 }
1288 wasmparser::HeapType::Exact(i) => {
1289 crate::HeapType::Exact(reencoder.type_index_unpacked(i)?)
1290 }
1291 wasmparser::HeapType::Abstract { shared, ty } => crate::HeapType::Abstract {
1292 shared,
1293 ty: reencoder.abstract_heap_type(ty)?,
1294 },
1295 })
1296 }
1297
1298 pub fn parse_table_section<T: ?Sized + Reencode>(
1301 reencoder: &mut T,
1302 tables: &mut crate::TableSection,
1303 section: wasmparser::TableSectionReader<'_>,
1304 ) -> Result<(), Error<T::Error>> {
1305 for table in section {
1306 reencoder.parse_table(tables, table?)?;
1307 }
1308 Ok(())
1309 }
1310
1311 pub fn parse_table<T: ?Sized + Reencode>(
1313 reencoder: &mut T,
1314 tables: &mut crate::TableSection,
1315 table: wasmparser::Table<'_>,
1316 ) -> Result<(), Error<T::Error>> {
1317 let ty = reencoder.table_type(table.ty)?;
1318 match table.init {
1319 wasmparser::TableInit::RefNull => {
1320 tables.table(ty);
1321 }
1322 wasmparser::TableInit::Expr(e) => {
1323 tables.table_with_init(ty, &reencoder.const_expr(e)?);
1324 }
1325 }
1326 Ok(())
1327 }
1328
1329 pub fn table_type<T: ?Sized + Reencode>(
1330 reencoder: &mut T,
1331 table_ty: wasmparser::TableType,
1332 ) -> Result<crate::TableType, Error<T::Error>> {
1333 Ok(crate::TableType {
1334 element_type: reencoder.ref_type(table_ty.element_type)?,
1335 minimum: table_ty.initial,
1336 maximum: table_ty.maximum,
1337 table64: table_ty.table64,
1338 shared: table_ty.shared,
1339 })
1340 }
1341
1342 pub fn parse_tag_section<T: ?Sized + Reencode>(
1345 reencoder: &mut T,
1346 tags: &mut crate::TagSection,
1347 section: wasmparser::TagSectionReader<'_>,
1348 ) -> Result<(), Error<T::Error>> {
1349 for tag in section {
1350 let tag = tag?;
1351 tags.tag(reencoder.tag_type(tag)?);
1352 }
1353 Ok(())
1354 }
1355
1356 pub fn parse_export_section<T: ?Sized + Reencode>(
1359 reencoder: &mut T,
1360 exports: &mut crate::ExportSection,
1361 section: wasmparser::ExportSectionReader<'_>,
1362 ) -> Result<(), Error<T::Error>> {
1363 for export in section {
1364 reencoder.parse_export(exports, export?)?;
1365 }
1366 Ok(())
1367 }
1368
1369 pub fn parse_export<T: ?Sized + Reencode>(
1372 reencoder: &mut T,
1373 exports: &mut crate::ExportSection,
1374 export: wasmparser::Export<'_>,
1375 ) -> Result<(), Error<T::Error>> {
1376 exports.export(
1377 export.name,
1378 reencoder.export_kind(export.kind)?,
1379 reencoder.external_index(export.kind, export.index)?,
1380 );
1381 Ok(())
1382 }
1383
1384 pub fn parse_global_section<T: ?Sized + Reencode>(
1387 reencoder: &mut T,
1388 globals: &mut crate::GlobalSection,
1389 section: wasmparser::GlobalSectionReader<'_>,
1390 ) -> Result<(), Error<T::Error>> {
1391 for global in section {
1392 reencoder.parse_global(globals, global?)?;
1393 }
1394 Ok(())
1395 }
1396
1397 pub fn parse_global<T: ?Sized + Reencode>(
1400 reencoder: &mut T,
1401 globals: &mut crate::GlobalSection,
1402 global: wasmparser::Global<'_>,
1403 ) -> Result<(), Error<T::Error>> {
1404 globals.global(
1405 reencoder.global_type(global.ty)?,
1406 &reencoder.const_expr(global.init_expr)?,
1407 );
1408 Ok(())
1409 }
1410
1411 pub fn global_type<T: ?Sized + Reencode>(
1412 reencoder: &mut T,
1413 global_ty: wasmparser::GlobalType,
1414 ) -> Result<crate::GlobalType, Error<T::Error>> {
1415 Ok(crate::GlobalType {
1416 val_type: reencoder.val_type(global_ty.content_type)?,
1417 mutable: global_ty.mutable,
1418 shared: global_ty.shared,
1419 })
1420 }
1421
1422 pub fn entity_type<T: ?Sized + Reencode>(
1423 reencoder: &mut T,
1424 type_ref: wasmparser::TypeRef,
1425 ) -> Result<crate::EntityType, Error<T::Error>> {
1426 Ok(match type_ref {
1427 wasmparser::TypeRef::Func(i) => crate::EntityType::Function(reencoder.type_index(i)?),
1428 wasmparser::TypeRef::FuncExact(i) => {
1429 crate::EntityType::FunctionExact(reencoder.type_index(i)?)
1430 }
1431 wasmparser::TypeRef::Table(t) => crate::EntityType::Table(reencoder.table_type(t)?),
1432 wasmparser::TypeRef::Memory(m) => crate::EntityType::Memory(reencoder.memory_type(m)?),
1433 wasmparser::TypeRef::Global(g) => crate::EntityType::Global(reencoder.global_type(g)?),
1434 wasmparser::TypeRef::Tag(t) => crate::EntityType::Tag(reencoder.tag_type(t)?),
1435 })
1436 }
1437
1438 pub fn parse_import_section<T: ?Sized + Reencode>(
1441 reencoder: &mut T,
1442 import_section: &mut crate::ImportSection,
1443 section: wasmparser::ImportSectionReader<'_>,
1444 ) -> Result<(), Error<T::Error>> {
1445 for imports in section {
1446 let imports = imports?;
1447 reencoder.parse_imports(import_section, imports)?;
1448 }
1449 Ok(())
1450 }
1451
1452 pub fn parse_imports<T: ?Sized + Reencode>(
1455 reencoder: &mut T,
1456 import_section: &mut crate::ImportSection,
1457 imports: wasmparser::Imports<'_>,
1458 ) -> Result<(), Error<T::Error>> {
1459 import_section.imports(match imports {
1460 wasmparser::Imports::Single(_, import) => Imports::Single(crate::Import {
1461 module: import.module,
1462 name: import.name,
1463 ty: reencoder.entity_type(import.ty)?,
1464 }),
1465 wasmparser::Imports::Compact1 { module, items } => {
1466 let mut new_items: Vec<crate::ImportCompact> = Vec::new();
1467 for item in items {
1468 let item = item?;
1469 new_items.push(crate::ImportCompact {
1470 name: item.name,
1471 ty: reencoder.entity_type(item.ty)?,
1472 })
1473 }
1474 Imports::Compact1 {
1475 module: module,
1476 items: new_items.into(),
1477 }
1478 }
1479 wasmparser::Imports::Compact2 { module, ty, names } => {
1480 let names = names.into_iter().collect::<wasmparser::Result<Vec<_>>>()?;
1481 Imports::Compact2 {
1482 module: module,
1483 ty: reencoder.entity_type(ty)?,
1484 names: names.into(),
1485 }
1486 }
1487 });
1488 Ok(())
1489 }
1490
1491 pub fn parse_import<T: ?Sized + Reencode>(
1494 reencoder: &mut T,
1495 imports: &mut crate::ImportSection,
1496 import: wasmparser::Import<'_>,
1497 ) -> Result<(), Error<T::Error>> {
1498 reencoder.parse_imports(imports, wasmparser::Imports::Single(0, import))?;
1499 Ok(())
1500 }
1501
1502 pub fn parse_memory_section<T: ?Sized + Reencode>(
1505 reencoder: &mut T,
1506 memories: &mut crate::MemorySection,
1507 section: wasmparser::MemorySectionReader<'_>,
1508 ) -> Result<(), Error<T::Error>> {
1509 for memory in section {
1510 let memory = memory?;
1511 memories.memory(reencoder.memory_type(memory)?);
1512 }
1513 Ok(())
1514 }
1515
1516 pub fn parse_function_section<T: ?Sized + Reencode>(
1519 reencoder: &mut T,
1520 functions: &mut crate::FunctionSection,
1521 section: wasmparser::FunctionSectionReader<'_>,
1522 ) -> Result<(), Error<T::Error>> {
1523 for func in section {
1524 functions.function(reencoder.type_index(func?)?);
1525 }
1526 Ok(())
1527 }
1528
1529 pub fn parse_data_section<T: ?Sized + Reencode>(
1532 reencoder: &mut T,
1533 data: &mut crate::DataSection,
1534 section: wasmparser::DataSectionReader<'_>,
1535 ) -> Result<(), Error<T::Error>> {
1536 for datum in section {
1537 reencoder.parse_data(data, datum?)?;
1538 }
1539 Ok(())
1540 }
1541
1542 pub fn parse_data<T: ?Sized + Reencode>(
1544 reencoder: &mut T,
1545 data: &mut crate::DataSection,
1546 datum: wasmparser::Data<'_>,
1547 ) -> Result<(), Error<T::Error>> {
1548 match datum.kind {
1549 wasmparser::DataKind::Active {
1550 memory_index,
1551 offset_expr,
1552 } => data.active(
1553 reencoder.memory_index(memory_index)?,
1554 &reencoder.const_expr(offset_expr)?,
1555 datum.data.iter().copied(),
1556 ),
1557 wasmparser::DataKind::Passive => data.passive(datum.data.iter().copied()),
1558 };
1559 Ok(())
1560 }
1561
1562 pub fn parse_element_section<T: ?Sized + Reencode>(
1565 reencoder: &mut T,
1566 elements: &mut crate::ElementSection,
1567 section: wasmparser::ElementSectionReader<'_>,
1568 ) -> Result<(), Error<T::Error>> {
1569 for element in section {
1570 reencoder.parse_element(elements, element?)?;
1571 }
1572 Ok(())
1573 }
1574
1575 pub fn parse_element<T: ?Sized + Reencode>(
1578 reencoder: &mut T,
1579 elements: &mut crate::ElementSection,
1580 element: wasmparser::Element<'_>,
1581 ) -> Result<(), Error<T::Error>> {
1582 let elems = reencoder.element_items(element.items)?;
1583 match element.kind {
1584 wasmparser::ElementKind::Active {
1585 table_index,
1586 offset_expr,
1587 } => elements.active(
1588 match (
1598 table_index,
1599 reencoder.table_index(table_index.unwrap_or(0))?,
1600 ) {
1601 (None, 0) => None,
1602 (_, n) => Some(n),
1603 },
1604 &reencoder.const_expr(offset_expr)?,
1605 elems,
1606 ),
1607 wasmparser::ElementKind::Passive => elements.passive(elems),
1608 wasmparser::ElementKind::Declared => elements.declared(elems),
1609 };
1610 Ok(())
1611 }
1612
1613 pub fn element_items<'a, T: ?Sized + Reencode>(
1614 reencoder: &mut T,
1615 items: wasmparser::ElementItems<'a>,
1616 ) -> Result<crate::Elements<'a>, Error<T::Error>> {
1617 Ok(match items {
1618 wasmparser::ElementItems::Functions(f) => {
1619 let mut funcs = Vec::new();
1620 for func in f {
1621 funcs.push(reencoder.function_index(func?)?);
1622 }
1623 crate::Elements::Functions(funcs.into())
1624 }
1625 wasmparser::ElementItems::Expressions(ty, e) => {
1626 let mut exprs = Vec::new();
1627 for expr in e {
1628 exprs.push(reencoder.const_expr(expr?)?);
1629 }
1630 crate::Elements::Expressions(reencoder.ref_type(ty)?, exprs.into())
1631 }
1632 })
1633 }
1634
1635 pub fn table_index<T: ?Sized + Reencode>(_reencoder: &mut T, table: u32) -> u32 {
1636 table
1637 }
1638
1639 pub fn global_index<T: ?Sized + Reencode>(_reencoder: &mut T, global: u32) -> u32 {
1640 global
1641 }
1642
1643 pub fn data_index<T: ?Sized + Reencode>(_reencoder: &mut T, data: u32) -> u32 {
1644 data
1645 }
1646
1647 pub fn element_index<T: ?Sized + Reencode>(_reencoder: &mut T, element: u32) -> u32 {
1648 element
1649 }
1650
1651 pub fn const_expr<T: ?Sized + Reencode>(
1652 reencoder: &mut T,
1653 const_expr: wasmparser::ConstExpr,
1654 ) -> Result<crate::ConstExpr, Error<T::Error>> {
1655 let mut ops = const_expr.get_operators_reader();
1656 let mut bytes = Vec::new();
1657
1658 while !ops.is_end_then_eof() {
1659 let insn = reencoder.parse_instruction(&mut ops)?;
1660 insn.encode(&mut bytes);
1661 }
1662
1663 Ok(crate::ConstExpr::raw(bytes))
1664 }
1665
1666 pub fn block_type<T: ?Sized + Reencode>(
1667 reencoder: &mut T,
1668 arg: wasmparser::BlockType,
1669 ) -> Result<crate::BlockType, Error<T::Error>> {
1670 match arg {
1671 wasmparser::BlockType::Empty => Ok(crate::BlockType::Empty),
1672 wasmparser::BlockType::FuncType(n) => {
1673 Ok(crate::BlockType::FunctionType(reencoder.type_index(n)?))
1674 }
1675 wasmparser::BlockType::Type(t) => Ok(crate::BlockType::Result(reencoder.val_type(t)?)),
1676 }
1677 }
1678
1679 pub fn instruction<'a, T: ?Sized + Reencode>(
1680 reencoder: &mut T,
1681 arg: wasmparser::Operator<'a>,
1682 ) -> Result<crate::Instruction<'a>, Error<T::Error>> {
1683 use crate::Instruction;
1684 use alloc::borrow::Cow;
1685
1686 macro_rules! translate {
1687 ($( @$proposal:ident $op:ident $({ $($arg:ident: $argty:ty),* })? => $visit:ident ($($ann:tt)*))*) => {
1688 Ok(match arg {
1689 $(
1690 wasmparser::Operator::$op $({ $($arg),* })? => {
1691 $(
1692 $(let $arg = translate!(map $arg $arg);)*
1693 )?
1694 translate!(build $op $($($arg)*)?)
1695 }
1696 )*
1697 unexpected => unreachable!("encountered unexpected Wasm operator: {unexpected:?}"),
1698 })
1699 };
1700
1701 (map $arg:ident tag_index) => (reencoder.tag_index($arg)?);
1705 (map $arg:ident function_index) => (reencoder.function_index($arg)?);
1706 (map $arg:ident table) => (reencoder.table_index($arg)?);
1707 (map $arg:ident table_index) => (reencoder.table_index($arg)?);
1708 (map $arg:ident dst_table) => (reencoder.table_index($arg)?);
1709 (map $arg:ident src_table) => (reencoder.table_index($arg)?);
1710 (map $arg:ident type_index) => (reencoder.type_index($arg)?);
1711 (map $arg:ident array_type_index) => (reencoder.type_index($arg)?);
1712 (map $arg:ident array_type_index_dst) => (reencoder.type_index($arg)?);
1713 (map $arg:ident array_type_index_src) => (reencoder.type_index($arg)?);
1714 (map $arg:ident struct_type_index) => (reencoder.type_index($arg)?);
1715 (map $arg:ident global_index) => (reencoder.global_index($arg)?);
1716 (map $arg:ident mem) => (reencoder.memory_index($arg)?);
1717 (map $arg:ident src_mem) => (reencoder.memory_index($arg)?);
1718 (map $arg:ident dst_mem) => (reencoder.memory_index($arg)?);
1719 (map $arg:ident data_index) => (reencoder.data_index($arg)?);
1720 (map $arg:ident elem_index) => (reencoder.element_index($arg)?);
1721 (map $arg:ident array_data_index) => (reencoder.data_index($arg)?);
1722 (map $arg:ident array_elem_index) => (reencoder.element_index($arg)?);
1723 (map $arg:ident blockty) => (reencoder.block_type($arg)?);
1724 (map $arg:ident relative_depth) => ($arg);
1725 (map $arg:ident targets) => ((
1726 $arg
1727 .targets()
1728 .collect::<Result<Vec<_>, wasmparser::Error>>()?
1729 .into(),
1730 $arg.default(),
1731 ));
1732 (map $arg:ident ty) => (reencoder.val_type($arg)?);
1733 (map $arg:ident tys) => (reencoder.val_types($arg)?);
1734 (map $arg:ident hty) => (reencoder.heap_type($arg)?);
1735 (map $arg:ident from_ref_type) => (reencoder.ref_type($arg)?);
1736 (map $arg:ident to_ref_type) => (reencoder.ref_type($arg)?);
1737 (map $arg:ident memarg) => (reencoder.mem_arg($arg)?);
1738 (map $arg:ident ordering) => (reencoder.ordering($arg)?);
1739 (map $arg:ident local_index) => ($arg);
1740 (map $arg:ident value) => ($arg);
1741 (map $arg:ident lane) => ($arg);
1742 (map $arg:ident lanes) => ($arg);
1743 (map $arg:ident array_size) => ($arg);
1744 (map $arg:ident field_index) => ($arg);
1745 (map $arg:ident try_table) => ($arg);
1746 (map $arg:ident argument_index) => (reencoder.type_index($arg)?);
1747 (map $arg:ident result_index) => (reencoder.type_index($arg)?);
1748 (map $arg:ident cont_type_index) => (reencoder.type_index($arg)?);
1749 (map $arg:ident resume_table) => ((
1750 $arg.handlers.into_iter()
1751 .map(|h| reencoder.handle(h))
1752 .collect::<Result<Vec<_>, _>>()?
1753 .into()
1754 ));
1755
1756 (build $op:ident) => (Instruction::$op);
1761 (build BrTable $arg:ident) => (Instruction::BrTable($arg.0, $arg.1));
1762 (build TypedSelectMulti $arg:ident) => (Instruction::TypedSelectMulti(Cow::from($arg)));
1763 (build I32Const $arg:ident) => (Instruction::I32Const($arg));
1764 (build I64Const $arg:ident) => (Instruction::I64Const($arg));
1765 (build F32Const $arg:ident) => (Instruction::F32Const($arg.into()));
1766 (build F64Const $arg:ident) => (Instruction::F64Const($arg.into()));
1767 (build V128Const $arg:ident) => (Instruction::V128Const($arg.i128()));
1768 (build TryTable $table:ident) => (Instruction::TryTable(reencoder.block_type($table.ty)?, {
1769 $table.catches.into_iter()
1770 .map(|c| reencoder.catch(c))
1771 .collect::<Result<Vec<_>, _>>()?
1772 .into()
1773 }));
1774 (build $op:ident $arg:ident) => (Instruction::$op($arg));
1775 (build $op:ident $($arg:ident)*) => (Instruction::$op { $($arg),* });
1776 }
1777
1778 wasmparser::for_each_operator!(translate)
1779 }
1780
1781 pub fn parse_code_section<T: ?Sized + Reencode>(
1784 reencoder: &mut T,
1785 code: &mut crate::CodeSection,
1786 section: wasmparser::CodeSectionReader<'_>,
1787 ) -> Result<(), Error<T::Error>> {
1788 for func in section {
1789 reencoder.parse_function_body(code, func?)?;
1790 }
1791 Ok(())
1792 }
1793
1794 pub fn parse_function_body<T: ?Sized + Reencode>(
1796 reencoder: &mut T,
1797 code: &mut crate::CodeSection,
1798 func: wasmparser::FunctionBody<'_>,
1799 ) -> Result<(), Error<T::Error>> {
1800 let mut f = reencoder.new_function_with_parsed_locals(&func)?;
1801 let mut reader = func.get_operators_reader()?;
1802 while !reader.eof() {
1803 f.instruction(&reencoder.parse_instruction(&mut reader)?);
1804 }
1805 code.function(&f);
1806 Ok(())
1807 }
1808
1809 pub fn new_function_with_parsed_locals<T: ?Sized + Reencode>(
1812 reencoder: &mut T,
1813 func: &wasmparser::FunctionBody<'_>,
1814 ) -> Result<crate::Function, Error<T::Error>> {
1815 let mut locals = Vec::new();
1816 for pair in func.get_locals_reader()? {
1817 let (cnt, ty) = pair?;
1818 locals.push((cnt, reencoder.val_type(ty)?));
1819 }
1820 Ok(crate::Function::new(locals))
1821 }
1822
1823 pub fn parse_instruction<'a, T: ?Sized + Reencode>(
1825 reencoder: &mut T,
1826 reader: &mut wasmparser::OperatorsReader<'a>,
1827 ) -> Result<crate::Instruction<'a>, Error<T::Error>> {
1828 let instruction = reencoder.instruction(reader.read()?)?;
1829 Ok(instruction)
1830 }
1831
1832 pub fn parse_unknown_section<T: ?Sized + Reencode>(
1833 _reencoder: &mut T,
1834 module: &mut crate::Module,
1835 id: u8,
1836 contents: &[u8],
1837 ) -> Result<(), Error<T::Error>> {
1838 module.section(&crate::RawSection { id, data: contents });
1839 Ok(())
1840 }
1841
1842 pub fn custom_name_section<T: ?Sized + Reencode>(
1843 reencoder: &mut T,
1844 section: wasmparser::NameSectionReader<'_>,
1845 ) -> Result<crate::NameSection, Error<T::Error>> {
1846 let mut ret = crate::NameSection::new();
1847 for subsection in section {
1848 reencoder.parse_custom_name_subsection(&mut ret, subsection?)?;
1849 }
1850 Ok(ret)
1851 }
1852
1853 pub fn parse_custom_name_subsection<T: ?Sized + Reencode>(
1854 reencoder: &mut T,
1855 names: &mut crate::NameSection,
1856 section: wasmparser::Name<'_>,
1857 ) -> Result<(), Error<T::Error>> {
1858 match section {
1859 wasmparser::Name::Module { name, .. } => {
1860 names.module(name);
1861 }
1862 wasmparser::Name::Function(map) => {
1863 names.functions(&name_map(map, |i| reencoder.function_index(i))?);
1864 }
1865 wasmparser::Name::Type(map) => {
1866 names.types(&name_map(map, |i| reencoder.type_index(i))?);
1867 }
1868 wasmparser::Name::Local(map) => {
1869 names.locals(&indirect_name_map(map, |i| reencoder.function_index(i))?);
1870 }
1871 wasmparser::Name::Label(map) => {
1872 names.labels(&indirect_name_map(map, |i| reencoder.function_index(i))?);
1873 }
1874 wasmparser::Name::Table(map) => {
1875 names.tables(&name_map(map, |i| reencoder.table_index(i))?);
1876 }
1877 wasmparser::Name::Memory(map) => {
1878 names.memories(&name_map(map, |i| reencoder.memory_index(i))?);
1879 }
1880 wasmparser::Name::Global(map) => {
1881 names.globals(&name_map(map, |i| reencoder.global_index(i))?);
1882 }
1883 wasmparser::Name::Element(map) => {
1884 names.elements(&name_map(map, |i| reencoder.element_index(i))?);
1885 }
1886 wasmparser::Name::Data(map) => {
1887 names.data(&name_map(map, |i| reencoder.data_index(i))?);
1888 }
1889 wasmparser::Name::Tag(map) => {
1890 names.tags(&name_map(map, |i| reencoder.tag_index(i))?);
1891 }
1892 wasmparser::Name::Field(map) => {
1893 names.fields(&indirect_name_map(map, |i| reencoder.type_index(i))?);
1894 }
1895 wasmparser::Name::Unknown { ty, data, .. } => {
1896 names.raw(ty, data);
1897 }
1898 }
1899 Ok(())
1900 }
1901
1902 pub fn name_map<E>(
1903 map: wasmparser::NameMap<'_>,
1904 mut map_index: impl FnMut(u32) -> Result<u32, Error<E>>,
1905 ) -> Result<crate::NameMap, Error<E>> {
1906 let mut ret = crate::NameMap::new();
1907 for naming in map {
1908 let naming = naming?;
1909 ret.append(map_index(naming.index)?, naming.name);
1910 }
1911 Ok(ret)
1912 }
1913
1914 pub fn indirect_name_map<E>(
1915 map: wasmparser::IndirectNameMap<'_>,
1916 mut map_index: impl FnMut(u32) -> Result<u32, Error<E>>,
1917 ) -> Result<crate::IndirectNameMap, Error<E>> {
1918 let mut ret = crate::IndirectNameMap::new();
1919 for naming in map {
1920 let naming = naming?;
1921 ret.append(
1922 map_index(naming.index)?,
1923 &name_map(naming.names, |i| Ok(i))?,
1924 );
1925 }
1926 Ok(ret)
1927 }
1928}
1929
1930impl From<wasmparser::Ieee32> for crate::Ieee32 {
1931 fn from(arg: wasmparser::Ieee32) -> Self {
1932 utils::ieee32_arg(&mut RoundtripReencoder, arg)
1933 }
1934}
1935
1936impl From<wasmparser::Ieee64> for crate::Ieee64 {
1937 fn from(arg: wasmparser::Ieee64) -> Self {
1938 utils::ieee64_arg(&mut RoundtripReencoder, arg)
1939 }
1940}
1941
1942impl TryFrom<wasmparser::MemArg> for crate::MemArg {
1943 type Error = Error;
1944 fn try_from(arg: wasmparser::MemArg) -> Result<Self, Self::Error> {
1945 RoundtripReencoder.mem_arg(arg)
1946 }
1947}
1948
1949impl From<wasmparser::Ordering> for crate::Ordering {
1950 fn from(arg: wasmparser::Ordering) -> Self {
1951 utils::ordering(&mut RoundtripReencoder, arg)
1952 }
1953}
1954
1955impl TryFrom<wasmparser::BlockType> for crate::BlockType {
1956 type Error = Error;
1957
1958 fn try_from(arg: wasmparser::BlockType) -> Result<Self, Self::Error> {
1959 RoundtripReencoder.block_type(arg)
1960 }
1961}
1962
1963impl<'a> TryFrom<wasmparser::Operator<'a>> for crate::Instruction<'a> {
1964 type Error = Error;
1965
1966 fn try_from(arg: wasmparser::Operator<'a>) -> Result<Self, Self::Error> {
1967 RoundtripReencoder.instruction(arg)
1968 }
1969}
1970
1971impl TryFrom<wasmparser::Catch> for crate::Catch {
1972 type Error = Error;
1973
1974 fn try_from(arg: wasmparser::Catch) -> Result<Self, Self::Error> {
1975 RoundtripReencoder.catch(arg)
1976 }
1977}
1978
1979impl<'a> TryFrom<wasmparser::ConstExpr<'a>> for crate::ConstExpr {
1980 type Error = Error;
1981
1982 fn try_from(const_expr: wasmparser::ConstExpr) -> Result<Self, Self::Error> {
1983 RoundtripReencoder.const_expr(const_expr)
1984 }
1985}
1986
1987impl<'a> From<wasmparser::CustomSectionReader<'a>> for crate::CustomSection<'a> {
1988 fn from(section: wasmparser::CustomSectionReader<'a>) -> Self {
1989 utils::custom_section(&mut RoundtripReencoder, section)
1990 }
1991}
1992
1993impl From<wasmparser::ExternalKind> for crate::ExportKind {
1994 fn from(external_kind: wasmparser::ExternalKind) -> Self {
1995 utils::export_kind(&mut RoundtripReencoder, external_kind)
1996 }
1997}
1998
1999impl TryFrom<wasmparser::GlobalType> for crate::GlobalType {
2000 type Error = Error;
2001
2002 fn try_from(global_ty: wasmparser::GlobalType) -> Result<Self, Self::Error> {
2003 RoundtripReencoder.global_type(global_ty)
2004 }
2005}
2006
2007impl TryFrom<wasmparser::Handle> for crate::Handle {
2008 type Error = Error;
2009 fn try_from(arg: wasmparser::Handle) -> Result<Self, Self::Error> {
2010 RoundtripReencoder.handle(arg)
2011 }
2012}
2013
2014impl TryFrom<wasmparser::TypeRef> for crate::EntityType {
2015 type Error = Error;
2016
2017 fn try_from(type_ref: wasmparser::TypeRef) -> Result<Self, Self::Error> {
2018 RoundtripReencoder.entity_type(type_ref)
2019 }
2020}
2021
2022impl From<wasmparser::MemoryType> for crate::MemoryType {
2023 fn from(memory_ty: wasmparser::MemoryType) -> Self {
2024 utils::memory_type(&mut RoundtripReencoder, memory_ty)
2025 }
2026}
2027
2028impl TryFrom<wasmparser::TableType> for crate::TableType {
2029 type Error = Error;
2030
2031 fn try_from(table_ty: wasmparser::TableType) -> Result<Self, Self::Error> {
2032 RoundtripReencoder.table_type(table_ty)
2033 }
2034}
2035
2036impl From<wasmparser::TagKind> for crate::TagKind {
2037 fn from(kind: wasmparser::TagKind) -> Self {
2038 utils::tag_kind(&mut RoundtripReencoder, kind)
2039 }
2040}
2041
2042impl TryFrom<wasmparser::TagType> for crate::TagType {
2043 type Error = Error;
2044 fn try_from(tag_ty: wasmparser::TagType) -> Result<Self, Self::Error> {
2045 RoundtripReencoder.tag_type(tag_ty)
2046 }
2047}
2048
2049impl TryFrom<wasmparser::SubType> for crate::SubType {
2050 type Error = Error;
2051
2052 fn try_from(sub_ty: wasmparser::SubType) -> Result<Self, Self::Error> {
2053 RoundtripReencoder.sub_type(sub_ty)
2054 }
2055}
2056
2057impl TryFrom<wasmparser::CompositeType> for crate::CompositeType {
2058 type Error = Error;
2059
2060 fn try_from(composite_ty: wasmparser::CompositeType) -> Result<Self, Self::Error> {
2061 RoundtripReencoder.composite_type(composite_ty)
2062 }
2063}
2064
2065impl TryFrom<wasmparser::FuncType> for crate::FuncType {
2066 type Error = Error;
2067
2068 fn try_from(func_ty: wasmparser::FuncType) -> Result<Self, Self::Error> {
2069 RoundtripReencoder.func_type(func_ty)
2070 }
2071}
2072
2073impl TryFrom<wasmparser::ArrayType> for crate::ArrayType {
2074 type Error = Error;
2075
2076 fn try_from(array_ty: wasmparser::ArrayType) -> Result<Self, Self::Error> {
2077 RoundtripReencoder.array_type(array_ty)
2078 }
2079}
2080
2081impl TryFrom<wasmparser::StructType> for crate::StructType {
2082 type Error = Error;
2083
2084 fn try_from(struct_ty: wasmparser::StructType) -> Result<Self, Self::Error> {
2085 RoundtripReencoder.struct_type(struct_ty)
2086 }
2087}
2088
2089impl TryFrom<wasmparser::FieldType> for crate::FieldType {
2090 type Error = Error;
2091
2092 fn try_from(field_ty: wasmparser::FieldType) -> Result<Self, Self::Error> {
2093 RoundtripReencoder.field_type(field_ty)
2094 }
2095}
2096
2097impl TryFrom<wasmparser::StorageType> for crate::StorageType {
2098 type Error = Error;
2099
2100 fn try_from(storage_ty: wasmparser::StorageType) -> Result<Self, Self::Error> {
2101 RoundtripReencoder.storage_type(storage_ty)
2102 }
2103}
2104
2105impl TryFrom<wasmparser::ValType> for crate::ValType {
2106 type Error = Error;
2107
2108 fn try_from(val_ty: wasmparser::ValType) -> Result<Self, Self::Error> {
2109 RoundtripReencoder.val_type(val_ty)
2110 }
2111}
2112
2113impl TryFrom<wasmparser::RefType> for crate::RefType {
2114 type Error = Error;
2115
2116 fn try_from(ref_type: wasmparser::RefType) -> Result<Self, Self::Error> {
2117 RoundtripReencoder.ref_type(ref_type)
2118 }
2119}
2120
2121impl TryFrom<wasmparser::HeapType> for crate::HeapType {
2122 type Error = Error;
2123
2124 fn try_from(heap_type: wasmparser::HeapType) -> Result<Self, Self::Error> {
2125 crate::reencode::utils::heap_type(&mut crate::reencode::RoundtripReencoder, heap_type)
2126 }
2127}
2128
2129impl From<wasmparser::AbstractHeapType> for crate::AbstractHeapType {
2130 fn from(value: wasmparser::AbstractHeapType) -> Self {
2131 utils::abstract_heap_type(&mut RoundtripReencoder, value)
2132 }
2133}