Skip to main content

multiversx_sc_scenario/executor/debug/
contract_debug_executor.rs

1use 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}