On Thu, Jul 15, 2010 at 10:56 AM, Robert Bradshaw
<[email protected]> wrote:
> On Thu, Jul 15, 2010 at 10:38 AM, Robert Kern <[email protected]> wrote:
>> What are the recommendations for the use of the "object" type versus 
>> "PyObject
>> *"? Ondrej pointed out a potential bug in my line_profiler package:
>>
>>
>> http://github.com/certik/line_profiler/commit/dc3ad198f8a810d34da5da71ffccf01c5e05a161
>>
>> I have a cdef function that serves as the callback for the PyEval_SetTrace()
>> functionality. It has a PyObject* argument that is sometimes NULL. This 
>> argument
>> happens to be unused. In the version of Cython I originally developed
>> line_profile under , no code referenced this argument. In the development
>> version of Cython that Ondrej used to compile line_profiler, a Py_INCREF is
>> apparently generated. When the argument is NULL, this obviously fails.
>>
>> Is this intentional? Should "object" be avoided when the argument could 
>> possibly
>> be NULL? Or should the generated code use Py_XINCREF/Py_XDECREF instead to 
>> avoid
>> failure?
>
> Typically PyObject* is used for borrowed references (i.e there's no
> need for you do decref it when you're done with it) whereas objects is
> used when you have ownership of a reference and need to handle the
> decref at the end. As for NULL, it is fine in the former (though be
> careful to use the Py_X... functions if necessary) but not in the
> latter.
>
> In this callback, the argument should be declared to take a PyObject*,
> and if you need to use it, cast it to an object if it's not NULL
> (maybe using None if it is).


Thanks for the replies. I just happened to be running the latest
cython-devel and I was horrified that the profiler just segfaulted for
me. Fortunately it was trivial to find the problem using gdb.

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

Reply via email to