123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359 |
- // 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 <google/protobuf/pyext/unknown_fields.h>
- #include <Python.h>
- #include <set>
- #include <memory>
- #include <google/protobuf/message.h>
- #include <google/protobuf/pyext/message.h>
- #include <google/protobuf/pyext/scoped_pyobject_ptr.h>
- #include <google/protobuf/unknown_field_set.h>
- #include <google/protobuf/wire_format_lite.h>
- #if PY_MAJOR_VERSION >= 3
- #define PyInt_FromLong PyLong_FromLong
- #endif
- namespace google {
- namespace protobuf {
- namespace python {
- namespace unknown_fields {
- static Py_ssize_t Len(PyObject* pself) {
- PyUnknownFields* self =
- reinterpret_cast<PyUnknownFields*>(pself);
- if (self->fields == NULL) {
- PyErr_Format(PyExc_ValueError,
- "UnknownFields does not exist. "
- "The parent message might be cleared.");
- return -1;
- }
- return self->fields->field_count();
- }
- void Clear(PyUnknownFields* self) {
- for (std::set<PyUnknownFields*>::iterator it =
- self->sub_unknown_fields.begin();
- it != self->sub_unknown_fields.end(); it++) {
- Clear(*it);
- }
- self->fields = NULL;
- self->sub_unknown_fields.clear();
- }
- PyObject* NewPyUnknownFieldRef(PyUnknownFields* parent,
- Py_ssize_t index);
- static PyObject* Item(PyObject* pself, Py_ssize_t index) {
- PyUnknownFields* self =
- reinterpret_cast<PyUnknownFields*>(pself);
- if (self->fields == NULL) {
- PyErr_Format(PyExc_ValueError,
- "UnknownFields does not exist. "
- "The parent message might be cleared.");
- return NULL;
- }
- Py_ssize_t total_size = self->fields->field_count();
- if (index < 0) {
- index = total_size + index;
- }
- if (index < 0 || index >= total_size) {
- PyErr_Format(PyExc_IndexError,
- "index (%zd) out of range",
- index);
- return NULL;
- }
- return unknown_fields::NewPyUnknownFieldRef(self, index);
- }
- PyObject* NewPyUnknownFields(CMessage* c_message) {
- PyUnknownFields* self = reinterpret_cast<PyUnknownFields*>(
- PyType_GenericAlloc(&PyUnknownFields_Type, 0));
- if (self == NULL) {
- return NULL;
- }
- // Call "placement new" to initialize PyUnknownFields.
- new (self) PyUnknownFields;
- Py_INCREF(c_message);
- self->parent = reinterpret_cast<PyObject*>(c_message);
- Message* message = c_message->message;
- const Reflection* reflection = message->GetReflection();
- self->fields = &reflection->GetUnknownFields(*message);
- return reinterpret_cast<PyObject*>(self);
- }
- PyObject* NewPyUnknownFieldRef(PyUnknownFields* parent,
- Py_ssize_t index) {
- PyUnknownFieldRef* self = reinterpret_cast<PyUnknownFieldRef*>(
- PyType_GenericAlloc(&PyUnknownFieldRef_Type, 0));
- if (self == NULL) {
- return NULL;
- }
- Py_INCREF(parent);
- self->parent = parent;
- self->index = index;
- return reinterpret_cast<PyObject*>(self);
- }
- static void Dealloc(PyObject* pself) {
- PyUnknownFields* self =
- reinterpret_cast<PyUnknownFields*>(pself);
- if (PyObject_TypeCheck(self->parent, &PyUnknownFields_Type)) {
- reinterpret_cast<PyUnknownFields*>(
- self->parent)->sub_unknown_fields.erase(self);
- } else {
- reinterpret_cast<CMessage*>(self->parent)->unknown_field_set = nullptr;
- }
- Py_CLEAR(self->parent);
- self->~PyUnknownFields();
- Py_TYPE(pself)->tp_free(pself);
- }
- static PySequenceMethods SqMethods = {
- Len, /* sq_length */
- 0, /* sq_concat */
- 0, /* sq_repeat */
- Item, /* sq_item */
- 0, /* sq_slice */
- 0, /* sq_ass_item */
- };
- } // namespace unknown_fields
- PyTypeObject PyUnknownFields_Type = {
- PyVarObject_HEAD_INIT(&PyType_Type, 0)
- FULL_MODULE_NAME ".PyUnknownFields", // tp_name
- sizeof(PyUnknownFields), // tp_basicsize
- 0, // tp_itemsize
- unknown_fields::Dealloc, // tp_dealloc
- 0, // tp_print
- 0, // tp_getattr
- 0, // tp_setattr
- 0, // tp_compare
- 0, // tp_repr
- 0, // tp_as_number
- &unknown_fields::SqMethods, // tp_as_sequence
- 0, // tp_as_mapping
- PyObject_HashNotImplemented, // tp_hash
- 0, // tp_call
- 0, // tp_str
- 0, // tp_getattro
- 0, // tp_setattro
- 0, // tp_as_buffer
- Py_TPFLAGS_DEFAULT, // tp_flags
- "unknown field set", // tp_doc
- 0, // tp_traverse
- 0, // tp_clear
- 0, // tp_richcompare
- 0, // tp_weaklistoffset
- 0, // tp_iter
- 0, // tp_iternext
- 0, // tp_methods
- 0, // tp_members
- 0, // tp_getset
- 0, // tp_base
- 0, // tp_dict
- 0, // tp_descr_get
- 0, // tp_descr_set
- 0, // tp_dictoffset
- 0, // tp_init
- };
- namespace unknown_field {
- static PyObject* PyUnknownFields_FromUnknownFieldSet(
- PyUnknownFields* parent, const UnknownFieldSet& fields) {
- PyUnknownFields* self = reinterpret_cast<PyUnknownFields*>(
- PyType_GenericAlloc(&PyUnknownFields_Type, 0));
- if (self == NULL) {
- return NULL;
- }
- // Call "placement new" to initialize PyUnknownFields.
- new (self) PyUnknownFields;
- Py_INCREF(parent);
- self->parent = reinterpret_cast<PyObject*>(parent);
- self->fields = &fields;
- parent->sub_unknown_fields.emplace(self);
- return reinterpret_cast<PyObject*>(self);
- }
- const UnknownField* GetUnknownField(PyUnknownFieldRef* self) {
- const UnknownFieldSet* fields = self->parent->fields;
- if (fields == NULL) {
- PyErr_Format(PyExc_ValueError,
- "UnknownField does not exist. "
- "The parent message might be cleared.");
- return NULL;
- }
- ssize_t total_size = fields->field_count();
- if (self->index >= total_size) {
- PyErr_Format(PyExc_ValueError,
- "UnknownField does not exist. "
- "The parent message might be cleared.");
- return NULL;
- }
- return &fields->field(self->index);
- }
- static PyObject* GetFieldNumber(PyUnknownFieldRef* self, void *closure) {
- const UnknownField* unknown_field = GetUnknownField(self);
- if (unknown_field == NULL) {
- return NULL;
- }
- return PyInt_FromLong(unknown_field->number());
- }
- using internal::WireFormatLite;
- static PyObject* GetWireType(PyUnknownFieldRef* self, void *closure) {
- const UnknownField* unknown_field = GetUnknownField(self);
- if (unknown_field == NULL) {
- return NULL;
- }
- // Assign a default value to suppress may-uninitialized warnings (errors
- // when built in some places).
- WireFormatLite::WireType wire_type = WireFormatLite::WIRETYPE_VARINT;
- switch (unknown_field->type()) {
- case UnknownField::TYPE_VARINT:
- wire_type = WireFormatLite::WIRETYPE_VARINT;
- break;
- case UnknownField::TYPE_FIXED32:
- wire_type = WireFormatLite::WIRETYPE_FIXED32;
- break;
- case UnknownField::TYPE_FIXED64:
- wire_type = WireFormatLite::WIRETYPE_FIXED64;
- break;
- case UnknownField::TYPE_LENGTH_DELIMITED:
- wire_type = WireFormatLite::WIRETYPE_LENGTH_DELIMITED;
- break;
- case UnknownField::TYPE_GROUP:
- wire_type = WireFormatLite::WIRETYPE_START_GROUP;
- break;
- }
- return PyInt_FromLong(wire_type);
- }
- static PyObject* GetData(PyUnknownFieldRef* self, void *closure) {
- const UnknownField* field = GetUnknownField(self);
- if (field == NULL) {
- return NULL;
- }
- PyObject* data = NULL;
- switch (field->type()) {
- case UnknownField::TYPE_VARINT:
- data = PyInt_FromLong(field->varint());
- break;
- case UnknownField::TYPE_FIXED32:
- data = PyInt_FromLong(field->fixed32());
- break;
- case UnknownField::TYPE_FIXED64:
- data = PyInt_FromLong(field->fixed64());
- break;
- case UnknownField::TYPE_LENGTH_DELIMITED:
- data = PyBytes_FromStringAndSize(field->length_delimited().data(),
- field->GetLengthDelimitedSize());
- break;
- case UnknownField::TYPE_GROUP:
- data = PyUnknownFields_FromUnknownFieldSet(
- self->parent, field->group());
- break;
- }
- return data;
- }
- static void Dealloc(PyObject* pself) {
- PyUnknownFieldRef* self =
- reinterpret_cast<PyUnknownFieldRef*>(pself);
- Py_CLEAR(self->parent);
- }
- static PyGetSetDef Getters[] = {
- {"field_number", (getter)GetFieldNumber, NULL},
- {"wire_type", (getter)GetWireType, NULL},
- {"data", (getter)GetData, NULL},
- {NULL}
- };
- } // namespace unknown_field
- PyTypeObject PyUnknownFieldRef_Type = {
- PyVarObject_HEAD_INIT(&PyType_Type, 0)
- FULL_MODULE_NAME ".PyUnknownFieldRef", // tp_name
- sizeof(PyUnknownFieldRef), // tp_basicsize
- 0, // tp_itemsize
- unknown_field::Dealloc, // tp_dealloc
- 0, // tp_print
- 0, // tp_getattr
- 0, // tp_setattr
- 0, // tp_compare
- 0, // tp_repr
- 0, // tp_as_number
- 0, // tp_as_sequence
- 0, // tp_as_mapping
- PyObject_HashNotImplemented, // tp_hash
- 0, // tp_call
- 0, // tp_str
- 0, // tp_getattro
- 0, // tp_setattro
- 0, // tp_as_buffer
- Py_TPFLAGS_DEFAULT, // tp_flags
- "unknown field", // tp_doc
- 0, // tp_traverse
- 0, // tp_clear
- 0, // tp_richcompare
- 0, // tp_weaklistoffset
- 0, // tp_iter
- 0, // tp_iternext
- 0, // tp_methods
- 0, // tp_members
- unknown_field::Getters, // tp_getset
- 0, // tp_base
- 0, // tp_dict
- 0, // tp_descr_get
- 0, // tp_descr_set
- 0, // tp_dictoffset
- 0, // tp_init
- };
- } // namespace python
- } // namespace protobuf
- } // namespace google
|