mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 23:57:56 +00:00
Update wasmtime (#5822)
* update wasmtime * update tests * Update client/executor/wasmtime/src/host.rs Co-Authored-By: Bastian Köcher <bkchr@users.noreply.github.com> * wip * use master-candidate * update with patches * update versions Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>
This commit is contained in:
@@ -26,7 +26,7 @@ use sc_executor_common::{
|
||||
util::{WasmModuleInfo, DataSegmentsSnapshot},
|
||||
};
|
||||
use sp_wasm_interface::{Pointer, WordSize, Value};
|
||||
use wasmtime::{Store, Instance, Module, Memory, Table, Val};
|
||||
use wasmtime::{Store, Instance, Module, Memory, Table, Val, Func, Extern, Global};
|
||||
|
||||
mod globals_snapshot;
|
||||
|
||||
@@ -88,6 +88,35 @@ pub struct InstanceWrapper {
|
||||
_not_send_nor_sync: marker::PhantomData<*const ()>,
|
||||
}
|
||||
|
||||
fn extern_memory(extern_: &Extern) -> Option<&Memory> {
|
||||
match extern_ {
|
||||
Extern::Memory(mem) => Some(mem),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fn extern_global(extern_: &Extern) -> Option<&Global> {
|
||||
match extern_ {
|
||||
Extern::Global(glob) => Some(glob),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn extern_table(extern_: &Extern) -> Option<&Table> {
|
||||
match extern_ {
|
||||
Extern::Table(table) => Some(table),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn extern_func(extern_: &Extern) -> Option<&Func> {
|
||||
match extern_ {
|
||||
Extern::Func(func) => Some(func),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
impl InstanceWrapper {
|
||||
/// Create a new instance wrapper from the given wasm module.
|
||||
pub fn new(module_wrapper: &ModuleWrapper, imports: &Imports, heap_pages: u32) -> Result<Self> {
|
||||
@@ -96,8 +125,7 @@ impl InstanceWrapper {
|
||||
|
||||
let memory = match imports.memory_import_index {
|
||||
Some(memory_idx) => {
|
||||
imports.externs[memory_idx]
|
||||
.memory()
|
||||
extern_memory(&imports.externs[memory_idx])
|
||||
.expect("only memory can be at the `memory_idx`; qed")
|
||||
.clone()
|
||||
}
|
||||
@@ -130,8 +158,7 @@ impl InstanceWrapper {
|
||||
.instance
|
||||
.get_export(name)
|
||||
.ok_or_else(|| Error::from(format!("Exported method {} is not found", name)))?;
|
||||
let entrypoint = export
|
||||
.func()
|
||||
let entrypoint = extern_func(&export)
|
||||
.ok_or_else(|| Error::from(format!("Export {} is not a function", name)))?;
|
||||
match (entrypoint.ty().params(), entrypoint.ty().results()) {
|
||||
(&[wasmtime::ValType::I32, wasmtime::ValType::I32], &[wasmtime::ValType::I64]) => {}
|
||||
@@ -164,8 +191,7 @@ impl InstanceWrapper {
|
||||
.get_export("__heap_base")
|
||||
.ok_or_else(|| Error::from("__heap_base is not found"))?;
|
||||
|
||||
let heap_base_global = heap_base_export
|
||||
.global()
|
||||
let heap_base_global = extern_global(&heap_base_export)
|
||||
.ok_or_else(|| Error::from("__heap_base is not a global"))?;
|
||||
|
||||
let heap_base = heap_base_global
|
||||
@@ -183,7 +209,7 @@ impl InstanceWrapper {
|
||||
None => return Ok(None),
|
||||
};
|
||||
|
||||
let global = global.global().ok_or_else(|| format!("`{}` is not a global", name))?;
|
||||
let global = extern_global(&global).ok_or_else(|| format!("`{}` is not a global", name))?;
|
||||
|
||||
match global.get() {
|
||||
Val::I32(val) => Ok(Some(Value::I32(val))),
|
||||
@@ -201,8 +227,7 @@ fn get_linear_memory(instance: &Instance) -> Result<Memory> {
|
||||
.get_export("memory")
|
||||
.ok_or_else(|| Error::from("memory is not exported under `memory` name"))?;
|
||||
|
||||
let memory = memory_export
|
||||
.memory()
|
||||
let memory = extern_memory(&memory_export)
|
||||
.ok_or_else(|| Error::from("the `memory` export should have memory type"))?
|
||||
.clone();
|
||||
|
||||
@@ -213,7 +238,8 @@ fn get_linear_memory(instance: &Instance) -> Result<Memory> {
|
||||
fn get_table(instance: &Instance) -> Option<Table> {
|
||||
instance
|
||||
.get_export("__indirect_function_table")
|
||||
.and_then(|export| export.table())
|
||||
.as_ref()
|
||||
.and_then(extern_table)
|
||||
.cloned()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user