Skip to content
This repository was archived by the owner on Apr 8, 2026. It is now read-only.

Commit 845e381

Browse files
committed
f
1 parent 317135d commit 845e381

2 files changed

Lines changed: 28 additions & 11 deletions

File tree

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

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,39 @@
22
// Copyright 2019 The EVMC Authors.
33
// Licensed under the Apache License, Version 2.0.
44

5+
use std::ffi::{CStr, CString};
6+
57
mod sys;
68

9+
pub fn load_and_configure(
10+
config: &str,
11+
) -> Result<*mut sys::evmc_vm, (sys::evmc_loader_error_code, String)> {
12+
let config_cstr = CString::new(config).unwrap();
13+
let mut error_code = sys::evmc_loader_error_code::EVMC_LOADER_UNSPECIFIED_ERROR;
14+
let instance = unsafe { sys::evmc_load_and_configure(config_cstr.as_ptr(), &mut error_code) };
15+
16+
if error_code == sys::evmc_loader_error_code::EVMC_LOADER_SUCCESS {
17+
assert!(!instance.is_null());
18+
Ok(instance)
19+
} else {
20+
assert!(instance.is_null());
21+
let error_msg = unsafe { CStr::from_ptr(sys::evmc_last_error_msg()) }
22+
.to_str()
23+
.expect("well formed error message") // TODO free the vm
24+
.to_string();
25+
Err((error_code, error_msg))
26+
}
27+
}
28+
729
#[cfg(test)]
830
mod tests {
9-
use std::ffi::CString;
10-
use std::os::raw::c_char;
31+
use std::ffi::CString;
32+
use std::os::raw::c_char;
1133

1234
use super::*;
1335

1436
#[test]
1537
fn load_fail() {
16-
let c_str = CString::new("test.so").unwrap();
17-
unsafe {
18-
let mut error_code = sys::evmc_loader_error_code::EVMC_LOADER_UNSPECIFIED_ERROR;
19-
let instance = sys::evmc_load_and_create(c_str.as_ptr() as *const c_char, &mut error_code);
20-
println!("{:?}", error_code);
21-
}
38+
println!("{:?}", load_and_configure("test.so"));
2239
}
2340
}

bindings/rust/evmc-loader/src/sys.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
1010

1111
#[cfg(test)]
1212
mod tests {
13-
use std::ffi::CString;
14-
use std::os::raw::c_char;
13+
use std::ffi::CString;
14+
use std::os::raw::c_char;
1515

1616
use super::*;
1717

@@ -21,7 +21,7 @@ use std::os::raw::c_char;
2121
unsafe {
2222
let mut error_code = evmc_loader_error_code::EVMC_LOADER_UNSPECIFIED_ERROR;
2323
let instance = evmc_load_and_create(c_str.as_ptr() as *const c_char, &mut error_code);
24-
println!("{:?}", error_code);
24+
println!("{:?}", error_code);
2525
}
2626
}
2727
}

0 commit comments

Comments
 (0)