@@ -15,10 +15,7 @@ mod checked {
15
15
} ,
16
16
gas_charger:: GasCharger ,
17
17
gas_meter:: SuiGasMeter ,
18
- programmable_transactions:: {
19
- data_store:: { PackageStore , SuiDataStore } ,
20
- linkage_view:: LinkageView ,
21
- } ,
18
+ programmable_transactions:: { data_store:: SuiDataStore , linkage_view:: LinkageView } ,
22
19
type_resolver:: TypeTagResolver ,
23
20
} ;
24
21
use move_binary_format:: {
@@ -62,7 +59,7 @@ mod checked {
62
59
metrics:: LimitsMetrics ,
63
60
move_package:: MovePackage ,
64
61
object:: { Authenticator , Data , MoveObject , Object , ObjectInner , Owner } ,
65
- storage:: DenyListResult ,
62
+ storage:: { BackingPackageStore , DenyListResult , PackageObject } ,
66
63
transaction:: { Argument , CallArg , ObjectArg } ,
67
64
} ;
68
65
use tracing:: instrument;
@@ -288,10 +285,10 @@ mod checked {
288
285
. unwrap_or ( * package_id) ) ;
289
286
}
290
287
291
- let move_package = get_package ( & self . linkage_view , package_id)
288
+ let package = package_for_linkage ( & self . linkage_view , package_id)
292
289
. map_err ( |e| self . convert_vm_error ( e) ) ?;
293
290
294
- self . linkage_view . set_linkage ( & move_package)
291
+ self . linkage_view . set_linkage ( package . move_package ( ) )
295
292
}
296
293
297
294
/// Load a type using the context's current session.
@@ -344,12 +341,7 @@ mod checked {
344
341
}
345
342
let new_events = events
346
343
. into_iter ( )
347
- . map ( |( tag, value) | {
348
- let ty = unwrap_type_tag_load (
349
- self . protocol_config ,
350
- self . load_type_from_struct ( & tag)
351
- . map_err ( |e| self . convert_vm_error ( e) ) ,
352
- ) ?;
344
+ . map ( |( ty, tag, value) | {
353
345
let layout = self
354
346
. vm
355
347
. get_runtime ( )
@@ -712,7 +704,7 @@ mod checked {
712
704
let Self {
713
705
protocol_config,
714
706
vm,
715
- mut linkage_view,
707
+ linkage_view,
716
708
mut native_extensions,
717
709
tx_context,
718
710
gas_charger,
@@ -847,6 +839,12 @@ mod checked {
847
839
loaded_runtime_objects. extend ( loaded_child_objects) ;
848
840
849
841
let mut written_objects = BTreeMap :: new ( ) ;
842
+ for package in new_packages {
843
+ let package_obj = Object :: new_from_package ( package, tx_digest) ;
844
+ let id = package_obj. id ( ) ;
845
+ created_object_ids. insert ( id) ;
846
+ written_objects. insert ( id, package_obj) ;
847
+ }
850
848
for ( id, additional_write) in additional_writes {
851
849
let AdditionalWrite {
852
850
recipient,
@@ -874,24 +872,7 @@ mod checked {
874
872
}
875
873
}
876
874
877
- for ( id, ( recipient, tag, value) ) in writes {
878
- let ty = unwrap_type_tag_load (
879
- protocol_config,
880
- load_type_from_struct (
881
- vm,
882
- & mut linkage_view,
883
- & new_packages,
884
- & StructTag :: from ( tag. clone ( ) ) ,
885
- )
886
- . map_err ( |e| {
887
- convert_vm_error (
888
- e,
889
- vm,
890
- & linkage_view,
891
- protocol_config. resolve_abort_locations_to_package_id ( ) ,
892
- )
893
- } ) ,
894
- ) ?;
875
+ for ( id, ( recipient, ty, value) ) in writes {
895
876
let abilities = vm. get_runtime ( ) . get_type_abilities ( & ty) . map_err ( |e| {
896
877
convert_vm_error (
897
878
e,
@@ -929,13 +910,6 @@ mod checked {
929
910
written_objects. insert ( id, object) ;
930
911
}
931
912
932
- for package in new_packages {
933
- let package_obj = Object :: new_from_package ( package, tx_digest) ;
934
- let id = package_obj. id ( ) ;
935
- created_object_ids. insert ( id) ;
936
- written_objects. insert ( id, package_obj) ;
937
- }
938
-
939
913
// Before finishing, ensure that any shared object taken by value by the transaction is either:
940
914
// 1. Mutated (and still has a shared ownership); or
941
915
// 2. Deleted.
@@ -1049,6 +1023,7 @@ mod checked {
1049
1023
1050
1024
/// Special case errors for type arguments to Move functions
1051
1025
pub fn convert_type_argument_error ( & self , idx : usize , error : VMError ) -> ExecutionError {
1026
+ use move_core_types:: vm_status:: StatusCode ;
1052
1027
use sui_types:: execution_status:: TypeArgumentError ;
1053
1028
match error. major_status ( ) {
1054
1029
StatusCode :: NUMBER_OF_TYPE_ARGUMENTS_MISMATCH => {
@@ -1309,17 +1284,22 @@ mod checked {
1309
1284
1310
1285
/// Fetch the package at `package_id` with a view to using it as a link context. Produces an error
1311
1286
/// if the object at that ID does not exist, or is not a package.
1312
- fn get_package (
1313
- package_store : & dyn PackageStore ,
1287
+ fn package_for_linkage (
1288
+ linkage_view : & LinkageView ,
1314
1289
package_id : ObjectID ,
1315
- ) -> VMResult < Rc < MovePackage > > {
1316
- match package_store. get_package ( & package_id) {
1290
+ ) -> VMResult < PackageObject > {
1291
+ use move_binary_format:: errors:: PartialVMError ;
1292
+ use move_core_types:: vm_status:: StatusCode ;
1293
+
1294
+ match linkage_view. get_package_object ( & package_id) {
1317
1295
Ok ( Some ( package) ) => Ok ( package) ,
1318
1296
Ok ( None ) => Err ( PartialVMError :: new ( StatusCode :: LINKER_ERROR )
1319
1297
. with_message ( format ! ( "Cannot find link context {package_id} in store" ) )
1320
1298
. finish ( Location :: Undefined ) ) ,
1321
1299
Err ( err) => Err ( PartialVMError :: new ( StatusCode :: LINKER_ERROR )
1322
- . with_message ( format ! ( "Error loading {package_id} from store: {err}" ) )
1300
+ . with_message ( format ! (
1301
+ "Error loading link context {package_id} from store: {err}"
1302
+ ) )
1323
1303
. finish ( Location :: Undefined ) ) ,
1324
1304
}
1325
1305
}
@@ -1343,27 +1323,22 @@ mod checked {
1343
1323
1344
1324
// Load the package that the struct is defined in, in storage
1345
1325
let defining_id = ObjectID :: from_address ( * address) ;
1346
-
1347
- let data_store = SuiDataStore :: new ( linkage_view, new_packages) ;
1348
- let move_package = get_package ( & data_store, defining_id) ?;
1349
-
1350
- // Save the link context as we need to set it while loading the struct and we don't want to
1351
- // clobber it.
1352
- let saved_linkage = linkage_view. steal_linkage ( ) ;
1326
+ let package = package_for_linkage ( linkage_view, defining_id) ?;
1353
1327
1354
1328
// Set the defining package as the link context while loading the
1355
1329
// struct
1356
1330
let original_address = linkage_view
1357
- . set_linkage ( & move_package)
1358
- . expect ( "Linkage context was just stolen. Therefore must be empty" ) ;
1331
+ . set_linkage ( package. move_package ( ) )
1332
+ . map_err ( |e| {
1333
+ PartialVMError :: new ( StatusCode :: UNKNOWN_INVARIANT_VIOLATION_ERROR )
1334
+ . with_message ( e. to_string ( ) )
1335
+ . finish ( Location :: Undefined )
1336
+ } ) ?;
1359
1337
1360
1338
let runtime_id = ModuleId :: new ( original_address, module. clone ( ) ) ;
1361
1339
let data_store = SuiDataStore :: new ( linkage_view, new_packages) ;
1362
1340
let res = vm. get_runtime ( ) . load_type ( & runtime_id, name, & data_store) ;
1363
1341
linkage_view. reset_linkage ( ) ;
1364
- linkage_view
1365
- . restore_linkage ( saved_linkage)
1366
- . expect ( "Linkage context was just reset. Therefore must be empty" ) ;
1367
1342
let ( idx, struct_type) = res?;
1368
1343
1369
1344
// Recursively load type parameters, if necessary
@@ -1732,17 +1707,6 @@ mod checked {
1732
1707
}
1733
1708
}
1734
1709
1735
- fn unwrap_type_tag_load (
1736
- protocol_config : & ProtocolConfig ,
1737
- ty : Result < Type , ExecutionError > ,
1738
- ) -> Result < Type , ExecutionError > {
1739
- if ty. is_err ( ) && !protocol_config. type_tags_in_object_runtime ( ) {
1740
- panic ! ( "Failed to load a type tag from the object runtime -- this shouldn't happen" )
1741
- } else {
1742
- ty
1743
- }
1744
- }
1745
-
1746
1710
enum EitherError {
1747
1711
CommandArgument ( CommandArgumentError ) ,
1748
1712
Execution ( ExecutionError ) ,
0 commit comments