Skip to content

Commit f2aa41d

Browse files
authored
Merge pull request #206 from ethereum/rust-enum-aliases
rust: add enum aliases
2 parents 17cc827 + 6ffb0f9 commit f2aa41d

File tree

5 files changed

+113
-50
lines changed

5 files changed

+113
-50
lines changed

CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,20 @@ and this project adheres to [Semantic Versioning].
1212
- Added `MockedHost` C++ class (in form of header-only `evmc::mocked_host` library)
1313
which can be used to emulate Host behavior when testing VM implementations.
1414
[#456](https://github.com/ethereum/evmc/pull/456)
15+
- In the Rust bindings added more type aliases (`MessageKind`, `MessageFlags`, `StatusCode`,
16+
`StorageStatus`, `Revision`).
17+
[#206](https://github.com/ethereum/evmc/pull/206)
1518

1619
### Changed
1720

21+
- Require Rust 1.37.0 as a minimum.
1822
- In the Rust bindings mark read-only functions in `ExecutionContext` as non-mutating.
1923
[#444](https://github.com/ethereum/evmc/pull/444)
2024
- In the C++ `HostInterface` the logically read-only methods are marked with `const`.
2125
[#461](https://github.com/ethereum/evmc/pull/461)
2226
- Updated dependencies of the Rust bindings to latest stable versions.
2327
[#462](https://github.com/ethereum/evmc/pull/462)
2428

25-
2629
## [7.0.0] „Istanbul Ready” — 2019-11-11
2730

2831
This version of EVMC delivers compatibility with Istanbul EVM revision.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Please visit the [documentation].
2424
| **C** | C99, C11 | GCC 6+, clang 3.8+, MSVC 2015+
2525
| **C++** | C++11, C++14, C++17 | GCC 6+, clang 3.8+, MSVC 2015+
2626
| **Go** _(bindings)_ | 1.9 - 1.12 |
27-
| **Rust** _(bindings)_[¹](#n1) | 2018 edition | 1.31.0 and newer
27+
| **Rust** _(bindings)_[¹](#n1) | 2018 edition | 1.37.0 and newer
2828

2929
<b id="n1">1</b>. Rust support is limited and not complete yet, but it is mostly functional already. Breaking changes are possible at this stage.
3030

bindings/rust/evmc-vm/src/lib.rs

Lines changed: 42 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ pub trait EvmcVm {
2222
/// This is called for every incoming message.
2323
fn execute<'a>(
2424
&self,
25-
revision: ffi::evmc_revision,
25+
revision: Revision,
2626
code: &'a [u8],
2727
message: &'a ExecutionMessage,
2828
context: Option<&'a mut ExecutionContext<'a>>,
@@ -32,7 +32,7 @@ pub trait EvmcVm {
3232
/// EVMC result structure.
3333
#[derive(Debug)]
3434
pub struct ExecutionResult {
35-
status_code: ffi::evmc_status_code,
35+
status_code: StatusCode,
3636
gas_left: i64,
3737
output: Option<Vec<u8>>,
3838
create_address: Option<Address>,
@@ -41,7 +41,7 @@ pub struct ExecutionResult {
4141
/// EVMC execution message structure.
4242
#[derive(Debug)]
4343
pub struct ExecutionMessage {
44-
kind: ffi::evmc_call_kind,
44+
kind: MessageKind,
4545
flags: u32,
4646
depth: i32,
4747
gas: i64,
@@ -65,11 +65,7 @@ pub struct ExecutionContext<'a> {
6565

6666
impl ExecutionResult {
6767
/// Manually create a result.
68-
pub fn new(
69-
_status_code: ffi::evmc_status_code,
70-
_gas_left: i64,
71-
_output: Option<&[u8]>,
72-
) -> Self {
68+
pub fn new(_status_code: StatusCode, _gas_left: i64, _output: Option<&[u8]>) -> Self {
7369
ExecutionResult {
7470
status_code: _status_code,
7571
gas_left: _gas_left,
@@ -84,21 +80,21 @@ impl ExecutionResult {
8480

8581
/// Create failure result.
8682
pub fn failure() -> Self {
87-
ExecutionResult::new(ffi::evmc_status_code::EVMC_FAILURE, 0, None)
83+
ExecutionResult::new(StatusCode::EVMC_FAILURE, 0, None)
8884
}
8985

9086
/// Create a revert result.
9187
pub fn revert(_gas_left: i64, _output: Option<&[u8]>) -> Self {
92-
ExecutionResult::new(ffi::evmc_status_code::EVMC_REVERT, _gas_left, _output)
88+
ExecutionResult::new(StatusCode::EVMC_REVERT, _gas_left, _output)
9389
}
9490

9591
/// Create a successful result.
9692
pub fn success(_gas_left: i64, _output: Option<&[u8]>) -> Self {
97-
ExecutionResult::new(ffi::evmc_status_code::EVMC_SUCCESS, _gas_left, _output)
93+
ExecutionResult::new(StatusCode::EVMC_SUCCESS, _gas_left, _output)
9894
}
9995

10096
/// Read the status code.
101-
pub fn status_code(&self) -> ffi::evmc_status_code {
97+
pub fn status_code(&self) -> StatusCode {
10298
self.status_code
10399
}
104100

@@ -121,7 +117,7 @@ impl ExecutionResult {
121117

122118
impl ExecutionMessage {
123119
pub fn new(
124-
kind: ffi::evmc_call_kind,
120+
kind: MessageKind,
125121
flags: u32,
126122
depth: i32,
127123
gas: i64,
@@ -149,7 +145,7 @@ impl ExecutionMessage {
149145
}
150146

151147
/// Read the message kind.
152-
pub fn kind(&self) -> ffi::evmc_call_kind {
148+
pub fn kind(&self) -> MessageKind {
153149
self.kind
154150
}
155151

@@ -239,7 +235,7 @@ impl<'a> ExecutionContext<'a> {
239235
address: &Address,
240236
key: &Bytes32,
241237
value: &Bytes32,
242-
) -> ffi::evmc_storage_status {
238+
) -> StorageStatus {
243239
unsafe {
244240
assert!((*self.host).set_storage.is_some());
245241
(*self.host).set_storage.unwrap()(
@@ -501,9 +497,9 @@ mod tests {
501497

502498
#[test]
503499
fn result_new() {
504-
let r = ExecutionResult::new(ffi::evmc_status_code::EVMC_FAILURE, 420, None);
500+
let r = ExecutionResult::new(StatusCode::EVMC_FAILURE, 420, None);
505501

506-
assert!(r.status_code() == ffi::evmc_status_code::EVMC_FAILURE);
502+
assert!(r.status_code() == StatusCode::EVMC_FAILURE);
507503
assert!(r.gas_left() == 420);
508504
assert!(r.output().is_none());
509505
assert!(r.create_address().is_none());
@@ -526,7 +522,7 @@ mod tests {
526522
#[test]
527523
fn result_from_ffi() {
528524
let f = ffi::evmc_result {
529-
status_code: ffi::evmc_status_code::EVMC_SUCCESS,
525+
status_code: StatusCode::EVMC_SUCCESS,
530526
gas_left: 1337,
531527
output_data: Box::into_raw(Box::new([0xde, 0xad, 0xbe, 0xef])) as *const u8,
532528
output_size: 4,
@@ -537,7 +533,7 @@ mod tests {
537533

538534
let r: ExecutionResult = f.into();
539535

540-
assert!(r.status_code() == ffi::evmc_status_code::EVMC_SUCCESS);
536+
assert!(r.status_code() == StatusCode::EVMC_SUCCESS);
541537
assert!(r.gas_left() == 1337);
542538
assert!(r.output().is_some());
543539
assert!(r.output().unwrap().len() == 4);
@@ -547,15 +543,15 @@ mod tests {
547543
#[test]
548544
fn result_into_heap_ffi() {
549545
let r = ExecutionResult::new(
550-
ffi::evmc_status_code::EVMC_FAILURE,
546+
StatusCode::EVMC_FAILURE,
551547
420,
552548
Some(&[0xc0, 0xff, 0xee, 0x71, 0x75]),
553549
);
554550

555551
let f: *const ffi::evmc_result = r.into();
556552
assert!(!f.is_null());
557553
unsafe {
558-
assert!((*f).status_code == ffi::evmc_status_code::EVMC_FAILURE);
554+
assert!((*f).status_code == StatusCode::EVMC_FAILURE);
559555
assert!((*f).gas_left == 420);
560556
assert!(!(*f).output_data.is_null());
561557
assert!((*f).output_size == 5);
@@ -572,12 +568,12 @@ mod tests {
572568

573569
#[test]
574570
fn result_into_heap_ffi_empty_data() {
575-
let r = ExecutionResult::new(ffi::evmc_status_code::EVMC_FAILURE, 420, None);
571+
let r = ExecutionResult::new(StatusCode::EVMC_FAILURE, 420, None);
576572

577573
let f: *const ffi::evmc_result = r.into();
578574
assert!(!f.is_null());
579575
unsafe {
580-
assert!((*f).status_code == ffi::evmc_status_code::EVMC_FAILURE);
576+
assert!((*f).status_code == StatusCode::EVMC_FAILURE);
581577
assert!((*f).gas_left == 420);
582578
assert!((*f).output_data.is_null());
583579
assert!((*f).output_size == 0);
@@ -591,14 +587,14 @@ mod tests {
591587
#[test]
592588
fn result_into_stack_ffi() {
593589
let r = ExecutionResult::new(
594-
ffi::evmc_status_code::EVMC_FAILURE,
590+
StatusCode::EVMC_FAILURE,
595591
420,
596592
Some(&[0xc0, 0xff, 0xee, 0x71, 0x75]),
597593
);
598594

599595
let f: ffi::evmc_result = r.into();
600596
unsafe {
601-
assert!(f.status_code == ffi::evmc_status_code::EVMC_FAILURE);
597+
assert!(f.status_code == StatusCode::EVMC_FAILURE);
602598
assert!(f.gas_left == 420);
603599
assert!(!f.output_data.is_null());
604600
assert!(f.output_size == 5);
@@ -615,11 +611,11 @@ mod tests {
615611

616612
#[test]
617613
fn result_into_stack_ffi_empty_data() {
618-
let r = ExecutionResult::new(ffi::evmc_status_code::EVMC_FAILURE, 420, None);
614+
let r = ExecutionResult::new(StatusCode::EVMC_FAILURE, 420, None);
619615

620616
let f: ffi::evmc_result = r.into();
621617
unsafe {
622-
assert!(f.status_code == ffi::evmc_status_code::EVMC_FAILURE);
618+
assert!(f.status_code == StatusCode::EVMC_FAILURE);
623619
assert!(f.gas_left == 420);
624620
assert!(f.output_data.is_null());
625621
assert!(f.output_size == 0);
@@ -639,7 +635,7 @@ mod tests {
639635
let create2_salt = Bytes32 { bytes: [255u8; 32] };
640636

641637
let ret = ExecutionMessage::new(
642-
ffi::evmc_call_kind::EVMC_CALL,
638+
MessageKind::EVMC_CALL,
643639
44,
644640
66,
645641
4466,
@@ -650,7 +646,7 @@ mod tests {
650646
create2_salt,
651647
);
652648

653-
assert_eq!(ret.kind(), ffi::evmc_call_kind::EVMC_CALL);
649+
assert_eq!(ret.kind(), MessageKind::EVMC_CALL);
654650
assert_eq!(ret.flags(), 44);
655651
assert_eq!(ret.depth(), 66);
656652
assert_eq!(ret.gas(), 4466);
@@ -670,7 +666,7 @@ mod tests {
670666
let create2_salt = Bytes32 { bytes: [255u8; 32] };
671667

672668
let msg = ffi::evmc_message {
673-
kind: ffi::evmc_call_kind::EVMC_CALL,
669+
kind: MessageKind::EVMC_CALL,
674670
flags: 44,
675671
depth: 66,
676672
gas: 4466,
@@ -704,7 +700,7 @@ mod tests {
704700
let create2_salt = Bytes32 { bytes: [255u8; 32] };
705701

706702
let msg = ffi::evmc_message {
707-
kind: ffi::evmc_call_kind::EVMC_CALL,
703+
kind: MessageKind::EVMC_CALL,
708704
flags: 44,
709705
depth: 66,
710706
gas: 4466,
@@ -768,16 +764,16 @@ mod tests {
768764

769765
ffi::evmc_result {
770766
status_code: if success {
771-
ffi::evmc_status_code::EVMC_SUCCESS
767+
StatusCode::EVMC_SUCCESS
772768
} else {
773-
ffi::evmc_status_code::EVMC_INTERNAL_ERROR
769+
StatusCode::EVMC_INTERNAL_ERROR
774770
},
775771
gas_left: 2,
776772
// NOTE: we are passing the input pointer here, but for testing the lifetime is ok
777773
output_data: msg.input_data,
778774
output_size: msg.input_size,
779775
release: None,
780-
create_address: ffi::evmc_address::default(),
776+
create_address: Address::default(),
781777
padding: [0u8; 4],
782778
}
783779
}
@@ -832,61 +828,61 @@ mod tests {
832828
#[test]
833829
fn test_call_empty_data() {
834830
// This address is useless. Just a dummy parameter for the interface function.
835-
let test_addr = ffi::evmc_address { bytes: [0u8; 20] };
831+
let test_addr = Address::default();
836832
let host = get_dummy_host_interface();
837833
let host_context = std::ptr::null_mut();
838834
let mut exe_context = ExecutionContext::new(&host, host_context);
839835

840836
let message = ExecutionMessage::new(
841-
ffi::evmc_call_kind::EVMC_CALL,
837+
MessageKind::EVMC_CALL,
842838
0,
843839
0,
844840
6566,
845841
test_addr,
846842
test_addr,
847843
None,
848-
ffi::evmc_uint256be::default(),
849-
ffi::evmc_bytes32::default(),
844+
Uint256::default(),
845+
Bytes32::default(),
850846
);
851847

852848
let b = exe_context.call(&message);
853849

854-
assert_eq!(b.status_code(), ffi::evmc_status_code::EVMC_SUCCESS);
850+
assert_eq!(b.status_code(), StatusCode::EVMC_SUCCESS);
855851
assert_eq!(b.gas_left(), 2);
856852
assert!(b.output().is_none());
857853
assert!(b.create_address().is_some());
858-
assert_eq!(b.create_address().unwrap(), &ffi::evmc_address::default());
854+
assert_eq!(b.create_address().unwrap(), &Address::default());
859855
}
860856

861857
#[test]
862858
fn test_call_with_data() {
863859
// This address is useless. Just a dummy parameter for the interface function.
864-
let test_addr = ffi::evmc_address { bytes: [0u8; 20] };
860+
let test_addr = Address::default();
865861
let host = get_dummy_host_interface();
866862
let host_context = std::ptr::null_mut();
867863
let mut exe_context = ExecutionContext::new(&host, host_context);
868864

869865
let data = vec![0xc0, 0xff, 0xfe];
870866

871867
let message = ExecutionMessage::new(
872-
ffi::evmc_call_kind::EVMC_CALL,
868+
MessageKind::EVMC_CALL,
873869
0,
874870
0,
875871
6566,
876872
test_addr,
877873
test_addr,
878874
Some(&data),
879-
ffi::evmc_uint256be::default(),
880-
ffi::evmc_bytes32::default(),
875+
Uint256::default(),
876+
Bytes32::default(),
881877
);
882878

883879
let b = exe_context.call(&message);
884880

885-
assert_eq!(b.status_code(), ffi::evmc_status_code::EVMC_SUCCESS);
881+
assert_eq!(b.status_code(), StatusCode::EVMC_SUCCESS);
886882
assert_eq!(b.gas_left(), 2);
887883
assert!(b.output().is_some());
888884
assert_eq!(b.output().unwrap(), &data);
889885
assert!(b.create_address().is_some());
890-
assert_eq!(b.create_address().unwrap(), &ffi::evmc_address::default());
886+
assert_eq!(b.create_address().unwrap(), &Address::default());
891887
}
892888
}

0 commit comments

Comments
 (0)