Avoid Option in ffi
Option seems to work fine on rustc 1.43+ but not 1.42.
diff --git a/macro/src/expand.rs b/macro/src/expand.rs
index defa565..9c198be 100644
--- a/macro/src/expand.rs
+++ b/macro/src/expand.rs
@@ -299,7 +299,7 @@
}
expr = quote!(::cxx::private::catch_unwind(__fn, move || #expr));
let ret = if efn.throws {
- quote!(-> ::std::option::Option<::cxx::private::RustStr>)
+ quote!(-> ::cxx::private::Error)
} else {
expand_extern_return_type(&efn.ret, types)
};
diff --git a/src/exception.rs b/src/exception.rs
index 3f32b45..57ff552 100644
--- a/src/exception.rs
+++ b/src/exception.rs
@@ -1,23 +1,29 @@
-use crate::rust_str::RustStr;
use std::fmt::Display;
use std::ptr;
-use std::slice;
-use std::str;
-pub unsafe fn r#try<T, E>(ret: *mut T, result: Result<T, E>) -> Option<RustStr>
+#[repr(C)]
+pub struct Error {
+ ptr: *const u8,
+ len: usize,
+}
+
+pub unsafe fn r#try<T, E>(ret: *mut T, result: Result<T, E>) -> Error
where
E: Display,
{
match result {
Ok(ok) => {
ptr::write(ret, ok);
- None
+ Error {
+ ptr: ptr::null(),
+ len: 0,
+ }
}
- Err(err) => Some(to_c_string(err.to_string())),
+ Err(err) => to_c_string(err.to_string()),
}
}
-unsafe fn to_c_string(msg: String) -> RustStr {
+unsafe fn to_c_string(msg: String) -> Error {
let mut msg = msg;
msg.as_mut_vec().push(b'\0');
let ptr = msg.as_ptr();
@@ -29,7 +35,5 @@
}
let copy = error(ptr, len);
- let slice = slice::from_raw_parts(copy, len);
- let string = str::from_utf8_unchecked(slice);
- RustStr::from(string)
+ Error { ptr: copy, len }
}
diff --git a/src/lib.rs b/src/lib.rs
index 109090c..aa7e84f 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -371,7 +371,7 @@
// Not public API.
#[doc(hidden)]
pub mod private {
- pub use crate::exception::r#try;
+ pub use crate::exception::{r#try, Error};
pub use crate::opaque::Opaque;
pub use crate::rust_str::RustStr;
pub use crate::rust_string::RustString;