Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use arc_anyhow::{Context, Result};
use code_gen_utils::escape_non_identifier_chars;
use code_gen_utils::make_rs_ident;
use code_gen_utils::CcConstQualifier;
use crubit_abi_type::{CrubitAbiTypeToRustExprTokens, CrubitAbiTypeToRustTokens};
use crubit_abi_type::CrubitAbiTypeToRustExprTokens;
use database::code_snippet::{CcPrerequisites, CcSnippet, ExternCDecl};
use database::{AdtCoreBindings, BindingsGenerator, SugaredTy};
use error_report::{anyhow, bail, ensure};
Expand Down Expand Up @@ -222,12 +222,11 @@ fn convert_bridged_type_from_c_abi_to_rust<'tcx>(
})
}
BridgedType::Composable(composable) => {
let crubit_abi_type = CrubitAbiTypeToRustTokens(&composable.crubit_abi_type);
let crubit_abi_type_expr = CrubitAbiTypeToRustExprTokens(&composable.crubit_abi_type);
// SAFETY: The buffer is the correct size, as determined by Crubit.
Ok(quote! {
let #local_name = unsafe {
::bridge_rust::decode_wrapper!(#crubit_abi_type_expr, #crubit_abi_type, #local_name)
::bridge_rust::internal::decode(#crubit_abi_type_expr, #local_name)
};
})
}
Expand Down Expand Up @@ -415,13 +414,13 @@ fn write_rs_value_to_c_abi_ptr<'tcx>(
}
},
BridgedType::Composable(composable) => {
let crubit_abi_type = CrubitAbiTypeToRustTokens(&composable.crubit_abi_type);
let crubit_abi_type_expr =
CrubitAbiTypeToRustExprTokens(&composable.crubit_abi_type);
quote! {
// SAFETY: TODO(okabayashi)
unsafe {
::bridge_rust::encode_wrapper!(#crubit_abi_type_expr, #crubit_abi_type,
::bridge_rust::internal::encode(
#crubit_abi_type_expr,
// TODO(okabayashi): This ptr case can be removed once tuple bridging is supported,
// as it only is required in the tuple recursive case.
#c_ptr as *mut core::ffi::c_uchar,
Expand Down
53 changes: 23 additions & 30 deletions cc_bindings_from_rs/test/golden/composable_bridging_cc_api_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,10 @@ unsafe extern "C" fn __crubit_thunk_returns_usome_uint(__ret_ptr: *mut core::ffi
unsafe {
let __rs_return_value = ::composable_bridging_rust_golden::returns_some_int();
unsafe {
::bridge_rust::encode_wrapper!(
::bridge_rust::OptionAbi(::bridge_rust::transmute_abi()),
::bridge_rust::OptionAbi<::bridge_rust::TransmuteAbi<i32>>,
::bridge_rust::internal::encode(
::bridge_rust::OptionAbi(::bridge_rust::transmute_abi::<i32>()),
__ret_ptr as *mut core::ffi::c_uchar,
__rs_return_value
__rs_return_value,
);
}
}
Expand All @@ -29,11 +28,10 @@ unsafe extern "C" fn __crubit_thunk_returns_uno_uint(__ret_ptr: *mut core::ffi::
unsafe {
let __rs_return_value = ::composable_bridging_rust_golden::returns_no_int();
unsafe {
::bridge_rust::encode_wrapper!(
::bridge_rust::OptionAbi(::bridge_rust::transmute_abi()),
::bridge_rust::OptionAbi<::bridge_rust::TransmuteAbi<i32>>,
::bridge_rust::internal::encode(
::bridge_rust::OptionAbi(::bridge_rust::transmute_abi::<i32>()),
__ret_ptr as *mut core::ffi::c_uchar,
__rs_return_value
__rs_return_value,
);
}
}
Expand All @@ -42,10 +40,9 @@ unsafe extern "C" fn __crubit_thunk_returns_uno_uint(__ret_ptr: *mut core::ffi::
unsafe extern "C" fn __crubit_thunk_unwrap_uor_uzero(x: *const core::ffi::c_uchar) -> i32 {
unsafe {
let x = unsafe {
::bridge_rust::decode_wrapper!(
::bridge_rust::OptionAbi(::bridge_rust::transmute_abi()),
::bridge_rust::OptionAbi<::bridge_rust::TransmuteAbi<i32>>,
x
::bridge_rust::internal::decode(
::bridge_rust::OptionAbi(::bridge_rust::transmute_abi::<i32>()),
x,
)
};
::composable_bridging_rust_golden::unwrap_or_zero(x)
Expand All @@ -58,19 +55,17 @@ unsafe extern "C" fn __crubit_thunk_option_uincrements(
) -> () {
unsafe {
let x = unsafe {
::bridge_rust::decode_wrapper!(
::bridge_rust::OptionAbi(::bridge_rust::transmute_abi()),
::bridge_rust::OptionAbi<::bridge_rust::TransmuteAbi<i32>>,
x
::bridge_rust::internal::decode(
::bridge_rust::OptionAbi(::bridge_rust::transmute_abi::<i32>()),
x,
)
};
let __rs_return_value = ::composable_bridging_rust_golden::option_increments(x);
unsafe {
::bridge_rust::encode_wrapper!(
::bridge_rust::OptionAbi(::bridge_rust::transmute_abi()),
::bridge_rust::OptionAbi<::bridge_rust::TransmuteAbi<i32>>,
::bridge_rust::internal::encode(
::bridge_rust::OptionAbi(::bridge_rust::transmute_abi::<i32>()),
__ret_ptr as *mut core::ffi::c_uchar,
__rs_return_value
__rs_return_value,
);
}
}
Expand All @@ -82,13 +77,12 @@ unsafe extern "C" fn __crubit_thunk_make_umy_uoption_urust(
unsafe {
let __rs_return_value = ::composable_bridging_rust_golden::make_my_option_rust();
unsafe {
::bridge_rust::encode_wrapper!(
::composable_bridging_rust_golden::MyOptionRustAbi(::bridge_rust::transmute_abi()),
::composable_bridging_rust_golden::MyOptionRustAbi<
::bridge_rust::TransmuteAbi<i32>,
>,
::bridge_rust::internal::encode(
::composable_bridging_rust_golden::MyOptionRustAbi(::bridge_rust::transmute_abi::<
i32,
>()),
__ret_ptr as *mut core::ffi::c_uchar,
__rs_return_value
__rs_return_value,
);
}
}
Expand All @@ -98,11 +92,10 @@ unsafe extern "C" fn __crubit_thunk_maybe_uint_uslice(__ret_ptr: *mut core::ffi:
unsafe {
let __rs_return_value = ::composable_bridging_rust_golden::maybe_int_slice();
unsafe {
::bridge_rust::encode_wrapper!(
::bridge_rust::OptionAbi(::bridge_rust::transmute_abi()),
::bridge_rust::OptionAbi<::bridge_rust::TransmuteAbi<*const [i32]>>,
::bridge_rust::internal::encode(
::bridge_rust::OptionAbi(::bridge_rust::transmute_abi::<*const [i32]>()),
__ret_ptr as *mut core::ffi::c_uchar,
__rs_return_value
__rs_return_value,
);
}
}
Expand Down
47 changes: 36 additions & 11 deletions common/crubit_abi_type.rs
Original file line number Diff line number Diff line change
Expand Up @@ -204,15 +204,40 @@ impl ToTokens for CrubitAbiTypeToRustTokens<'_> {
impl ToTokens for CrubitAbiTypeToRustExprTokens<'_> {
fn to_tokens(&self, tokens: &mut TokenStream) {
match self.0 {
CrubitAbiType::SignedChar
| CrubitAbiType::UnsignedChar
| CrubitAbiType::UnsignedShort
| CrubitAbiType::UnsignedInt
| CrubitAbiType::UnsignedLong
| CrubitAbiType::LongLong
| CrubitAbiType::UnsignedLongLong
| CrubitAbiType::Ptr { .. } => {
quote! { ::bridge_rust::transmute_abi() }.to_tokens(tokens);
CrubitAbiType::SignedChar => {
quote! { ::bridge_rust::transmute_abi::<::core::ffi::c_schar>() }.to_tokens(tokens)
}
CrubitAbiType::UnsignedChar => {
quote! { ::bridge_rust::transmute_abi::<::core::ffi::c_uchar>() }.to_tokens(tokens)
}
CrubitAbiType::UnsignedShort => {
quote! { ::bridge_rust::transmute_abi::<::core::ffi::c_ushort>() }.to_tokens(tokens)
}
CrubitAbiType::UnsignedInt => {
quote! { ::bridge_rust::transmute_abi::<::core::ffi::c_uint>() }.to_tokens(tokens)
}
CrubitAbiType::UnsignedLong => {
quote! { ::bridge_rust::transmute_abi::<::core::ffi::c_ulong>() }.to_tokens(tokens)
}
CrubitAbiType::LongLong => {
quote! { ::bridge_rust::transmute_abi::<::core::ffi::c_longlong>() }
.to_tokens(tokens)
}
CrubitAbiType::UnsignedLongLong => {
quote! { ::bridge_rust::transmute_abi::<::core::ffi::c_ulonglong>() }
.to_tokens(tokens)
}
CrubitAbiType::Ptr { is_const, is_rust_slice, rust_type, .. } => {
let mut ty = rust_type.clone();
if *is_rust_slice {
ty = quote! { [#ty] };
}
if *is_const {
ty = quote! { *const #ty };
} else {
ty = quote! { *mut #ty };
}
quote! { ::bridge_rust::transmute_abi::<#ty>() }.to_tokens(tokens);
}
CrubitAbiType::Pair(first, second) => {
let first_tokens = Self(first);
Expand All @@ -227,8 +252,8 @@ impl ToTokens for CrubitAbiTypeToRustExprTokens<'_> {
};
quote! { #root::std::BoxedCppStringAbi }.to_tokens(tokens)
}
CrubitAbiType::Transmute { .. } => {
quote! { ::bridge_rust::transmute_abi() }.to_tokens(tokens);
CrubitAbiType::Transmute { rust_type, .. } => {
quote! { ::bridge_rust::transmute_abi::<#rust_type>() }.to_tokens(tokens);
}
CrubitAbiType::ProtoMessage { proto_message_rust_bridge, .. } => {
quote! { #proto_message_rust_bridge(::core::marker::PhantomData) }
Expand Down
12 changes: 6 additions & 6 deletions rs_bindings_from_cc/test/golden/composable_bridging_rs_api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -67,14 +67,14 @@ impl Default for Vec3 {
#[inline(always)]
pub fn MakeOptionalVec3(x: f32, y: f32, z: f32, is_present: bool) -> crate::MyOption<crate::Vec3> {
unsafe {
::bridge_rust::unstable_return!(@crate::MyOptionAbi(::bridge_rust::transmute_abi()),crate::MyOptionAbi<::bridge_rust::TransmuteAbi<crate::Vec3>>,|__return_abi_buffer|{ crate::detail::__rust_thunk___Z16MakeOptionalVec3fffb(__return_abi_buffer,x,y,z,is_present); })
::bridge_rust::unstable_return!(@crate::MyOptionAbi(::bridge_rust::transmute_abi::<crate::Vec3>()),crate::MyOptionAbi<::bridge_rust::TransmuteAbi<crate::Vec3>>,|__return_abi_buffer|{ crate::detail::__rust_thunk___Z16MakeOptionalVec3fffb(__return_abi_buffer,x,y,z,is_present); })
}
}

#[inline(always)]
pub fn MapMultiply(v: crate::MyOption<crate::Vec3>, factor: f32) -> crate::MyOption<crate::Vec3> {
unsafe {
::bridge_rust::unstable_return!(@crate::MyOptionAbi(::bridge_rust::transmute_abi()),crate::MyOptionAbi<::bridge_rust::TransmuteAbi<crate::Vec3>>,|__return_abi_buffer|{ crate::detail::__rust_thunk___Z11MapMultiply8MyOptionI4Vec3Ef(__return_abi_buffer,::bridge_rust::unstable_encode!(@crate::MyOptionAbi(::bridge_rust::transmute_abi()),crate::MyOptionAbi<::bridge_rust::TransmuteAbi<crate::Vec3>>,v).as_ptr()as*const u8,factor); })
::bridge_rust::unstable_return!(@crate::MyOptionAbi(::bridge_rust::transmute_abi::<crate::Vec3>()),crate::MyOptionAbi<::bridge_rust::TransmuteAbi<crate::Vec3>>,|__return_abi_buffer|{ crate::detail::__rust_thunk___Z11MapMultiply8MyOptionI4Vec3Ef(__return_abi_buffer,::bridge_rust::unstable_encode!(@crate::MyOptionAbi(::bridge_rust::transmute_abi::<crate::Vec3>()),crate::MyOptionAbi<::bridge_rust::TransmuteAbi<crate::Vec3>>,v).as_ptr()as*const u8,factor); })
}
}

Expand All @@ -83,7 +83,7 @@ pub fn MapMultiply(v: crate::MyOption<crate::Vec3>, factor: f32) -> crate::MyOpt
#[inline(always)]
pub fn MakeMyI8Struct() -> crate::MyOption<i8> {
unsafe {
::bridge_rust::unstable_return!(@crate::MyOptionAbi(::bridge_rust::transmute_abi()),crate::MyOptionAbi<::bridge_rust::TransmuteAbi<i8>>,|__return_abi_buffer|{ crate::detail::__rust_thunk___Z14MakeMyI8Structv(__return_abi_buffer,); })
::bridge_rust::unstable_return!(@crate::MyOptionAbi(::bridge_rust::transmute_abi::<i8>()),crate::MyOptionAbi<::bridge_rust::TransmuteAbi<i8>>,|__return_abi_buffer|{ crate::detail::__rust_thunk___Z14MakeMyI8Structv(__return_abi_buffer,); })
}
}

Expand All @@ -97,21 +97,21 @@ pub unsafe fn InspectStringViews(
#[inline(always)]
pub fn MaybeVoidPtr() -> crate::MyOption<*mut ::core::ffi::c_void> {
unsafe {
::bridge_rust::unstable_return!(@crate::MyOptionAbi(::bridge_rust::transmute_abi()),crate::MyOptionAbi<::bridge_rust::TransmuteAbi<*mut::core::ffi::c_void>>,|__return_abi_buffer|{ crate::detail::__rust_thunk___Z12MaybeVoidPtrv(__return_abi_buffer,); })
::bridge_rust::unstable_return!(@crate::MyOptionAbi(::bridge_rust::transmute_abi::<*mut::core::ffi::c_void>()),crate::MyOptionAbi<::bridge_rust::TransmuteAbi<*mut::core::ffi::c_void>>,|__return_abi_buffer|{ crate::detail::__rust_thunk___Z12MaybeVoidPtrv(__return_abi_buffer,); })
}
}

#[inline(always)]
pub unsafe fn AcceptsSliceAndReturnsStatusErrorIfEmpty(
slice: *const [::core::ffi::c_int],
) -> crate::MyOption<*const [::core::ffi::c_int]> {
::bridge_rust::unstable_return!(@crate::MyOptionAbi(::bridge_rust::transmute_abi()),crate::MyOptionAbi<::bridge_rust::TransmuteAbi<*const[::core::ffi::c_int]>>,|__return_abi_buffer|{ crate::detail::__rust_thunk___Z40AcceptsSliceAndReturnsStatusErrorIfEmptyN6rs_std8SliceRefIKiEE(__return_abi_buffer,slice); })
::bridge_rust::unstable_return!(@crate::MyOptionAbi(::bridge_rust::transmute_abi::<*const[::core::ffi::c_int]>()),crate::MyOptionAbi<::bridge_rust::TransmuteAbi<*const[::core::ffi::c_int]>>,|__return_abi_buffer|{ crate::detail::__rust_thunk___Z40AcceptsSliceAndReturnsStatusErrorIfEmptyN6rs_std8SliceRefIKiEE(__return_abi_buffer,slice); })
}

#[inline(always)]
pub fn ReturnsCStrArray() -> crate::MyOption<*mut *const ::core::ffi::c_char> {
unsafe {
::bridge_rust::unstable_return!(@crate::MyOptionAbi(::bridge_rust::transmute_abi()),crate::MyOptionAbi<::bridge_rust::TransmuteAbi<*mut*const::core::ffi::c_char>>,|__return_abi_buffer|{ crate::detail::__rust_thunk___Z16ReturnsCStrArrayv(__return_abi_buffer,); })
::bridge_rust::unstable_return!(@crate::MyOptionAbi(::bridge_rust::transmute_abi::<*mut*const::core::ffi::c_char>()),crate::MyOptionAbi<::bridge_rust::TransmuteAbi<*mut*const::core::ffi::c_char>>,|__return_abi_buffer|{ crate::detail::__rust_thunk___Z16ReturnsCStrArrayv(__return_abi_buffer,); })
}
}

Expand Down
18 changes: 0 additions & 18 deletions support/bridge.h
Original file line number Diff line number Diff line change
Expand Up @@ -362,31 +362,13 @@ void Encode(Abi&& abi, unsigned char* buf, typename Abi::Value value) {
std::forward<Abi>(abi).Encode(std::move(value), encoder);
}

// TODO(b/461708400): Remove this overload once deletion of
// http://cc_bindings_from_rs/generate_bindings/generate_function.rs;l=145;rcl=843296833
// hits crosstool.
template <typename Abi>
requires(is_crubit_abi<Abi> && std::is_default_constructible_v<Abi>)
void Encode(unsigned char* buf, typename Abi::Value value) {
Encode(Abi(), buf, std::move(value));
}

template <typename Abi>
requires(is_crubit_abi<Abi>)
typename Abi::Value Decode(Abi&& abi, const unsigned char* buf) {
Decoder decoder(Abi::kSize, buf);
return std::forward<Abi>(abi).Decode(decoder);
}

// TODO(b/461708400): Remove this overload once deletion of
// http://cc_bindings_from_rs/generate_bindings/generate_function.rs;l=289;rcl=836830956
// hits crosstool.
template <typename Abi>
requires(is_crubit_abi<Abi> && std::is_default_constructible_v<Abi>)
typename Abi::Value Decode(const unsigned char* buf) {
return Decode(Abi(), buf);
}

} // namespace internal

} // namespace crubit
Expand Down
20 changes: 0 additions & 20 deletions support/bridge.rs
Original file line number Diff line number Diff line change
Expand Up @@ -349,26 +349,6 @@ pub mod internal {
}
}

// Temporary wrapper to migrate all callers of `encode` to the new version which
// takes another argument.
// TODO(b/461708400): Remove this once the migration is complete.
#[macro_export]
macro_rules! encode_wrapper {
{$crubit_abi_expr:expr, $crubit_abi:ty, $buf:expr, $expr:expr} => {
$crate::internal::encode::<$crubit_abi>($crubit_abi_expr, $buf, $expr)
}
}

// Temporary wrapper to migrate all callers of `decode` to the new version which
// takes another argument.
// TODO(b/461708400): Remove this once the migration is complete.
#[macro_export]
macro_rules! decode_wrapper {
{$crubit_abi_expr:expr, $crubit_abi:ty, $buf:expr} => {
$crate::internal::decode::<$crubit_abi>($crubit_abi_expr, $buf)
}
}

// This cannot be a function because it errors with "constant expression depends on a generic
// parameter" when constructing the buffer.
// This macro is unstable, and may be changed. Do not use this unless you have been approved by the
Expand Down