///|
const MEMORY_BASE_CONTEXT_FIELD : Int = 0
///|
pub fn memory_base_context_field(memory_index : Int) -> @milkir.ContextField {
@milkir.ContextField::new(
WASM_DIALECT,
MEMORY_BASE_CONTEXT_FIELD,
[memory_index],
Ptr,
)
}
///|
pub fn decode_memory_base_context_field(field : @milkir.ContextField) -> Int? {
if field.dialect != WASM_DIALECT ||
field.key != MEMORY_BASE_CONTEXT_FIELD ||
field.parameters.length() != 1 ||
field.parameters[0] < 0 ||
field.ty != Ptr {
return None
}
Some(field.parameters[0])
}
///|
pub fn validate_global_value(data : @milkir.GlobalValueData) -> String? {
match data {
ContextField(field, _, region) =>
match decode_memory_base_context_field(field) {
Some(memory_index) =>
if region == Heap(memory_index) {
None
} else {
Some(
"malformed Wasm memory-base global: memory \{memory_index} must produce heap[\{memory_index}] provenance",
)
}
None =>
Some(
"unknown or malformed Wasm context field \{field.dialect}:\{field.key}",
)
}
}
}