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

Log:    Add configure_now flag

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,15 +666,6 @@
         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 config_fields(self):
         result = []
         for name, value in self.fields:
@@ -708,11 +699,11 @@
         self.structs.update(other.structs)
         self.includes.append(other)
 
-    def add_typedef(self, name, obj):
+    def add_typedef(self, name, obj, configure_now=False):
         assert name not in self.definitions
         tp = self.convert_type(obj)
         if isinstance(tp, DelayedStruct):
-            tp = self.realize_struct(tp, name)
+            tp = self.realize_struct(tp, name, configure_now=configure_now)
         self.definitions[name] = tp
 
     def add_macro(self, name, value):
@@ -729,10 +720,10 @@
                  [self.convert_type(field) for field in obj.fldtypes])
         return struct
 
-    def realize_struct(self, struct, type_name):
+    def realize_struct(self, struct, type_name, configure_now=False):
         from pypy.module.cpyext.api import cpython_struct
         configname = type_name.replace(' ', '__')
-        if struct.is_ready():
+        if configure_now:
             setattr(self._Config, configname,
                 rffi_platform.Struct(type_name, struct.config_fields()))
             self._TYPES[configname] = struct.TYPE
@@ -740,13 +731,13 @@
             cpython_struct(type_name, struct.fields, forward=struct.TYPE)
         return struct.TYPE
 
-    def configure_types(self):
+    def configure_types(self, configure_now=False):
         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)
+                self.add_typedef(name, obj, configure_now=configure_now)
             elif name.startswith('macro '):
                 name = name[6:]
                 self.add_macro(name, obj)
@@ -784,12 +775,12 @@
             raise NotImplementedError
 
 
-def parse_source(source, includes=None, eci=None):
+def parse_source(source, includes=None, eci=None, configure_now=False):
     ctx = Parser()
     src = ParsedSource(source, ctx, eci=eci)
     if includes is not None:
         for header in includes:
             src.include(header)
     ctx.parse(source)
-    src.configure_types()
+    src.configure_types(configure_now=configure_now)
     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
@@ -16,7 +16,7 @@
     hdr.write(decl)
     eci = ExternalCompilationInfo(
         include_dirs=[str(tmpdir)], includes=['sys/types.h', 'header.h'])
-    res = parse_source(decl, eci=eci)
+    res = parse_source(decl, eci=eci, configure_now=True)
     TestFloatObject = res.definitions['TestFloatObject']
     assert isinstance(TestFloatObject, lltype.Struct)
     assert TestFloatObject.c_ob_refcnt == rffi.SSIZE_T
@@ -70,10 +70,10 @@
     eci = ExternalCompilationInfo(
         include_dirs=[str(tmpdir)],
         includes=['sys/types.h', 'base.h', 'object.h'])
-    hdr1 = parse_source(cdef1, eci=eci)
+    hdr1 = parse_source(cdef1, eci=eci, configure_now=True)
     Type = hdr1.definitions['Type']
     assert isinstance(Type, lltype.Struct)
-    hdr2 = parse_source(cdef2, includes=[hdr1], eci=eci)
+    hdr2 = parse_source(cdef2, includes=[hdr1], eci=eci, configure_now=True)
     assert 'Type' not in hdr2.definitions
     Object = hdr2.definitions['Object']
     assert Object.c_type.TO is Type
@@ -125,7 +125,7 @@
     eci = ExternalCompilationInfo(
         include_dirs=[str(tmpdir)],
         includes=['sys/types.h', 'foo.h'])
-    foo_h = parse_source(cdef, eci=eci)
+    foo_h = parse_source(cdef, eci=eci, configure_now=True)
     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