ExercĂcio: Interoperabilidade com C++
Parte um
- No arquivo Rust que vocĂȘ criou anteriormente, adicione um
#[cxx::bridge]
que especifica uma Ășnica função, a ser chamada do C++, chamadahello_from_rust
, sem parùmetros e sem valor de retorno. - Modifique sua função
hello_from_rust
anterior para removerextern "C"
e#[no_mangle]
. Esta é agora apenas uma função Rust padrão. - Modifique seu alvo
gn
para compilar esses bindings. - No seu código C++, remova a declaração antecipada de
hello_from_rust
. Em vez disso, inclua o arquivo de cabeçalho gerado. - Compile e execute!
Parte dois
Ă uma boa ideia brincar um pouco com o CXX. Isso ajuda vocĂȘ a pensar sobre quĂŁo flexĂvel o Rust no Chromium realmente Ă©.
Algumas coisas para tentar:
- Chame de volta para o C++ a partir do Rust. VocĂȘ vai precisar de:
- Um arquivo de cabeçalho adicional que vocĂȘ pode
include!
do seucxx::bridge
. VocĂȘ precisarĂĄ declarar sua função C++ nesse novo arquivo de cabeçalho. - Um bloco
unsafe
para chamar tal função, ou alternativamente especifique a palavra-chaveunsafe
no seu#[cxx::bridge]
conforme descrito aqui. - VocĂȘ tambĂ©m pode precisar
#include "third_party/rust/cxx/v1/crate/include/cxx.h"
- Um arquivo de cabeçalho adicional que vocĂȘ pode
- Passe uma string C++ para o Rust.
- Passe uma referĂȘncia a um objeto C++ para o Rust.
- Intencionalmente, obtenha as assinaturas de função Rust incompatĂveis com o
#[cxx::bridge]
e familiarize-se com os erros que vocĂȘ vĂȘ. - Intencionalmente, obtenha as assinaturas de função C++ incompatĂveis com o
#[cxx::bridge]
e familiarize-se com os erros que vocĂȘ vĂȘ. - Passe um
std::unique_ptr
de algum tipo do C++ para o Rust, para que o Rust possa own (possuir) algum objeto C++. - Crie um objeto Rust e passe-o para o C++, para que o C++ o possua. (Dica: vocĂȘ precisa de uma
Box
). - Declare alguns métodos em um tipo C++. Chame-os do Rust.
- Declare alguns métodos em um tipo Rust. Chame-os do C++.
Parte trĂȘs
Agora que vocĂȘ entende os pontos fortes e as limitaçÔes da interoperabilidade do CXX, pense em alguns casos de uso para o Rust no Chromium, onde a interface seria suficientemente simples. Esboce como vocĂȘ pode definir essa interface.
Onde encontrar ajuda
As students explore Part Two, they're bound to have lots of questions about how
to achieve these things, and also how CXX works behind the scenes.
Algumas das perguntas que vocĂȘ pode encontrar:
- Estou vendo um problema ao inicializar uma variåvel do tipo X com o tipo Y, onde X e Y são ambos tipos de função. Isso ocorre porque sua função C++ não corresponde exatamente à declaração em sua
cxx::bridge
. - Parece que posso converter livremente referĂȘncias C++ em referĂȘncias Rust. Isso nĂŁo arrisca UB? Para os tipos opaque do CXX, nĂŁo, porque eles tĂȘm tamanho zero. Para os tipos triviais do CXX, sim, Ă© possĂvel causar UB, embora o design do CXX torne bastante difĂcil criar um exemplo assim.