31 #include <google/protobuf/pyext/unknown_fields.h>
33 #define PY_SSIZE_T_CLEAN
38 #include <google/protobuf/message.h>
39 #include <google/protobuf/pyext/message.h>
40 #include <google/protobuf/pyext/scoped_pyobject_ptr.h>
41 #include <google/protobuf/unknown_field_set.h>
42 #include <google/protobuf/wire_format_lite.h>
48 namespace unknown_fields {
50 static Py_ssize_t
Len(PyObject* pself) {
53 if (
self->fields == NULL) {
54 PyErr_Format(PyExc_ValueError,
55 "UnknownFields does not exist. "
56 "The parent message might be cleared.");
59 return self->fields->field_count();
64 self->sub_unknown_fields.begin();
65 it !=
self->sub_unknown_fields.end();
it++) {
69 self->sub_unknown_fields.clear();
75 static PyObject*
Item(PyObject* pself, Py_ssize_t
index) {
78 if (
self->fields == NULL) {
79 PyErr_Format(PyExc_ValueError,
80 "UnknownFields does not exist. "
81 "The parent message might be cleared.");
84 Py_ssize_t total_size =
self->fields->field_count();
88 if (index < 0 || index >= total_size) {
89 PyErr_Format(PyExc_IndexError,
90 "index (%zd) out of range",
107 Py_INCREF(c_message);
108 self->parent =
reinterpret_cast<PyObject*
>(c_message);
113 return reinterpret_cast<PyObject*
>(
self);
118 PyUnknownFieldRef*
self =
reinterpret_cast<PyUnknownFieldRef*
>(
125 self->parent = parent;
128 return reinterpret_cast<PyObject*
>(
self);
136 self->parent)->sub_unknown_fields.erase(
self);
138 reinterpret_cast<CMessage*
>(
self->parent)->unknown_field_set =
nullptr;
140 Py_CLEAR(
self->parent);
141 self->~PyUnknownFields();
142 Py_TYPE(pself)->tp_free(pself);
170 PyObject_HashNotImplemented,
207 self->parent =
reinterpret_cast<PyObject*
>(parent);
211 return reinterpret_cast<PyObject*
>(
self);
217 PyErr_Format(PyExc_ValueError,
218 "UnknownField does not exist. "
219 "The parent message might be cleared.");
222 Py_ssize_t total_size =
fields->field_count();
223 if (
self->index >= total_size) {
224 PyErr_Format(PyExc_ValueError,
225 "UnknownField does not exist. "
226 "The parent message might be cleared.");
234 if (unknown_field == NULL) {
237 return PyLong_FromLong(unknown_field->
number());
243 if (unknown_field == NULL) {
250 switch (unknown_field->
type()) {
267 return PyLong_FromLong(wire_type);
275 PyObject*
data = NULL;
276 switch (
field->type()) {
281 data = PyLong_FromLong(
field->fixed32());
284 data = PyLong_FromLong(
field->fixed64());
287 data = PyBytes_FromStringAndSize(
field->length_delimited().data(),
288 field->GetLengthDelimitedSize());
301 Py_CLEAR(
self->parent);
307 {
"data", (getter)
GetData, NULL},
316 sizeof(PyUnknownFieldRef),
327 PyObject_HashNotImplemented,