@@ -52,8 +52,8 @@ use move_vm_types::{
52
52
natives:: function:: NativeResult ,
53
53
resolver:: ResourceResolver ,
54
54
values:: {
55
- self , AbstractFunction , Closure , GlobalValue , IntegerValue , Locals , Reference , SignerRef ,
56
- Struct , StructRef , VMValueCast , Value , Vector , VectorRef ,
55
+ self , AbstractFunction , Closure , GlobalValue , Locals , Reference , SignerRef , Struct ,
56
+ StructRef , VMValueCast , Value , Vector , VectorRef ,
57
57
} ,
58
58
views:: TypeView ,
59
59
} ;
@@ -1222,68 +1222,48 @@ where
1222
1222
}
1223
1223
1224
1224
/// Perform a binary operation to two values at the top of the stack.
1225
- fn binop < F , T > ( & mut self , f : F ) -> PartialVMResult < ( ) >
1225
+ #[ inline( always) ]
1226
+ fn binop < F > ( & mut self , f : F ) -> PartialVMResult < ( ) >
1226
1227
where
1227
- Value : VMValueCast < T > ,
1228
- F : FnOnce ( T , T ) -> PartialVMResult < Value > ,
1228
+ F : FnOnce ( Value , Value ) -> PartialVMResult < Value > ,
1229
1229
{
1230
- let rhs = self . operand_stack . pop_as :: < T > ( ) ?;
1231
- let lhs = self . operand_stack . pop_as :: < T > ( ) ?;
1230
+ let rhs = self . operand_stack . pop ( ) ?;
1231
+ let lhs = self . operand_stack . pop ( ) ?;
1232
1232
let result = f ( lhs, rhs) ?;
1233
1233
self . operand_stack . push ( result)
1234
1234
}
1235
1235
1236
- /// Perform a unary operation to one value at the top of the stack.
1237
- fn unop < F , T > ( & mut self , f : F ) -> PartialVMResult < ( ) >
1238
- where
1239
- Value : VMValueCast < T > ,
1240
- F : FnOnce ( T ) -> PartialVMResult < Value > ,
1241
- {
1242
- let arg = self . operand_stack . pop_as :: < T > ( ) ?;
1243
- let result = f ( arg) ?;
1244
- self . operand_stack . push ( result)
1245
- }
1246
-
1247
- /// Perform a binary operation for integer values.
1248
- fn binop_int < F > ( & mut self , f : F ) -> PartialVMResult < ( ) >
1236
+ #[ inline( always) ]
1237
+ fn binop_bool < F > ( & mut self , f : F ) -> PartialVMResult < ( ) >
1249
1238
where
1250
- F : FnOnce ( IntegerValue , IntegerValue ) -> PartialVMResult < IntegerValue > ,
1239
+ F : FnOnce ( bool , bool ) -> PartialVMResult < bool > ,
1251
1240
{
1252
- self . binop ( |lhs, rhs| Ok ( Self :: integer_value_to_value ( f ( lhs, rhs) ?) ) )
1241
+ let rhs = self . operand_stack . pop_as :: < bool > ( ) ?;
1242
+ let lhs = self . operand_stack . pop_as :: < bool > ( ) ?;
1243
+ let result = f ( lhs, rhs) ?;
1244
+ self . operand_stack . push ( Value :: bool ( result) )
1253
1245
}
1254
1246
1255
- /// Perform a unary operation for integer values.
1256
- fn unop_int < F > ( & mut self , f : F ) -> PartialVMResult < ( ) >
1247
+ # [ inline ( always ) ]
1248
+ fn binop_rel < F > ( & mut self , f : F ) -> PartialVMResult < ( ) >
1257
1249
where
1258
- F : FnOnce ( IntegerValue ) -> PartialVMResult < IntegerValue > ,
1250
+ F : FnOnce ( Value , Value ) -> PartialVMResult < bool > ,
1259
1251
{
1260
- self . unop ( |arg| Ok ( Self :: integer_value_to_value ( f ( arg) ?) ) )
1261
- }
1262
-
1263
- fn integer_value_to_value ( val : IntegerValue ) -> Value {
1264
- match val {
1265
- IntegerValue :: U8 ( x) => Value :: u8 ( x) ,
1266
- IntegerValue :: U16 ( x) => Value :: u16 ( x) ,
1267
- IntegerValue :: U32 ( x) => Value :: u32 ( x) ,
1268
- IntegerValue :: U64 ( x) => Value :: u64 ( x) ,
1269
- IntegerValue :: U128 ( x) => Value :: u128 ( x) ,
1270
- IntegerValue :: U256 ( x) => Value :: u256 ( x) ,
1271
- IntegerValue :: I8 ( x) => Value :: i8 ( x) ,
1272
- IntegerValue :: I16 ( x) => Value :: i16 ( x) ,
1273
- IntegerValue :: I32 ( x) => Value :: i32 ( x) ,
1274
- IntegerValue :: I64 ( x) => Value :: i64 ( x) ,
1275
- IntegerValue :: I128 ( x) => Value :: i128 ( x) ,
1276
- IntegerValue :: I256 ( x) => Value :: i256 ( x) ,
1277
- }
1252
+ let rhs = self . operand_stack . pop ( ) ?;
1253
+ let lhs = self . operand_stack . pop ( ) ?;
1254
+ let result = f ( lhs, rhs) ?;
1255
+ self . operand_stack . push ( Value :: bool ( result) )
1278
1256
}
1279
1257
1280
- /// Perform a binary operation for boolean values.
1281
- fn binop_bool < F , T > ( & mut self , f : F ) -> PartialVMResult < ( ) >
1258
+ /// Perform a unary operation to one value at the top of the stack.
1259
+ #[ inline( always) ]
1260
+ fn unop < F > ( & mut self , f : F ) -> PartialVMResult < ( ) >
1282
1261
where
1283
- Value : VMValueCast < T > ,
1284
- F : FnOnce ( T , T ) -> PartialVMResult < bool > ,
1262
+ F : FnOnce ( Value ) -> PartialVMResult < Value > ,
1285
1263
{
1286
- self . binop ( |lhs, rhs| Ok ( Value :: bool ( f ( lhs, rhs) ?) ) )
1264
+ let arg = self . operand_stack . pop ( ) ?;
1265
+ let result = f ( arg) ?;
1266
+ self . operand_stack . push ( result)
1287
1267
}
1288
1268
1289
1269
/// Creates a data cache entry for the specified address-type pair. Charges gas for the number
@@ -2626,84 +2606,84 @@ impl Frame {
2626
2606
} ,
2627
2607
Bytecode :: CastU8 => {
2628
2608
gas_meter. charge_simple_instr ( S :: CastU8 ) ?;
2629
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2609
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2630
2610
interpreter
2631
2611
. operand_stack
2632
2612
. push ( Value :: u8 ( integer_value. cast_u8 ( ) ?) ) ?;
2633
2613
} ,
2634
2614
Bytecode :: CastU16 => {
2635
2615
gas_meter. charge_simple_instr ( S :: CastU16 ) ?;
2636
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2616
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2637
2617
interpreter
2638
2618
. operand_stack
2639
2619
. push ( Value :: u16 ( integer_value. cast_u16 ( ) ?) ) ?;
2640
2620
} ,
2641
2621
Bytecode :: CastU32 => {
2642
2622
gas_meter. charge_simple_instr ( S :: CastU32 ) ?;
2643
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2623
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2644
2624
interpreter
2645
2625
. operand_stack
2646
2626
. push ( Value :: u32 ( integer_value. cast_u32 ( ) ?) ) ?;
2647
2627
} ,
2648
2628
Bytecode :: CastU64 => {
2649
2629
gas_meter. charge_simple_instr ( S :: CastU64 ) ?;
2650
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2630
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2651
2631
interpreter
2652
2632
. operand_stack
2653
2633
. push ( Value :: u64 ( integer_value. cast_u64 ( ) ?) ) ?;
2654
2634
} ,
2655
2635
Bytecode :: CastU128 => {
2656
2636
gas_meter. charge_simple_instr ( S :: CastU128 ) ?;
2657
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2637
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2658
2638
interpreter
2659
2639
. operand_stack
2660
2640
. push ( Value :: u128 ( integer_value. cast_u128 ( ) ?) ) ?;
2661
2641
} ,
2662
2642
Bytecode :: CastU256 => {
2663
2643
gas_meter. charge_simple_instr ( S :: CastU256 ) ?;
2664
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2644
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2665
2645
interpreter
2666
2646
. operand_stack
2667
2647
. push ( Value :: u256 ( integer_value. cast_u256 ( ) ?) ) ?;
2668
2648
} ,
2669
2649
Bytecode :: CastI8 => {
2670
2650
gas_meter. charge_simple_instr ( S :: CastI8 ) ?;
2671
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2651
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2672
2652
interpreter
2673
2653
. operand_stack
2674
2654
. push ( Value :: i8 ( integer_value. cast_i8 ( ) ?) ) ?;
2675
2655
} ,
2676
2656
Bytecode :: CastI16 => {
2677
2657
gas_meter. charge_simple_instr ( S :: CastI16 ) ?;
2678
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2658
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2679
2659
interpreter
2680
2660
. operand_stack
2681
2661
. push ( Value :: i16 ( integer_value. cast_i16 ( ) ?) ) ?;
2682
2662
} ,
2683
2663
Bytecode :: CastI32 => {
2684
2664
gas_meter. charge_simple_instr ( S :: CastI32 ) ?;
2685
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2665
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2686
2666
interpreter
2687
2667
. operand_stack
2688
2668
. push ( Value :: i32 ( integer_value. cast_i32 ( ) ?) ) ?;
2689
2669
} ,
2690
2670
Bytecode :: CastI64 => {
2691
2671
gas_meter. charge_simple_instr ( S :: CastI64 ) ?;
2692
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2672
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2693
2673
interpreter
2694
2674
. operand_stack
2695
2675
. push ( Value :: i64 ( integer_value. cast_i64 ( ) ?) ) ?;
2696
2676
} ,
2697
2677
Bytecode :: CastI128 => {
2698
2678
gas_meter. charge_simple_instr ( S :: CastI128 ) ?;
2699
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2679
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2700
2680
interpreter
2701
2681
. operand_stack
2702
2682
. push ( Value :: i128 ( integer_value. cast_i128 ( ) ?) ) ?;
2703
2683
} ,
2704
2684
Bytecode :: CastI256 => {
2705
2685
gas_meter. charge_simple_instr ( S :: CastI256 ) ?;
2706
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2686
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2707
2687
interpreter
2708
2688
. operand_stack
2709
2689
. push ( Value :: i256 ( integer_value. cast_i256 ( ) ?) ) ?;
@@ -2712,55 +2692,51 @@ impl Frame {
2712
2692
// Arithmetic Operations
2713
2693
Bytecode :: Add => {
2714
2694
gas_meter. charge_simple_instr ( S :: Add ) ?;
2715
- interpreter. binop_int ( IntegerValue :: add_checked) ?
2695
+ interpreter. binop ( Value :: add_checked) ?
2716
2696
} ,
2717
2697
Bytecode :: Sub => {
2718
2698
gas_meter. charge_simple_instr ( S :: Sub ) ?;
2719
- interpreter. binop_int ( IntegerValue :: sub_checked) ?
2699
+ interpreter. binop ( Value :: sub_checked) ?
2720
2700
} ,
2721
2701
Bytecode :: Mul => {
2722
2702
gas_meter. charge_simple_instr ( S :: Mul ) ?;
2723
- interpreter. binop_int ( IntegerValue :: mul_checked) ?
2703
+ interpreter. binop ( Value :: mul_checked) ?
2724
2704
} ,
2725
2705
Bytecode :: Mod => {
2726
2706
gas_meter. charge_simple_instr ( S :: Mod ) ?;
2727
- interpreter. binop_int ( IntegerValue :: rem_checked) ?
2707
+ interpreter. binop ( Value :: rem_checked) ?
2728
2708
} ,
2729
2709
Bytecode :: Div => {
2730
2710
gas_meter. charge_simple_instr ( S :: Div ) ?;
2731
- interpreter. binop_int ( IntegerValue :: div_checked) ?
2711
+ interpreter. binop ( Value :: div_checked) ?
2732
2712
} ,
2733
2713
Bytecode :: Negate => {
2734
2714
gas_meter. charge_simple_instr ( S :: Negate ) ?;
2735
- interpreter. unop_int ( IntegerValue :: negate_checked) ?
2715
+ interpreter. unop ( Value :: negate_checked) ?
2736
2716
} ,
2737
2717
Bytecode :: BitOr => {
2738
2718
gas_meter. charge_simple_instr ( S :: BitOr ) ?;
2739
- interpreter. binop_int ( IntegerValue :: bit_or) ?
2719
+ interpreter. binop ( Value :: bit_or) ?
2740
2720
} ,
2741
2721
Bytecode :: BitAnd => {
2742
2722
gas_meter. charge_simple_instr ( S :: BitAnd ) ?;
2743
- interpreter. binop_int ( IntegerValue :: bit_and) ?
2723
+ interpreter. binop ( Value :: bit_and) ?
2744
2724
} ,
2745
2725
Bytecode :: Xor => {
2746
2726
gas_meter. charge_simple_instr ( S :: Xor ) ?;
2747
- interpreter. binop_int ( IntegerValue :: bit_xor) ?
2727
+ interpreter. binop ( Value :: bit_xor) ?
2748
2728
} ,
2749
2729
Bytecode :: Shl => {
2750
2730
gas_meter. charge_simple_instr ( S :: Shl ) ?;
2751
2731
let rhs = interpreter. operand_stack . pop_as :: < u8 > ( ) ?;
2752
- let lhs = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2753
- interpreter
2754
- . operand_stack
2755
- . push ( lhs. shl_checked ( rhs) ?. into_value ( ) ) ?;
2732
+ let lhs = interpreter. operand_stack . pop ( ) ?;
2733
+ interpreter. operand_stack . push ( lhs. shl_checked ( rhs) ?) ?;
2756
2734
} ,
2757
2735
Bytecode :: Shr => {
2758
2736
gas_meter. charge_simple_instr ( S :: Shr ) ?;
2759
2737
let rhs = interpreter. operand_stack . pop_as :: < u8 > ( ) ?;
2760
- let lhs = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2761
- interpreter
2762
- . operand_stack
2763
- . push ( lhs. shr_checked ( rhs) ?. into_value ( ) ) ?;
2738
+ let lhs = interpreter. operand_stack . pop ( ) ?;
2739
+ interpreter. operand_stack . push ( lhs. shr_checked ( rhs) ?) ?;
2764
2740
} ,
2765
2741
Bytecode :: Or => {
2766
2742
gas_meter. charge_simple_instr ( S :: Or ) ?;
@@ -2772,19 +2748,19 @@ impl Frame {
2772
2748
} ,
2773
2749
Bytecode :: Lt => {
2774
2750
gas_meter. charge_simple_instr ( S :: Lt ) ?;
2775
- interpreter. binop_bool ( IntegerValue :: lt) ?
2751
+ interpreter. binop_rel ( Value :: lt) ?
2776
2752
} ,
2777
2753
Bytecode :: Gt => {
2778
2754
gas_meter. charge_simple_instr ( S :: Gt ) ?;
2779
- interpreter. binop_bool ( IntegerValue :: gt) ?
2755
+ interpreter. binop_rel ( Value :: gt) ?
2780
2756
} ,
2781
2757
Bytecode :: Le => {
2782
2758
gas_meter. charge_simple_instr ( S :: Le ) ?;
2783
- interpreter. binop_bool ( IntegerValue :: le) ?
2759
+ interpreter. binop_rel ( Value :: le) ?
2784
2760
} ,
2785
2761
Bytecode :: Ge => {
2786
2762
gas_meter. charge_simple_instr ( S :: Ge ) ?;
2787
- interpreter. binop_bool ( IntegerValue :: ge) ?
2763
+ interpreter. binop_rel ( Value :: ge) ?
2788
2764
} ,
2789
2765
Bytecode :: Abort => {
2790
2766
gas_meter. charge_simple_instr ( S :: Abort ) ?;
0 commit comments