mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 13:27:57 +00:00
Adds a test to ensure that we clear the heap between calls into runtime (#4903)
* Adds a test to ensure that we clear the heap between calls into runtime The tests shows that we currently not clearing the heap in wasmtime. For now we don't run the test for wasmtime. * Fix compilation
This commit is contained in:
@@ -21,10 +21,10 @@ use crate::util;
|
||||
use crate::imports::Imports;
|
||||
|
||||
use sc_executor_common::error::{Error, Result};
|
||||
use sp_wasm_interface::{Pointer, WordSize};
|
||||
use sp_wasm_interface::{Pointer, WordSize, Value};
|
||||
use std::slice;
|
||||
use std::marker;
|
||||
use wasmtime::{Instance, Module, Memory, Table};
|
||||
use wasmtime::{Instance, Module, Memory, Table, Val};
|
||||
|
||||
/// Wrap the given WebAssembly Instance of a wasm module with Substrate-runtime.
|
||||
///
|
||||
@@ -127,6 +127,24 @@ impl InstanceWrapper {
|
||||
|
||||
Ok(heap_base as u32)
|
||||
}
|
||||
|
||||
/// Get the value from a global with the given `name`.
|
||||
pub fn get_global_val(&self, name: &str) -> Result<Option<Value>> {
|
||||
let global = match self.instance.get_export(name) {
|
||||
Some(global) => global,
|
||||
None => return Ok(None),
|
||||
};
|
||||
|
||||
let global = global.global().ok_or_else(|| format!("`{}` is not a global", name))?;
|
||||
|
||||
match global.get() {
|
||||
Val::I32(val) => Ok(Some(Value::I32(val))),
|
||||
Val::I64(val) => Ok(Some(Value::I64(val))),
|
||||
Val::F32(val) => Ok(Some(Value::F32(val))),
|
||||
Val::F64(val) => Ok(Some(Value::F64(val))),
|
||||
_ => Err("Unknow value type".into()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Extract linear memory instance from the given instance.
|
||||
|
||||
@@ -27,7 +27,7 @@ use sc_executor_common::{
|
||||
};
|
||||
use sp_allocator::FreeingBumpHeapAllocator;
|
||||
use sp_runtime_interface::unpack_ptr_and_len;
|
||||
use sp_wasm_interface::{Function, Pointer, WordSize};
|
||||
use sp_wasm_interface::{Function, Pointer, WordSize, Value};
|
||||
use wasmtime::{Config, Engine, Module, Store};
|
||||
|
||||
/// A `WasmRuntime` implementation using wasmtime to compile the runtime module to machine code
|
||||
@@ -55,6 +55,12 @@ impl WasmRuntime for WasmtimeRuntime {
|
||||
self.heap_pages,
|
||||
)
|
||||
}
|
||||
|
||||
fn get_global_val(&self, name: &str) -> Result<Option<Value>> {
|
||||
// Yeah, there is no better way currently :(
|
||||
InstanceWrapper::new(&self.module, &self.imports, self.heap_pages)?
|
||||
.get_global_val(name)
|
||||
}
|
||||
}
|
||||
|
||||
/// Create a new `WasmtimeRuntime` given the code. This function performs translation from Wasm to
|
||||
|
||||
Reference in New Issue
Block a user