[pypy-commit] pypy rffi-parser-2: Add CTypeSpace.parse_header()

rlamy pypy.commits at gmail.com
Mon Jan 16 13:14:50 EST 2017


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: rffi-parser-2
Changeset: r89614:47602e2d9f0e
Date: 2017-01-16 18:14 +0000
http://bitbucket.org/pypy/pypy/changeset/47602e2d9f0e/

Log:	Add CTypeSpace.parse_header()

diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py
--- a/pypy/module/cpyext/api.py
+++ b/pypy/module/cpyext/api.py
@@ -142,14 +142,14 @@
         target.chmod(0444) # make the file read-only, to make sure that nobody
                            # edits it by mistake
 
-def copy_header_files(dstdir, copy_numpy_headers):
+def copy_header_files(cts, dstdir, copy_numpy_headers):
     # XXX: 20 lines of code to recursively copy a directory, really??
     assert dstdir.check(dir=True)
     headers = include_dir.listdir('*.h') + include_dir.listdir('*.inl')
     for name in ["pypy_macros.h"] + FUNCTIONS_BY_HEADER.keys():
         headers.append(udir.join(name))
-    headers.append(parse_dir / 'cpyext_object.h')
-    headers.append(parse_dir / 'cpyext_typeobject.h')
+    for path in cts.parsed_headers:
+        headers.append(path)
     _copy_header_files(headers, dstdir)
 
     if copy_numpy_headers:
@@ -670,9 +670,8 @@
                              % (cpyname, ))
 build_exported_objects()
 
-object_cdef = (parse_dir / 'cpyext_object.h').read()
 cts = CTypeSpace(headers=['sys/types.h', 'stdarg.h', 'stdio.h'])
-cts.parse_source(object_cdef)
+cts.parse_header(parse_dir / 'cpyext_object.h')
 
 Py_ssize_t = cts.gettype('Py_ssize_t')
 Py_ssize_tP = cts.gettype('Py_ssize_t *')
@@ -1410,7 +1409,7 @@
 
     setup_init_functions(eci, prefix)
     trunk_include = pypydir.dirpath() / 'include'
-    copy_header_files(trunk_include, use_micronumpy)
+    copy_header_files(cts, trunk_include, use_micronumpy)
 
 
 def _load_from_cffi(space, name, path, initptr):
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
@@ -687,12 +687,13 @@
 class CTypeSpace(object):
     def __init__(self, parser=None, definitions=None, macros=None,
                  headers=None, includes=None):
-        self.sources = []
         self.definitions = definitions if definitions is not None else {}
         self.macros = macros if macros is not None else {}
         self.structs = {}
         self.ctx = parser if parser else Parser()
         self.headers = headers if headers is not None else ['sys/types.h']
+        self.parsed_headers = []
+        self.sources = []
         self._Config = type('Config', (object,), {})
         self._TYPES = {}
         self.includes = []
@@ -712,6 +713,12 @@
         self.ctx.parse(source)
         self.configure_types()
 
+    def parse_header(self, header_path):
+        self.headers.append(str(header_path))
+        self.parsed_headers.append(header_path)
+        self.ctx.parse(header_path.read())
+        self.configure_types()
+
     def add_typedef(self, name, obj, quals):
         assert name not in self.definitions
         tp = self.convert_type(obj, quals)
diff --git a/pypy/module/cpyext/test/test_api.py b/pypy/module/cpyext/test/test_api.py
--- a/pypy/module/cpyext/test/test_api.py
+++ b/pypy/module/cpyext/test/test_api.py
@@ -5,7 +5,7 @@
 from pypy.module.cpyext.state import State
 from pypy.module.cpyext.api import (
     slot_function, cpython_api, copy_header_files, INTERPLEVEL_API,
-    Py_ssize_t, Py_ssize_tP, PyObject)
+    Py_ssize_t, Py_ssize_tP, PyObject, cts)
 from pypy.module.cpyext.test.test_cpyext import freeze_refcnts, LeakCheckingTest
 from pypy.interpreter.error import OperationError
 from rpython.rlib import rawrefcount
@@ -113,7 +113,7 @@
 @pytest.mark.skipif(os.environ.get('USER')=='root',
                     reason='root can write to all files')
 def test_copy_header_files(tmpdir):
-    copy_header_files(tmpdir, True)
+    copy_header_files(cts, tmpdir, True)
     def check(name):
         f = tmpdir.join(name)
         assert f.check(file=True)
diff --git a/pypy/module/cpyext/typeobject.py b/pypy/module/cpyext/typeobject.py
--- a/pypy/module/cpyext/typeobject.py
+++ b/pypy/module/cpyext/typeobject.py
@@ -41,8 +41,7 @@
 
 PyType_Check, PyType_CheckExact = build_type_checkers("Type", "w_type")
 
-cdef = (parse_dir / 'cpyext_typeobject.h').read()
-cts.parse_source(cdef)
+cts.parse_header(parse_dir / 'cpyext_typeobject.h')
 PyHeapTypeObjectStruct = cts.gettype('PyHeapTypeObject')
 PyHeapTypeObject = cts.gettype('PyHeapTypeObject *')
 


More information about the pypy-commit mailing list