Author: Ronan Lamy <[email protected]>
Branch: rffi-parser
Changeset: r89084:9d38728d62cc
Date: 2016-12-16 02:29 +0000
http://bitbucket.org/pypy/pypy/changeset/9d38728d62cc/
Log: Start defining the parsing API
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
@@ -660,3 +660,24 @@
def cname_to_lltype(name):
return CNAME_TO_LLTYPE[name]
+
+class ParsedSource(object):
+ def __init__(self, source, definitions):
+ self.source = source
+ self.definitions = definitions
+
+
+def parse_source(source):
+ ctx = Parser()
+ ctx.parse(source)
+ defs = {}
+ for name, (obj, quals) in ctx._declarations.iteritems():
+ 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
+ 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
@@ -1,9 +1,9 @@
from rpython.rtyper.lltypesystem import rffi
-from pypy.module.cpyext.cparser import Parser, cname_to_lltype
+from pypy.module.cpyext.cparser import Parser, cname_to_lltype, parse_source
-def test_simple():
+def test_stuff():
decl = """
- typedef intptr_t Py_ssize_t;
+ typedef ssize_t Py_ssize_t;
typedef struct {
Py_ssize_t ob_refcnt;
@@ -15,4 +15,9 @@
ctx.parse(decl)
obj = ctx._declarations['typedef PyFloatObject'][0]
assert [cname_to_lltype(tp.name) for tp in obj.fldtypes] == [
- rffi.INTPTR_T, rffi.INTPTR_T, rffi.DOUBLE]
+ rffi.SSIZE_T, rffi.SSIZE_T, rffi.DOUBLE]
+
+def test_simple():
+ decl = "typedef ssize_t Py_ssize_t;"
+ hdr = parse_source(decl)
+ assert hdr.definitions == {'Py_ssize_t': rffi.SSIZE_T}
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit