Author: Ronan Lamy <[email protected]>
Branch: 
Changeset: r89682:96efa16ddc41
Date: 2017-01-21 19:54 +0000
http://bitbucket.org/pypy/pypy/changeset/96efa16ddc41/

Log:    Keep typedef information around a bit longer

diff --git a/pypy/module/cpyext/cmodel.py b/pypy/module/cpyext/cmodel.py
--- a/pypy/module/cpyext/cmodel.py
+++ b/pypy/module/cpyext/cmodel.py
@@ -192,6 +192,15 @@
         raise NotImplementedError("float type '%s' can only be used after "
                                   "compilation" % self.name)
 
+class DefinedType(BaseType):
+    _attrs_ = ('name', )
+
+    def __init__(self, name, realtype, quals):
+        self.name = name
+        self.realtype = realtype
+        self.quals = quals
+        self.c_name_with_marker = name + '&'
+
 
 class BaseFunctionType(BaseType):
     _attrs_ = ('args', 'result', 'ellipsis', 'abi')
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
@@ -189,13 +189,7 @@
                 if isinstance(decl, pycparser.c_ast.Decl):
                     self._parse_decl(decl)
                 elif isinstance(decl, pycparser.c_ast.Typedef):
-                    if not decl.name:
-                        raise CDefError("typedef does not declare any name",
-                                        decl)
-                    quals = 0
-                    realtype, quals = self._get_type_and_quals(
-                        decl.type, name=decl.name, partial_length_ok=True)
-                    self._declare('typedef ' + decl.name, realtype, 
quals=quals)
+                    self._parse_typedef(decl)
                 elif decl.__class__.__name__ == 'Pragma':
                     pass    # skip pragma, only in pycparser 2.15
                 else:
@@ -245,6 +239,14 @@
             tag = 'function '
         self._declare(tag + decl.name, tp)
 
+    def _parse_typedef(self, decl):
+        if not decl.name:
+            raise CDefError("typedef does not declare any name", decl)
+        realtype, quals = self._get_type_and_quals(
+            decl.type, name=decl.name, partial_length_ok=True)
+        tp = model.DefinedType(decl.name, realtype, quals)
+        self._declare('typedef ' + decl.name, tp)
+
     def _parse_decl(self, decl):
         node = decl.type
         if isinstance(node, pycparser.c_ast.FuncDecl):
@@ -802,6 +804,8 @@
                 del self._TYPES[name]
 
     def convert_type(self, obj, quals=0):
+        if isinstance(obj, model.DefinedType):
+            return self.convert_type(obj.realtype, obj.quals)
         if isinstance(obj, model.PrimitiveType):
             return cname_to_lltype(obj.name)
         elif isinstance(obj, model.StructType):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to