New submission from Christian Heimes:
A while ago I've experimented with the pyvm module and a semi
auto-generated types list. The patch adds a script that reads
Include/*.h and adds all available PyTypeObjects to Modules/_typesmodule.c.
The patch or script may be useful in the future.
----------
components: Interpreter Core
files: py3k_autogen_types.patch
keywords: patch, py3k
messages: 58511
nosy: tiran
priority: low
severity: normal
status: open
title: Semi autogenerated _types module
type: rfe
versions: Python 2.6, Python 3.0
Added file: http://bugs.python.org/file8934/py3k_autogen_types.patch
__________________________________
Tracker <[EMAIL PROTECTED]>
<http://bugs.python.org/issue1605>
__________________________________
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);
}
-
-
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com