Fix and test returning Vec by reference from C to Rust
diff --git a/macro/src/expand.rs b/macro/src/expand.rs
index d27c15c..e7eece0 100644
--- a/macro/src/expand.rs
+++ b/macro/src/expand.rs
@@ -287,6 +287,7 @@
Type::Ident(ident) if ident == RustString => {
Some(quote!(#call.map(|r| r.as_string())))
}
+ Type::RustVec(_) => Some(quote!(#call.map(|r| r.as_vec()))),
_ => None,
},
Type::Str(_) => Some(quote!(#call.map(|r| r.as_str()))),
@@ -301,6 +302,7 @@
Type::UniquePtr(_) => Some(quote!(::cxx::UniquePtr::from_raw(#call))),
Type::Ref(ty) => match &ty.inner {
Type::Ident(ident) if ident == RustString => Some(quote!(#call.as_string())),
+ Type::RustVec(_) => Some(quote!(#call.as_vec())),
_ => None,
},
Type::Str(_) => Some(quote!(#call.as_str())),
diff --git a/tests/ffi/lib.rs b/tests/ffi/lib.rs
index 6e636d8..d66bcc0 100644
--- a/tests/ffi/lib.rs
+++ b/tests/ffi/lib.rs
@@ -33,6 +33,7 @@
fn c_return_unique_ptr_vector_opaque() -> UniquePtr<CxxVector<C>>;
fn c_return_ref_vector(c: &C) -> &CxxVector<u8>;
fn c_return_rust_vec() -> Vec<u8>;
+ fn c_return_ref_rust_vec(c: &C) -> &Vec<u8>;
fn c_take_primitive(n: usize);
fn c_take_shared(shared: Shared);
@@ -62,6 +63,7 @@
fn c_try_return_rust_string() -> Result<String>;
fn c_try_return_unique_ptr_string() -> Result<UniquePtr<CxxString>>;
fn c_try_return_rust_vec() -> Result<Vec<u8>>;
+ fn c_try_return_ref_rust_vec(c: &C) -> Result<&Vec<u8>>;
fn get(self: &C) -> usize;
fn set(self: &mut C, n: usize) -> usize;
diff --git a/tests/ffi/tests.cc b/tests/ffi/tests.cc
index 8ea3d06..805e9b9 100644
--- a/tests/ffi/tests.cc
+++ b/tests/ffi/tests.cc
@@ -97,6 +97,11 @@
throw std::runtime_error("unimplemented");
}
+const rust::Vec<uint8_t> &c_return_ref_rust_vec(const C &c) {
+ (void)c;
+ throw std::runtime_error("unimplemented");
+}
+
void c_take_primitive(size_t n) {
if (n == 2020) {
cxx_test_suite_set_correct();
@@ -227,6 +232,11 @@
throw std::runtime_error("unimplemented");
}
+const rust::Vec<uint8_t> &c_try_return_ref_rust_vec(const C &c) {
+ (void)c;
+ throw std::runtime_error("unimplemented");
+}
+
extern "C" C *cxx_test_suite_get_unique_ptr() noexcept {
return std::unique_ptr<C>(new C{2020}).release();
}
diff --git a/tests/ffi/tests.h b/tests/ffi/tests.h
index 22fed58..81125f8 100644
--- a/tests/ffi/tests.h
+++ b/tests/ffi/tests.h
@@ -37,6 +37,7 @@
std::unique_ptr<std::vector<C>> c_return_unique_ptr_vector_opaque();
const std::vector<uint8_t> &c_return_ref_vector(const C &c);
rust::Vec<uint8_t> c_return_rust_vec();
+const rust::Vec<uint8_t> &c_return_ref_rust_vec(const C &c);
void c_take_primitive(size_t n);
void c_take_shared(Shared shared);
@@ -66,5 +67,6 @@
rust::String c_try_return_rust_string();
std::unique_ptr<std::string> c_try_return_unique_ptr_string();
rust::Vec<uint8_t> c_try_return_rust_vec();
+const rust::Vec<uint8_t> &c_try_return_ref_rust_vec(const C &c);
} // namespace tests