@@ -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
} ;
@@ -1176,68 +1176,48 @@ where
1176
1176
}
1177
1177
1178
1178
/// Perform a binary operation to two values at the top of the stack.
1179
- fn binop < F , T > ( & mut self , f : F ) -> PartialVMResult < ( ) >
1179
+ #[ inline( always) ]
1180
+ fn binop < F > ( & mut self , f : F ) -> PartialVMResult < ( ) >
1180
1181
where
1181
- Value : VMValueCast < T > ,
1182
- F : FnOnce ( T , T ) -> PartialVMResult < Value > ,
1182
+ F : FnOnce ( Value , Value ) -> PartialVMResult < Value > ,
1183
1183
{
1184
- let rhs = self . operand_stack . pop_as :: < T > ( ) ?;
1185
- let lhs = self . operand_stack . pop_as :: < T > ( ) ?;
1184
+ let rhs = self . operand_stack . pop ( ) ?;
1185
+ let lhs = self . operand_stack . pop ( ) ?;
1186
1186
let result = f ( lhs, rhs) ?;
1187
1187
self . operand_stack . push ( result)
1188
1188
}
1189
1189
1190
- /// Perform a unary operation to one value at the top of the stack.
1191
- fn unop < F , T > ( & mut self , f : F ) -> PartialVMResult < ( ) >
1192
- where
1193
- Value : VMValueCast < T > ,
1194
- F : FnOnce ( T ) -> PartialVMResult < Value > ,
1195
- {
1196
- let arg = self . operand_stack . pop_as :: < T > ( ) ?;
1197
- let result = f ( arg) ?;
1198
- self . operand_stack . push ( result)
1199
- }
1200
-
1201
- /// Perform a binary operation for integer values.
1202
- fn binop_int < F > ( & mut self , f : F ) -> PartialVMResult < ( ) >
1190
+ #[ inline( always) ]
1191
+ fn binop_bool < F > ( & mut self , f : F ) -> PartialVMResult < ( ) >
1203
1192
where
1204
- F : FnOnce ( IntegerValue , IntegerValue ) -> PartialVMResult < IntegerValue > ,
1193
+ F : FnOnce ( bool , bool ) -> PartialVMResult < bool > ,
1205
1194
{
1206
- self . binop ( |lhs, rhs| Ok ( Self :: integer_value_to_value ( f ( lhs, rhs) ?) ) )
1195
+ let rhs = self . operand_stack . pop_as :: < bool > ( ) ?;
1196
+ let lhs = self . operand_stack . pop_as :: < bool > ( ) ?;
1197
+ let result = f ( lhs, rhs) ?;
1198
+ self . operand_stack . push ( Value :: bool ( result) )
1207
1199
}
1208
1200
1209
- /// Perform a unary operation for integer values.
1210
- fn unop_int < F > ( & mut self , f : F ) -> PartialVMResult < ( ) >
1201
+ # [ inline ( always ) ]
1202
+ fn binop_rel < F > ( & mut self , f : F ) -> PartialVMResult < ( ) >
1211
1203
where
1212
- F : FnOnce ( IntegerValue ) -> PartialVMResult < IntegerValue > ,
1204
+ F : FnOnce ( Value , Value ) -> PartialVMResult < bool > ,
1213
1205
{
1214
- self . unop ( |arg| Ok ( Self :: integer_value_to_value ( f ( arg) ?) ) )
1215
- }
1216
-
1217
- fn integer_value_to_value ( val : IntegerValue ) -> Value {
1218
- match val {
1219
- IntegerValue :: U8 ( x) => Value :: u8 ( x) ,
1220
- IntegerValue :: U16 ( x) => Value :: u16 ( x) ,
1221
- IntegerValue :: U32 ( x) => Value :: u32 ( x) ,
1222
- IntegerValue :: U64 ( x) => Value :: u64 ( x) ,
1223
- IntegerValue :: U128 ( x) => Value :: u128 ( x) ,
1224
- IntegerValue :: U256 ( x) => Value :: u256 ( x) ,
1225
- IntegerValue :: I8 ( x) => Value :: i8 ( x) ,
1226
- IntegerValue :: I16 ( x) => Value :: i16 ( x) ,
1227
- IntegerValue :: I32 ( x) => Value :: i32 ( x) ,
1228
- IntegerValue :: I64 ( x) => Value :: i64 ( x) ,
1229
- IntegerValue :: I128 ( x) => Value :: i128 ( x) ,
1230
- IntegerValue :: I256 ( x) => Value :: i256 ( x) ,
1231
- }
1206
+ let rhs = self . operand_stack . pop ( ) ?;
1207
+ let lhs = self . operand_stack . pop ( ) ?;
1208
+ let result = f ( lhs, rhs) ?;
1209
+ self . operand_stack . push ( Value :: bool ( result) )
1232
1210
}
1233
1211
1234
- /// Perform a binary operation for boolean values.
1235
- fn binop_bool < F , T > ( & mut self , f : F ) -> PartialVMResult < ( ) >
1212
+ /// Perform a unary operation to one value at the top of the stack.
1213
+ #[ inline( always) ]
1214
+ fn unop < F > ( & mut self , f : F ) -> PartialVMResult < ( ) >
1236
1215
where
1237
- Value : VMValueCast < T > ,
1238
- F : FnOnce ( T , T ) -> PartialVMResult < bool > ,
1216
+ F : FnOnce ( Value ) -> PartialVMResult < Value > ,
1239
1217
{
1240
- self . binop ( |lhs, rhs| Ok ( Value :: bool ( f ( lhs, rhs) ?) ) )
1218
+ let arg = self . operand_stack . pop ( ) ?;
1219
+ let result = f ( arg) ?;
1220
+ self . operand_stack . push ( result)
1241
1221
}
1242
1222
1243
1223
/// Creates a data cache entry for the specified address-type pair. Charges gas for the number
@@ -2571,84 +2551,84 @@ impl Frame {
2571
2551
} ,
2572
2552
Bytecode :: CastU8 => {
2573
2553
gas_meter. charge_simple_instr ( S :: CastU8 ) ?;
2574
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2554
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2575
2555
interpreter
2576
2556
. operand_stack
2577
2557
. push ( Value :: u8 ( integer_value. cast_u8 ( ) ?) ) ?;
2578
2558
} ,
2579
2559
Bytecode :: CastU16 => {
2580
2560
gas_meter. charge_simple_instr ( S :: CastU16 ) ?;
2581
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2561
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2582
2562
interpreter
2583
2563
. operand_stack
2584
2564
. push ( Value :: u16 ( integer_value. cast_u16 ( ) ?) ) ?;
2585
2565
} ,
2586
2566
Bytecode :: CastU32 => {
2587
2567
gas_meter. charge_simple_instr ( S :: CastU32 ) ?;
2588
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2568
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2589
2569
interpreter
2590
2570
. operand_stack
2591
2571
. push ( Value :: u32 ( integer_value. cast_u32 ( ) ?) ) ?;
2592
2572
} ,
2593
2573
Bytecode :: CastU64 => {
2594
2574
gas_meter. charge_simple_instr ( S :: CastU64 ) ?;
2595
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2575
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2596
2576
interpreter
2597
2577
. operand_stack
2598
2578
. push ( Value :: u64 ( integer_value. cast_u64 ( ) ?) ) ?;
2599
2579
} ,
2600
2580
Bytecode :: CastU128 => {
2601
2581
gas_meter. charge_simple_instr ( S :: CastU128 ) ?;
2602
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2582
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2603
2583
interpreter
2604
2584
. operand_stack
2605
2585
. push ( Value :: u128 ( integer_value. cast_u128 ( ) ?) ) ?;
2606
2586
} ,
2607
2587
Bytecode :: CastU256 => {
2608
2588
gas_meter. charge_simple_instr ( S :: CastU256 ) ?;
2609
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2589
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2610
2590
interpreter
2611
2591
. operand_stack
2612
2592
. push ( Value :: u256 ( integer_value. cast_u256 ( ) ?) ) ?;
2613
2593
} ,
2614
2594
Bytecode :: CastI8 => {
2615
2595
gas_meter. charge_simple_instr ( S :: CastI8 ) ?;
2616
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2596
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2617
2597
interpreter
2618
2598
. operand_stack
2619
2599
. push ( Value :: i8 ( integer_value. cast_i8 ( ) ?) ) ?;
2620
2600
} ,
2621
2601
Bytecode :: CastI16 => {
2622
2602
gas_meter. charge_simple_instr ( S :: CastI16 ) ?;
2623
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2603
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2624
2604
interpreter
2625
2605
. operand_stack
2626
2606
. push ( Value :: i16 ( integer_value. cast_i16 ( ) ?) ) ?;
2627
2607
} ,
2628
2608
Bytecode :: CastI32 => {
2629
2609
gas_meter. charge_simple_instr ( S :: CastI32 ) ?;
2630
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2610
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2631
2611
interpreter
2632
2612
. operand_stack
2633
2613
. push ( Value :: i32 ( integer_value. cast_i32 ( ) ?) ) ?;
2634
2614
} ,
2635
2615
Bytecode :: CastI64 => {
2636
2616
gas_meter. charge_simple_instr ( S :: CastI64 ) ?;
2637
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2617
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2638
2618
interpreter
2639
2619
. operand_stack
2640
2620
. push ( Value :: i64 ( integer_value. cast_i64 ( ) ?) ) ?;
2641
2621
} ,
2642
2622
Bytecode :: CastI128 => {
2643
2623
gas_meter. charge_simple_instr ( S :: CastI128 ) ?;
2644
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2624
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2645
2625
interpreter
2646
2626
. operand_stack
2647
2627
. push ( Value :: i128 ( integer_value. cast_i128 ( ) ?) ) ?;
2648
2628
} ,
2649
2629
Bytecode :: CastI256 => {
2650
2630
gas_meter. charge_simple_instr ( S :: CastI256 ) ?;
2651
- let integer_value = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2631
+ let integer_value = interpreter. operand_stack . pop ( ) ?;
2652
2632
interpreter
2653
2633
. operand_stack
2654
2634
. push ( Value :: i256 ( integer_value. cast_i256 ( ) ?) ) ?;
@@ -2657,55 +2637,51 @@ impl Frame {
2657
2637
// Arithmetic Operations
2658
2638
Bytecode :: Add => {
2659
2639
gas_meter. charge_simple_instr ( S :: Add ) ?;
2660
- interpreter. binop_int ( IntegerValue :: add_checked) ?
2640
+ interpreter. binop ( Value :: add_checked) ?
2661
2641
} ,
2662
2642
Bytecode :: Sub => {
2663
2643
gas_meter. charge_simple_instr ( S :: Sub ) ?;
2664
- interpreter. binop_int ( IntegerValue :: sub_checked) ?
2644
+ interpreter. binop ( Value :: sub_checked) ?
2665
2645
} ,
2666
2646
Bytecode :: Mul => {
2667
2647
gas_meter. charge_simple_instr ( S :: Mul ) ?;
2668
- interpreter. binop_int ( IntegerValue :: mul_checked) ?
2648
+ interpreter. binop ( Value :: mul_checked) ?
2669
2649
} ,
2670
2650
Bytecode :: Mod => {
2671
2651
gas_meter. charge_simple_instr ( S :: Mod ) ?;
2672
- interpreter. binop_int ( IntegerValue :: rem_checked) ?
2652
+ interpreter. binop ( Value :: rem_checked) ?
2673
2653
} ,
2674
2654
Bytecode :: Div => {
2675
2655
gas_meter. charge_simple_instr ( S :: Div ) ?;
2676
- interpreter. binop_int ( IntegerValue :: div_checked) ?
2656
+ interpreter. binop ( Value :: div_checked) ?
2677
2657
} ,
2678
2658
Bytecode :: Negate => {
2679
2659
gas_meter. charge_simple_instr ( S :: Negate ) ?;
2680
- interpreter. unop_int ( IntegerValue :: negate_checked) ?
2660
+ interpreter. unop ( Value :: negate_checked) ?
2681
2661
} ,
2682
2662
Bytecode :: BitOr => {
2683
2663
gas_meter. charge_simple_instr ( S :: BitOr ) ?;
2684
- interpreter. binop_int ( IntegerValue :: bit_or) ?
2664
+ interpreter. binop ( Value :: bit_or) ?
2685
2665
} ,
2686
2666
Bytecode :: BitAnd => {
2687
2667
gas_meter. charge_simple_instr ( S :: BitAnd ) ?;
2688
- interpreter. binop_int ( IntegerValue :: bit_and) ?
2668
+ interpreter. binop ( Value :: bit_and) ?
2689
2669
} ,
2690
2670
Bytecode :: Xor => {
2691
2671
gas_meter. charge_simple_instr ( S :: Xor ) ?;
2692
- interpreter. binop_int ( IntegerValue :: bit_xor) ?
2672
+ interpreter. binop ( Value :: bit_xor) ?
2693
2673
} ,
2694
2674
Bytecode :: Shl => {
2695
2675
gas_meter. charge_simple_instr ( S :: Shl ) ?;
2696
2676
let rhs = interpreter. operand_stack . pop_as :: < u8 > ( ) ?;
2697
- let lhs = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2698
- interpreter
2699
- . operand_stack
2700
- . push ( lhs. shl_checked ( rhs) ?. into_value ( ) ) ?;
2677
+ let lhs = interpreter. operand_stack . pop ( ) ?;
2678
+ interpreter. operand_stack . push ( lhs. shl_checked ( rhs) ?) ?;
2701
2679
} ,
2702
2680
Bytecode :: Shr => {
2703
2681
gas_meter. charge_simple_instr ( S :: Shr ) ?;
2704
2682
let rhs = interpreter. operand_stack . pop_as :: < u8 > ( ) ?;
2705
- let lhs = interpreter. operand_stack . pop_as :: < IntegerValue > ( ) ?;
2706
- interpreter
2707
- . operand_stack
2708
- . push ( lhs. shr_checked ( rhs) ?. into_value ( ) ) ?;
2683
+ let lhs = interpreter. operand_stack . pop ( ) ?;
2684
+ interpreter. operand_stack . push ( lhs. shr_checked ( rhs) ?) ?;
2709
2685
} ,
2710
2686
Bytecode :: Or => {
2711
2687
gas_meter. charge_simple_instr ( S :: Or ) ?;
@@ -2717,19 +2693,19 @@ impl Frame {
2717
2693
} ,
2718
2694
Bytecode :: Lt => {
2719
2695
gas_meter. charge_simple_instr ( S :: Lt ) ?;
2720
- interpreter. binop_bool ( IntegerValue :: lt) ?
2696
+ interpreter. binop_rel ( Value :: lt) ?
2721
2697
} ,
2722
2698
Bytecode :: Gt => {
2723
2699
gas_meter. charge_simple_instr ( S :: Gt ) ?;
2724
- interpreter. binop_bool ( IntegerValue :: gt) ?
2700
+ interpreter. binop_rel ( Value :: gt) ?
2725
2701
} ,
2726
2702
Bytecode :: Le => {
2727
2703
gas_meter. charge_simple_instr ( S :: Le ) ?;
2728
- interpreter. binop_bool ( IntegerValue :: le) ?
2704
+ interpreter. binop_rel ( Value :: le) ?
2729
2705
} ,
2730
2706
Bytecode :: Ge => {
2731
2707
gas_meter. charge_simple_instr ( S :: Ge ) ?;
2732
- interpreter. binop_bool ( IntegerValue :: ge) ?
2708
+ interpreter. binop_rel ( Value :: ge) ?
2733
2709
} ,
2734
2710
Bytecode :: Abort => {
2735
2711
gas_meter. charge_simple_instr ( S :: Abort ) ?;
0 commit comments