On Dec 9, 2009, at 4:37 PM, Lisandro Dalcin wrote:

> On Wed, Dec 9, 2009 at 6:38 PM, Dag Sverre Seljebotn
> <[email protected]> wrote:
>> Greg Ewing wrote:
>>> Lisandro Dalcin wrote:
>>>
>>>> The point is that NULL is not a valid return value, but  
>>>> MPI_COMM_NULL is.
>>>
>>> In that case, you don't have a problem in the first
>>> place, because you *want* something that is not a
>>> valid return value.
>>>
>>> Are you sure you understand what the 'except' clause
>>> is doing here? It *doesn't* cause an exception to be
>>> raised when the routine returns that value. It's an
>>> out-of-band value for Pyrex to use to indicate that
>>> the routine has, or may have, already raised an
>>> exception.
>>>
>>> If you're calling an external routine, you need to
>>> check for whatever it uses to signal an error and raise
>>> and exception yourself. When you do that, Pyrex will
>>> use the exception value you've declared to signal
>>> that to calling Python-aware code.
>>>
>>> The exception value is ideally a value that the routine
>>> can't ever return normally, or (with '?') one that
>>> it returns rarely. If the external routine is guaranteed
>>> never to return NULL, then that's an ideal unconditional
>>> exception value for your wrapper routine to use.
>>
>> I believe the idea is that the routine doesn't return a pointer,  
>> but a
>> struct or similar. Of course, also structs can have NULL-like values
>> defined for them.
>>
>
> Indeed. I need to return a MPI_Comm value, and MPI_Comm can be
> anything (well, it usually is an integer or a pointer, depending on
> the implementation). So I need to code this:
>
> cdef class Comm:
>    MPI_Comm ob_mpi
>
> cdef api MPI_Comm PyMPIComm_AsComm(object o) except? MPI_COMM_NULL:
>    return (<Comm?>o).ob_mpi
>
> Inside that function I do a typecheck to make sure that object 'o' do
> have the appropriate type. So if the typecheck fail, Cython/Pyrex
> should set the Python error, and I want MPI_COMM_NULL to be returned
> to signal the failure to the caller.

I would be fine with allowing extern variables as exception values.

- Robert


_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to