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