multiversx_sc_scenario/executor/debug/
contract_debug_executor.rs1use super::*;
2
3use multiversx_chain_vm::host::runtime::RuntimeWeakRef;
4use multiversx_chain_vm_executor::{CompilationOptions, Executor, ExecutorError, Instance};
5use std::fmt;
6
7pub struct ContractDebugExecutor {
8 runtime_ref: RuntimeWeakRef,
9 contract_map_ref: ContractMapRef,
10}
11
12impl fmt::Debug for ContractDebugExecutor {
13 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
14 f.debug_struct("DebugSCExecutor").finish()
15 }
16}
17
18impl ContractDebugExecutor {
19 pub fn new(runtime_ref: RuntimeWeakRef, contract_map_ref: ContractMapRef) -> Self {
20 ContractDebugExecutor {
21 runtime_ref,
22 contract_map_ref,
23 }
24 }
25
26 pub fn new_contract_container_instance(
27 &self,
28 contract_container: ContractContainerRef,
29 ) -> Box<dyn Instance> {
30 let tx_context_ref = self.runtime_ref.upgrade().get_executor_context();
31 let instance = ContractDebugInstance::new(tx_context_ref, contract_container);
32 Box::new(instance)
33 }
34}
35
36impl Executor for ContractDebugExecutor {
37 fn new_instance(
38 &self,
39 wasm_bytes: &[u8],
40 _compilation_options: &CompilationOptions,
41 ) -> Result<Box<dyn Instance>, ExecutorError> {
42 if let Some(contract_container) = self.contract_map_ref.lock().get_contract(wasm_bytes) {
43 Ok(self.new_contract_container_instance(contract_container))
44 } else {
45 Err(Box::new(ContractDebugExecutorNotRegisteredError::new(
46 wasm_bytes,
47 )))
48 }
49 }
50
51 fn new_instance_from_cache(
52 &self,
53 _cache_bytes: &[u8],
54 _compilation_options: &CompilationOptions,
55 ) -> Result<Box<dyn Instance>, ExecutorError> {
56 panic!("DebugSCExecutor new_instance_from_cache not supported")
57 }
58}