[Python-Dev] Py_BuildValue and decref (original) (raw)
Mihai Ibanescu misa at redhat.com
Sat Sep 9 00:35:58 CEST 2006
- Previous message: [Python-Dev] Py_BuildValue and decref
- Next message: [Python-Dev] Py_BuildValue and decref
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On Fri, Sep 08, 2006 at 06:27:08PM -0400, Barry Warsaw wrote:
On Sep 8, 2006, at 6:06 PM, Mihai Ibanescu wrote: >There is no description of what happens when PyBuildValue fails. >Will it >decref the python object passed in? Will it not? I just want to point out that the C API documentation is pretty silent about the refcounting side-effects in error conditions (and often in success conditions too) of most Python functions. For example, what is the refcounting side-effects of PyDictSetItem() on val? What about if that function fails? Has val been incref'd or not? What about the side-effects on any value the new one replaces, both in success and failure?
In this particular case, it doesn't decref it (or so I read the code). Relevant code is in do_mkvalue from Python/modsupport.c
case 'N':
case 'S':
case 'O':
if (**p_format == '&') {
typedef PyObject *(*converter)(void *);
converter func = va_arg(*p_va, converter);
void *arg = va_arg(*p_va, void *);
++*p_format;
return (*func)(arg);
}
else {
PyObject *v;
v = va_arg(*p_va, PyObject *);
if (v != NULL) {
if (*(*p_format - 1) != 'N')
Py_INCREF(v);
}
else if (!PyErr_Occurred())
/* If a NULL was passed
* because a call that should
* have constructed a value
* failed, that's OK, and we
* pass the error on; but if
* no error occurred it's not
* clear that the caller knew
* what she was doing. */
PyErr_SetString(PyExc_SystemError,
"NULL object passed to
Py_BuildValue"); return v; }
Barry, where can I ship you my cloning machine? :-)
Misa
- Previous message: [Python-Dev] Py_BuildValue and decref
- Next message: [Python-Dev] Py_BuildValue and decref
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]