@@ -121,7 +121,7 @@ fn add_simple_struct(module: &mut CompiledModule) {
121
121
abilities : AbilitySet :: EMPTY ,
122
122
type_parameters : vec ! [ ] ,
123
123
} ;
124
-
124
+
125
125
module. struct_defs . push ( struct_def) ;
126
126
module. struct_handles . push ( struct_handle) ;
127
127
@@ -1333,3 +1333,73 @@ fn test_imm_borrow_field_no_arg() {
1333
1333
let _result = type_safety:: verify ( & module, & fun_context, & mut DummyMeter ) ;
1334
1334
}
1335
1335
1336
+
1337
+ #[ test]
1338
+ fn test_mut_borrow_field_correct_type ( ) {
1339
+ let code = vec ! [ Bytecode :: MutBorrowLoc ( 0 ) , Bytecode :: MutBorrowField ( FieldHandleIndex ( 0 ) ) ] ;
1340
+ let mut module = make_module_with_local ( code, SignatureToken :: Struct ( StructHandleIndex ( 0 ) ) ) ;
1341
+ add_simple_struct ( & mut module) ;
1342
+ let fun_context = get_fun_context ( & module) ;
1343
+ let result = type_safety:: verify ( & module, & fun_context, & mut DummyMeter ) ;
1344
+ assert ! ( result. is_ok( ) ) ;
1345
+ }
1346
+
1347
+ #[ test]
1348
+ fn test_mut_borrow_field_wrong_type ( ) {
1349
+ let code = vec ! [ Bytecode :: LdTrue , Bytecode :: MutBorrowField ( FieldHandleIndex ( 0 ) ) ] ;
1350
+ let mut module = make_module_with_local ( code, SignatureToken :: Struct ( StructHandleIndex ( 0 ) ) ) ;
1351
+ add_simple_struct ( & mut module) ;
1352
+ let fun_context = get_fun_context ( & module) ;
1353
+ let result = type_safety:: verify ( & module, & fun_context, & mut DummyMeter ) ;
1354
+ assert_eq ! (
1355
+ result. unwrap_err( ) . major_status( ) ,
1356
+ StatusCode :: BORROWFIELD_TYPE_MISMATCH_ERROR
1357
+ ) ;
1358
+
1359
+ let code = vec ! [ Bytecode :: ImmBorrowLoc ( 0 ) , Bytecode :: MutBorrowField ( FieldHandleIndex ( 0 ) ) ] ;
1360
+ let mut module = make_module_with_local ( code, SignatureToken :: Struct ( StructHandleIndex ( 0 ) ) ) ;
1361
+ add_simple_struct ( & mut module) ;
1362
+ let fun_context = get_fun_context ( & module) ;
1363
+ let result = type_safety:: verify ( & module, & fun_context, & mut DummyMeter ) ;
1364
+ assert_eq ! (
1365
+ result. unwrap_err( ) . major_status( ) ,
1366
+ StatusCode :: BORROWFIELD_TYPE_MISMATCH_ERROR
1367
+ ) ;
1368
+
1369
+ }
1370
+
1371
+ #[ test]
1372
+ fn test_mut_borrow_field_mismatched_types ( ) {
1373
+ let code = vec ! [ Bytecode :: MutBorrowLoc ( 0 ) , Bytecode :: MutBorrowField ( FieldHandleIndex ( 0 ) ) ] ;
1374
+ let mut module = make_module_with_local ( code, SignatureToken :: U64 ) ;
1375
+ add_simple_struct ( & mut module) ;
1376
+ let fun_context = get_fun_context ( & module) ;
1377
+ let result = type_safety:: verify ( & module, & fun_context, & mut DummyMeter ) ;
1378
+ assert_eq ! (
1379
+ result. unwrap_err( ) . major_status( ) ,
1380
+ StatusCode :: BORROWFIELD_TYPE_MISMATCH_ERROR
1381
+ ) ;
1382
+ }
1383
+
1384
+ #[ test]
1385
+ fn test_mut_borrow_field_bad_field ( ) {
1386
+ let code = vec ! [ Bytecode :: MutBorrowLoc ( 0 ) , Bytecode :: MutBorrowField ( FieldHandleIndex ( 0 ) ) ] ;
1387
+ let mut module = make_module_with_local ( code, SignatureToken :: Struct ( StructHandleIndex ( 0 ) ) ) ;
1388
+ add_native_struct ( & mut module) ;
1389
+ let fun_context = get_fun_context ( & module) ;
1390
+ let result = type_safety:: verify ( & module, & fun_context, & mut DummyMeter ) ;
1391
+ assert_eq ! (
1392
+ result. unwrap_err( ) . major_status( ) ,
1393
+ StatusCode :: BORROWFIELD_BAD_FIELD_ERROR
1394
+ ) ;
1395
+ }
1396
+
1397
+ #[ test]
1398
+ #[ should_panic]
1399
+ fn test_mut_borrow_field_no_arg ( ) {
1400
+ let code = vec ! [ Bytecode :: MutBorrowField ( FieldHandleIndex ( 0 ) ) ] ;
1401
+ let mut module = make_module_with_local ( code, SignatureToken :: Struct ( StructHandleIndex ( 0 ) ) ) ;
1402
+ add_simple_struct ( & mut module) ;
1403
+ let fun_context = get_fun_context ( & module) ;
1404
+ let _result = type_safety:: verify ( & module, & fun_context, & mut DummyMeter ) ;
1405
+ }
0 commit comments