@@ -121,7 +121,7 @@ fn add_simple_struct(module: &mut CompiledModule) {
121121 abilities : AbilitySet :: EMPTY ,
122122 type_parameters : vec ! [ ] ,
123123 } ;
124-
124+
125125 module. struct_defs . push ( struct_def) ;
126126 module. struct_handles . push ( struct_handle) ;
127127
@@ -1333,3 +1333,73 @@ fn test_imm_borrow_field_no_arg() {
13331333 let _result = type_safety:: verify ( & module, & fun_context, & mut DummyMeter ) ;
13341334}
13351335
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