Author: Ronan Lamy <[email protected]>
Branch: rffi-parser
Changeset: r89085:483201b600d4
Date: 2016-12-16 03:13 +0000
http://bitbucket.org/pypy/pypy/changeset/483201b600d4/

Log:    progress

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,16 @@
         self.source = source
         self.definitions = definitions
 
+def cffi_to_lltype(obj):
+    from pypy.module.cpyext.api import cpython_struct
+    if isinstance(obj, model.PrimitiveType):
+        return cname_to_lltype(obj.name)
+    elif isinstance(obj, model.StructType):
+        fields = zip(
+            obj.fldnames,
+            [cffi_to_lltype(field) for field in obj.fldtypes])
+        return cpython_struct(obj.name, fields)
+
 
 def parse_source(source):
     ctx = Parser()
@@ -675,9 +685,6 @@
         if not name.startswith('typedef '):
             continue
         name = name[8:]
-        if isinstance(obj, model.PrimitiveType):
-            assert obj.name not in defs
-            defs[name] = cname_to_lltype(obj.name)
-        else:
-            pass
+        assert name not in defs
+        defs[name] = cffi_to_lltype(obj)
     return ParsedSource(source, defs)
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,6 +16,7 @@
     obj = ctx._declarations['typedef PyFloatObject'][0]
     assert [cname_to_lltype(tp.name) for tp in obj.fldtypes] == [
         rffi.SSIZE_T, rffi.SSIZE_T, rffi.DOUBLE]
+    res = parse_source(decl)
 
 def test_simple():
     decl = "typedef ssize_t Py_ssize_t;"
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to