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.