Author: mattip <[email protected]>
Branch: cleanup-includes
Changeset: r83606:45cb9a7c7b7d
Date: 2016-04-11 23:19 +0300
http://bitbucket.org/pypy/pypy/changeset/45cb9a7c7b7d/
Log: move ndarray declarations to seperate header, adjust header creation
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
@@ -811,6 +811,11 @@
prologue = ("#include <Python.h>\n"
"#include <structmember.h>\n"
"#include <src/thread.c>\n")
+ if use_micronumpy:
+ prologue = ("#include <Python.h>\n"
+ "#include <structmember.h>\n"
+ "#include <pypy_numpy.h>\n"
+ "#include <src/thread.c>\n")
code = (prologue +
struct_declaration_code +
global_code +
@@ -1012,6 +1017,16 @@
for header_name, header_functions in FUNCTIONS_BY_HEADER.iteritems():
if header_name not in decls:
header = decls[header_name] = []
+ header.append("#ifndef _PYPY_%s\n" %
+ header_name.upper().replace('.','_'))
+ header.append("#define _PYPY_%s\n" %
+ header_name.upper().replace('.','_'))
+ header.append("#ifndef PYPY_STANDALONE\n")
+ header.append("#ifdef __cplusplus")
+ header.append("extern \"C\" {")
+ header.append("#endif\n")
+ header.append('#define Signed long /* xxx temporary
fix */\n')
+ header.append('#define Unsigned unsigned long /* xxx temporary
fix */\n')
else:
header = decls[header_name]
@@ -1048,13 +1063,16 @@
typ = 'PyObject*'
pypy_decls.append('PyAPI_DATA(%s) %s;' % (typ, name))
- pypy_decls.append('#undef Signed /* xxx temporary fix */\n')
- pypy_decls.append('#undef Unsigned /* xxx temporary fix */\n')
- pypy_decls.append("#ifdef __cplusplus")
- pypy_decls.append("}")
- pypy_decls.append("#endif")
- pypy_decls.append("#endif /*PYPY_STANDALONE*/\n")
- pypy_decls.append("#endif /*_PYPY_PYPY_DECL_H*/\n")
+ for header_name in FUNCTIONS_BY_HEADER.keys():
+ header = decls[header_name]
+ header.append('#undef Signed /* xxx temporary fix */\n')
+ header.append('#undef Unsigned /* xxx temporary fix */\n')
+ header.append("#ifdef __cplusplus")
+ header.append("}")
+ header.append("#endif")
+ header.append("#endif /*PYPY_STANDALONE*/\n")
+ header.append("#endif /*_PYPY_%s_H*/\n" %
+ header_name.upper().replace('.','_'))
for header_name, header_decls in decls.iteritems():
decl_h = udir.join(header_name)
@@ -1204,10 +1222,12 @@
PyObjectP, 'pypy_static_pyobjs', eci2, c_type='PyObject **',
getter_only=True, declare_as_extern=False)
- for name, func in FUNCTIONS.iteritems():
- newname = mangle_name('PyPy', name) or name
- deco = entrypoint_lowlevel("cpyext", func.argtypes, newname,
relax=True)
- deco(func.get_wrapper(space))
+ for name, func in FUNCTIONS_BY_HEADER.iteritems():
+ for name, func in header_functions.iteritems():
+ newname = mangle_name('PyPy', name) or name
+ deco = entrypoint_lowlevel("cpyext", func.argtypes, newname,
+ relax=True)
+ deco(func.get_wrapper(space))
setup_init_functions(eci, translating=True)
trunk_include = pypydir.dirpath() / 'include'
diff --git a/pypy/module/cpyext/ndarrayobject.py
b/pypy/module/cpyext/ndarrayobject.py
--- a/pypy/module/cpyext/ndarrayobject.py
+++ b/pypy/module/cpyext/ndarrayobject.py
@@ -27,62 +27,63 @@
ARRAY_DEFAULT = ARRAY_CARRAY
-@cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
+HEADER = 'pypy_numpy.h'
+@cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL, header=HEADER)
def _PyArray_Check(space, w_obj):
w_obj_type = space.type(w_obj)
w_type = space.gettypeobject(W_NDimArray.typedef)
return (space.is_w(w_obj_type, w_type) or
space.is_true(space.issubtype(w_obj_type, w_type)))
-@cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
+@cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL, header=HEADER)
def _PyArray_CheckExact(space, w_obj):
w_obj_type = space.type(w_obj)
w_type = space.gettypeobject(W_NDimArray.typedef)
return space.is_w(w_obj_type, w_type)
-@cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
+@cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL, header=HEADER)
def _PyArray_FLAGS(space, w_array):
assert isinstance(w_array, W_NDimArray)
flags = ARRAY_BEHAVED_NS | w_array.get_flags()
return flags
-@cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
+@cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL, header=HEADER)
def _PyArray_NDIM(space, w_array):
assert isinstance(w_array, W_NDimArray)
return len(w_array.get_shape())
-@cpython_api([PyObject, Py_ssize_t], Py_ssize_t, error=CANNOT_FAIL)
+@cpython_api([PyObject, Py_ssize_t], Py_ssize_t, error=CANNOT_FAIL,
header=HEADER)
def _PyArray_DIM(space, w_array, n):
assert isinstance(w_array, W_NDimArray)
return w_array.get_shape()[n]
-@cpython_api([PyObject, Py_ssize_t], Py_ssize_t, error=CANNOT_FAIL)
+@cpython_api([PyObject, Py_ssize_t], Py_ssize_t, error=CANNOT_FAIL,
header=HEADER)
def _PyArray_STRIDE(space, w_array, n):
assert isinstance(w_array, W_NDimArray)
return w_array.implementation.get_strides()[n]
-@cpython_api([PyObject], Py_ssize_t, error=CANNOT_FAIL)
+@cpython_api([PyObject], Py_ssize_t, error=CANNOT_FAIL, header=HEADER)
def _PyArray_SIZE(space, w_array):
assert isinstance(w_array, W_NDimArray)
return w_array.get_size()
-@cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
+@cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL, header=HEADER)
def _PyArray_ITEMSIZE(space, w_array):
assert isinstance(w_array, W_NDimArray)
return w_array.get_dtype().elsize
-@cpython_api([PyObject], Py_ssize_t, error=CANNOT_FAIL)
+@cpython_api([PyObject], Py_ssize_t, error=CANNOT_FAIL, header=HEADER)
def _PyArray_NBYTES(space, w_array):
assert isinstance(w_array, W_NDimArray)
return w_array.get_size() * w_array.get_dtype().elsize
-@cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
+@cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL, header=HEADER)
def _PyArray_TYPE(space, w_array):
assert isinstance(w_array, W_NDimArray)
return w_array.get_dtype().num
-@cpython_api([PyObject], rffi.VOIDP, error=CANNOT_FAIL)
+@cpython_api([PyObject], rffi.VOIDP, error=CANNOT_FAIL, header=HEADER)
def _PyArray_DATA(space, w_array):
# fails on scalars - see PyArray_FromAny()
assert isinstance(w_array, W_NDimArray)
@@ -92,7 +93,7 @@
NULL = lltype.nullptr(rffi.VOIDP.TO)
@cpython_api([PyObject, PyArray_Descr, Py_ssize_t, Py_ssize_t, Py_ssize_t,
rffi.VOIDP],
- PyObject)
+ PyObject, header=HEADER)
def _PyArray_FromAny(space, w_obj, w_dtype, min_depth, max_depth,
requirements, context):
""" This is the main function used to obtain an array from any nested
sequence, or object that exposes the array interface, op. The
@@ -146,7 +147,7 @@
w_array.implementation.shape = []
return w_array
-@cpython_api([Py_ssize_t], PyObject)
+@cpython_api([Py_ssize_t], PyObject, header=HEADER)
def _PyArray_DescrFromType(space, typenum):
try:
dtype = get_dtype_cache(space).dtypes_by_num[typenum]
@@ -155,7 +156,7 @@
raise OperationError(space.w_ValueError, space.wrap(
'_PyArray_DescrFromType called with invalid dtype %d' % typenum))
-@cpython_api([PyObject, Py_ssize_t, Py_ssize_t, Py_ssize_t], PyObject)
+@cpython_api([PyObject, Py_ssize_t, Py_ssize_t, Py_ssize_t], PyObject,
header=HEADER)
def _PyArray_FromObject(space, w_obj, typenum, min_depth, max_depth):
try:
dtype = get_dtype_cache(space).dtypes_by_num[typenum]
@@ -193,15 +194,15 @@
order=order, owning=owning, w_subtype=w_subtype)
-@cpython_api([Py_ssize_t, rffi.LONGP, Py_ssize_t], PyObject)
+@cpython_api([Py_ssize_t, rffi.LONGP, Py_ssize_t], PyObject, header=HEADER)
def _PyArray_SimpleNew(space, nd, dims, typenum):
return simple_new(space, nd, dims, typenum)
-@cpython_api([Py_ssize_t, rffi.LONGP, Py_ssize_t, rffi.VOIDP], PyObject)
+@cpython_api([Py_ssize_t, rffi.LONGP, Py_ssize_t, rffi.VOIDP], PyObject,
header=HEADER)
def _PyArray_SimpleNewFromData(space, nd, dims, typenum, data):
return simple_new_from_data(space, nd, dims, typenum, data, owning=False)
-@cpython_api([Py_ssize_t, rffi.LONGP, Py_ssize_t, rffi.VOIDP], PyObject)
+@cpython_api([Py_ssize_t, rffi.LONGP, Py_ssize_t, rffi.VOIDP], PyObject,
header=HEADER)
def _PyArray_SimpleNewFromDataOwning(space, nd, dims, typenum, data):
# Variant to take over ownership of the memory, equivalent to:
# PyObject *arr = PyArray_SimpleNewFromData(nd, dims, typenum, data);
@@ -210,7 +211,7 @@
@cpython_api([rffi.VOIDP, Py_ssize_t, rffi.LONGP, Py_ssize_t, rffi.LONGP,
- rffi.VOIDP, Py_ssize_t, Py_ssize_t, PyObject], PyObject)
+ rffi.VOIDP, Py_ssize_t, Py_ssize_t, PyObject], PyObject, header=HEADER)
def _PyArray_New(space, subtype, nd, dims, typenum, strides, data, itemsize,
flags, obj):
if strides:
raise OperationError(space.w_NotImplementedError,
@@ -232,7 +233,7 @@
# a problem with casting function pointers?
@cpython_api([rffi.CArrayPtr(rffi.CArrayPtr(gufunctype)), rffi.VOIDP,
rffi.CCHARP, Py_ssize_t, Py_ssize_t,
Py_ssize_t, Py_ssize_t, rffi.CCHARP, rffi.CCHARP, Py_ssize_t,
- rffi.CCHARP], PyObject)
+ rffi.CCHARP], PyObject, header=HEADER)
def PyUFunc_FromFuncAndDataAndSignature(space, funcs, data, types, ntypes,
nin, nout, identity, name, doc, check_return, signature):
w_signature = rffi.charp2str(signature)
@@ -258,7 +259,7 @@
return ufunc_generic
@cpython_api([rffi.CArrayPtr(rffi.CArrayPtr(gufunctype)), rffi.VOIDP,
rffi.CCHARP, Py_ssize_t, Py_ssize_t,
- Py_ssize_t, Py_ssize_t, rffi.CCHARP, rffi.CCHARP, Py_ssize_t],
PyObject)
+ Py_ssize_t, Py_ssize_t, rffi.CCHARP, rffi.CCHARP, Py_ssize_t],
PyObject, header=HEADER)
def PyUFunc_FromFuncAndData(space, funcs, data, types, ntypes,
nin, nout, identity, name, doc, check_return):
w_signature = ','.join(['()'] * nin) + '->' + ','.join(['()'] * nout)
diff --git a/pypy/module/cpyext/src/ndarrayobject.c
b/pypy/module/cpyext/src/ndarrayobject.c
--- a/pypy/module/cpyext/src/ndarrayobject.c
+++ b/pypy/module/cpyext/src/ndarrayobject.c
@@ -1,5 +1,6 @@
#include "Python.h"
+#include "pypy_numpy.h"
#include "numpy/arrayobject.h"
#include <string.h> /* memset, memcpy */
diff --git a/pypy/module/cpyext/test/test_ndarrayobject.py
b/pypy/module/cpyext/test/test_ndarrayobject.py
--- a/pypy/module/cpyext/test/test_ndarrayobject.py
+++ b/pypy/module/cpyext/test/test_ndarrayobject.py
@@ -281,7 +281,8 @@
return _PyArray_DescrFromType(typenum);
"""
),
- ], prologue='#include <numpy/arrayobject.h>')
+ ], prologue='''#include <numpy/arrayobject.h>
+#include <pypy_numpy.h>''')
arr = mod.test_simplenew()
assert arr.shape == (2, 3)
assert arr.dtype.num == 11 #float32 dtype
@@ -309,7 +310,8 @@
Py_INCREF(obj);
return obj;
'''),
- ], prologue='#include <numpy/arrayobject.h>')
+ ], prologue='''#include <numpy/arrayobject.h>
+#include <pypy_numpy.h>''')
array = ndarray((3, 4), dtype='d')
assert mod.check_array(array) is array
raises(TypeError, "mod.check_array(42)")
@@ -353,6 +355,7 @@
"""),
], prologue='''
#include "numpy/ndarraytypes.h"
+ #include "pypy_numpy.h"
/*#include <numpy/ufuncobject.h> generated by numpy setup.py*/
typedef void (*PyUFuncGenericFunction)
(char **args,
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit