Go to the documentation of this file.
52 #define PY_SSIZE_T_CLEAN
55 #include <google/protobuf/descriptor.h>
56 #include <google/protobuf/pyext/descriptor_containers.h>
57 #include <google/protobuf/pyext/descriptor_pool.h>
58 #include <google/protobuf/pyext/descriptor.h>
59 #include <google/protobuf/pyext/scoped_pyobject_ptr.h>
61 #define PyString_AsStringAndSize(ob, charpp, sizep) \
62 (PyUnicode_Check(ob) ? ((*(charpp) = const_cast<char*>( \
63 PyUnicode_AsUTF8AndSize(ob, (sizep)))) == NULL \
66 : PyBytes_AsStringAndSize(ob, (charpp), (sizep)))
75 typedef const void* (*GetByIndexMethod)(PyContainer*
self,
int index);
76 typedef const void* (*GetByNameMethod)(PyContainer*
self,
78 typedef const void* (*GetByCamelcaseNameMethod)(PyContainer*
self,
80 typedef const void* (*GetByNumberMethod)(PyContainer*
self,
int index);
81 typedef PyObject* (*NewObjectFromItemMethod)(
const void*
descriptor);
83 typedef const std::string& (*GetItemCamelcaseNameMethod)(
88 struct DescriptorContainerDef {
139 struct PyContainerIterator {
164 switch (
self->kind) {
168 Py_ssize_t name_size;
170 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
178 *item =
self->container_def->get_by_name_fn(
184 char* camelcase_name;
185 Py_ssize_t name_size;
187 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
195 *item =
self->container_def->get_by_camelcase_name_fn(
201 Py_ssize_t
number = PyNumber_AsSsize_t(
key, NULL);
202 if (
number == -1 && PyErr_Occurred()) {
203 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
211 *item =
self->container_def->get_by_number_fn(
self,
number);
215 PyErr_SetNone(PyExc_NotImplementedError);
223 const void* item =
self->container_def->get_by_index_fn(
self,
index);
224 switch (
self->kind) {
228 return PyUnicode_FromStringAndSize(
name.c_str(),
name.size());
233 self->container_def->get_item_camelcase_name_fn(item));
234 return PyUnicode_FromStringAndSize(
name.c_str(),
name.size());
238 int value =
self->container_def->get_item_number_fn(item);
239 return PyLong_FromLong(
value);
242 PyErr_SetNone(PyExc_NotImplementedError);
250 return self->container_def->new_object_from_item_fn(
251 self->container_def->get_by_index_fn(
self,
index));
255 return self->container_def->count_fn(
self);
261 const void* item = NULL;
266 PyErr_SetObject(PyExc_KeyError,
key);
269 return self->container_def->new_object_from_item_fn(item);
276 PyErr_Format(PyExc_TypeError,
277 "'%.200s' object does not support item assignment",
289 const void* item = NULL;
301 const char* kind =
"";
302 switch (
self->kind) {
307 kind =
"mapping by name";
310 kind =
"mapping by camelCase name";
313 kind =
"mapping by number";
316 return PyUnicode_FromFormat(
"<%s %s>",
self->container_def->mapping_name,
330 if (
self->descriptor == other_container->descriptor &&
331 self->container_def == other_container->container_def &&
332 self->kind == other_container->kind) {
340 if (PyList_Check(other)) {
343 if (
size != PyList_Size(other)) {
348 if (value1 == NULL) {
351 PyObject* value2 = PyList_GetItem(other,
index);
352 if (value2 == NULL) {
355 int cmp = PyObject_RichCompareBool(value1.
get(), value2, Py_EQ);
374 if (
self->descriptor == other_container->descriptor &&
375 self->container_def == other_container->container_def &&
376 self->kind == other_container->kind) {
384 if (PyDict_Check(other)) {
387 if (
size != PyDict_Size(other)) {
396 if (value1 == NULL) {
399 PyObject* value2 = PyDict_GetItem(other,
key.get());
400 if (value2 == NULL) {
404 int cmp = PyObject_RichCompareBool(value1.
get(), value2, Py_EQ);
417 if (opid != Py_EQ && opid != Py_NE) {
418 Py_INCREF(Py_NotImplemented);
419 return Py_NotImplemented;
432 if (
result ^ (opid == Py_NE)) {
452 PyObject* default_value = Py_None;
453 if (!PyArg_UnpackTuple(
args,
"get", 1, 2, &
key, &default_value)) {
462 Py_INCREF(default_value);
463 return default_value;
465 return self->container_def->new_object_from_item_fn(item);
515 PyTuple_SET_ITEM(
obj.get(), 0,
key);
520 PyTuple_SET_ITEM(
obj.get(), 1,
value);
543 {
"get", (PyCFunction)
Get, METH_VARARGS, },
544 {
"keys", (PyCFunction)
Keys, METH_NOARGS, },
545 {
"values", (PyCFunction)
Values, METH_NOARGS, },
546 {
"items", (PyCFunction)
Items, METH_NOARGS, },
547 {
"iterkeys", (PyCFunction)
IterKeys, METH_NOARGS, },
548 {
"itervalues", (PyCFunction)
IterValues, METH_NOARGS, },
549 {
"iteritems", (PyCFunction)
IterItems, METH_NOARGS, },
601 if (index < 0 || index >=
Length(
self)) {
602 PyErr_SetString(PyExc_IndexError,
"index out of range");
610 if (PyIndex_Check(item)) {
612 index = PyNumber_AsSsize_t(item, PyExc_IndexError);
613 if (
index == -1 && PyErr_Occurred())
619 reinterpret_cast<PyObject*
>(&PyList_Type),
self, NULL));
623 return Py_TYPE(list.
get())->tp_as_mapping->mp_subscript(list.
get(), item);
636 if (descriptor_ptr == NULL) {
641 if (
self->container_def->get_item_index_fn) {
642 int index =
self->container_def->get_item_index_fn(descriptor_ptr);
643 if (index < 0 || index >=
Length(
self)) {
647 if (
self->container_def->get_by_index_fn(
self,
index) != descriptor_ptr) {
657 if (
self->container_def->get_by_index_fn(
self,
index) == descriptor_ptr) {
671 PyErr_SetNone(PyExc_ValueError);
692 return PyLong_FromLong(0);
694 return PyLong_FromLong(1);
702 PyErr_Format(PyExc_TypeError,
703 "'%.200s' object is not a mutable sequence",
714 {
"index", (PyCFunction)
Index, METH_O, },
715 {
"count", (PyCFunction)
Count, METH_O, },
716 {
"append", (PyCFunction)
Append, METH_O, },
717 {
"__reversed__", (PyCFunction)
Reversed, METH_NOARGS, },
740 "DescriptorSequence",
787 self->container_def = container_def;
789 return reinterpret_cast<PyObject*
>(
self);
799 self->container_def = container_def;
801 return reinterpret_cast<PyObject*
>(
self);
806 if (container_def->get_by_number_fn == NULL ||
807 container_def->get_item_number_fn == NULL) {
808 PyErr_SetNone(PyExc_NotImplementedError);
816 self->container_def = container_def;
818 return reinterpret_cast<PyObject*
>(
self);
828 self->container_def = container_def;
830 return reinterpret_cast<PyObject*
>(
self);
836 Py_CLEAR(
self->container);
837 Py_TYPE(
self)->tp_free(
reinterpret_cast<PyObject*
>(
self));
841 int count =
self->container->container_def->count_fn(
self->container);
846 int index =
self->index;
848 switch (
self->kind) {
857 PyObject*
obj = PyTuple_New(2);
866 PyTuple_SET_ITEM(
obj, 0,
key);
876 PyErr_SetNone(PyExc_NotImplementedError);
883 "DescriptorContainerIterator",
935 return reinterpret_cast<PyObject*
>(
self);
942 namespace message_descriptor {
1028 namespace nested_types {
1057 "MessageNestedTypes",
1109 "MessageNestedEnums",
1132 namespace enumvalues {
1159 int enum_type_count =
GetDescriptor(
self)->enum_type_count();
1160 for (
int i = 0;
i < enum_type_count; ++
i) {
1162 int enum_value_count =
enum_type->value_count();
1163 if (
index < enum_value_count) {
1167 index -= enum_value_count;
1184 "MessageEnumValues",
1232 "MessageExtensions",
1317 namespace enumvalues {
1384 namespace oneof_descriptor {
1434 namespace service_descriptor {
1496 namespace file_descriptor {
1504 namespace messages {
1696 namespace dependencies {
1732 namespace public_dependencies {
1749 "FilePublicDependencies",
static PyObject * NewObjectFromItem(const void *item)
PyObject * NewMessageExtensionsSeq(ParentDescriptor descriptor)
static PyObject * NewMappingByNumber(DescriptorContainerDef *container_def, const void *descriptor)
static const string & GetItemName(const void *item)
PyObject * NewFileDependencies(const FileDescriptor *descriptor)
PyObject * NewMessageOneofsSeq(ParentDescriptor descriptor)
const typedef ServiceDescriptor * ItemDescriptor
const typedef FieldDescriptor * ItemDescriptor
OPENSSL_EXPORT const ASN1_OBJECT * obj
static const string & GetItemCamelcaseName(const void *item)
static DescriptorContainerDef ContainerDef
static const void * GetByName(PyContainer *self, const string &name)
const typedef Descriptor * ItemDescriptor
int Find(PyContainer *self, PyObject *item)
static PyObject * GetItem(PyContainer *self, Py_ssize_t index)
static const void * GetByName(PyContainer *self, const string &name)
const Descriptor::ReservedRange value
static int SeqContains(PyContainer *self, PyObject *item)
static DescriptorContainerDef ContainerDef
PyObject * NewFileMessageTypesByName(ParentDescriptor descriptor)
const typedef OneofDescriptor * ItemDescriptor
const PyObject_HEAD void * descriptor
@ KIND_ITERVALUE_REVERSED
static PyObject * SeqSubscript(PyContainer *self, PyObject *item)
static int Count(PyContainer *self)
const typedef FileDescriptor * ItemDescriptor
static const void * GetByName(PyContainer *self, const string &name)
GetItemNameMethod get_item_name_fn
GetItemIndexMethod get_item_index_fn
static PyObject * Iterator_Next(PyContainerIterator *self)
static int GetItemIndex(const void *item)
static int GetItemIndex(const void *item)
static int GetItemIndex(const void *item)
PyObject * PyServiceDescriptor_FromDescriptor(const ServiceDescriptor *service_descriptor)
PyObject * NewOneofFieldsSeq(ParentDescriptor descriptor)
static int GetItemIndex(const void *item)
const typedef void *(* GetByNumberMethod)(PyContainer *self, int index)
const typedef OneofDescriptor * ParentDescriptor
PyObject * NewFileEnumTypesByName(ParentDescriptor descriptor)
static int GetItemIndex(const void *item)
static const void * GetByIndex(PyContainer *self, int index)
PyObject * NewFilePublicDependencies(const FileDescriptor *descriptor)
#define PyString_AsStringAndSize(ob, charpp, sizep)
static int GetItemIndex(const void *item)
PyObject * NewServiceMethodsByName(ParentDescriptor descriptor)
PyObjectStruct * get() const
static PyObject * Iter(PyContainer *self)
static PyObject * Reversed(PyContainer *self, PyObject *args)
PyObject * PyMethodDescriptor_FromDescriptor(const MethodDescriptor *method_descriptor)
static PyObject * Get(PyContainer *self, PyObject *args)
PyObject * NewMessageNestedTypesSeq(ParentDescriptor descriptor)
static PyObject * IterValues(PyContainer *self, PyObject *args)
static const void * GetByIndex(PyContainer *self, int index)
GetItemCamelcaseNameMethod get_item_camelcase_name_fn
PyObject * PyEnumValueDescriptor_FromDescriptor(const EnumValueDescriptor *enumvalue_descriptor)
static PyObject * NewContainerIterator(PyContainer *mapping, PyContainerIterator::IterKind kind)
PyObject * NewEnumValuesByNumber(ParentDescriptor descriptor)
PyObject * NewMessageExtensionsByName(ParentDescriptor descriptor)
static const string & GetItemName(const void *item)
NewObjectFromItemMethod new_object_from_item_fn
static int GetItemNumber(const void *item)
static const void * GetByCamelcaseName(PyContainer *self, const string &name)
static const void * GetByName(PyContainer *self, const string &name)
PyObject * NewMessageEnumsByName(ParentDescriptor descriptor)
PyObject * NewMessageNestedTypesByName(ParentDescriptor descriptor)
static PySequenceMethods MappingSequenceMethods
static void Iterator_Dealloc(PyContainerIterator *self)
static int Count(PyContainer *self)
static const string & GetItemName(const void *item)
const typedef FileDescriptor * ParentDescriptor
static const void * GetByIndex(PyContainer *self, int index)
GetItemNumberMethod get_item_number_fn
static int GetItemIndex(const void *item)
static const void * GetByIndex(PyContainer *self, int index)
static const void * GetByIndex(PyContainer *self, int index)
static const string & GetItemName(const void *item)
static const string & GetItemName(const void *item)
static PyObject * NewObjectFromItem(const void *item)
static DescriptorContainerDef ContainerDef
static const string & GetItemName(const void *item)
PyObjectStruct * release()
static int Count(PyContainer *self)
PyObject * PyEnumDescriptor_FromDescriptor(const EnumDescriptor *enum_descriptor)
PyObject * PyFieldDescriptor_FromDescriptor(const FieldDescriptor *field_descriptor)
static DescriptorContainerDef ContainerDef
GetByNumberMethod get_by_number_fn
static int GetItemNumber(const void *item)
PyObject * PyMessageDescriptor_FromDescriptor(const Descriptor *message_descriptor)
const typedef void *(* GetByIndexMethod)(PyContainer *self, int index)
static PyObject * IterKeys(PyContainer *self, PyObject *args)
static const string & GetItemName(const void *item)
const typedef EnumDescriptor * ItemDescriptor
static int GetItemIndex(const void *item)
static int AssSubscript(PyContainer *self, PyObject *key, PyObject *value)
int(* GetItemIndexMethod)(const void *descriptor)
enum google::protobuf::python::PyContainerIterator::IterKind kind
static DescriptorContainerDef ContainerDef
static PyMappingMethods SeqMappingMethods
static const string & GetItemName(const void *item)
const std::string & ConstStringParam
bool InitDescriptorMappingTypes()
PyObject * NewMessageFieldsByNumber(ParentDescriptor descriptor)
static PyObject * NewObjectFromItem(const void *item)
static PyObject * NewObjectFromItem(const void *item)
PyTypeObject DescriptorSequence_Type
static const string & GetItemName(const void *item)
static PyObject * Append(PyContainer *self, PyObject *args)
static DescriptorContainerDef ContainerDef
int(* GetItemNumberMethod)(const void *descriptor)
static DescriptorContainerDef ContainerDef
PyObject *(* NewObjectFromItemMethod)(const void *descriptor)
static const void * GetByName(PyContainer *self, const string &name)
static PyObject * NewMappingByName(DescriptorContainerDef *container_def, const void *descriptor)
static const string & GetItemName(const void *item)
static int Count(PyContainer *self)
static DescriptorContainerDef ContainerDef
static const void * GetByIndex(PyContainer *self, int index)
static DescriptorContainerDef ContainerDef
static PyObject * Keys(PyContainer *self, PyObject *args)
static PyMethodDef MappingMethods[]
static Py_ssize_t Length(PyContainer *self)
static PyObject * NewObjectFromItem(const void *item)
static PyObject * ContainerRepr(PyContainer *self)
static DescriptorContainerDef ContainerDef
static int Count(PyContainer *self)
static const void * GetByName(PyContainer *self, const string &name)
static const void * GetByIndex(PyContainer *self, int index)
static int DescriptorMapping_Equal(PyContainer *self, PyObject *other)
static const void * GetByName(PyContainer *self, const string &name)
const typedef EnumDescriptor * ParentDescriptor
static int Count(PyContainer *self)
static const void * GetByIndex(PyContainer *self, int index)
static int GetItemIndex(const void *item)
GetByNameMethod get_by_name_fn
PyObject * NewEnumValuesByName(ParentDescriptor descriptor)
const typedef EnumValueDescriptor * ItemDescriptor
static const void * GetByName(PyContainer *self, const string &name)
static const void * GetByName(PyContainer *self, const string &name)
static ParentDescriptor GetDescriptor(PyContainer *self)
static const string & GetItemName(const void *item)
static ParentDescriptor GetDescriptor(PyContainer *self)
const typedef EnumDescriptor * ItemDescriptor
static const void * GetByIndex(PyContainer *self, int index)
static const void * GetByIndex(PyContainer *self, int index)
static PyObject * Items(PyContainer *self, PyObject *args)
const typedef Descriptor * ItemDescriptor
GetByIndexMethod get_by_index_fn
static PyObject * NewObjectFromItem(const void *item)
static const void * GetByIndex(PyContainer *self, int index)
static int Count(PyContainer *self)
static const void * GetByIndex(PyContainer *self, int index)
PyObject * NewMessageFieldsByName(ParentDescriptor descriptor)
PyObject * NewMessageFieldsSeq(ParentDescriptor descriptor)
static DescriptorContainerDef ContainerDef
const char * mapping_name
PyObject * PyFileDescriptor_FromDescriptor(const FileDescriptor *file_descriptor)
static PyTypeObject ContainerIterator_Type
const typedef EnumValueDescriptor * ItemDescriptor
static PyObject * NewObjectFromItem(const void *item)
static const void * GetByNumber(PyContainer *self, int number)
const typedef void *(* GetByNameMethod)(PyContainer *self, const string &name)
static int Count(PyContainer *self)
static DescriptorContainerDef ContainerDef
static PyObject * NewObjectFromItem(const void *item)
static int Count(PyContainer *self)
const typedef FieldDescriptor * ItemDescriptor
const typedef FieldDescriptor * ItemDescriptor
static PyObject * NewMappingByCamelcaseName(DescriptorContainerDef *container_def, const void *descriptor)
static const void * GetByName(PyContainer *self, const string &name)
static DescriptorContainerDef ContainerDef
GetByCamelcaseNameMethod get_by_camelcase_name_fn
static const void * GetByName(PyContainer *self, const string &name)
static PyObject * RichCompare(PyContainer *self, PyObject *other, int opid)
PyObject * PyOneofDescriptor_FromDescriptor(const OneofDescriptor *oneof_descriptor)
const typedef string &(* GetItemCamelcaseNameMethod)(const void *descriptor)
const void * PyDescriptor_AsVoidPtr(PyObject *obj)
static DescriptorContainerDef ContainerDef
static PyObject * NewObjectFromItem(const void *item)
static PyObject * NewObjectFromItem(const void *item)
static PyObject * _NewObj_ByIndex(PyContainer *self, Py_ssize_t index)
static int Contains(PyContainer *self, PyObject *key)
static bool _GetItemByKey(PyContainer *self, PyObject *key, const void **item)
static ParentDescriptor GetDescriptor(PyContainer *self)
bool _CalledFromGeneratedFile(int stacklevel)
enum google::protobuf::python::PyContainer::ContainerKind kind
PyTypeObject DescriptorMapping_Type
PyObject * NewFileExtensionsByName(ParentDescriptor descriptor)
static ParentDescriptor GetDescriptor(PyContainer *self)
static PyObject * Values(PyContainer *self, PyObject *args)
static PyObject * Subscript(PyContainer *self, PyObject *key)
static const string & GetItemName(const void *item)
static int Count(PyContainer *self)
PyObject * NewMessageOneofsByName(ParentDescriptor descriptor)
const DescriptorContainerDef * container_def
const typedef FieldDescriptor * ItemDescriptor
static const void * GetByNumber(PyContainer *self, int number)
static int Count(PyContainer *self)
const typedef string &(* GetItemNameMethod)(const void *descriptor)
static PyObject * NewObjectFromItem(const void *item)
static PyObject * NewObjectFromItem(const void *item)
const typedef FileDescriptor * ItemDescriptor
static PyMethodDef SeqMethods[]
#define PyVarObject_HEAD_INIT(type, size)
static int Count(PyContainer *self)
const typedef Descriptor * ParentDescriptor
static int GetItemIndex(const void *item)
static PySequenceMethods SeqSequenceMethods
const typedef void *(* GetByCamelcaseNameMethod)(PyContainer *self, const string &name)
static const void * GetByIndex(PyContainer *self, int index)
static int Count(PyContainer *self)
const typedef ServiceDescriptor * ParentDescriptor
static const void * GetByName(PyContainer *self, const string &name)
static PyObject * Index(PyContainer *self, PyObject *item)
PyObject * NewFileServicesByName(const FileDescriptor *descriptor)
static PyObject * NewSequence(DescriptorContainerDef *container_def, const void *descriptor)
PyObject * NewMessageEnumValuesByName(ParentDescriptor descriptor)
PHP_PROTO_OBJECT_FREE_END PHP_PROTO_OBJECT_DTOR_END intern self
PyObject * NewServiceMethodsSeq(ParentDescriptor descriptor)
PyObject * NewMessageFieldsByCamelcaseName(ParentDescriptor descriptor)
VALUE enum_descriptor(VALUE self)
int(* CountMethod)(PyContainer *self)
static DescriptorContainerDef ContainerDef
static const void * GetByIndex(PyContainer *self, int index)
static PyObject * Count(PyContainer *self, PyObject *item)
static const char descriptor[1336]
static PyMappingMethods MappingMappingMethods
static int GetItemIndex(const void *item)
PyObject_HEAD PyContainer * container
GRPC_CUSTOM_SERVICEDESCRIPTOR ServiceDescriptor
static int Count(PyContainer *self)
static PyObject * NewObjectFromItem(const void *item)
PyObject * NewMessageEnumsSeq(ParentDescriptor descriptor)
static PyObject * IterItems(PyContainer *self, PyObject *args)
static int GetItemIndex(const void *item)
static int DescriptorSequence_Equal(PyContainer *self, PyObject *other)
static ParentDescriptor GetDescriptor(PyContainer *self)
static struct async_container * container
static const void * GetByIndex(PyContainer *self, int index)
static PyObject * _NewKey_ByIndex(PyContainer *self, Py_ssize_t index)
static PyObject * NewObjectFromItem(const void *item)
PyObject * NewEnumValuesSeq(ParentDescriptor descriptor)
static int Count(PyContainer *self)
static PyObject * NewObjectFromItem(const void *item)
const typedef MethodDescriptor * ItemDescriptor
grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:14