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