From a22e8bdfd92cd4f1bc3d60e91df6410c4efde6a0 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Thu, 29 Nov 2007 22:35:39 +0000 Subject: [PATCH] Added all PyTypeObjects to the appropriate header files. Before the patch a lot of internal types weren't available in the header files. The patch exposes the new iterators, views and some other types to all C modules. I've also renamed some of the types and tp_names. --- Include/bytesobject.h | 1 + Include/descrobject.h | 5 +++++ Include/dictobject.h | 13 +++++++++++++ Include/iterobject.h | 4 +++- Include/listobject.h | 3 +++ Include/rangeobject.h | 2 ++ Include/setobject.h | 1 + Include/stringobject.h | 1 + Include/tupleobject.h | 1 + Include/unicodeobject.h | 1 + Objects/descrobject.c | 12 ++++++------ Objects/dictobject.c | 18 ------------------ Objects/iterobject.c | 6 +++--- Objects/listobject.c | 16 ++++++++-------- Objects/rangeobject.c | 12 ++++++------ Objects/setobject.c | 2 +- Objects/tupleobject.c | 2 +- 17 files changed, 56 insertions(+), 44 deletions(-) diff --git a/Include/bytesobject.h b/Include/bytesobject.h index 4d9c53fe10e..e9c319c87ee 100644 --- a/Include/bytesobject.h +++ b/Include/bytesobject.h @@ -29,6 +29,7 @@ typedef struct { /* Type object */ PyAPI_DATA(PyTypeObject) PyBytes_Type; +PyAPI_DATA(PyTypeObject) PyBytesIter_Type; /* Type check macros */ #define PyBytes_Check(self) PyObject_TypeCheck(self, &PyBytes_Type) diff --git a/Include/descrobject.h b/Include/descrobject.h index a45a80132ca..badfa5b238a 100644 --- a/Include/descrobject.h +++ b/Include/descrobject.h @@ -67,7 +67,12 @@ typedef struct { void *d_wrapped; /* This can be any function pointer */ } PyWrapperDescrObject; +PyAPI_DATA(PyTypeObject) PyClassMethodDescr_Type; +PyAPI_DATA(PyTypeObject) PyGetSetDescr_Type; +PyAPI_DATA(PyTypeObject) PyMemberDescr_Type; +PyAPI_DATA(PyTypeObject) PyMethodDescr_Type; PyAPI_DATA(PyTypeObject) PyWrapperDescr_Type; +PyAPI_DATA(PyTypeObject) PyDictProxy_Type; PyAPI_FUNC(PyObject *) PyDescr_NewMethod(PyTypeObject *, PyMethodDef *); PyAPI_FUNC(PyObject *) PyDescr_NewClassMethod(PyTypeObject *, PyMethodDef *); diff --git a/Include/dictobject.h b/Include/dictobject.h index fec62958fe1..0d8a09bce13 100644 --- a/Include/dictobject.h +++ b/Include/dictobject.h @@ -89,10 +89,23 @@ struct _dictobject { }; PyAPI_DATA(PyTypeObject) PyDict_Type; +PyAPI_DATA(PyTypeObject) PyDictIterKey_Type; +PyAPI_DATA(PyTypeObject) PyDictIterValue_Type; +PyAPI_DATA(PyTypeObject) PyDictIterItem_Type; +PyAPI_DATA(PyTypeObject) PyDictKeys_Type; +PyAPI_DATA(PyTypeObject) PyDictItems_Type; +PyAPI_DATA(PyTypeObject) PyDictValues_Type; #define PyDict_Check(op) \ PyType_FastSubclass(Py_Type(op), Py_TPFLAGS_DICT_SUBCLASS) #define PyDict_CheckExact(op) (Py_Type(op) == &PyDict_Type) +#define PyDictKeys_Check(op) (Py_Type(op) == &PyDictKeys_Type) +#define PyDictItems_Check(op) (Py_Type(op) == &PyDictItems_Type) +#define PyDictValues_Check(op) (Py_Type(op) == &PyDictValues_Type) +/* This excludes Values, since they are not sets. */ +# define PyDictViewSet_Check(op) \ + (PyDictKeys_Check(op) || PyDictItems_Check(op)) + PyAPI_FUNC(PyObject *) PyDict_New(void); PyAPI_FUNC(PyObject *) PyDict_GetItem(PyObject *mp, PyObject *key); diff --git a/Include/iterobject.h b/Include/iterobject.h index 12853b41466..ba1b482fc71 100644 --- a/Include/iterobject.h +++ b/Include/iterobject.h @@ -6,12 +6,14 @@ extern "C" { #endif PyAPI_DATA(PyTypeObject) PySeqIter_Type; +PyAPI_DATA(PyTypeObject) PyCallIter_Type; +PyAPI_DATA(PyTypeObject) PyZipIter_Type; +PyAPI_DATA(PyTypeObject) PyCmpWrapper_Type; #define PySeqIter_Check(op) (Py_Type(op) == &PySeqIter_Type) PyAPI_FUNC(PyObject *) PySeqIter_New(PyObject *); -PyAPI_DATA(PyTypeObject) PyCallIter_Type; #define PyCallIter_Check(op) (Py_Type(op) == &PyCallIter_Type) diff --git a/Include/listobject.h b/Include/listobject.h index e8b192adff2..d39588934f8 100644 --- a/Include/listobject.h +++ b/Include/listobject.h @@ -39,6 +39,9 @@ typedef struct { } PyListObject; PyAPI_DATA(PyTypeObject) PyList_Type; +PyAPI_DATA(PyTypeObject) PyListIter_Type; +PyAPI_DATA(PyTypeObject) PyListRevIter_Type; +PyAPI_DATA(PyTypeObject) PySortWrapper_Type; #define PyList_Check(op) \ PyType_FastSubclass(Py_Type(op), Py_TPFLAGS_LIST_SUBCLASS) diff --git a/Include/rangeobject.h b/Include/rangeobject.h index 24038070816..2746454e84b 100644 --- a/Include/rangeobject.h +++ b/Include/rangeobject.h @@ -16,6 +16,8 @@ they are represented by a start, stop, and step datamembers. */ PyAPI_DATA(PyTypeObject) PyRange_Type; +PyAPI_DATA(PyTypeObject) PyRangeIter_Type; +PyAPI_DATA(PyTypeObject) PyLongRangeIter_Type; #define PyRange_Check(op) (Py_Type(op) == &PyRange_Type) diff --git a/Include/setobject.h b/Include/setobject.h index 891474959e5..5b97fcba8df 100644 --- a/Include/setobject.h +++ b/Include/setobject.h @@ -58,6 +58,7 @@ struct _setobject { PyAPI_DATA(PyTypeObject) PySet_Type; PyAPI_DATA(PyTypeObject) PyFrozenSet_Type; +PyAPI_DATA(PyTypeObject) PySetIter_Type; /* Invariants for frozensets: * data is immutable. diff --git a/Include/stringobject.h b/Include/stringobject.h index 8241f1e52dd..184bcdd3342 100644 --- a/Include/stringobject.h +++ b/Include/stringobject.h @@ -40,6 +40,7 @@ typedef struct { } PyStringObject; PyAPI_DATA(PyTypeObject) PyString_Type; +PyAPI_DATA(PyTypeObject) PyStringIter_Type; #define PyString_Check(op) \ PyType_FastSubclass(Py_Type(op), Py_TPFLAGS_STRING_SUBCLASS) diff --git a/Include/tupleobject.h b/Include/tupleobject.h index 423103a2777..7e9cdb5ca6b 100644 --- a/Include/tupleobject.h +++ b/Include/tupleobject.h @@ -32,6 +32,7 @@ typedef struct { } PyTupleObject; PyAPI_DATA(PyTypeObject) PyTuple_Type; +PyAPI_DATA(PyTypeObject) PyTupleIter_Type; #define PyTuple_Check(op) \ PyType_FastSubclass(Py_Type(op), Py_TPFLAGS_TUPLE_SUBCLASS) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index f3c37fe63b6..4e94f7698be 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -417,6 +417,7 @@ typedef struct { } PyUnicodeObject; PyAPI_DATA(PyTypeObject) PyUnicode_Type; +PyAPI_DATA(PyTypeObject) PyUnicodeIter_Type; #define SSTATE_NOT_INTERNED 0 #define SSTATE_INTERNED_MORTAL 1 diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 294c7b31648..c4d55e48db7 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -383,7 +383,7 @@ descr_traverse(PyObject *self, visitproc visit, void *arg) return 0; } -static PyTypeObject PyMethodDescr_Type = { +PyTypeObject PyMethodDescr_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "method_descriptor", sizeof(PyMethodDescrObject), @@ -421,7 +421,7 @@ static PyTypeObject PyMethodDescr_Type = { }; /* This is for METH_CLASS in C, not for "f = classmethod(f)" in Python! */ -static PyTypeObject PyClassMethodDescr_Type = { +PyTypeObject PyClassMethodDescr_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "classmethod_descriptor", sizeof(PyMethodDescrObject), @@ -458,7 +458,7 @@ static PyTypeObject PyClassMethodDescr_Type = { 0, /* tp_descr_set */ }; -static PyTypeObject PyMemberDescr_Type = { +PyTypeObject PyMemberDescr_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "member_descriptor", sizeof(PyMemberDescrObject), @@ -495,7 +495,7 @@ static PyTypeObject PyMemberDescr_Type = { (descrsetfunc)member_set, /* tp_descr_set */ }; -static PyTypeObject PyGetSetDescr_Type = { +PyTypeObject PyGetSetDescr_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "getset_descriptor", sizeof(PyGetSetDescrObject), @@ -786,7 +786,7 @@ proxy_richcompare(proxyobject *v, PyObject *w, int op) return PyObject_RichCompare(v->dict, w, op); } -static PyTypeObject proxytype = { +PyTypeObject PyDictProxy_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "dictproxy", /* tp_name */ sizeof(proxyobject), /* tp_basicsize */ @@ -829,7 +829,7 @@ PyDictProxy_New(PyObject *dict) { proxyobject *pp; - pp = PyObject_GC_New(proxyobject, &proxytype); + pp = PyObject_GC_New(proxyobject, &PyDictProxy_Type); if (pp != NULL) { Py_INCREF(dict); pp->dict = dict; diff --git a/Objects/dictobject.c b/Objects/dictobject.c index d1ebf1fe19a..dad98552e05 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1798,13 +1798,8 @@ dict_tp_clear(PyObject *op) return 0; } - -extern PyTypeObject PyDictIterKey_Type; /* Forward */ -extern PyTypeObject PyDictIterValue_Type; /* Forward */ -extern PyTypeObject PyDictIterItem_Type; /* Forward */ static PyObject *dictiter_new(PyDictObject *, PyTypeObject *); - PyDoc_STRVAR(contains__doc__, "D.__contains__(k) -> True if D has a key k, else False"); @@ -2401,19 +2396,6 @@ dictview_new(PyObject *dict, PyTypeObject *type) - if public then they should probably be in builtins */ -/* Forward */ -PyTypeObject PyDictKeys_Type; -PyTypeObject PyDictItems_Type; -PyTypeObject PyDictValues_Type; - -#define PyDictKeys_Check(obj) ((obj)->ob_type == &PyDictKeys_Type) -#define PyDictItems_Check(obj) ((obj)->ob_type == &PyDictItems_Type) -#define PyDictValues_Check(obj) ((obj)->ob_type == &PyDictValues_Type) - -/* This excludes Values, since they are not sets. */ -# define PyDictViewSet_Check(obj) \ - (PyDictKeys_Check(obj) || PyDictItems_Check(obj)) - /* Return 1 if self is a subset of other, iterating over self; 0 if not; -1 if an error occurred. */ static int diff --git a/Objects/iterobject.c b/Objects/iterobject.c index ce9c661c4cd..12b603a826d 100644 --- a/Objects/iterobject.c +++ b/Objects/iterobject.c @@ -199,7 +199,7 @@ calliter_iternext(calliterobject *it) PyTypeObject PyCallIter_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "callable-iterator", /* tp_name */ + "callable_iterator", /* tp_name */ sizeof(calliterobject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ @@ -240,7 +240,7 @@ typedef struct zipiterobject_t { PyTupleObject *result; /* Reusable tuple for optimization */ } zipiterobject; -static PyTypeObject PyZipIter_Type; /* Forward */ + /* Forward */ PyObject * _PyZip_CreateIter(PyObject* args) @@ -367,7 +367,7 @@ zipiter_next(zipiterobject *zit) return result; } -static PyTypeObject PyZipIter_Type = { +PyTypeObject PyZipIter_Type = { PyVarObject_HEAD_INIT(0, 0) "zip_iterator", /* tp_name */ sizeof(zipiterobject), /* tp_basicsize */ diff --git a/Objects/listobject.c b/Objects/listobject.c index 1d82e354104..ea10abf4cf0 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -1790,7 +1790,7 @@ sortwrapper_richcompare(sortwrapperobject *, sortwrapperobject *, int); static void sortwrapper_dealloc(sortwrapperobject *); -static PyTypeObject sortwrapper_type = { +PyTypeObject PySortWrapper_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "sortwrapper", /* tp_name */ sizeof(sortwrapperobject), /* tp_basicsize */ @@ -1822,7 +1822,7 @@ static PyTypeObject sortwrapper_type = { static PyObject * sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op) { - if (!PyObject_TypeCheck(b, &sortwrapper_type)) { + if (!PyObject_TypeCheck(b, &PySortWrapper_Type)) { PyErr_SetString(PyExc_TypeError, "expected a sortwrapperobject"); return NULL; @@ -1846,7 +1846,7 @@ build_sortwrapper(PyObject *key, PyObject *value) { sortwrapperobject *so; - so = PyObject_New(sortwrapperobject, &sortwrapper_type); + so = PyObject_New(sortwrapperobject, &PySortWrapper_Type); if (so == NULL) return NULL; so->key = key; @@ -1860,7 +1860,7 @@ sortwrapper_getvalue(PyObject *so) { PyObject *value; - if (!PyObject_TypeCheck(so, &sortwrapper_type)) { + if (!PyObject_TypeCheck(so, &PySortWrapper_Type)) { PyErr_SetString(PyExc_TypeError, "expected a sortwrapperobject"); return NULL; @@ -1893,8 +1893,8 @@ cmpwrapper_call(cmpwrapperobject *co, PyObject *args, PyObject *kwds) if (!PyArg_UnpackTuple(args, "", 2, 2, &x, &y)) return NULL; - if (!PyObject_TypeCheck(x, &sortwrapper_type) || - !PyObject_TypeCheck(y, &sortwrapper_type)) { + if (!PyObject_TypeCheck(x, &PySortWrapper_Type) || + !PyObject_TypeCheck(y, &PySortWrapper_Type)) { PyErr_SetString(PyExc_TypeError, "expected a sortwrapperobject"); return NULL; @@ -1906,7 +1906,7 @@ cmpwrapper_call(cmpwrapperobject *co, PyObject *args, PyObject *kwds) PyDoc_STRVAR(cmpwrapper_doc, "cmp() wrapper for sort with custom keys."); -static PyTypeObject cmpwrapper_type = { +PyTypeObject PyCmpWrapper_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "cmpwrapper", /* tp_name */ sizeof(cmpwrapperobject), /* tp_basicsize */ @@ -1936,7 +1936,7 @@ build_cmpwrapper(PyObject *cmpfunc) { cmpwrapperobject *co; - co = PyObject_New(cmpwrapperobject, &cmpwrapper_type); + co = PyObject_New(cmpwrapperobject, &PyCmpWrapper_Type); if (co == NULL) return NULL; Py_INCREF(cmpfunc); diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index d1c959a1bf5..0b7be4355bb 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -367,7 +367,7 @@ static PyMethodDef rangeiter_methods[] = { {NULL, NULL} /* sentinel */ }; -PyTypeObject Pyrangeiter_Type = { +PyTypeObject PyRangeIter_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "range_iterator", /* tp_name */ sizeof(rangeiterobject), /* tp_basicsize */ @@ -441,7 +441,7 @@ get_len_of_range(long lo, long hi, long step) static PyObject * int_range_iter(long start, long stop, long step) { - rangeiterobject *it = PyObject_New(rangeiterobject, &Pyrangeiter_Type); + rangeiterobject *it = PyObject_New(rangeiterobject, &PyRangeIter_Type); if (it == NULL) return NULL; it->start = start; @@ -519,9 +519,9 @@ longrangeiter_next(longrangeiterobject *r) return result; } -static PyTypeObject Pylongrangeiter_Type = { +PyTypeObject PyLongRangeIter_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "rangeiterator", /* tp_name */ + "longrange_iterator", /* tp_name */ sizeof(longrangeiterobject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ @@ -567,7 +567,7 @@ range_iter(PyObject *seq) PyLong_AsLong(r->stop), PyLong_AsLong(r->step)); - it = PyObject_New(longrangeiterobject, &Pylongrangeiter_Type); + it = PyObject_New(longrangeiterobject, &PyLongRangeIter_Type); if (it == NULL) return NULL; @@ -627,7 +627,7 @@ range_reverse(PyObject *seq) return int_range_iter(new_start, new_stop, -step); } - it = PyObject_New(longrangeiterobject, &Pylongrangeiter_Type); + it = PyObject_New(longrangeiterobject, &PyLongRangeIter_Type); if (it == NULL) return NULL; diff --git a/Objects/setobject.c b/Objects/setobject.c index e4e7780e8de..11ca407cc1c 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -849,7 +849,7 @@ fail: return NULL; } -static PyTypeObject PySetIter_Type = { +PyTypeObject PySetIter_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "set_iterator", /* tp_name */ sizeof(setiterobject), /* tp_basicsize */ diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index c22785ddee3..fcfd09d58e5 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -840,7 +840,7 @@ static PyMethodDef tupleiter_methods[] = { PyTypeObject PyTupleIter_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "tupleiterator", /* tp_name */ + "tuple_iterator", /* tp_name */ sizeof(tupleiterobject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */