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

Reply via email to