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