File: OwnedRustBuffer.cpp

package info (click to toggle)
firefox 142.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,591,884 kB
  • sloc: cpp: 7,451,570; javascript: 6,392,463; ansic: 3,712,584; python: 1,388,569; xml: 629,223; asm: 426,919; java: 184,857; sh: 63,439; makefile: 19,150; objc: 13,059; perl: 12,983; yacc: 4,583; cs: 3,846; pascal: 3,352; lex: 1,720; ruby: 1,003; exp: 762; php: 436; lisp: 258; awk: 247; sql: 66; sed: 53; csh: 10
file content (89 lines) | stat: -rw-r--r-- 2,821 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/* -*- 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/. */

#include "nsString.h"
#include "mozilla/uniffi/OwnedRustBuffer.h"

namespace mozilla::uniffi {

using dom::ArrayBuffer;

OwnedRustBuffer::OwnedRustBuffer(const RustBuffer& aBuf) : mBuf(aBuf) {}

OwnedRustBuffer OwnedRustBuffer::FromArrayBuffer(
    const ArrayBuffer& aArrayBuffer) {
  return aArrayBuffer.ProcessData(
      [](const Span<uint8_t>& aData,
         JS::AutoCheckCannotGC&&) -> OwnedRustBuffer {
        uint64_t bufLen = aData.Length();

        RustCallStatus status{};
        RustBuffer buf =
            uniffi_rustbuffer_alloc(static_cast<uint64_t>(bufLen), &status);
        buf.len = bufLen;

        // uniffi_rustbuffer_alloc cannot fail within gecko as we build with
        // `panic=abort`, and allocations default to infallible.
        MOZ_RELEASE_ASSERT(status.code == 0,
                           "uniffi_rustbuffer_alloc cannot fail in Gecko");
        memcpy(buf.data, aData.Elements(), bufLen);
        return OwnedRustBuffer(buf);
      });
}

OwnedRustBuffer::OwnedRustBuffer(OwnedRustBuffer&& aOther) : mBuf(aOther.mBuf) {
  aOther.mBuf = RustBuffer{0};
}

OwnedRustBuffer& OwnedRustBuffer::operator=(OwnedRustBuffer&& aOther) {
  if (&aOther != this) {
    FreeData();
  }
  mBuf = aOther.mBuf;
  aOther.mBuf = RustBuffer{0};
  return *this;
}

void OwnedRustBuffer::FreeData() {
  if (IsValid()) {
    RustCallStatus status{};
    uniffi_rustbuffer_free(mBuf, &status);
    MOZ_RELEASE_ASSERT(status.code == 0,
                       "Freeing a rustbuffer should never fail");
    mBuf = {0};
  }
}

OwnedRustBuffer::~OwnedRustBuffer() { FreeData(); }

RustBuffer OwnedRustBuffer::IntoRustBuffer() {
  RustBuffer rv = mBuf;
  mBuf = {};
  return rv;
}

void OwnedRustBuffer::IntoArrayBuffer(JSContext* aCx,
                                      JS::MutableHandle<JSObject*> aResult,
                                      ErrorResult& aError) {
  auto len = mBuf.len;
  void* data = mBuf.data;
  auto userData = MakeUnique<OwnedRustBuffer>(std::move(*this));
  UniquePtr<void, JS::BufferContentsDeleter> dataPtr{
      data, {&ArrayBufferFreeFunc, userData.release()}};

  JS::Rooted<JSObject*> obj(
      aCx, JS::NewExternalArrayBuffer(aCx, len, std::move(dataPtr)));
  if (!obj) {
    aError.NoteJSContextException(aCx);
    return;
  }
  aResult.set(obj);
}

void OwnedRustBuffer::ArrayBufferFreeFunc(void* contents, void* userData) {
  UniquePtr<OwnedRustBuffer> buf{reinterpret_cast<OwnedRustBuffer*>(userData)};
}
}  // namespace mozilla::uniffi