blob: 74481afb4f326fecea4ecafa8c66e89e746fbe61 [file] [log] [blame]
// Copyright 2023 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <Python.h>
#include <fuchsia_controller_abi/utils.h>
#include "decode.h"
#include "encode.h"
#include "ir.h"
#include "mod.h"
extern struct PyModuleDef libfidl_codec;
namespace fuchsia_controller::fidl_codec {
namespace {
namespace fc = fuchsia_controller;
constexpr PyMethodDef SENTINEL = {nullptr, nullptr, 0, nullptr};
PyMethodDef FidlCodecMethods[] = {
decode::decode_fidl_response_py_def,
decode::decode_fidl_request_py_def,
decode::decode_standalone_py_def,
encode::encode_fidl_message_py_def,
encode::encode_fidl_object_py_def,
ir::add_ir_path_py_def,
ir::add_ir_paths_py_def,
ir::get_ir_path_py_def,
ir::get_method_ordinal_py_def,
SENTINEL,
};
int FidlCodecModule_clear(PyObject *m) {
auto state = reinterpret_cast<mod::FidlCodecState *>(PyModule_GetState(m));
state->~FidlCodecState();
return 0;
}
PyMODINIT_FUNC PyInit_libfidl_codec() {
auto m = fc::abi::utils::Object(PyModule_Create(&libfidl_codec));
if (m == nullptr) {
return nullptr;
}
auto state = reinterpret_cast<mod::FidlCodecState *>(PyModule_GetState(m.get()));
new (state) mod::FidlCodecState();
return m.take();
}
} // namespace
} // namespace fuchsia_controller::fidl_codec
struct PyModuleDef libfidl_codec = {
.m_base = PyModuleDef_HEAD_INIT,
.m_name = "fidl_codec",
.m_doc = nullptr,
.m_size = sizeof(::fuchsia_controller::fidl_codec::mod::FidlCodecState *),
.m_methods = ::fuchsia_controller::fidl_codec::FidlCodecMethods,
.m_clear = ::fuchsia_controller::fidl_codec::FidlCodecModule_clear,
};