File: RustMessageUtils.h

package info (click to toggle)
firefox 147.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,683,324 kB
  • sloc: cpp: 7,607,156; javascript: 6,532,492; ansic: 3,775,158; python: 1,415,368; xml: 634,556; asm: 438,949; java: 186,241; sh: 62,751; makefile: 18,079; objc: 13,092; perl: 12,808; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10; exp: 6
file content (42 lines) | stat: -rw-r--r-- 2,726 bytes parent folder | download | duplicates (13)
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
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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_ipc_RustMessageUtils_h
#define mozilla_ipc_RustMessageUtils_h

#include "chrome/common/ipc_message_utils.h"

// Some macros for rust integrations. See ipc/rust/ipdl_utils
#define MOZ_DEFINE_RUST_PARAMTRAITS(type_, serializer_, deserializer_)        \
  extern "C" uint8_t* serializer_(const type_*, size_t* len, size_t* cap);    \
  extern "C" bool deserializer_(const uint8_t*, size_t len, type_*);          \
                                                                              \
  template <>                                                                 \
  struct IPC::ParamTraits<type_> {                                            \
    using paramType = type_;                                                  \
    static void Write(IPC::MessageWriter* aWriter, const paramType& aParam) { \
      size_t len, cap;                                                        \
      uint8_t* buf = serializer_(&aParam, &cap, &len);                        \
      MOZ_DIAGNOSTIC_ASSERT(buf, #type_ " serialization failed");             \
      WriteParam(aWriter, mozilla::ipc::ByteBuf(buf, len, cap));              \
    }                                                                         \
    static IPC::ReadResult<paramType> Read(IPC::MessageReader* aReader) {     \
      mozilla::ipc::ByteBuf in;                                               \
      IPC::ReadResult<paramType> result;                                      \
      if (!ReadParam(aReader, &in) || !in.mData) {                            \
        return result;                                                        \
      }                                                                       \
      /* TODO: Should be able to initialize `result` in-place instead */      \
      mozilla::AlignedStorage2<paramType> value;                              \
      if (!deserializer_(in.mData, in.mLen, value.addr())) {                  \
        return result;                                                        \
      }                                                                       \
      result = std::move(*value.addr());                                      \
      value.addr()->~paramType();                                             \
      return result;                                                          \
    }                                                                         \
  };

#endif