sui_adapter_latest/data_store/legacy/
sui_data_store.rs1use crate::data_store::{PackageStore, legacy::linkage_view::LinkageView};
5use move_binary_format::errors::{Location, PartialVMError, PartialVMResult, VMResult};
6use move_core_types::{
7    account_address::AccountAddress, identifier::IdentStr, language_storage::ModuleId,
8    resolver::ModuleResolver, vm_status::StatusCode,
9};
10use move_vm_types::data_store::DataStore;
11use std::rc::Rc;
12use sui_types::{base_types::ObjectID, error::SuiResult, move_package::MovePackage};
13
14pub(crate) struct SuiDataStore<'state, 'a> {
21    linkage_view: &'a LinkageView<'state>,
22    new_packages: &'a [MovePackage],
23}
24
25impl<'state, 'a> SuiDataStore<'state, 'a> {
26    pub(crate) fn new(
27        linkage_view: &'a LinkageView<'state>,
28        new_packages: &'a [MovePackage],
29    ) -> Self {
30        Self {
31            linkage_view,
32            new_packages,
33        }
34    }
35
36    fn get_module(&self, module_id: &ModuleId) -> Option<&Vec<u8>> {
37        for package in self.new_packages {
38            let module = package.get_module(module_id);
39            if module.is_some() {
40                return module;
41            }
42        }
43        None
44    }
45}
46
47impl DataStore for SuiDataStore<'_, '_> {
50    fn link_context(&self) -> PartialVMResult<AccountAddress> {
51        self.linkage_view.link_context().map_err(|e| {
52            PartialVMError::new(StatusCode::UNKNOWN_INVARIANT_VIOLATION_ERROR)
53                .with_message(e.to_string())
54        })
55    }
56
57    fn relocate(&self, module_id: &ModuleId) -> PartialVMResult<ModuleId> {
58        self.linkage_view.relocate(module_id).map_err(|err| {
59            PartialVMError::new(StatusCode::LINKER_ERROR)
60                .with_message(format!("Error relocating {module_id}: {err:?}"))
61        })
62    }
63
64    fn defining_module(
65        &self,
66        runtime_id: &ModuleId,
67        struct_: &IdentStr,
68    ) -> PartialVMResult<ModuleId> {
69        self.linkage_view
70            .defining_module(runtime_id, struct_)
71            .map_err(|err| {
72                PartialVMError::new(StatusCode::LINKER_ERROR).with_message(format!(
73                    "Error finding defining module for {runtime_id}::{struct_}: {err:?}"
74                ))
75            })
76    }
77
78    fn load_module(&self, module_id: &ModuleId) -> VMResult<Vec<u8>> {
79        if let Some(bytes) = self.get_module(module_id) {
80            return Ok(bytes.clone());
81        }
82        match self.linkage_view.get_module(module_id) {
83            Ok(Some(bytes)) => Ok(bytes),
84            Ok(None) => Err(PartialVMError::new(StatusCode::LINKER_ERROR)
85                .with_message(format!("Cannot find {:?} in data cache", module_id))
86                .finish(Location::Undefined)),
87            Err(err) => {
88                let msg = format!("Unexpected storage error: {:?}", err);
89                Err(
90                    PartialVMError::new(StatusCode::UNKNOWN_INVARIANT_VIOLATION_ERROR)
91                        .with_message(msg)
92                        .finish(Location::Undefined),
93                )
94            }
95        }
96    }
97
98    fn publish_module(&mut self, _module_id: &ModuleId, _blob: Vec<u8>) -> VMResult<()> {
99        Ok(())
102    }
103}
104
105impl PackageStore for SuiDataStore<'_, '_> {
106    fn get_package(&self, id: &ObjectID) -> SuiResult<Option<Rc<MovePackage>>> {
107        for package in self.new_packages {
108            if package.id() == *id {
109                return Ok(Some(Rc::new(package.clone())));
110            }
111        }
112        self.linkage_view.get_package(id)
113    }
114
115    fn resolve_type_to_defining_id(
116        &self,
117        _module_address: ObjectID,
118        _module_name: &IdentStr,
119        _type_name: &IdentStr,
120    ) -> SuiResult<Option<ObjectID>> {
121        unimplemented!(
122            "resolve_type_to_defining_id is not implemented for legacy::SuiDataStore and should never be called"
123        )
124    }
125}