[pypy-commit] pypy rffi-parser: Convert primitive types to rffi

rlamy pypy.commits at gmail.com
Thu Dec 15 20:11:59 EST 2016


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: rffi-parser
Changeset: r89083:b4125bc7dfba
Date: 2016-12-16 01:08 +0000
http://bitbucket.org/pypy/pypy/changeset/b4125bc7dfba/

Log:	Convert primitive types to rffi

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
@@ -2,6 +2,8 @@
 from cffi.commontypes import COMMON_TYPES, resolve_common_type
 import pycparser
 import weakref, re
+from rpython.rtyper.lltypesystem import rffi
+from rpython.rtyper.tool import rfficache
 
 _r_comment = re.compile(r"/\*.*?\*/|//([^\n\\]|\\.)*?$",
                         re.DOTALL | re.MULTILINE)
@@ -639,3 +641,22 @@
                 self._declare(name, tp, included=True, quals=quals)
         for k, v in other._int_constants.items():
             self._add_constants(k, v)
+
+CNAME_TO_LLTYPE = {
+    'char': rffi.CHAR,
+    'double': rffi.DOUBLE, 'long double': rffi.LONGDOUBLE,
+    'float': rffi.FLOAT}
+
+def add_inttypes():
+    for name in rffi.TYPES:
+        if name.startswith('unsigned'):
+            rname = 'u' + name[9:]
+        else:
+            rname = name
+        rname = rname.replace(' ', '').upper()
+        CNAME_TO_LLTYPE[name] = rfficache.platform.types[rname]
+
+add_inttypes()
+
+def cname_to_lltype(name):
+    return CNAME_TO_LLTYPE[name]
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,4 +1,5 @@
-from pypy.module.cpyext.cparser import Parser
+from rpython.rtyper.lltypesystem import rffi
+from pypy.module.cpyext.cparser import Parser, cname_to_lltype
 
 def test_simple():
     decl = """
@@ -7,9 +8,11 @@
     typedef struct {
         Py_ssize_t ob_refcnt;
         Py_ssize_t ob_pypy_link;
-        struct _typeobject *ob_type;
         double ob_fval;
     } PyFloatObject;
     """
     ctx = Parser()
     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]


More information about the pypy-commit mailing list