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