Author: Ronan Lamy <[email protected]>
Branch: rffi-parser-2
Changeset: r89230:16dc5f310fe9
Date: 2016-12-26 15:45 +0100
http://bitbucket.org/pypy/pypy/changeset/16dc5f310fe9/

Log:    refactor .configure_types()

diff --git a/pypy/module/cpyext/__init__.py b/pypy/module/cpyext/__init__.py
--- a/pypy/module/cpyext/__init__.py
+++ b/pypy/module/cpyext/__init__.py
@@ -18,7 +18,7 @@
         method = pypy.module.cpyext.typeobject.get_new_method_def(space)
         w_obj = pypy.module.cpyext.methodobject.W_PyCFunctionObject(space, 
method, space.wrap(''))
         space.appexec([space.type(w_obj)], """(methodtype):
-            from pickle import Pickler 
+            from pickle import Pickler
             Pickler.dispatch[methodtype] = Pickler.save_global
         """)
 
diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py
--- a/pypy/module/cpyext/api.py
+++ b/pypy/module/cpyext/api.py
@@ -625,7 +625,6 @@
 
 typedef void (*freefunc)(void *);
 """)
-h.configure_types()
 
 Py_ssize_t = lltype.Typedef(h.definitions['Py_ssize_t'], 'Py_ssize_t')
 Py_ssize_tP = rffi.CArrayPtr(Py_ssize_t)
diff --git a/pypy/module/cpyext/cparser.py b/pypy/module/cpyext/cparser.py
--- a/pypy/module/cpyext/cparser.py
+++ b/pypy/module/cpyext/cparser.py
@@ -675,6 +675,15 @@
         except TypeError:
             return False
 
+    def config_fields(self):
+        result = []
+        for name, value in self.fields:
+            if isinstance(value, DelayedStruct):
+                result.append((name, value.TYPE))
+            else:
+                result.append((name, value))
+        return result
+
     def __repr__(self):
         return "<struct {struct_name}>".format(**vars(self))
 
@@ -704,7 +713,6 @@
         tp = self.convert_type(obj)
         if isinstance(tp, DelayedStruct):
             tp = self.realize_struct(tp, name)
-            self.structs[obj] = tp
         self.definitions[name] = tp
 
     def add_macro(self, name, value):
@@ -726,13 +734,22 @@
         configname = type_name.replace(' ', '__')
         if struct.is_ready():
             setattr(self._Config, configname,
-                rffi_platform.Struct(type_name, struct.fields))
+                rffi_platform.Struct(type_name, struct.config_fields()))
             self._TYPES[configname] = struct.TYPE
         else:
             cpython_struct(type_name, struct.fields, forward=struct.TYPE)
         return struct.TYPE
 
     def configure_types(self):
+        for name, (obj, quals) in self.ctx._declarations.iteritems():
+            if obj in self.ctx._included_declarations:
+                continue
+            if name.startswith('typedef '):
+                name = name[8:]
+                self.add_typedef(name, obj)
+            elif name.startswith('macro '):
+                name = name[6:]
+                self.add_macro(name, obj)
         for name, TYPE in rffi_platform.configure(self._Config).iteritems():
             if name in self._TYPES:
                 self._TYPES[name].become(TYPE)
@@ -774,13 +791,5 @@
         for header in includes:
             src.include(header)
     ctx.parse(source)
-    for name, (obj, quals) in ctx._declarations.iteritems():
-        if obj in ctx._included_declarations:
-            continue
-        if name.startswith('typedef '):
-            name = name[8:]
-            src.add_typedef(name, obj)
-        elif name.startswith('macro '):
-            name = name[6:]
-            src.add_macro(name, obj)
+    src.configure_types()
     return src
diff --git a/pypy/module/cpyext/test/test_cparser.py 
b/pypy/module/cpyext/test/test_cparser.py
--- a/pypy/module/cpyext/test/test_cparser.py
+++ b/pypy/module/cpyext/test/test_cparser.py
@@ -17,7 +17,6 @@
     eci = ExternalCompilationInfo(
         include_dirs=[str(tmpdir)], includes=['sys/types.h', 'header.h'])
     res = parse_source(decl, eci=eci)
-    res.configure_types()
     TestFloatObject = res.definitions['TestFloatObject']
     assert isinstance(TestFloatObject, lltype.Struct)
     assert TestFloatObject.c_ob_refcnt == rffi.SSIZE_T
@@ -72,11 +71,9 @@
         include_dirs=[str(tmpdir)],
         includes=['sys/types.h', 'base.h', 'object.h'])
     hdr1 = parse_source(cdef1, eci=eci)
-    hdr1.configure_types()
     Type = hdr1.definitions['Type']
     assert isinstance(Type, lltype.Struct)
     hdr2 = parse_source(cdef2, includes=[hdr1], eci=eci)
-    hdr2.configure_types()
     assert 'Type' not in hdr2.definitions
     Object = hdr2.definitions['Object']
     assert Object.c_type.TO is Type
@@ -102,7 +99,6 @@
         include_dirs=[str(tmpdir)],
         includes=['sys/types.h', 'foo.h'])
     foo_h = parse_source(cdef, eci=eci)
-    foo_h.configure_types()
     Object = foo_h.definitions['Object']
     assert isinstance(Object, lltype.ForwardReference) or hash(Object)
 
@@ -130,7 +126,6 @@
         include_dirs=[str(tmpdir)],
         includes=['sys/types.h', 'foo.h'])
     foo_h = parse_source(cdef, eci=eci)
-    foo_h.configure_types()
     Object = foo_h.definitions['Object']
     assert isinstance(Object, lltype.Struct)
     hash(Object)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to