Skip to content

Commit c9ca336

Browse files
committed
use ref cell for working set
1 parent 43f2091 commit c9ca336

File tree

1 file changed

+19
-8
lines changed
  • protocol-units/sov-modules/sov-aptos-vm/src/aptos

1 file changed

+19
-8
lines changed

protocol-units/sov-modules/sov-aptos-vm/src/aptos/db.rs

+19-8
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,25 @@ use bytes::Bytes;
1616
use move_binary_format::file_format::CompiledModule;
1717
use move_core_types::gas_schedule::{GasCarrier, InternalGasUnits};
1818
use move_table_extension::{TableHandle, TableOperation, TableResolver};
19-
use sov_modules_api::{StateMap, StateMapAccessor, WorkingSet};
19+
use sov_modules_api::{StateMap, StateMapAccessor, StateReaderAndWriter, WorkingSet};
20+
use sov_prover_storage_manager::new_orphan_storage;
21+
use sov_state::DefaultStorageSpec;
2022
use std::cell::RefCell;
2123
use std::fmt::Debug;
24+
use std::ops::DerefMut;
2225

2326
type Result<T, E = StateviewError> = std::result::Result<T, E>;
2427
/// The Aptos Database structure for storing and working with accounts and their modules.
2528
pub(crate) struct SovAptosDb<'a, S: sov_modules_api::Spec> {
2629
pub(crate) state_data: StateMap<StateKeyWrapper, StateValueWrapper>,
2730
/// Working set
28-
pub(crate) working_set: &'a mut WorkingSet<S>,
31+
pub(crate) working_set: RefCell<&'a mut WorkingSet<S>>,
2932
}
3033

3134
impl<'a, S: sov_modules_api::Spec> SovAptosDb<'a, S> {
3235
pub(crate) fn new(
3336
state_data: StateMap<StateKeyWrapper, StateValueWrapper>,
34-
working_set: &'a mut WorkingSet<S>,
37+
working_set: RefCell<&'a mut WorkingSet<S>>,
3538
) -> Self {
3639
Self { working_set, state_data }
3740
}
@@ -44,9 +47,11 @@ where
4447
{
4548
type Key = StateKey;
4649

47-
fn get_state_value(&mut self, state_key: &Self::Key) -> Result<Option<AptosStateValue>> {
50+
fn get_state_value(&self, state_key: &Self::Key) -> Result<Option<AptosStateValue>> {
4851
let state_key_wrapper = StateKeyWrapper::new(state_key.clone());
49-
let state_value_wrapper = self.state_data.get(&state_key_wrapper, self.working_set);
52+
let mut working_set = self.working_set.borrow_mut();
53+
let mut working_set = working_set.deref_mut().deref_mut();
54+
let state_value_wrapper = self.state_data.get(&state_key_wrapper, working_set.deref_mut());
5055
match state_value_wrapper {
5156
Some(state_value_wrapper) => {
5257
let state_value = state_value_wrapper.into();
@@ -74,9 +79,11 @@ impl<'a, S: sov_modules_api::Spec> ResourceResolver for SovAptosDb<'a, S> {
7479
) -> Result<(Option<Bytes>, usize), Error> {
7580
let ap = AccessPath::resource_access_path(*address, struct_tag.clone())
7681
.expect("Invalid access path.");
82+
let mut working_set = self.working_set.borrow_mut();
83+
let working_set = working_set.deref_mut().deref_mut();
7784
match self
7885
.state_data
79-
.get(&StateKeyWrapper::new(StateKey::access_path(ap)), self.working_set)
86+
.get(&StateKeyWrapper::new(StateKey::access_path(ap)), working_set)
8087
{
8188
Some(val) => Ok((Some(val.0.bytes().clone()), 0)),
8289
None => Ok((None, 0)),
@@ -101,9 +108,11 @@ impl<'a, S: sov_modules_api::Spec> ModuleResolver for SovAptosDb<'a, S> {
101108

102109
fn get_module(&self, id: &ModuleId) -> std::result::Result<Option<Bytes>, Self::Error> {
103110
let ap = AccessPath::from(id);
111+
let mut working_set = self.working_set.borrow_mut();
112+
let working_set = working_set.deref_mut().deref_mut();
104113
match self
105114
.state_data
106-
.get(&StateKeyWrapper::new(StateKey::access_path(ap)), self.working_set)
115+
.get(&StateKeyWrapper::new(StateKey::access_path(ap)), working_set)
107116
{
108117
Some(val) => Ok(Some(val.0.bytes().clone())),
109118
None => Ok(None),
@@ -122,7 +131,9 @@ impl<'a, S: sov_modules_api::Spec> TableResolver for SovAptosDb<'a, S> {
122131
let account_address = AccountAddress::new(address);
123132
let ap = AccessPath::new(AccountAddress::from(account_address), key.to_vec());
124133
let state_key_wrapper = StateKeyWrapper::new(StateKey::access_path(ap));
125-
let state_value_wrapper = self.state_data.get(&state_key_wrapper, self.working_set);
134+
let mut working_set = self.working_set.borrow_mut();
135+
let working_set = working_set.deref_mut().deref_mut();
136+
let state_value_wrapper = self.state_data.get(&state_key_wrapper, working_set);
126137
match state_value_wrapper {
127138
Some(state_value_wrapper) => {
128139
let state_value: StateValue = state_value_wrapper.into();

0 commit comments

Comments
 (0)