wasmparser/readers/component/
instances.rs1use crate::limits::{MAX_WASM_INSTANTIATION_ARGS, MAX_WASM_INSTANTIATION_EXPORTS};
2use crate::prelude::*;
3use crate::{
4 BinaryReader, ComponentExport, ComponentExternalKind, Export, FromReader, Result,
5 SectionLimited,
6};
7
8#[derive(Debug, Copy, Clone, PartialEq, Eq)]
10pub enum InstantiationArgKind {
11 Instance,
13}
14
15#[derive(Debug, Clone, Eq, PartialEq)]
17pub struct InstantiationArg<'a> {
18 pub name: &'a str,
20 pub kind: InstantiationArgKind,
22 pub index: u32,
24}
25
26#[derive(Debug, Clone, Eq, PartialEq)]
28pub enum Instance<'a> {
29 Instantiate {
31 module_index: u32,
33 args: Box<[InstantiationArg<'a>]>,
35 },
36 FromExports(Box<[Export<'a>]>),
38}
39
40pub type InstanceSectionReader<'a> = SectionLimited<'a, Instance<'a>>;
54
55impl<'a> FromReader<'a> for Instance<'a> {
56 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
57 Ok(match reader.read_u8()? {
58 0x00 => Instance::Instantiate {
59 module_index: reader.read_var_u32()?,
60 args: reader
61 .read_iter(MAX_WASM_INSTANTIATION_ARGS, "core instantiation arguments")?
62 .collect::<Result<_>>()?,
63 },
64 0x01 => Instance::FromExports(
65 reader
66 .read_iter(MAX_WASM_INSTANTIATION_ARGS, "core instantiation arguments")?
67 .collect::<Result<_>>()?,
68 ),
69 x => return reader.invalid_leading_byte(x, "core instance"),
70 })
71 }
72}
73
74impl<'a> FromReader<'a> for InstantiationArg<'a> {
75 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
76 Ok(InstantiationArg {
77 name: reader.read()?,
78 kind: reader.read()?,
79 index: reader.read()?,
80 })
81 }
82}
83
84impl<'a> FromReader<'a> for InstantiationArgKind {
85 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
86 Ok(match reader.read_u8()? {
87 0x12 => InstantiationArgKind::Instance,
88 x => return reader.invalid_leading_byte(x, "instantiation arg kind"),
89 })
90 }
91}
92
93#[derive(Debug, Clone, Eq, PartialEq)]
95pub struct ComponentInstantiationArg<'a> {
96 pub name: &'a str,
98 pub kind: ComponentExternalKind,
100 pub index: u32,
102}
103
104#[derive(Debug, Clone, Eq, PartialEq)]
106pub enum ComponentInstance<'a> {
107 Instantiate {
109 component_index: u32,
111 args: Box<[ComponentInstantiationArg<'a>]>,
113 },
114 FromExports(Box<[ComponentExport<'a>]>),
116}
117
118pub type ComponentInstanceSectionReader<'a> = SectionLimited<'a, ComponentInstance<'a>>;
132
133impl<'a> FromReader<'a> for ComponentInstance<'a> {
134 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
135 Ok(match reader.read_u8()? {
136 0x00 => ComponentInstance::Instantiate {
137 component_index: reader.read_var_u32()?,
138 args: reader
139 .read_iter(MAX_WASM_INSTANTIATION_ARGS, "instantiation arguments")?
140 .collect::<Result<_>>()?,
141 },
142 0x01 => ComponentInstance::FromExports(
143 (0..reader.read_size(MAX_WASM_INSTANTIATION_EXPORTS, "instantiation exports")?)
144 .map(|_| {
145 Ok(ComponentExport {
146 name: reader.read()?,
147 kind: reader.read()?,
148 index: reader.read()?,
149 ty: None,
150 })
151 })
152 .collect::<Result<_>>()?,
153 ),
154 x => return reader.invalid_leading_byte(x, "instance"),
155 })
156 }
157}
158impl<'a> FromReader<'a> for ComponentInstantiationArg<'a> {
159 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
160 Ok(ComponentInstantiationArg {
161 name: reader.read()?,
162 kind: reader.read()?,
163 index: reader.read()?,
164 })
165 }
166}