aboutsummaryrefslogtreecommitdiff
path: root/third_party/upb/python/extension_dict.c
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/upb/python/extension_dict.c')
-rw-r--r--third_party/upb/python/extension_dict.c253
1 files changed, 0 insertions, 253 deletions
diff --git a/third_party/upb/python/extension_dict.c b/third_party/upb/python/extension_dict.c
deleted file mode 100644
index 48bb2de799..0000000000
--- a/third_party/upb/python/extension_dict.c
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Copyright (c) 2009-2021, Google LLC
- * All rights reserved.
- *
- * 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 LLC 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 Google LLC 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 "python/extension_dict.h"
-
-#include "python/message.h"
-#include "python/protobuf.h"
-#include "upb/reflection/def.h"
-
-// -----------------------------------------------------------------------------
-// ExtensionDict
-// -----------------------------------------------------------------------------
-
-typedef struct {
- PyObject_HEAD;
- PyObject* msg; // Owning ref to our parent pessage.
-} PyUpb_ExtensionDict;
-
-PyObject* PyUpb_ExtensionDict_New(PyObject* msg) {
- PyUpb_ModuleState* state = PyUpb_ModuleState_Get();
- PyUpb_ExtensionDict* ext_dict =
- (void*)PyType_GenericAlloc(state->extension_dict_type, 0);
- ext_dict->msg = msg;
- Py_INCREF(ext_dict->msg);
- return &ext_dict->ob_base;
-}
-
-static PyObject* PyUpb_ExtensionDict_FindExtensionByName(PyObject* _self,
- PyObject* key) {
- PyUpb_ExtensionDict* self = (PyUpb_ExtensionDict*)_self;
- const char* name = PyUpb_GetStrData(key);
- if (!name) {
- PyErr_Format(PyExc_TypeError, "_FindExtensionByName expect a str");
- return NULL;
- }
- const upb_MessageDef* m = PyUpb_Message_GetMsgdef(self->msg);
- const upb_FileDef* file = upb_MessageDef_File(m);
- const upb_DefPool* symtab = upb_FileDef_Pool(file);
- const upb_FieldDef* ext = upb_DefPool_FindExtensionByName(symtab, name);
- if (ext) {
- return PyUpb_FieldDescriptor_Get(ext);
- } else {
- Py_RETURN_NONE;
- }
-}
-
-static PyObject* PyUpb_ExtensionDict_FindExtensionByNumber(PyObject* _self,
- PyObject* arg) {
- PyUpb_ExtensionDict* self = (PyUpb_ExtensionDict*)_self;
- const upb_MessageDef* m = PyUpb_Message_GetMsgdef(self->msg);
- const upb_MiniTable* l = upb_MessageDef_MiniTable(m);
- const upb_FileDef* file = upb_MessageDef_File(m);
- const upb_DefPool* symtab = upb_FileDef_Pool(file);
- const upb_ExtensionRegistry* reg = upb_DefPool_ExtensionRegistry(symtab);
- int64_t number = PyLong_AsLong(arg);
- if (number == -1 && PyErr_Occurred()) return NULL;
- const upb_MiniTableExtension* ext =
- (upb_MiniTableExtension*)upb_ExtensionRegistry_Lookup(reg, l, number);
- if (ext) {
- const upb_FieldDef* f = upb_DefPool_FindExtensionByMiniTable(symtab, ext);
- return PyUpb_FieldDescriptor_Get(f);
- } else {
- Py_RETURN_NONE;
- }
-}
-
-static void PyUpb_ExtensionDict_Dealloc(PyUpb_ExtensionDict* self) {
- PyUpb_Message_ClearExtensionDict(self->msg);
- Py_DECREF(self->msg);
- PyUpb_Dealloc(self);
-}
-
-static PyObject* PyUpb_ExtensionDict_RichCompare(PyObject* _self,
- PyObject* _other, int opid) {
- // Only equality comparisons are implemented.
- if (opid != Py_EQ && opid != Py_NE) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
- PyUpb_ExtensionDict* self = (PyUpb_ExtensionDict*)_self;
- bool equals = false;
- if (PyObject_TypeCheck(_other, Py_TYPE(_self))) {
- PyUpb_ExtensionDict* other = (PyUpb_ExtensionDict*)_other;
- equals = self->msg == other->msg;
- }
- bool ret = opid == Py_EQ ? equals : !equals;
- return PyBool_FromLong(ret);
-}
-
-static int PyUpb_ExtensionDict_Contains(PyObject* _self, PyObject* key) {
- PyUpb_ExtensionDict* self = (PyUpb_ExtensionDict*)_self;
- const upb_FieldDef* f = PyUpb_Message_GetExtensionDef(self->msg, key);
- if (!f) return -1;
- upb_Message* msg = PyUpb_Message_GetIfReified(self->msg);
- if (!msg) return 0;
- if (upb_FieldDef_IsRepeated(f)) {
- upb_MessageValue val = upb_Message_GetFieldByDef(msg, f);
- return upb_Array_Size(val.array_val) > 0;
- } else {
- return upb_Message_HasFieldByDef(msg, f);
- }
-}
-
-static Py_ssize_t PyUpb_ExtensionDict_Length(PyObject* _self) {
- PyUpb_ExtensionDict* self = (PyUpb_ExtensionDict*)_self;
- upb_Message* msg = PyUpb_Message_GetIfReified(self->msg);
- return msg ? upb_Message_ExtensionCount(msg) : 0;
-}
-
-static PyObject* PyUpb_ExtensionDict_Subscript(PyObject* _self, PyObject* key) {
- PyUpb_ExtensionDict* self = (PyUpb_ExtensionDict*)_self;
- const upb_FieldDef* f = PyUpb_Message_GetExtensionDef(self->msg, key);
- if (!f) return NULL;
- return PyUpb_Message_GetFieldValue(self->msg, f);
-}
-
-static int PyUpb_ExtensionDict_AssignSubscript(PyObject* _self, PyObject* key,
- PyObject* val) {
- PyUpb_ExtensionDict* self = (PyUpb_ExtensionDict*)_self;
- const upb_FieldDef* f = PyUpb_Message_GetExtensionDef(self->msg, key);
- if (!f) return -1;
- if (val) {
- return PyUpb_Message_SetFieldValue(self->msg, f, val, PyExc_TypeError);
- } else {
- PyUpb_Message_DoClearField(self->msg, f);
- return 0;
- }
-}
-
-static PyObject* PyUpb_ExtensionIterator_New(PyObject* _ext_dict);
-
-static PyMethodDef PyUpb_ExtensionDict_Methods[] = {
- {"_FindExtensionByName", PyUpb_ExtensionDict_FindExtensionByName, METH_O,
- "Finds an extension by name."},
- {"_FindExtensionByNumber", PyUpb_ExtensionDict_FindExtensionByNumber,
- METH_O, "Finds an extension by number."},
- {NULL, NULL},
-};
-
-static PyType_Slot PyUpb_ExtensionDict_Slots[] = {
- {Py_tp_dealloc, PyUpb_ExtensionDict_Dealloc},
- {Py_tp_methods, PyUpb_ExtensionDict_Methods},
- //{Py_tp_getset, PyUpb_ExtensionDict_Getters},
- //{Py_tp_hash, PyObject_HashNotImplemented},
- {Py_tp_richcompare, PyUpb_ExtensionDict_RichCompare},
- {Py_tp_iter, PyUpb_ExtensionIterator_New},
- {Py_sq_contains, PyUpb_ExtensionDict_Contains},
- {Py_sq_length, PyUpb_ExtensionDict_Length},
- {Py_mp_length, PyUpb_ExtensionDict_Length},
- {Py_mp_subscript, PyUpb_ExtensionDict_Subscript},
- {Py_mp_ass_subscript, PyUpb_ExtensionDict_AssignSubscript},
- {0, NULL}};
-
-static PyType_Spec PyUpb_ExtensionDict_Spec = {
- PYUPB_MODULE_NAME ".ExtensionDict", // tp_name
- sizeof(PyUpb_ExtensionDict), // tp_basicsize
- 0, // tp_itemsize
- Py_TPFLAGS_DEFAULT, // tp_flags
- PyUpb_ExtensionDict_Slots,
-};
-
-// -----------------------------------------------------------------------------
-// ExtensionIterator
-// -----------------------------------------------------------------------------
-
-typedef struct {
- PyObject_HEAD;
- PyObject* msg;
- size_t iter;
-} PyUpb_ExtensionIterator;
-
-static PyObject* PyUpb_ExtensionIterator_New(PyObject* _ext_dict) {
- PyUpb_ExtensionDict* ext_dict = (PyUpb_ExtensionDict*)_ext_dict;
- PyUpb_ModuleState* state = PyUpb_ModuleState_Get();
- PyUpb_ExtensionIterator* iter =
- (void*)PyType_GenericAlloc(state->extension_iterator_type, 0);
- if (!iter) return NULL;
- iter->msg = ext_dict->msg;
- iter->iter = kUpb_Message_Begin;
- Py_INCREF(iter->msg);
- return &iter->ob_base;
-}
-
-static void PyUpb_ExtensionIterator_Dealloc(void* _self) {
- PyUpb_ExtensionIterator* self = (PyUpb_ExtensionIterator*)_self;
- Py_DECREF(self->msg);
- PyUpb_Dealloc(_self);
-}
-
-PyObject* PyUpb_ExtensionIterator_IterNext(PyObject* _self) {
- PyUpb_ExtensionIterator* self = (PyUpb_ExtensionIterator*)_self;
- upb_Message* msg = PyUpb_Message_GetIfReified(self->msg);
- if (!msg) return NULL;
- const upb_MessageDef* m = PyUpb_Message_GetMsgdef(self->msg);
- const upb_DefPool* symtab = upb_FileDef_Pool(upb_MessageDef_File(m));
- while (true) {
- const upb_FieldDef* f;
- upb_MessageValue val;
- if (!upb_Message_Next(msg, m, symtab, &f, &val, &self->iter)) return NULL;
- if (upb_FieldDef_IsExtension(f)) return PyUpb_FieldDescriptor_Get(f);
- }
-}
-
-static PyType_Slot PyUpb_ExtensionIterator_Slots[] = {
- {Py_tp_dealloc, PyUpb_ExtensionIterator_Dealloc},
- {Py_tp_iter, PyObject_SelfIter},
- {Py_tp_iternext, PyUpb_ExtensionIterator_IterNext},
- {0, NULL}};
-
-static PyType_Spec PyUpb_ExtensionIterator_Spec = {
- PYUPB_MODULE_NAME ".ExtensionIterator", // tp_name
- sizeof(PyUpb_ExtensionIterator), // tp_basicsize
- 0, // tp_itemsize
- Py_TPFLAGS_DEFAULT, // tp_flags
- PyUpb_ExtensionIterator_Slots,
-};
-
-// -----------------------------------------------------------------------------
-// Top Level
-// -----------------------------------------------------------------------------
-
-bool PyUpb_InitExtensionDict(PyObject* m) {
- PyUpb_ModuleState* s = PyUpb_ModuleState_GetFromModule(m);
-
- s->extension_dict_type = PyUpb_AddClass(m, &PyUpb_ExtensionDict_Spec);
- s->extension_iterator_type = PyUpb_AddClass(m, &PyUpb_ExtensionIterator_Spec);
-
- return s->extension_dict_type && s->extension_iterator_type;
-}