forked from mirrors/gecko-dev
Generate the C++ and JS code to handle UniFFI bindings. The WebIDL code is completely static and doesn't need to be generated. There's support for both synchronus and async functions, but we haven't decided the how we want this to be configured. In practice, almost all functions will need to be async, so for now we're just forcing all functions to be. The `uniffi-bindgen-gecko-js` crate builds the binary that generates the bindings. This binary needs to be fed a list of UDL files, the path of the .cpp file to generate, and the directory to generate .jsm files in (and also all of those arguments again, but for the test fixtures). This is quiet a horrible UI, but it's going to be wrapped in a mach command. The `uniffi-js` directory contains shared C++ code for `uniffi-bindgen-gecko-js`. As much as possible we tried to put the functionality here and have the generated code simply forward function calls here. Still Todo: - CallbackInterfaces - Custom and external types - Datetime and TimeInterval Differential Revision: https://phabricator.services.mozilla.com/D144472
69 lines
2.5 KiB
C++
69 lines
2.5 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef mozilla_OwnedRustBuffer_h
|
|
#define mozilla_OwnedRustBuffer_h
|
|
|
|
#include "mozilla/ErrorResult.h"
|
|
#include "mozilla/ResultVariant.h"
|
|
#include "mozilla/dom/TypedArray.h"
|
|
#include "mozilla/dom/UniFFIRust.h"
|
|
|
|
namespace mozilla::uniffi {
|
|
|
|
// RustBuffer that's owned by the JS code and handles the memory management
|
|
class OwnedRustBuffer final {
|
|
private:
|
|
RustBuffer mBuf;
|
|
|
|
void FreeData();
|
|
|
|
public:
|
|
// The default constructor creates an invalid OwnedRustBuffer
|
|
OwnedRustBuffer() : mBuf{0} {};
|
|
|
|
// Constructor for creating an OwnedRustBuffer from a raw RustBuffer struct
|
|
// that was returned by Rust (therefore we now own the RustBuffer).
|
|
explicit OwnedRustBuffer(const RustBuffer& aBuf);
|
|
|
|
// Manual implementation of move constructor and assignment operator.
|
|
OwnedRustBuffer(OwnedRustBuffer&& aOther);
|
|
OwnedRustBuffer& operator=(OwnedRustBuffer&& aOther);
|
|
|
|
// Delete copy & move constructor as this type is non-copyable.
|
|
OwnedRustBuffer(const OwnedRustBuffer&) = delete;
|
|
OwnedRustBuffer& operator=(const OwnedRustBuffer&) = delete;
|
|
|
|
// Destructor that frees the RustBuffer if it is still valid
|
|
~OwnedRustBuffer();
|
|
|
|
// Constructor for creating an OwnedRustBuffer from an ArrayBuffer. Will set
|
|
// aError to failed and construct an invalid OwnedRustBuffer if the
|
|
// conversion failed.
|
|
static Result<OwnedRustBuffer, nsCString> FromArrayBuffer(
|
|
const mozilla::dom::ArrayBuffer& aArrayBuffer);
|
|
|
|
// Moves the buffer out of this `OwnedArrayBuffer` into a raw `RustBuffer`
|
|
// struct. The raw struct must be passed into a Rust function, transfering
|
|
// ownership to Rust. After this call the buffer will no longer be valid.
|
|
RustBuffer IntoRustBuffer();
|
|
|
|
// Moves the buffer out of this `OwnedArrayBuffer` into a JS ArrayBuffer.
|
|
// This transfers ownership into the JS engine. After this call the buffer
|
|
// will no longer be valid.
|
|
JSObject* IntoArrayBuffer(JSContext* cx);
|
|
|
|
// Is this RustBuffer pointing to valid data?
|
|
bool IsValid() const { return mBuf.data != nullptr; }
|
|
|
|
private:
|
|
// Helper function used by IntoArrayBuffer.
|
|
static void ArrayBufferFreeFunc(void* contents, void* userData);
|
|
};
|
|
|
|
} // namespace mozilla::uniffi
|
|
|
|
#endif // mozilla_OwnedRustBuffer_h
|