mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-09 19:57:59 +00:00
executor: Move runtime version caching out of WasmRuntime interface. (#3993)
* executor: Move runtime caching out of WasmRuntime interface. The runtime version is now fetched and cached at a higher level, not within the WasmRuntime trait implementations. * executor: Require successful querying of runtime version.
This commit is contained in:
@@ -23,9 +23,8 @@ use crate::wasm_utils::interpret_runtime_api_result;
|
||||
use crate::wasmtime::function_executor::FunctionExecutorState;
|
||||
use crate::wasmtime::trampoline::{EnvState, make_trampoline};
|
||||
use crate::wasmtime::util::{cranelift_ir_signature, read_memory_into, write_memory_from};
|
||||
use crate::{Externalities, RuntimeVersion};
|
||||
use crate::Externalities;
|
||||
|
||||
use codec::Decode;
|
||||
use cranelift_codegen::ir;
|
||||
use cranelift_codegen::isa::TargetIsa;
|
||||
use cranelift_entity::{EntityRef, PrimaryMap};
|
||||
@@ -34,7 +33,6 @@ use cranelift_wasm::DefinedFuncIndex;
|
||||
use std::cell::RefCell;
|
||||
use std::collections::HashMap;
|
||||
use std::convert::TryFrom;
|
||||
use std::panic::AssertUnwindSafe;
|
||||
use std::rc::Rc;
|
||||
use wasm_interface::{HostFunctions, Pointer, WordSize};
|
||||
use wasmtime_environ::{Module, translate_signature};
|
||||
@@ -51,7 +49,6 @@ pub struct WasmtimeRuntime {
|
||||
context: Context,
|
||||
max_heap_pages: Option<u32>,
|
||||
heap_pages: u32,
|
||||
version: Option<RuntimeVersion>,
|
||||
}
|
||||
|
||||
impl WasmRuntime for WasmtimeRuntime {
|
||||
@@ -75,18 +72,14 @@ impl WasmRuntime for WasmtimeRuntime {
|
||||
self.heap_pages,
|
||||
)
|
||||
}
|
||||
|
||||
fn version(&self) -> Option<RuntimeVersion> {
|
||||
self.version.clone()
|
||||
}
|
||||
}
|
||||
|
||||
/// Create a new `WasmtimeRuntime` given the code. This function performs translation from Wasm to
|
||||
/// machine code, which can be computationally heavy.
|
||||
pub fn create_instance<E: Externalities>(ext: &mut E, code: &[u8], heap_pages: u64)
|
||||
pub fn create_instance(code: &[u8], heap_pages: u64)
|
||||
-> std::result::Result<WasmtimeRuntime, WasmError>
|
||||
{
|
||||
let (mut compiled_module, mut context) = create_compiled_unit(code)?;
|
||||
let (compiled_module, context) = create_compiled_unit(code)?;
|
||||
|
||||
// Inspect the module for the min and max memory sizes.
|
||||
let (min_memory_size, max_memory_size) = {
|
||||
@@ -105,38 +98,11 @@ pub fn create_instance<E: Externalities>(ext: &mut E, code: &[u8], heap_pages: u
|
||||
let heap_pages = heap_pages_valid(heap_pages, max_heap_pages)
|
||||
.ok_or_else(|| WasmError::InvalidHeapPages)?;
|
||||
|
||||
// Call to determine runtime version.
|
||||
let version_result = {
|
||||
// `ext` is already implicitly handled as unwind safe, as we store it in a global variable.
|
||||
let mut ext = AssertUnwindSafe(ext);
|
||||
|
||||
// The following unwind safety assertions are OK because if the method call panics, the
|
||||
// context and compiled module will be dropped.
|
||||
let mut context = AssertUnwindSafe(&mut context);
|
||||
let mut compiled_module = AssertUnwindSafe(&mut compiled_module);
|
||||
crate::native_executor::safe_call(move || {
|
||||
call_method(
|
||||
&mut **context,
|
||||
&mut **compiled_module,
|
||||
&mut **ext,
|
||||
"Core_version",
|
||||
&[],
|
||||
heap_pages
|
||||
)
|
||||
}).map_err(|_| {
|
||||
WasmError::Instantiation("panic in call to get runtime version".to_string())
|
||||
})?
|
||||
};
|
||||
let version = version_result
|
||||
.ok()
|
||||
.and_then(|v| RuntimeVersion::decode(&mut v.as_slice()).ok());
|
||||
|
||||
Ok(WasmtimeRuntime {
|
||||
module: compiled_module,
|
||||
context,
|
||||
max_heap_pages,
|
||||
heap_pages,
|
||||
version,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user