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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
use super::stack::StackLimits;
use wasmparser::WasmFeatures;
/// Configuration for an [`Engine`].
///
/// [`Engine`]: [`crate::Engine`]
#[derive(Debug, Copy, Clone)]
pub struct Config {
/// The limits set on the value stack and call stack.
stack_limits: StackLimits,
/// Is `true` if the `mutable-global` Wasm proposal is enabled.
mutable_global: bool,
/// Is `true` if the `sign-extension` Wasm proposal is enabled.
sign_extension: bool,
/// Is `true` if the `saturating-float-to-int` Wasm proposal is enabled.
saturating_float_to_int: bool,
/// Is `true` if the [`multi-value`] Wasm proposal is enabled.
multi_value: bool,
}
impl Default for Config {
fn default() -> Self {
Self {
stack_limits: StackLimits::default(),
mutable_global: true,
sign_extension: true,
saturating_float_to_int: true,
multi_value: true,
}
}
}
impl Config {
/// Sets the [`StackLimits`] for the [`Config`].
pub fn set_stack_limits(&mut self, stack_limits: StackLimits) -> &mut Self {
self.stack_limits = stack_limits;
self
}
/// Returns the [`StackLimits`] of the [`Config`].
pub(super) fn stack_limits(&self) -> StackLimits {
self.stack_limits
}
/// Enable or disable the [`mutable-global`] Wasm proposal for the [`Config`].
///
/// # Note
///
/// Enabled by default.
///
/// [`mutable-global`]: https://github.com/WebAssembly/mutable-global
pub fn wasm_mutable_global(&mut self, enable: bool) -> &mut Self {
self.mutable_global = enable;
self
}
/// Enable or disable the [`sign-extension`] Wasm proposal for the [`Config`].
///
/// # Note
///
/// Enabled by default.
///
/// [`sign-extension`]: https://github.com/WebAssembly/sign-extension-ops
pub fn wasm_sign_extension(&mut self, enable: bool) -> &mut Self {
self.sign_extension = enable;
self
}
/// Enable or disable the [`saturating-float-to-int`] Wasm proposal for the [`Config`].
///
/// # Note
///
/// Enabled by default.
///
/// [`saturating-float-to-int`]:
/// https://github.com/WebAssembly/nontrapping-float-to-int-conversions
pub fn wasm_saturating_float_to_int(&mut self, enable: bool) -> &mut Self {
self.saturating_float_to_int = enable;
self
}
/// Enable or disable the [`multi-value`] Wasm proposal for the [`Config`].
///
/// # Note
///
/// Enabled by default.
///
/// [`multi-value`]: https://github.com/WebAssembly/multi-value
pub fn wasm_multi_value(&mut self, enable: bool) -> &mut Self {
self.multi_value = enable;
self
}
/// Returns the [`WasmFeatures`] represented by the [`Config`].
pub fn wasm_features(&self) -> WasmFeatures {
WasmFeatures {
multi_value: self.multi_value,
mutable_global: self.mutable_global,
saturating_float_to_int: self.saturating_float_to_int,
sign_extension: self.sign_extension,
reference_types: false,
bulk_memory: false,
component_model: false,
simd: false,
relaxed_simd: false,
threads: false,
tail_call: false,
deterministic_only: true,
multi_memory: false,
exceptions: false,
memory64: false,
extended_const: false,
}
}
}