Author: Ronan Lamy <[email protected]>
Branch: rffi-parser-2
Changeset: r89228:a2b33bc5a642
Date: 2016-12-24 12:39 +0100
http://bitbucket.org/pypy/pypy/changeset/a2b33bc5a642/

Log:    Don't configure incomplete structs

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
@@ -666,6 +666,15 @@
         self.fields = fields
         self.TYPE = TYPE
 
+    def is_ready(self):
+        if self.fields is None:
+            return False
+        try:
+            [hash(fld[1]) for fld in self.fields]
+            return True
+        except TypeError:
+            return False
+
     def __repr__(self):
         return "<struct {struct_name}>".format(**vars(self))
 
@@ -713,12 +722,15 @@
         return struct
 
     def realize_struct(self, struct, type_name):
+        from pypy.module.cpyext.api import cpython_struct
         configname = type_name.replace(' ', '__')
-        setattr(self._Config, configname,
-            rffi_platform.Struct(type_name, struct.fields))
-        forward = lltype.ForwardReference()
-        self._TYPES[configname] = forward
-        return forward
+        if struct.is_ready():
+            setattr(self._Config, configname,
+                rffi_platform.Struct(type_name, struct.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, TYPE in rffi_platform.configure(self._Config).iteritems():
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to