1pub const MAX_FLAT_PARAMS: usize = 16;
26
27pub const MAX_FLAT_ASYNC_PARAMS: usize = 4;
30
31pub const MAX_FLAT_RESULTS: usize = 1;
35
36pub const PREPARE_ASYNC_NO_RESULT: u32 = u32::MAX;
40
41pub const PREPARE_ASYNC_WITH_RESULT: u32 = u32::MAX - 1;
46
47pub const START_FLAG_ASYNC_CALLEE: i32 = 1 << 0;
53
54mod artifacts;
55mod info;
56mod intrinsic;
57mod names;
58mod types;
59mod vmcomponent_offsets;
60pub use self::artifacts::*;
61pub use self::info::*;
62pub use self::intrinsic::*;
63pub use self::names::*;
64pub use self::types::*;
65pub use self::vmcomponent_offsets::*;
66
67#[cfg(feature = "compile")]
68mod compiler;
69#[cfg(feature = "compile")]
70pub mod dfg;
71#[cfg(feature = "compile")]
72mod translate;
73#[cfg(feature = "compile")]
74mod types_builder;
75#[cfg(feature = "compile")]
76pub use self::compiler::*;
77#[cfg(feature = "compile")]
78pub use self::translate::*;
79#[cfg(feature = "compile")]
80pub use self::types_builder::*;
81
82#[macro_export]
85macro_rules! foreach_builtin_component_function {
86 ($mac:ident) => {
87 $mac! {
88 resource_new32(vmctx: vmctx, caller_instance: u32, resource: u32, rep: u32) -> u64;
89 resource_rep32(vmctx: vmctx, caller_instance: u32, resource: u32, idx: u32) -> u64;
90
91 resource_drop(vmctx: vmctx, caller_instance: u32, resource: u32, idx: u32) -> u64;
96
97 resource_transfer_own(vmctx: vmctx, src_idx: u32, src_table: u32, dst_table: u32) -> u64;
98 resource_transfer_borrow(vmctx: vmctx, src_idx: u32, src_table: u32, dst_table: u32) -> u64;
99 resource_enter_call(vmctx: vmctx);
100 resource_exit_call(vmctx: vmctx) -> bool;
101
102 #[cfg(feature = "component-model-async")]
103 backpressure_set(vmctx: vmctx, caller_instance: u32, enabled: u32) -> bool;
104 #[cfg(feature = "component-model-async")]
105 backpressure_modify(vmctx: vmctx, caller_instance: u32, increment: u8) -> bool;
106 #[cfg(feature = "component-model-async")]
107 task_return(vmctx: vmctx, caller_instance: u32, ty: u32, options: u32, storage: ptr_u8, storage_len: size) -> bool;
108 #[cfg(feature = "component-model-async")]
109 task_cancel(vmctx: vmctx, caller_instance: u32) -> bool;
110 #[cfg(feature = "component-model-async")]
111 waitable_set_new(vmctx: vmctx, caller_instance: u32) -> u64;
112 #[cfg(feature = "component-model-async")]
113 waitable_set_wait(vmctx: vmctx, caller_instance: u32, options: u32, set: u32, payload: u32) -> u64;
114 #[cfg(feature = "component-model-async")]
115 waitable_set_poll(vmctx: vmctx, caller_instance: u32, options: u32, set: u32, payload: u32) -> u64;
116 #[cfg(feature = "component-model-async")]
117 waitable_set_drop(vmctx: vmctx, caller_instance: u32, set: u32) -> bool;
118 #[cfg(feature = "component-model-async")]
119 waitable_join(vmctx: vmctx, caller_instance: u32, set: u32, waitable: u32) -> bool;
120 #[cfg(feature = "component-model-async")]
121 thread_yield(vmctx: vmctx, caller_instance: u32, cancellable: u8) -> u32;
122 #[cfg(feature = "component-model-async")]
123 subtask_drop(vmctx: vmctx, caller_instance: u32, task_id: u32) -> bool;
124 #[cfg(feature = "component-model-async")]
125 subtask_cancel(vmctx: vmctx, caller_instance: u32, async_: u8, task_id: u32) -> u64;
126 #[cfg(feature = "component-model-async")]
127 prepare_call(
128 vmctx: vmctx,
129 memory: ptr_u8,
130 start: ptr_u8,
131 return_: ptr_u8,
132 caller_instance: u32,
133 callee_instance: u32,
134 task_return_type: u32,
135 callee_async: u32,
136 string_encoding: u32,
137 result_count_or_max_if_async: u32,
138 storage: ptr_u8,
139 storage_len: size
140 ) -> bool;
141 #[cfg(feature = "component-model-async")]
142 sync_start(vmctx: vmctx, callback: ptr_u8, storage: ptr_u8, storage_len: size, callee: ptr_u8, param_count: u32) -> bool;
143 #[cfg(feature = "component-model-async")]
144 async_start(vmctx: vmctx, callback: ptr_u8, post_return: ptr_u8, callee: ptr_u8, param_count: u32, result_count: u32, flags: u32) -> u64;
145 #[cfg(feature = "component-model-async")]
146 future_new(vmctx: vmctx, caller_instance: u32, ty: u32) -> u64;
147 #[cfg(feature = "component-model-async")]
148 future_write(vmctx: vmctx, caller_instance: u32, ty: u32, options: u32, future: u32, address: u32) -> u64;
149 #[cfg(feature = "component-model-async")]
150 future_read(vmctx: vmctx, caller_instance: u32, ty: u32, options: u32, future: u32, address: u32) -> u64;
151 #[cfg(feature = "component-model-async")]
152 future_cancel_write(vmctx: vmctx, caller_instance: u32, ty: u32, async_: u8, writer: u32) -> u64;
153 #[cfg(feature = "component-model-async")]
154 future_cancel_read(vmctx: vmctx, caller_instance: u32, ty: u32, async_: u8, reader: u32) -> u64;
155 #[cfg(feature = "component-model-async")]
156 future_drop_writable(vmctx: vmctx, caller_instance: u32, ty: u32, writer: u32) -> bool;
157 #[cfg(feature = "component-model-async")]
158 future_drop_readable(vmctx: vmctx, caller_instance: u32, ty: u32, reader: u32) -> bool;
159 #[cfg(feature = "component-model-async")]
160 stream_new(vmctx: vmctx, caller_instance: u32, ty: u32) -> u64;
161 #[cfg(feature = "component-model-async")]
162 stream_write(vmctx: vmctx, caller_instance: u32, ty: u32, options: u32, stream: u32, address: u32, count: u32) -> u64;
163 #[cfg(feature = "component-model-async")]
164 stream_read(vmctx: vmctx, caller_instance: u32, ty: u32, options: u32, stream: u32, address: u32, count: u32) -> u64;
165 #[cfg(feature = "component-model-async")]
166 stream_cancel_write(vmctx: vmctx, caller_instance: u32, ty: u32, async_: u8, writer: u32) -> u64;
167 #[cfg(feature = "component-model-async")]
168 stream_cancel_read(vmctx: vmctx, caller_instance: u32, ty: u32, async_: u8, reader: u32) -> u64;
169 #[cfg(feature = "component-model-async")]
170 stream_drop_writable(vmctx: vmctx, caller_instance: u32, ty: u32, writer: u32) -> bool;
171 #[cfg(feature = "component-model-async")]
172 stream_drop_readable(vmctx: vmctx, caller_instance: u32, ty: u32, reader: u32) -> bool;
173 #[cfg(feature = "component-model-async")]
174 flat_stream_write(vmctx: vmctx, caller_instance: u32, ty: u32, options:u32, payload_size: u32, payload_align: u32, stream: u32, address: u32, count: u32) -> u64;
175 #[cfg(feature = "component-model-async")]
176 flat_stream_read(vmctx: vmctx, caller_instance: u32, ty: u32, options: u32, payload_size: u32, payload_align: u32, stream: u32, address: u32, count: u32) -> u64;
177 #[cfg(feature = "component-model-async")]
178 error_context_new(vmctx: vmctx, caller_instance: u32, ty: u32, options: u32, debug_msg_address: u32, debug_msg_len: u32) -> u64;
179 #[cfg(feature = "component-model-async")]
180 error_context_debug_message(vmctx: vmctx, caller_instance: u32, ty: u32, options: u32, err_ctx_handle: u32, debug_msg_address: u32) -> bool;
181 #[cfg(feature = "component-model-async")]
182 error_context_drop(vmctx: vmctx, caller_instance: u32, ty: u32, err_ctx_handle: u32) -> bool;
183 #[cfg(feature = "component-model-async")]
184 future_transfer(vmctx: vmctx, src_idx: u32, src_table: u32, dst_table: u32) -> u64;
185 #[cfg(feature = "component-model-async")]
186 stream_transfer(vmctx: vmctx, src_idx: u32, src_table: u32, dst_table: u32) -> u64;
187 #[cfg(feature = "component-model-async")]
188 error_context_transfer(vmctx: vmctx, src_idx: u32, src_table: u32, dst_table: u32) -> u64;
189 #[cfg(feature = "component-model-async")]
190 check_blocking(vmctx: vmctx) -> bool;
191 #[cfg(feature = "component-model-async")]
192 context_get(vmctx: vmctx, caller_instance: u32, slot: u32) -> u64;
193 #[cfg(feature = "component-model-async")]
194 context_set(vmctx: vmctx, caller_instance: u32, slot: u32, val: u32) -> bool;
195 #[cfg(feature = "component-model-async")]
196 thread_index(vmctx: vmctx) -> u64;
197 #[cfg(feature = "component-model-async")]
198 thread_new_indirect(vmctx: vmctx, caller_instance: u32, func_ty_id: u32, func_table_idx: u32, func_idx: u32, context: u32) -> u64;
199 #[cfg(feature = "component-model-async")]
200 thread_switch_to(vmctx: vmctx, caller_instance: u32, cancellable: u8, thread_idx: u32) -> u32;
201 #[cfg(feature = "component-model-async")]
202 thread_suspend(vmctx: vmctx, caller_instance: u32, cancellable: u8) -> u32;
203 #[cfg(feature = "component-model-async")]
204 thread_resume_later(vmctx: vmctx, caller_instance: u32, thread_idx: u32) -> bool;
205 #[cfg(feature = "component-model-async")]
206 thread_yield_to(vmctx: vmctx, caller_instance: u32, cancellable: u8, thread_idx: u32) -> u32;
207
208 trap(vmctx: vmctx, code: u8) -> bool;
209
210 utf8_to_utf8(vmctx: vmctx, src: ptr_u8, len: size, dst: ptr_u8) -> bool;
211 utf16_to_utf16(vmctx: vmctx, src: ptr_u16, len: size, dst: ptr_u16) -> bool;
212 latin1_to_latin1(vmctx: vmctx, src: ptr_u8, len: size, dst: ptr_u8) -> bool;
213 latin1_to_utf16(vmctx: vmctx, src: ptr_u8, len: size, dst: ptr_u16) -> bool;
214 utf8_to_utf16(vmctx: vmctx, src: ptr_u8, len: size, dst: ptr_u16) -> size;
215 utf16_to_utf8(vmctx: vmctx, src: ptr_u16, src_len: size, dst: ptr_u8, dst_len: size, ret2: ptr_size) -> size;
216 latin1_to_utf8(vmctx: vmctx, src: ptr_u8, src_len: size, dst: ptr_u8, dst_len: size, ret2: ptr_size) -> size;
217 utf16_to_compact_probably_utf16(vmctx: vmctx, src: ptr_u16, len: size, dst: ptr_u16) -> size;
218 utf8_to_latin1(vmctx: vmctx, src: ptr_u8, len: size, dst: ptr_u8, ret2: ptr_size) -> size;
219 utf16_to_latin1(vmctx: vmctx, src: ptr_u16, len: size, dst: ptr_u8, ret2: ptr_size) -> size;
220 utf8_to_compact_utf16(vmctx: vmctx, src: ptr_u8, src_len: size, dst: ptr_u16, dst_len: size, bytes_so_far: size) -> size;
221 utf16_to_compact_utf16(vmctx: vmctx, src: ptr_u16, src_len: size, dst: ptr_u16, dst_len: size, bytes_so_far: size) -> size;
222 }
223 };
224}
225
226declare_builtin_index! {
228 pub struct ComponentBuiltinFunctionIndex: foreach_builtin_component_function;
230}