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}