Index: Tools/scripts/update_types.py =================================================================== --- Tools/scripts/update_types.py (Revision 0) +++ Tools/scripts/update_types.py (Revision 0) @@ -0,0 +1,62 @@ +"""Script to update the list of types for _types from Include/*.h +""" + +import os +import glob +import sys +import re + +BASE = '' +RE_PYTYPE = re.compile("PyAPI_DATA\(PyTypeObject\) (Py[A-Za-z_]*)") +HEADERS = os.path.join(BASE, "Include", "*.h") +CFILE = os.path.join(BASE, "Modules", "_typesmodule.c") +TEMPLATE = "\t\t&%s,\n" +IGNORE = {"PySTEntry_Type"} + +def find_pytype(fp): + types = set() + for line in fp: + match = RE_PYTYPE.match(line) + if match: + name = match.group(1) + if name not in IGNORE: + types.add(match.group(1)) + return types + +def read_headerfiles(): + types = set() + files = glob.glob(HEADERS) + for file in files: + with open(file) as fp: + types.update(find_pytype(fp)) + return types + +def modify(): + start = [] + middle = [] + end = [] + cur = start + + with open(CFILE) as fp: + for line in fp: + if line.startswith("/*** START"): + cur.append(line) + cur = middle + continue + if line.startswith("/*** END"): + cur = end + cur.append(line) + + types = read_headerfiles() + middle = [] + for t in sorted(types): + middle.append(TEMPLATE % t) + + with open(CFILE, 'w') as fp: + fp.write(''.join(start)) + fp.write(''.join(middle)) + fp.write(''.join(end)) + +if __name__ == "__main__": + modify() + Eigenschaftsänderungen: Tools/scripts/update_types.py ___________________________________________________________________ Name: svn:keywords + 'Id Revision' Name: svn:eol-style + native Index: Lib/types.py =================================================================== --- Lib/types.py (Revision 59478) +++ Lib/types.py (Arbeitskopie) @@ -43,8 +43,8 @@ except ImportError: pass else: - GetSetDescriptorType = type(_types.Helper.getter) - MemberDescriptorType = type(_types.Helper.member) + GetSetDescriptorType = _types.getset_descriptor + MemberDescriptorType = _types.member_descriptor del _types del sys, _f, _g, _C, # Not for export Index: Modules/_typesmodule.c =================================================================== --- Modules/_typesmodule.c (Revision 59478) +++ Modules/_typesmodule.c (Arbeitskopie) @@ -5,89 +5,97 @@ #include "Python.h" #include "structmember.h" +#include "frameobject.h" -typedef struct -{ - PyObject_HEAD - int member; -} Helper; - -static PyMemberDef helper_members[] = { - { "member", T_INT, offsetof(Helper, member), READONLY, - PyDoc_STR("A member descriptor") - }, - { NULL } -}; - -static PyObject * -helper_getter(Helper *self, void *unused) -{ - Py_RETURN_NONE; -} - -static PyGetSetDef helper_getset[] = { - { "getter", (getter)helper_getter, NULL, - PyDoc_STR("A getset descriptor"), - }, - { NULL } -}; - -static PyTypeObject HelperType = { - PyVarObject_HEAD_INIT(NULL, 0) - "_types.Helper", /* tp_name */ - sizeof(Helper), /* tp_basicsize */ - 0, /* tp_itemsize */ - 0, /* 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 */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - helper_members, /* tp_members */ - helper_getset, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0, /* tp_free */ -}; - PyMODINIT_FUNC init_types(void) { - PyObject *m; + PyObject *mod; + char *name; + int i; + PyTypeObject *ti; + PyTypeObject *typelist[] = { +/*** START of autogenerated code ***/ + &PyBaseObject_Type, + &PyBool_Type, + &PyBytesIter_Type, + &PyBytes_Type, + &PyCFunction_Type, + &PyCObject_Type, + &PyCallIter_Type, + &PyCell_Type, + &PyClassMethodDescr_Type, + &PyClassMethod_Type, + &PyCmpWrapper_Type, + &PyCode_Type, + &PyComplex_Type, + &PyDictItems_Type, + &PyDictIterItem_Type, + &PyDictIterKey_Type, + &PyDictIterValue_Type, + &PyDictKeys_Type, + &PyDictProxy_Type, + &PyDictValues_Type, + &PyDict_Type, + &PyEnum_Type, + &PyFloat_Type, + &PyFrame_Type, + &PyFrozenSet_Type, + &PyFunction_Type, + &PyGen_Type, + &PyGetSetDescr_Type, + &PyInstanceMethod_Type, + &PyListIter_Type, + &PyListRevIter_Type, + &PyList_Type, + &PyLongRangeIter_Type, + &PyLong_Type, + &PyMemberDescr_Type, + &PyMemoryView_Type, + &PyMethodDescr_Type, + &PyMethod_Type, + &PyModule_Type, + &PyNullImporter_Type, + &PyProperty_Type, + &PyRangeIter_Type, + &PyRange_Type, + &PyReversed_Type, + &PySeqIter_Type, + &PySetIter_Type, + &PySet_Type, + &PySlice_Type, + &PySortWrapper_Type, + &PyStaticMethod_Type, + &PyStdPrinter_Type, + &PyStringIter_Type, + &PyString_Type, + &PySuper_Type, + &PyTraceBack_Type, + &PyTupleIter_Type, + &PyTuple_Type, + &PyType_Type, + &PyUnicodeIter_Type, + &PyUnicode_Type, + &PyWrapperDescr_Type, + &PyZipIter_Type, +/*** END of autogenerated code ***/ + NULL + }; - m = Py_InitModule3("_types", NULL, "A types module helper"); - if (!m) - return; + mod = Py_InitModule3("_types", NULL, "A types module helper"); + if (!mod) + return; - if (PyType_Ready(&HelperType) < 0) - return; + for (i=0 ; (ti = typelist[i]) != NULL ; i++) { + name = (char*)ti->tp_name; + if (name) { + Py_INCREF(ti); + PyModule_AddObject(mod, name, (PyObject *)ti); + } + else { + fprintf(stderr, "Nameless type\n"); + fflush(stderr); + } + } - Py_INCREF(&HelperType); - PyModule_AddObject(m, "Helper", (PyObject *)&HelperType); } - -