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.