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++, chamada hello_from_rust, sem parâmetros e sem valor de retorno.
  • Modifique sua função hello_from_rust anterior para remover extern "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 seu cxx::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-chave unsafe no seu #[cxx::bridge] conforme descrito aqui.
    • Você também pode precisar #include "third_party/rust/cxx/v1/crate/include/cxx.h"
  • 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.