// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include #include #include #include #include namespace { // C++ API. Clients get at this via proto_api.h struct ApiImplementation : google::protobuf::python::PyProto_API { const google::protobuf::Message* GetMessagePointer(PyObject* msg) const override { return google::protobuf::python::PyMessage_GetMessagePointer(msg); } google::protobuf::Message* GetMutableMessagePointer(PyObject* msg) const override { return google::protobuf::python::PyMessage_GetMutableMessagePointer(msg); } const google::protobuf::Descriptor* MessageDescriptor_AsDescriptor( PyObject* desc) const override { return google::protobuf::python::PyMessageDescriptor_AsDescriptor(desc); } const google::protobuf::EnumDescriptor* EnumDescriptor_AsDescriptor( PyObject* enum_desc) const override { return google::protobuf::python::PyEnumDescriptor_AsDescriptor(enum_desc); } const google::protobuf::DescriptorPool* GetDefaultDescriptorPool() const override { return google::protobuf::python::GetDefaultDescriptorPool()->pool; } google::protobuf::MessageFactory* GetDefaultMessageFactory() const override { return google::protobuf::python::GetDefaultDescriptorPool() ->py_message_factory->message_factory; } PyObject* NewMessage(const google::protobuf::Descriptor* descriptor, PyObject* py_message_factory) const override { return google::protobuf::python::PyMessage_New(descriptor, py_message_factory); } PyObject* NewMessageOwnedExternally( google::protobuf::Message* msg, PyObject* py_message_factory) const override { return google::protobuf::python::PyMessage_NewMessageOwnedExternally( msg, py_message_factory); } PyObject* DescriptorPool_FromPool( const google::protobuf::DescriptorPool* pool) const override { return google::protobuf::python::PyDescriptorPool_FromPool(pool); } }; } // namespace static const char module_docstring[] = "python-proto2 is a module that can be used to enhance proto2 Python API\n" "performance.\n" "\n" "It provides access to the protocol buffers C++ reflection API that\n" "implements the basic protocol buffer functions."; static PyMethodDef ModuleMethods[] = { {"SetAllowOversizeProtos", (PyCFunction)google::protobuf::python::cmessage::SetAllowOversizeProtos, METH_O, "Enable/disable oversize proto parsing."}, // DO NOT USE: For migration and testing only. {NULL, NULL}}; #if PY_MAJOR_VERSION >= 3 static struct PyModuleDef _module = {PyModuleDef_HEAD_INIT, "_message", module_docstring, -1, ModuleMethods, /* m_methods */ NULL, NULL, NULL, NULL}; #define INITFUNC PyInit__message #define INITFUNC_ERRORVAL NULL #else // Python 2 #define INITFUNC init_message #define INITFUNC_ERRORVAL #endif PyMODINIT_FUNC INITFUNC() { PyObject* m; #if PY_MAJOR_VERSION >= 3 m = PyModule_Create(&_module); #else m = Py_InitModule3("_message", ModuleMethods, module_docstring); #endif if (m == NULL) { return INITFUNC_ERRORVAL; } if (!google::protobuf::python::InitProto2MessageModule(m)) { Py_DECREF(m); return INITFUNC_ERRORVAL; } // Adds the C++ API if (PyObject* api = PyCapsule_New( new ApiImplementation(), google::protobuf::python::PyProtoAPICapsuleName(), [](PyObject* o) { delete (ApiImplementation*)PyCapsule_GetPointer( o, google::protobuf::python::PyProtoAPICapsuleName()); })) { PyModule_AddObject(m, "proto_API", api); } else { return INITFUNC_ERRORVAL; } #if PY_MAJOR_VERSION >= 3 return m; #endif }