[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