Backed out 2 changesets (bug 1943998) for causing wd failures @ phases.py CLOSED...
[gecko.git] / ipc / glue / RustMessageUtils.h
blob901466682adf90d442d15f9e306936836fba6f63
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef mozilla_ipc_RustMessageUtils_h
7 #define mozilla_ipc_RustMessageUtils_h
9 #include "chrome/common/ipc_message_utils.h"
11 // Some macros for rust integrations. See ipc/rust/ipdl_utils
12 #define MOZ_DEFINE_RUST_PARAMTRAITS(type_, serializer_, deserializer_) \
13 extern "C" uint8_t* serializer_(const type_*, size_t* len, size_t* cap); \
14 extern "C" bool deserializer_(const uint8_t*, size_t len, type_*); \
16 template <> \
17 struct IPC::ParamTraits<type_> { \
18 using paramType = type_; \
19 static void Write(IPC::MessageWriter* aWriter, const paramType& aParam) { \
20 size_t len, cap; \
21 uint8_t* buf = serializer_(&aParam, &cap, &len); \
22 MOZ_DIAGNOSTIC_ASSERT(buf, #type_ " serialization failed"); \
23 WriteParam(aWriter, mozilla::ipc::ByteBuf(buf, len, cap)); \
24 } \
25 static IPC::ReadResult<paramType> Read(IPC::MessageReader* aReader) { \
26 mozilla::ipc::ByteBuf in; \
27 IPC::ReadResult<paramType> result; \
28 if (!ReadParam(aReader, &in) || !in.mData) { \
29 return result; \
30 } \
31 /* TODO: Should be able to initialize `result` in-place instead */ \
32 mozilla::AlignedStorage2<paramType> value; \
33 if (!deserializer_(in.mData, in.mLen, value.addr())) { \
34 return result; \
35 } \
36 result = std::move(*value.addr()); \
37 value.addr()->~paramType(); \
38 return result; \
39 } \
42 #endif