[Numpy-discussion] SWIG, numpy.i and errno: comments?

Bill Spotz wfspotz at sandia.gov
Mon Aug 10 11:14:10 EDT 2009


Sure.

On Aug 9, 2009, at 12:50 PM, Egor Zindy wrote:

> Bill,
>
> thank you for your comment. Would this do instead? (replacing the
> return NULL with SWIG_fail):
>
> %exception
> {
>    errno = 0;
>    $action
>
>    if (errno != 0)
>    {
>        switch(errno)
>        {
>            case EPERM:
>                PyErr_Format(PyExc_IndexError, "Index out of range");
>                break;
>            case ENOMEM:
>                PyErr_Format(PyExc_MemoryError, "failed malloc()");
>                break;
>            default:
>                PyErr_Format(PyExc_Exception, "Unknown exception");
>        }
>        SWIG_fail;
>    }
> }
>
> Cheers,
> Egor
>
> On Sun, Aug 9, 2009 at 2:30 PM, Bill Spotz<wfspotz at sandia.gov> wrote:
>> Egor,
>>
>> This looks about right.  However, it is customary to invoke the  
>> SWIG macro
>> "SWIG_fail;" instead of "break;".  (This translates into a "goto"  
>> to the
>> failure label, and is better in case there is any other cleanup  
>> code to
>> execute.)
>>
>> On Aug 9, 2009, at 6:17 AM, Egor Zindy wrote:
>>
>>> Hello list,
>>>
>>> this is my attempt at generating python exceptions in SWIG/C using  
>>> the
>>> errno mechanism:
>>>
>>> http://www.scipy.org/Cookbook/SWIG_NumPy_examples#head-10f49a0f5ea6b313127d2ec5ffa1eaf1c133cb22
>>>
>>> Used together with numpy.i, this has been useful for notifying (in a
>>> pythonic way) memory allocation errors or array index problems.
>>>
>>> A change in the errno global variable is detected in the %exception
>>> part of the SWIG interface file, and Python exceptions are generated
>>> after $action depending on the errno error code value.
>>>
>>> %exception
>>> {
>>>   errno = 0;
>>>   $action
>>>
>>>   if (errno != 0)
>>>   {
>>>       switch(errno)
>>>       {
>>>           case EPERM:
>>>               PyErr_Format(PyExc_IndexError, "Index out of range");
>>>               break;
>>>           case ENOMEM:
>>>               PyErr_Format(PyExc_MemoryError, "Failed malloc()");
>>>               break;
>>>           default:
>>>               PyErr_Format(PyExc_Exception, "Unknown exception");
>>>       }
>>>       return NULL;
>>>   }
>>> }
>>>
>>> If there's a better way of doing this, I'll update the cookbook  
>>> recipe.
>>>
>>> Regards,
>>> Egor
>>
>> ** Bill Spotz                                              **
>> ** Sandia National Laboratories  Voice: (505)845-0170      **
>> ** P.O. Box 5800                 Fax:   (505)284-0154      **
>> ** Albuquerque, NM 87185-0370    Email: wfspotz at sandia.gov **
>>
>>
>>
>>
>>
>>
>>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>

** Bill Spotz                                              **
** Sandia National Laboratories  Voice: (505)845-0170      **
** P.O. Box 5800                 Fax:   (505)284-0154      **
** Albuquerque, NM 87185-0370    Email: wfspotz at sandia.gov **









More information about the NumPy-Discussion mailing list