[Numpy-svn] r4518 - trunk/numpy/doc/swig

numpy-svn at scipy.org numpy-svn at scipy.org
Sat Dec 1 23:17:35 EST 2007


Author: wfspotz at sandia.gov
Date: 2007-12-01 22:17:23 -0600 (Sat, 01 Dec 2007)
New Revision: 4518

Modified:
   trunk/numpy/doc/swig/pyfragments.swg
Log:
Corrected casting logic for numpy array scalars

Modified: trunk/numpy/doc/swig/pyfragments.swg
===================================================================
--- trunk/numpy/doc/swig/pyfragments.swg	2007-12-01 18:16:42 UTC (rev 4517)
+++ trunk/numpy/doc/swig/pyfragments.swg	2007-12-02 04:17:23 UTC (rev 4518)
@@ -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;
   }
 }




More information about the Numpy-svn mailing list