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
68 lines
2.4 KiB
C++
68 lines
2.4 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* 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_dom_UniFFIPointer_h
|
|
#define mozilla_dom_UniFFIPointer_h
|
|
|
|
#include "nsISupports.h"
|
|
#include "nsWrapperCache.h"
|
|
#include "nsString.h"
|
|
#include "mozilla/dom/UniFFIPointerType.h"
|
|
|
|
namespace mozilla::dom {
|
|
|
|
class UniFFIPointer final : public nsISupports, public nsWrapperCache {
|
|
public:
|
|
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
|
|
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(UniFFIPointer)
|
|
|
|
static already_AddRefed<UniFFIPointer> Create(
|
|
void* aPtr, const uniffi::UniFFIPointerType* aType);
|
|
static already_AddRefed<UniFFIPointer> Read(
|
|
const ArrayBuffer& aArrayBuff, uint32_t aPosition,
|
|
const uniffi::UniFFIPointerType* aType, ErrorResult& aError);
|
|
void Write(const ArrayBuffer& aArrayBuff, uint32_t aPosition,
|
|
const uniffi::UniFFIPointerType* aType, ErrorResult& aError) const;
|
|
|
|
UniFFIPointer(void* aPtr, const uniffi::UniFFIPointerType* aType);
|
|
|
|
JSObject* WrapObject(JSContext* aCx,
|
|
JS::Handle<JSObject*> aGivenProto) override;
|
|
nsISupports* GetParentObject() { return nullptr; }
|
|
|
|
/**
|
|
* returns the raw pointer `UniFFIPointer` holds
|
|
* This is safe because:
|
|
* - The pointer was allocated in Rust as a reference counted `Arc<T>`
|
|
* - Rust cloned the pointer without destructing it when passed into C++
|
|
* - Eventually, when the destructor of `UniFFIPointer` runs, we return
|
|
* ownership to Rust, which then decrements the count and deallocates the
|
|
* memory the pointer points to.
|
|
*/
|
|
void* GetPtr() const;
|
|
|
|
/**
|
|
* Returns true if the pointer type `this` holds is the same as the argument
|
|
* it does so using pointer comparison, as there is **exactly** one static
|
|
* `UniFFIPointerType` per type exposed in the UniFFI interface
|
|
*/
|
|
bool IsSamePtrType(const uniffi::UniFFIPointerType* type) const;
|
|
|
|
private:
|
|
const uniffi::UniFFIPointerType* mType;
|
|
void* mPtr;
|
|
|
|
protected:
|
|
/**
|
|
* Destructs the `UniFFIPointer`, making sure to give back ownership of the
|
|
* raw pointer back to Rust, which deallocates the pointer
|
|
*/
|
|
~UniFFIPointer();
|
|
};
|
|
} // namespace mozilla::dom
|
|
|
|
#endif /* mozilla_dom_UniFFIPointer_h */
|