[pypy-commit] pypy cpyext-ext: try harder to remove ndarray macros and decls by adding the header name after # for all GLOBALS
mattip
pypy.commits at gmail.com
Tue Apr 19 17:16:00 EDT 2016
Author: mattip <matti.picus at gmail.com>
Branch: cpyext-ext
Changeset: r83778:932d99f41a9a
Date: 2016-04-19 23:32 +0300
http://bitbucket.org/pypy/pypy/changeset/932d99f41a9a/
Log: try harder to remove ndarray macros and decls by adding the header
name after # for all GLOBALS
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
@@ -494,11 +494,11 @@
]
TYPES = {}
GLOBALS = { # this needs to include all prebuilt pto, otherwise segfaults occur
- '_Py_NoneStruct#': ('PyObject*', 'space.w_None'),
- '_Py_TrueStruct#': ('PyIntObject*', 'space.w_True'),
- '_Py_ZeroStruct#': ('PyIntObject*', 'space.w_False'),
- '_Py_NotImplementedStruct#': ('PyObject*', 'space.w_NotImplemented'),
- '_Py_EllipsisObject#': ('PyObject*', 'space.w_Ellipsis'),
+ '_Py_NoneStruct#%s' % pypy_decl: ('PyObject*', 'space.w_None'),
+ '_Py_TrueStruct#%s' % pypy_decl: ('PyIntObject*', 'space.w_True'),
+ '_Py_ZeroStruct#%s' % pypy_decl: ('PyIntObject*', 'space.w_False'),
+ '_Py_NotImplementedStruct#%s' % pypy_decl: ('PyObject*', 'space.w_NotImplemented'),
+ '_Py_EllipsisObject#%s' % pypy_decl: ('PyObject*', 'space.w_Ellipsis'),
'PyDateTimeAPI': ('PyDateTime_CAPI*', 'None'),
}
FORWARD_DECLS = []
@@ -548,7 +548,7 @@
'PyCFunction_Type': 'space.gettypeobject(cpyext.methodobject.W_PyCFunctionObject.typedef)',
'PyWrapperDescr_Type': 'space.gettypeobject(cpyext.methodobject.W_PyCMethodObject.typedef)'
}.items():
- GLOBALS['%s#' % (cpyname, )] = ('PyTypeObject*', pypyexpr)
+ GLOBALS['%s#%s' % (cpyname, pypy_decl)] = ('PyTypeObject*', pypyexpr)
for cpyname in '''PyMethodObject PyListObject PyLongObject
PyDictObject PyClassObject'''.split():
@@ -887,6 +887,9 @@
structindex = {}
for header, header_functions in FUNCTIONS_BY_HEADER.iteritems():
for name, func in header_functions.iteritems():
+ if not func:
+ # added only for the macro, not the decl
+ continue
restype, args = c_function_signature(db, func)
members.append('%s (*%s)(%s);' % (restype, name, args))
structindex[name] = len(structindex)
@@ -903,7 +906,7 @@
global_objects = []
for name, (typ, expr) in GLOBALS.iteritems():
- if "#" in name:
+ if '#' in name:
continue
if typ == 'PyDateTime_CAPI*':
continue
@@ -927,7 +930,7 @@
'\n' +
'\n'.join(functions))
- eci = build_eci(True, export_symbols, code)
+ eci = build_eci(True, export_symbols, code, use_micronumpy)
eci = eci.compile_shared_lib(
outputfilename=str(udir / "module_cache" / "pypyapi"))
modulename = py.path.local(eci.libraries[-1])
@@ -958,8 +961,8 @@
for name, (typ, expr) in GLOBALS.iteritems():
from pypy.module import cpyext # for the eval() below
w_obj = eval(expr)
- if name.endswith('#'):
- name = name[:-1]
+ if '#' in name:
+ name = name.split('#')[0]
isptr = False
else:
isptr = True
@@ -1004,7 +1007,7 @@
# ctypes.c_void_p)
for header, header_functions in FUNCTIONS_BY_HEADER.iteritems():
for name, func in header_functions.iteritems():
- if name.startswith('cpyext_'): # XXX hack
+ if name.startswith('cpyext_') or func is None: # XXX hack
continue
pypyAPI[structindex[name]] = ctypes.cast(
ll2ctypes.lltype2ctypes(func.get_llhelper(space)),
@@ -1076,10 +1079,14 @@
pypy_macros = []
renamed_symbols = []
for name in export_symbols:
- name = name.replace("#", "")
+ if '#' in name:
+ name,header = name.split('#')
+ else:
+ header = pypy_decl
newname = mangle_name(prefix, name)
assert newname, name
- pypy_macros.append('#define %s %s' % (name, newname))
+ if header == pypy_decl:
+ pypy_macros.append('#define %s %s' % (name, newname))
if name.startswith("PyExc_"):
pypy_macros.append('#define _%s _%s' % (name, newname))
renamed_symbols.append(newname)
@@ -1124,6 +1131,8 @@
header = decls[header_name]
for name, func in sorted(header_functions.iteritems()):
+ if not func:
+ continue
if header == DEFAULT_HEADER:
_name = name
else:
@@ -1149,12 +1158,15 @@
functions.append(header + '\n{return va_arg(*vp, %s);}\n' % name)
for name, (typ, expr) in GLOBALS.iteritems():
- if name.endswith('#'):
- name = name.replace("#", "")
+ if '#' in name:
+ name, header = name.split("#")
typ = typ.replace("*", "")
elif name.startswith('PyExc_'):
typ = 'PyObject*'
- pypy_decls.append('PyAPI_DATA(%s) %s;' % (typ, name))
+ header = pypy_decl
+ if header != pypy_decl:
+ decls[header].append('#define %s %s' % (name, mangle_name(prefix, name)))
+ decls[header].append('PyAPI_DATA(%s) %s;' % (typ, name))
for header_name in FUNCTIONS_BY_HEADER.keys():
header = decls[header_name]
@@ -1185,7 +1197,7 @@
source_dir / "pymem.c",
]
-def build_eci(building_bridge, export_symbols, code):
+def build_eci(building_bridge, export_symbols, code, use_micronumpy=False):
"NOT_RPYTHON"
# Build code and get pointer to the structure
kwds = {}
@@ -1207,9 +1219,11 @@
# Generate definitions for global structures
structs = ["#include <Python.h>"]
+ if use_micronumpy:
+ structs.append('#include <pypy_numpy.h>')
for name, (typ, expr) in GLOBALS.iteritems():
- if name.endswith('#'):
- structs.append('%s %s;' % (typ[:-1], name[:-1]))
+ if '#' in name:
+ structs.append('%s %s;' % (typ[:-1], name.split('#')[0]))
elif name.startswith('PyExc_'):
structs.append('PyTypeObject _%s;' % (name,))
structs.append('PyObject* %s = (PyObject*)&_%s;' % (name, name))
@@ -1250,11 +1264,12 @@
use_micronumpy = space.config.objspace.usemodules.micronumpy
if not use_micronumpy:
return use_micronumpy
- # import to register api functions by side-effect
- import pypy.module.cpyext.ndarrayobject
- global GLOBALS, SYMBOLS_C, separate_module_files
- GLOBALS["PyArray_Type#"]= ('PyTypeObject*', "space.gettypeobject(W_NDimArray.typedef)")
- SYMBOLS_C += ['PyArray_Type', '_PyArray_FILLWBYTE', '_PyArray_ZEROS']
+ # import registers api functions by side-effect, we also need HEADER
+ from pypy.module.cpyext.ndarrayobject import HEADER
+ global GLOBALS, FUNCTIONS_BY_HEADER, separate_module_files
+ for func_name in ['PyArray_Type', '_PyArray_FILLWBYTE', '_PyArray_ZEROS']:
+ FUNCTIONS_BY_HEADER.setdefault(HEADER, {})[func_name] = None
+ GLOBALS["PyArray_Type#%s" % HEADER] = ('PyTypeObject*', "space.gettypeobject(W_NDimArray.typedef)")
separate_module_files.append(source_dir / "ndarrayobject.c")
return use_micronumpy
@@ -1269,9 +1284,12 @@
functions = generate_decls_and_callbacks(db, [], api_struct=False,
prefix='PyPy')
- code = "#include <Python.h>\n" + "\n".join(functions)
+ code = "#include <Python.h>\n"
+ if use_micronumpy:
+ code += "#include <pypy_numpy.h>"
+ code += "\n".join(functions)
- eci = build_eci(False, export_symbols, code)
+ eci = build_eci(False, export_symbols, code, use_micronumpy)
space.fromcache(State).install_dll(eci)
@@ -1283,7 +1301,8 @@
lines = ['PyObject *pypy_static_pyobjs[] = {\n']
include_lines = ['RPY_EXTERN PyObject *pypy_static_pyobjs[];\n']
for name, (typ, expr) in sorted(GLOBALS.items()):
- if name.endswith('#'):
+ if '#' in name:
+ name = name.split('#')[0]
assert typ in ('PyObject*', 'PyTypeObject*', 'PyIntObject*')
typ, name = typ[:-1], name[:-1]
elif name.startswith('PyExc_'):
More information about the pypy-commit
mailing list