Skip to content

Commit bd22709

Browse files
wrwgjunxzm1990
authored andcommitted
[vm] Removing IntegerValue and Value wrapper
The `values_impl::IntegerValue` type introduced a rather unnecessary wrapper for integer values, creating to conversions back and force to `Value`. Moreover, the newtype wrapper `Value` for `ValueImpl` was unnecessary as well and created overhead because it cannot be eliminated by the compiler when applied in iterators (as in `values.into_iter().map(Value).collect()`). Both have been removed.
1 parent 901ac24 commit bd22709

File tree

6 files changed

+533
-800
lines changed

6 files changed

+533
-800
lines changed

third_party/move/move-vm/runtime/src/interpreter.rs

Lines changed: 57 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ use move_vm_types::{
5252
natives::function::NativeResult,
5353
resolver::ResourceResolver,
5454
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,
5757
},
5858
views::TypeView,
5959
};
@@ -1222,68 +1222,48 @@ where
12221222
}
12231223

12241224
/// 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<()>
12261227
where
1227-
Value: VMValueCast<T>,
1228-
F: FnOnce(T, T) -> PartialVMResult<Value>,
1228+
F: FnOnce(Value, Value) -> PartialVMResult<Value>,
12291229
{
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()?;
12321232
let result = f(lhs, rhs)?;
12331233
self.operand_stack.push(result)
12341234
}
12351235

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<()>
12491238
where
1250-
F: FnOnce(IntegerValue, IntegerValue) -> PartialVMResult<IntegerValue>,
1239+
F: FnOnce(bool, bool) -> PartialVMResult<bool>,
12511240
{
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))
12531245
}
12541246

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<()>
12571249
where
1258-
F: FnOnce(IntegerValue) -> PartialVMResult<IntegerValue>,
1250+
F: FnOnce(Value, Value) -> PartialVMResult<bool>,
12591251
{
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))
12781256
}
12791257

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<()>
12821261
where
1283-
Value: VMValueCast<T>,
1284-
F: FnOnce(T, T) -> PartialVMResult<bool>,
1262+
F: FnOnce(Value) -> PartialVMResult<Value>,
12851263
{
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)
12871267
}
12881268

12891269
/// Creates a data cache entry for the specified address-type pair. Charges gas for the number
@@ -2626,84 +2606,84 @@ impl Frame {
26262606
},
26272607
Bytecode::CastU8 => {
26282608
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()?;
26302610
interpreter
26312611
.operand_stack
26322612
.push(Value::u8(integer_value.cast_u8()?))?;
26332613
},
26342614
Bytecode::CastU16 => {
26352615
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()?;
26372617
interpreter
26382618
.operand_stack
26392619
.push(Value::u16(integer_value.cast_u16()?))?;
26402620
},
26412621
Bytecode::CastU32 => {
26422622
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()?;
26442624
interpreter
26452625
.operand_stack
26462626
.push(Value::u32(integer_value.cast_u32()?))?;
26472627
},
26482628
Bytecode::CastU64 => {
26492629
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()?;
26512631
interpreter
26522632
.operand_stack
26532633
.push(Value::u64(integer_value.cast_u64()?))?;
26542634
},
26552635
Bytecode::CastU128 => {
26562636
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()?;
26582638
interpreter
26592639
.operand_stack
26602640
.push(Value::u128(integer_value.cast_u128()?))?;
26612641
},
26622642
Bytecode::CastU256 => {
26632643
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()?;
26652645
interpreter
26662646
.operand_stack
26672647
.push(Value::u256(integer_value.cast_u256()?))?;
26682648
},
26692649
Bytecode::CastI8 => {
26702650
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()?;
26722652
interpreter
26732653
.operand_stack
26742654
.push(Value::i8(integer_value.cast_i8()?))?;
26752655
},
26762656
Bytecode::CastI16 => {
26772657
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()?;
26792659
interpreter
26802660
.operand_stack
26812661
.push(Value::i16(integer_value.cast_i16()?))?;
26822662
},
26832663
Bytecode::CastI32 => {
26842664
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()?;
26862666
interpreter
26872667
.operand_stack
26882668
.push(Value::i32(integer_value.cast_i32()?))?;
26892669
},
26902670
Bytecode::CastI64 => {
26912671
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()?;
26932673
interpreter
26942674
.operand_stack
26952675
.push(Value::i64(integer_value.cast_i64()?))?;
26962676
},
26972677
Bytecode::CastI128 => {
26982678
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()?;
27002680
interpreter
27012681
.operand_stack
27022682
.push(Value::i128(integer_value.cast_i128()?))?;
27032683
},
27042684
Bytecode::CastI256 => {
27052685
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()?;
27072687
interpreter
27082688
.operand_stack
27092689
.push(Value::i256(integer_value.cast_i256()?))?;
@@ -2712,55 +2692,51 @@ impl Frame {
27122692
// Arithmetic Operations
27132693
Bytecode::Add => {
27142694
gas_meter.charge_simple_instr(S::Add)?;
2715-
interpreter.binop_int(IntegerValue::add_checked)?
2695+
interpreter.binop(Value::add_checked)?
27162696
},
27172697
Bytecode::Sub => {
27182698
gas_meter.charge_simple_instr(S::Sub)?;
2719-
interpreter.binop_int(IntegerValue::sub_checked)?
2699+
interpreter.binop(Value::sub_checked)?
27202700
},
27212701
Bytecode::Mul => {
27222702
gas_meter.charge_simple_instr(S::Mul)?;
2723-
interpreter.binop_int(IntegerValue::mul_checked)?
2703+
interpreter.binop(Value::mul_checked)?
27242704
},
27252705
Bytecode::Mod => {
27262706
gas_meter.charge_simple_instr(S::Mod)?;
2727-
interpreter.binop_int(IntegerValue::rem_checked)?
2707+
interpreter.binop(Value::rem_checked)?
27282708
},
27292709
Bytecode::Div => {
27302710
gas_meter.charge_simple_instr(S::Div)?;
2731-
interpreter.binop_int(IntegerValue::div_checked)?
2711+
interpreter.binop(Value::div_checked)?
27322712
},
27332713
Bytecode::Negate => {
27342714
gas_meter.charge_simple_instr(S::Negate)?;
2735-
interpreter.unop_int(IntegerValue::negate_checked)?
2715+
interpreter.unop(Value::negate_checked)?
27362716
},
27372717
Bytecode::BitOr => {
27382718
gas_meter.charge_simple_instr(S::BitOr)?;
2739-
interpreter.binop_int(IntegerValue::bit_or)?
2719+
interpreter.binop(Value::bit_or)?
27402720
},
27412721
Bytecode::BitAnd => {
27422722
gas_meter.charge_simple_instr(S::BitAnd)?;
2743-
interpreter.binop_int(IntegerValue::bit_and)?
2723+
interpreter.binop(Value::bit_and)?
27442724
},
27452725
Bytecode::Xor => {
27462726
gas_meter.charge_simple_instr(S::Xor)?;
2747-
interpreter.binop_int(IntegerValue::bit_xor)?
2727+
interpreter.binop(Value::bit_xor)?
27482728
},
27492729
Bytecode::Shl => {
27502730
gas_meter.charge_simple_instr(S::Shl)?;
27512731
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)?)?;
27562734
},
27572735
Bytecode::Shr => {
27582736
gas_meter.charge_simple_instr(S::Shr)?;
27592737
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)?)?;
27642740
},
27652741
Bytecode::Or => {
27662742
gas_meter.charge_simple_instr(S::Or)?;
@@ -2772,19 +2748,19 @@ impl Frame {
27722748
},
27732749
Bytecode::Lt => {
27742750
gas_meter.charge_simple_instr(S::Lt)?;
2775-
interpreter.binop_bool(IntegerValue::lt)?
2751+
interpreter.binop_rel(Value::lt)?
27762752
},
27772753
Bytecode::Gt => {
27782754
gas_meter.charge_simple_instr(S::Gt)?;
2779-
interpreter.binop_bool(IntegerValue::gt)?
2755+
interpreter.binop_rel(Value::gt)?
27802756
},
27812757
Bytecode::Le => {
27822758
gas_meter.charge_simple_instr(S::Le)?;
2783-
interpreter.binop_bool(IntegerValue::le)?
2759+
interpreter.binop_rel(Value::le)?
27842760
},
27852761
Bytecode::Ge => {
27862762
gas_meter.charge_simple_instr(S::Ge)?;
2787-
interpreter.binop_bool(IntegerValue::ge)?
2763+
interpreter.binop_rel(Value::ge)?
27882764
},
27892765
Bytecode::Abort => {
27902766
gas_meter.charge_simple_instr(S::Abort)?;

third_party/move/move-vm/types/src/value_serde.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ impl<'a> ValueSerDeContext<'a> {
193193
let value = SerializationReadyValue {
194194
ctx: &self,
195195
layout,
196-
value: &value.0,
196+
value,
197197
depth: 1,
198198
};
199199

@@ -223,7 +223,7 @@ impl<'a> ValueSerDeContext<'a> {
223223
let value = SerializationReadyValue {
224224
ctx: &self,
225225
layout,
226-
value: &value.0,
226+
value,
227227
depth: 1,
228228
};
229229
bcs::serialized_size(&value).map_err(|e| {

third_party/move/move-vm/types/src/value_traversal.rs

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
use crate::{
55
delayed_values::error::code_invariant_error,
6-
values::{Closure, Container, Value, ValueImpl},
6+
values::{Closure, Container, Value},
77
};
88
use move_binary_format::errors::{PartialVMError, PartialVMResult};
99
use move_core_types::vm_status::StatusCode;
@@ -16,30 +16,30 @@ pub fn find_identifiers_in_value(
1616
value: &Value,
1717
identifiers: &mut HashSet<u64>,
1818
) -> PartialVMResult<()> {
19-
find_identifiers_in_value_impl(&value.0, identifiers)
19+
find_identifiers_in_value_impl(value, identifiers)
2020
}
2121

2222
fn find_identifiers_in_value_impl(
23-
value: &ValueImpl,
23+
value: &Value,
2424
identifiers: &mut HashSet<u64>,
2525
) -> PartialVMResult<()> {
2626
match value {
27-
ValueImpl::U8(_)
28-
| ValueImpl::U16(_)
29-
| ValueImpl::U32(_)
30-
| ValueImpl::U64(_)
31-
| ValueImpl::U128(_)
32-
| ValueImpl::U256(_)
33-
| ValueImpl::I8(_)
34-
| ValueImpl::I16(_)
35-
| ValueImpl::I32(_)
36-
| ValueImpl::I64(_)
37-
| ValueImpl::I128(_)
38-
| ValueImpl::I256(_)
39-
| ValueImpl::Bool(_)
40-
| ValueImpl::Address(_) => {},
41-
42-
ValueImpl::Container(c) => match c {
27+
Value::U8(_)
28+
| Value::U16(_)
29+
| Value::U32(_)
30+
| Value::U64(_)
31+
| Value::U128(_)
32+
| Value::U256(_)
33+
| Value::I8(_)
34+
| Value::I16(_)
35+
| Value::I32(_)
36+
| Value::I64(_)
37+
| Value::I128(_)
38+
| Value::I256(_)
39+
| Value::Bool(_)
40+
| Value::Address(_) => {},
41+
42+
Value::Container(c) => match c {
4343
Container::Locals(_) => {
4444
return Err(PartialVMError::new(
4545
StatusCode::UNKNOWN_INVARIANT_VIOLATION_ERROR,
@@ -68,19 +68,19 @@ fn find_identifiers_in_value_impl(
6868
},
6969
},
7070

71-
ValueImpl::ClosureValue(Closure(_, captured)) => {
71+
Value::ClosureValue(Closure(_, captured)) => {
7272
for val in captured.iter() {
7373
find_identifiers_in_value_impl(val, identifiers)?;
7474
}
7575
},
7676

77-
ValueImpl::Invalid | ValueImpl::ContainerRef(_) | ValueImpl::IndexedRef(_) => {
77+
Value::Invalid | Value::ContainerRef(_) | Value::IndexedRef(_) => {
7878
return Err(PartialVMError::new(
7979
StatusCode::UNKNOWN_INVARIANT_VIOLATION_ERROR,
8080
))
8181
},
8282

83-
ValueImpl::DelayedFieldID { id } => {
83+
Value::DelayedFieldID { id } => {
8484
if !identifiers.insert(id.as_u64()) {
8585
return Err(code_invariant_error(
8686
"Duplicated identifiers for Move value".to_string(),

0 commit comments

Comments
 (0)