Skip to content

Commit 9f703ae

Browse files
committed
Allow passing pointers across rpsl ffi.
1 parent ebdbd45 commit 9f703ae

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

tools/rps_rustc/rps_rs/macro_utils/src/lib.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ fn emit_wrapper_arg_forwarding_stmts(
338338
},
339339
Type::Ptr(ty_ptr) => {
340340
out_stmts.push(parse_quote!{
341-
let #arg_name = unsafe { pp_args[#arg_index] as #ty_ptr };
341+
let #arg_name = unsafe {*(pp_args[#arg_index] as *const #ty_ptr)};
342342
});
343343
},
344344
Type::Slice(_ty_slice) => {
@@ -497,21 +497,21 @@ pub fn derive_rps_ffi_type(item: TokenStream) -> TokenStream {
497497

498498
let output = quote! {
499499

500-
impl RpsTypeInfoTrait for & #ident {
501-
const RPS_TYPE_INFO : CRpsTypeInfo = CRpsTypeInfo {
500+
impl rps_rs::rpsl_runtime::RpsTypeInfoTrait for & #ident {
501+
const RPS_TYPE_INFO : rps_rs::rpsl_runtime::CRpsTypeInfo = rps_rs::rpsl_runtime::CRpsTypeInfo {
502502
size: std::mem::size_of::<#ident>() as u16,
503-
id: RpsBuiltInTypeIds::RPS_TYPE_OPAQUE as u16,
503+
id: rps_rs::rpsl_runtime::RpsBuiltInTypeIds::RPS_TYPE_OPAQUE as u16,
504504
};
505505

506506
fn to_c_ptr(&self) -> *const c_void {
507507
(*self) as *const _ as *const c_void
508508
}
509509
}
510510

511-
impl RpsTypeInfoTrait for #ident {
512-
const RPS_TYPE_INFO : CRpsTypeInfo = CRpsTypeInfo {
511+
impl rps_rs::rpsl_runtime::RpsTypeInfoTrait for #ident {
512+
const RPS_TYPE_INFO : rps_rs::rpsl_runtime::CRpsTypeInfo = rps_rs::rpsl_runtime::CRpsTypeInfo {
513513
size: std::mem::size_of::<#ident>() as u16,
514-
id: RpsBuiltInTypeIds::RPS_TYPE_OPAQUE as u16,
514+
id: rps_rs::rpsl_runtime::RpsBuiltInTypeIds::RPS_TYPE_OPAQUE as u16,
515515
};
516516
}
517517
};

tools/rps_rustc/rps_rs/src/rps_types.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ use core::ffi::c_void;
44

55
use crate::rpsl_runtime::{RpsTypeInfoTrait, RpsBuiltInTypeIds, CRpsTypeInfo, CRpsResourceDesc};
66

7+
extern crate self as rps_rs;
8+
79
#[non_exhaustive]
810
#[repr(u32)]
911
#[derive(Default, Clone, Copy, PartialEq, Eq)]
@@ -877,6 +879,20 @@ impl<U: RpsTypeInfoTrait, const N: usize> RpsTypeInfoTrait for &[U; N] {
877879
}
878880
}
879881

882+
// Treat pointers as a 2-level indirection for now
883+
// to allow passing arbitary Rust structures across FFI.
884+
// Callers must guarantee the lifetime of the pointee.
885+
impl<T> RpsTypeInfoTrait for *const T {
886+
const RPS_TYPE_INFO : CRpsTypeInfo = CRpsTypeInfo {
887+
size: std::mem::size_of::<*const T>() as _,
888+
id: RpsBuiltInTypeIds::RPS_TYPE_OPAQUE as _,
889+
};
890+
891+
fn to_c_ptr(&self) -> *const c_void {
892+
self as * const _ as *const c_void
893+
}
894+
}
895+
880896
impl_rps_built_in_type_info!(bool, RPS_TYPE_BUILT_IN_BOOL);
881897
impl_rps_built_in_type_info!(i8, RPS_TYPE_BUILT_IN_INT8);
882898
impl_rps_built_in_type_info!(u8, RPS_TYPE_BUILT_IN_UINT8);

0 commit comments

Comments
 (0)