diff --git a/libraries/chain/include/eosio/chain/webassembly/eos-vm.hpp b/libraries/chain/include/eosio/chain/webassembly/eos-vm.hpp index 1c1a3e50cb..357c152270 100644 --- a/libraries/chain/include/eosio/chain/webassembly/eos-vm.hpp +++ b/libraries/chain/include/eosio/chain/webassembly/eos-vm.hpp @@ -41,6 +41,7 @@ struct profile_config { template class eos_vm_runtime : public eosio::chain::wasm_runtime_interface { + using context_t = typename Backend::template context; public: eos_vm_runtime(); std::unique_ptr instantiate_module(const char* code_bytes, size_t code_size, @@ -49,6 +50,7 @@ class eos_vm_runtime : public eosio::chain::wasm_runtime_interface { private: // todo: managing this will get more complicated with sync calls; eos_vm_backend_t* _bkend = nullptr; // non owning pointer to allow for immediate exit + context_t _exec_ctx; template friend class eos_vm_instantiated_module; diff --git a/libraries/chain/webassembly/runtimes/eos-vm.cpp b/libraries/chain/webassembly/runtimes/eos-vm.cpp index b0c81c3c6a..b9511caf5f 100644 --- a/libraries/chain/webassembly/runtimes/eos-vm.cpp +++ b/libraries/chain/webassembly/runtimes/eos-vm.cpp @@ -128,6 +128,12 @@ class eos_vm_instantiated_module : public wasm_instantiated_module_interface { _instantiated_module(std::move(mod)) {} void apply(apply_context& context) override { + // Reset execution context (reused per thread) + _runtime->_exec_ctx.set_module(&(_instantiated_module->get_module())); + _instantiated_module->set_context(&_runtime->_exec_ctx); + _instantiated_module->reset_max_call_depth(); + _instantiated_module->reset_max_pages(); + _instantiated_module->set_wasm_allocator(&context.control.get_wasm_allocator()); _runtime->_bkend = _instantiated_module.get(); apply_options opts; @@ -240,9 +246,9 @@ std::unique_ptr eos_vm_runtime::instan .max_call_depth = 0 }; std::unique_ptr bkend = nullptr; if constexpr (std::is_same_v) { - bkend = std::make_unique(code, code_size, nullptr, options, true); // true -- JIT uses single parsing + bkend = std::make_unique(code, code_size, nullptr, options, true, false); // true, false <--> single parsing, backend does not own execution context (execution context is reused per thread) } else { - bkend = std::make_unique(code, code_size, nullptr, options, false); // false -- Interpreter uses 2-passes parsing + bkend = std::make_unique(code, code_size, nullptr, options, false, false); // false, false <--> 2-passes parsing, backend does not own execution context (execution context is reused per thread) } eos_vm_host_functions_t::resolve(bkend->get_module()); return std::make_unique>(this, std::move(bkend));