From 504f0aaf15ce8baa2886a258faf56592495bbc51 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Thu, 4 Jul 2019 21:00:44 +0100 Subject: [PATCH] rust: make ExecutionContext optional in EvmcVm.execute() --- bindings/rust/evmc-declare-tests/src/lib.rs | 2 +- bindings/rust/evmc-declare/src/lib.rs | 16 +++++++++------- bindings/rust/evmc-vm/src/container.rs | 2 +- bindings/rust/evmc-vm/src/lib.rs | 2 +- examples/example-rust-vm/src/lib.rs | 2 +- 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/bindings/rust/evmc-declare-tests/src/lib.rs b/bindings/rust/evmc-declare-tests/src/lib.rs index 38fd2f3e7..d95a0f7e3 100644 --- a/bindings/rust/evmc-declare-tests/src/lib.rs +++ b/bindings/rust/evmc-declare-tests/src/lib.rs @@ -21,7 +21,7 @@ impl EvmcVm for FooVM { &self, _code: &[u8], _message: &ExecutionMessage, - _context: &ExecutionContext, + _context: Option<&ExecutionContext>, ) -> ExecutionResult { ExecutionResult::success(1337, None) } diff --git a/bindings/rust/evmc-declare/src/lib.rs b/bindings/rust/evmc-declare/src/lib.rs index c74527816..ca507eda1 100644 --- a/bindings/rust/evmc-declare/src/lib.rs +++ b/bindings/rust/evmc-declare/src/lib.rs @@ -22,14 +22,14 @@ //! ExampleVM {} //! } //! -//! fn execute(&self, code: &[u8], message: &evmc_vm::ExecutionMessage, context: &evmc_vm::ExecutionContext) -> evmc_vm::ExecutionResult { +//! fn execute(&self, code: &[u8], message: &evmc_vm::ExecutionMessage, context: Option<&evmc_vm::ExecutionContext>) -> evmc_vm::ExecutionResult { //! evmc_vm::ExecutionResult::success(1337, None) //! } //! } //! ``` // Set a higher recursion limit because parsing certain token trees might fail with the default of 64. -#![recursion_limit = "128"] +#![recursion_limit = "160"] extern crate proc_macro; @@ -338,14 +338,16 @@ fn build_execute_fn(names: &VMNameSet) -> proc_macro2::TokenStream { use evmc_vm::EvmcVm; assert!(!instance.is_null()); - // TODO: context is optional in case of the "precompiles" capability - assert!(!context.is_null()); assert!(!msg.is_null()); let execution_message: ::evmc_vm::ExecutionMessage = unsafe { msg.as_ref().unwrap().into() }; - let execution_context = unsafe { - ::evmc_vm::ExecutionContext::new(context.as_mut().expect("EVMC context is null")) + let execution_context: Option<::evmc_vm::ExecutionContext> = if context.is_null() { + None + } else { + Some(unsafe { + ::evmc_vm::ExecutionContext::new(context.as_mut().expect("EVMC context is null")) + }) }; let empty_code = [0u8;0]; @@ -363,7 +365,7 @@ fn build_execute_fn(names: &VMNameSet) -> proc_macro2::TokenStream { }; let result = ::std::panic::catch_unwind(|| { - container.execute(code_ref, &execution_message, &execution_context) + container.execute(code_ref, &execution_message, execution_context.as_ref()) }); let result = if result.is_err() { diff --git a/bindings/rust/evmc-vm/src/container.rs b/bindings/rust/evmc-vm/src/container.rs index aa22d3523..54c8eaf97 100644 --- a/bindings/rust/evmc-vm/src/container.rs +++ b/bindings/rust/evmc-vm/src/container.rs @@ -61,7 +61,7 @@ mod tests { &self, _code: &[u8], _message: &ExecutionMessage, - _context: &ExecutionContext, + _context: Option<&ExecutionContext>, ) -> ExecutionResult { ExecutionResult::failure() } diff --git a/bindings/rust/evmc-vm/src/lib.rs b/bindings/rust/evmc-vm/src/lib.rs index 682dea09e..c708b1304 100644 --- a/bindings/rust/evmc-vm/src/lib.rs +++ b/bindings/rust/evmc-vm/src/lib.rs @@ -21,7 +21,7 @@ pub trait EvmcVm { &self, code: &[u8], message: &ExecutionMessage, - context: &ExecutionContext, + context: Option<&ExecutionContext>, ) -> ExecutionResult; } diff --git a/examples/example-rust-vm/src/lib.rs b/examples/example-rust-vm/src/lib.rs index e48ab7194..c226e7c4a 100644 --- a/examples/example-rust-vm/src/lib.rs +++ b/examples/example-rust-vm/src/lib.rs @@ -18,7 +18,7 @@ impl EvmcVm for ExampleRustVM { &self, _code: &[u8], message: &ExecutionMessage, - context: &ExecutionContext, + context: Option<&ExecutionContext>, ) -> ExecutionResult { let is_create = message.kind() == evmc_sys::evmc_call_kind::EVMC_CREATE;