1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
use crate::BuiltinFunctionIndex;
#[cfg(feature = "component-model")]
use crate::component::ComponentBuiltinFunctionIndex;
/// Enumeration of all possible ways that wasm may execute code in the
/// host.
///
/// This type is intended to be serialized into a 32-bit index (or smaller) and
/// is used by Pulley for example to identify how transitions from the guest to
/// the host are performed.
pub enum HostCall {
/// An "array call" is being done which means that the wasm is calling the
/// host using the array calling convention (e.g. `VMArrayCallNative`).
ArrayCall,
/// A builtin function, e.g. for `memory.grow`, is being called. Each
/// builtin has its own ABI.
Builtin(BuiltinFunctionIndex),
/// A lowered component function is being called. This is done by a
/// trampoline generated by Cranelift and is distinct from the array calling
/// convention.
///
/// This correspond to `VMLoweringCallee`.
#[cfg(feature = "component-model")]
ComponentLowerImport,
/// A builtin function, but specifically for components. For example string
/// transcoders.
#[cfg(feature = "component-model")]
ComponentBuiltin(ComponentBuiltinFunctionIndex),
}
impl HostCall {
/// Returns a 32-bit index for this hostcall.
pub const fn index(&self) -> u32 {
match self {
HostCall::ArrayCall => 0,
HostCall::Builtin(i) => 1 + i.index(),
#[cfg(feature = "component-model")]
HostCall::ComponentLowerImport => 1 + BuiltinFunctionIndex::len(),
#[cfg(feature = "component-model")]
HostCall::ComponentBuiltin(i) => 2 + BuiltinFunctionIndex::len() + i.index(),
}
}
}
impl From<BuiltinFunctionIndex> for HostCall {
fn from(idx: BuiltinFunctionIndex) -> HostCall {
HostCall::Builtin(idx)
}
}
#[cfg(feature = "component-model")]
impl From<ComponentBuiltinFunctionIndex> for HostCall {
fn from(idx: ComponentBuiltinFunctionIndex) -> HostCall {
HostCall::ComponentBuiltin(idx)
}
}