Thanks to visit codestin.com
Credit goes to github.com

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
4 changes: 3 additions & 1 deletion cc_bindings_from_rs/generate_bindings/generate_function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -136,13 +136,15 @@ fn cc_param_to_c_abi<'tcx>(
// We need to encode it into a buffer, then send that over.
includes.insert(db.support_header("bridge.h"));
let crubit_abi_type = CrubitAbiTypeToCppTokens(&composable.crubit_abi_type);
let crubit_abi_type_expr =
CrubitAbiTypeToCppExprTokens(&composable.crubit_abi_type);

let buffer_name = expect_format_cc_ident(&format!("{cc_ident}_buffer"));
// Create a buffer, encode it into the buffer, and then make the buffer be
// what we sent to Rust across the C ABI.
statements.extend(quote! {
unsigned char #buffer_name[#crubit_abi_type::kSize];
::crubit::internal::Encode<#crubit_abi_type>(#buffer_name, #cc_ident);
::crubit::internal::Encode<#crubit_abi_type>(#crubit_abi_type_expr, #buffer_name, #cc_ident);
});
quote! { #buffer_name }
}
Expand Down
25 changes: 18 additions & 7 deletions cc_bindings_from_rs/test/golden/composable_bridging_cc_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ inline std::optional<std::int32_t> returns_some_int() {
__crubit_internal::__crubit_thunk_returns_usome_uint(__return_value_storage);
return ::crubit::internal::Decode<
::crubit::OptionAbi<::crubit::TransmuteAbi<std::int32_t>>>(
::crubit::OptionAbi(::crubit::TransmuteAbi<std::int32_t>()),
::crubit::OptionAbi<::crubit::TransmuteAbi<std::int32_t>>(
::crubit::TransmuteAbi<std::int32_t>()),
__return_value_storage);
}

Expand All @@ -74,7 +75,8 @@ inline std::optional<std::int32_t> returns_no_int() {
__crubit_internal::__crubit_thunk_returns_uno_uint(__return_value_storage);
return ::crubit::internal::Decode<
::crubit::OptionAbi<::crubit::TransmuteAbi<std::int32_t>>>(
::crubit::OptionAbi(::crubit::TransmuteAbi<std::int32_t>()),
::crubit::OptionAbi<::crubit::TransmuteAbi<std::int32_t>>(
::crubit::TransmuteAbi<std::int32_t>()),
__return_value_storage);
}

Expand All @@ -85,7 +87,10 @@ inline std::int32_t unwrap_or_zero(std::optional<std::int32_t> x) {
unsigned char x_buffer
[::crubit::OptionAbi<::crubit::TransmuteAbi<std::int32_t>>::kSize];
::crubit::internal::Encode<
::crubit::OptionAbi<::crubit::TransmuteAbi<std::int32_t>>>(x_buffer, x);
::crubit::OptionAbi<::crubit::TransmuteAbi<std::int32_t>>>(
::crubit::OptionAbi<::crubit::TransmuteAbi<std::int32_t>>(
::crubit::TransmuteAbi<std::int32_t>()),
x_buffer, x);
return __crubit_internal::__crubit_thunk_unwrap_uor_uzero(x_buffer);
}

Expand All @@ -98,14 +103,18 @@ inline std::optional<std::int32_t> option_increments(
unsigned char x_buffer
[::crubit::OptionAbi<::crubit::TransmuteAbi<std::int32_t>>::kSize];
::crubit::internal::Encode<
::crubit::OptionAbi<::crubit::TransmuteAbi<std::int32_t>>>(x_buffer, x);
::crubit::OptionAbi<::crubit::TransmuteAbi<std::int32_t>>>(
::crubit::OptionAbi<::crubit::TransmuteAbi<std::int32_t>>(
::crubit::TransmuteAbi<std::int32_t>()),
x_buffer, x);
unsigned char __return_value_storage
[::crubit::OptionAbi<::crubit::TransmuteAbi<std::int32_t>>::kSize];
__crubit_internal::__crubit_thunk_option_uincrements(x_buffer,
__return_value_storage);
return ::crubit::internal::Decode<
::crubit::OptionAbi<::crubit::TransmuteAbi<std::int32_t>>>(
::crubit::OptionAbi(::crubit::TransmuteAbi<std::int32_t>()),
::crubit::OptionAbi<::crubit::TransmuteAbi<std::int32_t>>(
::crubit::TransmuteAbi<std::int32_t>()),
__return_value_storage);
}

Expand All @@ -119,7 +128,8 @@ inline std::optional<std::int32_t> make_my_option_rust() {
__return_value_storage);
return ::crubit::internal::Decode<
crubit::OptionalAbi<::crubit::TransmuteAbi<std::int32_t>>>(
crubit::OptionalAbi(::crubit::TransmuteAbi<std::int32_t>()),
crubit::OptionalAbi<::crubit::TransmuteAbi<std::int32_t>>(
::crubit::TransmuteAbi<std::int32_t>()),
__return_value_storage);
}

Expand All @@ -132,7 +142,8 @@ inline std::optional<rs_std::SliceRef<const std::int32_t>> maybe_int_slice() {
__crubit_internal::__crubit_thunk_maybe_uint_uslice(__return_value_storage);
return ::crubit::internal::Decode<::crubit::OptionAbi<
::crubit::TransmuteAbi<::rs_std::SliceRef<const std::int32_t>>>>(
::crubit::OptionAbi(
::crubit::OptionAbi<
::crubit::TransmuteAbi<::rs_std::SliceRef<const std::int32_t>>>(
::crubit::TransmuteAbi<::rs_std::SliceRef<const std::int32_t>>()),
__return_value_storage);
}
Expand Down
39 changes: 30 additions & 9 deletions common/crubit_abi_type.rs
Original file line number Diff line number Diff line change
Expand Up @@ -283,9 +283,12 @@ impl ToTokens for CrubitAbiTypeToCppTokens<'_> {
quote! { ::crubit::TransmuteAbi<#ty> }.to_tokens(tokens);
}
CrubitAbiType::Pair(first, second) => {
let first_tokens = Self(first);
let second_tokens = Self(second);
quote! { ::crubit::PairAbi<#first_tokens, #second_tokens> }.to_tokens(tokens);
let first_crubit_abi_type = Self(first);
let second_crubit_abi_type = Self(second);
quote! {
::crubit::PairAbi<#first_crubit_abi_type, #second_crubit_abi_type>
}
.to_tokens(tokens);
}
CrubitAbiType::StdString { .. } => {
quote! { ::crubit::BoxedAbi<std::string> }.to_tokens(tokens)
Expand Down Expand Up @@ -344,9 +347,17 @@ impl ToTokens for CrubitAbiTypeToCppExprTokens<'_> {
quote! { ::crubit::TransmuteAbi<#ty>() }.to_tokens(tokens);
}
CrubitAbiType::Pair(first, second) => {
let first_tokens = Self(first);
let second_tokens = Self(second);
quote! { ::crubit::PairAbi(#first_tokens, #second_tokens) }.to_tokens(tokens);
let first_crubit_abi_type = CrubitAbiTypeToCppTokens(first);
let first_crubit_abi_type_expr = Self(first);
let second_crubit_abi_type = CrubitAbiTypeToCppTokens(second);
let second_crubit_abi_type_expr = Self(second);
quote! {
::crubit::PairAbi<#first_crubit_abi_type, #second_crubit_abi_type>(
#first_crubit_abi_type_expr,
#second_crubit_abi_type_expr
)
}
.to_tokens(tokens);
}
CrubitAbiType::StdString { .. } => {
quote! { ::crubit::BoxedAbi<std::string>() }.to_tokens(tokens)
Expand All @@ -358,9 +369,19 @@ impl ToTokens for CrubitAbiTypeToCppExprTokens<'_> {
quote! { ::crubit::BoxedAbi<#cpp_proto_path>() }.to_tokens(tokens);
}
CrubitAbiType::Type { cpp_abi_path, type_args, .. } => {
cpp_abi_path.to_tokens(tokens);
let type_args_tokens = type_args.iter().map(Self);
quote! { ( #(#type_args_tokens),* ) }.to_tokens(tokens);
if type_args.is_empty() {
// Special empty case since `Foo<>()` is invalid syntax.
quote! { #cpp_abi_path() }.to_tokens(tokens);
} else {
let type_args_crubit_abi_types = type_args.iter().map(CrubitAbiTypeToCppTokens);
let type_args_crubit_abi_type_exprs = type_args.iter().map(Self);
quote! {
#cpp_abi_path<#(#type_args_crubit_abi_types),*>(
#(#type_args_crubit_abi_type_exprs),*
)
}
.to_tokens(tokens);
}
}
}
}
Expand Down
29 changes: 18 additions & 11 deletions rs_bindings_from_cc/test/golden/composable_bridging_rs_api_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ extern "C" void __rust_thunk___Z16MakeOptionalVec3fffb(
bool is_present) {
::crubit::internal::Encode<
::crubit::MyOptionAbi<::crubit::TransmuteAbi<::Vec3>>>(
::crubit::MyOptionAbi(::crubit::TransmuteAbi<::Vec3>()),
::crubit::MyOptionAbi<::crubit::TransmuteAbi<::Vec3>>(
::crubit::TransmuteAbi<::Vec3>()),
__return_abi_buffer, MakeOptionalVec3(x, y, z, is_present));
}

Expand All @@ -61,13 +62,15 @@ extern "C" void __rust_thunk___Z11MapMultiply8MyOptionI4Vec3Ef(
unsigned char* __return_abi_buffer, const unsigned char* v, float factor) {
::crubit::internal::Encode<
::crubit::MyOptionAbi<::crubit::TransmuteAbi<::Vec3>>>(
::crubit::MyOptionAbi(::crubit::TransmuteAbi<::Vec3>()),
::crubit::MyOptionAbi<::crubit::TransmuteAbi<::Vec3>>(
::crubit::TransmuteAbi<::Vec3>()),
__return_abi_buffer,
MapMultiply(
::crubit::internal::Decode<
::crubit::MyOptionAbi<::crubit::TransmuteAbi<::Vec3>>>(
::crubit::MyOptionAbi(::crubit::TransmuteAbi<::Vec3>()), v),
factor));
MapMultiply(::crubit::internal::Decode<
::crubit::MyOptionAbi<::crubit::TransmuteAbi<::Vec3>>>(
::crubit::MyOptionAbi<::crubit::TransmuteAbi<::Vec3>>(
::crubit::TransmuteAbi<::Vec3>()),
v),
factor));
}

static_assert((struct MyOption<Vec3> (*)(struct MyOption<Vec3>,
Expand All @@ -77,7 +80,8 @@ extern "C" void __rust_thunk___Z14MakeMyI8Structv(
unsigned char* __return_abi_buffer) {
::crubit::internal::Encode<
::crubit::MyOptionAbi<::crubit::TransmuteAbi<::MyI8Struct>>>(
::crubit::MyOptionAbi(::crubit::TransmuteAbi<::MyI8Struct>()),
::crubit::MyOptionAbi<::crubit::TransmuteAbi<::MyI8Struct>>(
::crubit::TransmuteAbi<::MyI8Struct>()),
__return_abi_buffer, MakeMyI8Struct());
}

Expand All @@ -91,7 +95,8 @@ extern "C" void __rust_thunk___Z12MaybeVoidPtrv(
unsigned char* __return_abi_buffer) {
::crubit::internal::Encode<
::crubit::MyOptionAbi<::crubit::TransmuteAbi<void*>>>(
::crubit::MyOptionAbi(::crubit::TransmuteAbi<void*>()),
::crubit::MyOptionAbi<::crubit::TransmuteAbi<void*>>(
::crubit::TransmuteAbi<void*>()),
__return_abi_buffer, MaybeVoidPtr());
}

Expand All @@ -102,7 +107,8 @@ __rust_thunk___Z40AcceptsSliceAndReturnsStatusErrorIfEmptyN6rs_std8SliceRefIKiEE
unsigned char* __return_abi_buffer, ::rs_std::SliceRef<const int> slice) {
::crubit::internal::Encode<::crubit::MyOptionAbi<
::crubit::TransmuteAbi<::rs_std::SliceRef<const int>>>>(
::crubit::MyOptionAbi(
::crubit::MyOptionAbi<
::crubit::TransmuteAbi<::rs_std::SliceRef<const int>>>(
::crubit::TransmuteAbi<::rs_std::SliceRef<const int>>()),
__return_abi_buffer, AcceptsSliceAndReturnsStatusErrorIfEmpty(slice));
}
Expand All @@ -114,7 +120,8 @@ extern "C" void __rust_thunk___Z16ReturnsCStrArrayv(
unsigned char* __return_abi_buffer) {
::crubit::internal::Encode<
::crubit::MyOptionAbi<::crubit::TransmuteAbi<char const**>>>(
::crubit::MyOptionAbi(::crubit::TransmuteAbi<char const**>()),
::crubit::MyOptionAbi<::crubit::TransmuteAbi<char const**>>(
::crubit::TransmuteAbi<char const**>()),
__return_abi_buffer, ReturnsCStrArray());
}

Expand Down
7 changes: 0 additions & 7 deletions support/bridge.h
Original file line number Diff line number Diff line change
Expand Up @@ -305,9 +305,6 @@ struct PairAbi {
std::pair<Abi1, Abi2> abis;
};

template <typename Abi1, typename Abi2>
PairAbi(Abi1, Abi2) -> PairAbi<Abi1, Abi2>;

template <typename Abi>
requires(is_crubit_abi<Abi>)
struct OptionAbi {
Expand All @@ -331,10 +328,6 @@ struct OptionAbi {
Abi abi;
};

template <typename Abi>
requires(is_crubit_abi<Abi>)
OptionAbi(Abi) -> OptionAbi<Abi>;

template <typename T>
requires(std::move_constructible<T>)
struct BoxedAbi {
Expand Down