From 65293fce1c575ac74bd18a96ac43187e3fd8c439 Mon Sep 17 00:00:00 2001 From: "wfspotz@sandia.gov" Date: Sun, 2 Dec 2007 04:17:23 +0000 Subject: Corrected casting logic for numpy array scalars --- numpy/doc/swig/pyfragments.swg | 127 +++-------------------------------------- 1 file changed, 9 insertions(+), 118 deletions(-) (limited to 'numpy/doc') diff --git a/numpy/doc/swig/pyfragments.swg b/numpy/doc/swig/pyfragments.swg index 6e812c647..3c9502ff5 100644 --- a/numpy/doc/swig/pyfragments.swg +++ b/numpy/doc/swig/pyfragments.swg @@ -1,4 +1,5 @@ /*-*- C -*-*/ + /**********************************************************************/ /* For numpy versions prior to 1.0, the names of certain data types @@ -71,11 +72,12 @@ %fragment(SWIG_AsVal_frag(long), "header", fragment="SWIG_CanCastAsInteger", - fragment="NumPy_Backward_Compatibility") + fragment="NumPy_Backward_Compatibility") { SWIGINTERN int SWIG_AsVal_dec(long)(PyObject * obj, long * val) { + static PyArray_Descr * longDescr = PyArray_DescrNewFromType(NPY_LONG); if (PyInt_Check(obj)) { if (val) *val = PyInt_AsLong(obj); return SWIG_OK; @@ -108,69 +110,13 @@ } } %#endif - if (!PyArray_CheckScalar(obj)) return SWIG_TypeError; - int dataType = PyArray_TYPE(obj); - switch (dataType) - { - case NPY_BYTE: - { - char data = *((char*)PyArray_DATA(obj)); - if (val) *val = %numeric_cast(data, long); - break; - } - case NPY_UBYTE: - { - unsigned char data = *((unsigned char*)PyArray_DATA(obj)); - if (val) *val = %numeric_cast(data, long); - break; - } - case NPY_SHORT: - { - short data = *((short*)PyArray_DATA(obj)); - if (val) *val = %numeric_cast(data, long); - break; - } - case NPY_USHORT: - { - unsigned short data = *((unsigned short*)PyArray_DATA(obj)); - if (val) *val = %numeric_cast(data, long); - break; - } - case NPY_INT: - { - int data = *((int*)PyArray_DATA(obj)); - if (val) *val = %numeric_cast(data, long); - break; - } - case NPY_UINT: - { - unsigned int data = *((unsigned int*)PyArray_DATA(obj)); - if (data > NPY_MAX_LONG) return SWIG_OverflowError; - if (val) *val = %numeric_cast(data, long); - break; - } - case NPY_LONG: - { - *val = *((long*)PyArray_DATA(obj)); - break; - } - case NPY_ULONG: - { - unsigned long data = *((unsigned long*)PyArray_DATA(obj)); - if (data > NPY_MAX_LONG) return SWIG_OverflowError; - if (val) *val = %numeric_cast(data, long); - break; - } - default: - return SWIG_TypeError; - } + if (!PyArray_IsScalar(obj,Integer)) return SWIG_TypeError; + PyArray_CastScalarToCtype(obj, (void*)val, longDescr); return SWIG_OK; } } - - /* Override the SWIG_AsVal_frag(unsigned long) fragment so that it * also checks for numpy scalar array types. The code through the * %#endif is essentially cut-and-paste from pyprimtype.swg @@ -178,11 +124,12 @@ %fragment(SWIG_AsVal_frag(unsigned long),"header", fragment="SWIG_CanCastAsInteger", - fragment="NumPy_Backward_Compatibility") + fragment="NumPy_Backward_Compatibility") { SWIGINTERN int SWIG_AsVal_dec(unsigned long)(PyObject *obj, unsigned long *val) { + static PyArray_Descr * ulongDescr = PyArray_DescrNewFromType(NPY_ULONG); if (PyInt_Check(obj)) { long v = PyInt_AsLong(obj); if (v >= 0) { @@ -220,64 +167,8 @@ } } %#endif - if (!PyArray_CheckScalar(obj)) return SWIG_TypeError; - int dataType = PyArray_TYPE(obj); - switch (dataType) - { - case NPY_BYTE: - { - char data = *((char*)PyArray_DATA(obj)); - if (data < 0) return SWIG_OverflowError; - if (val) *val = %numeric_cast(data, unsigned long); - break; - } - case NPY_UBYTE: - { - unsigned char data = *((unsigned char*)PyArray_DATA(obj)); - if (val) *val = %numeric_cast(data, unsigned long); - break; - } - case NPY_SHORT: - { - short data = *((short*)PyArray_DATA(obj)); - if (data < 0) return SWIG_OverflowError; - if (val) *val = %numeric_cast(data, unsigned long); - break; - } - case NPY_USHORT: - { - unsigned short data = *((unsigned short*)PyArray_DATA(obj)); - if (val) *val = %numeric_cast(data, unsigned long); - break; - } - case NPY_INT: - { - int data = *((int*)PyArray_DATA(obj)); - if (data < 0) return SWIG_OverflowError; - if (val) *val = %numeric_cast(data, unsigned long); - break; - } - case NPY_UINT: - { - unsigned int data = *((unsigned int*)PyArray_DATA(obj)); - if (val) *val = %numeric_cast(data, unsigned long); - break; - } - case NPY_LONG: - { - long data = *((long*)PyArray_DATA(obj)); - if (data < 0) return SWIG_OverflowError; - if (val) *val = %numeric_cast(data, unsigned long); - break; - } - case NPY_ULONG: - { - *val = *((unsigned long*)PyArray_DATA(obj)); - break; - } - default: - return SWIG_TypeError; - } + if (!PyArray_IsScalar(obj,Integer)) return SWIG_TypeError; + PyArray_CastScalarToCtype(obj, (void*)val, ulongDescr); return SWIG_OK; } } -- cgit v1.2.1