
Hello,
I am attempting to write a python extension in C to "glue" the ASIO SDK to python 2.5.4. However I am really confused about reference counts. Below is a code snippet that "seems" to work, however I suspect that some of the object reference counts have been incremented too many times.
static PyObject *
getAsioInfo(PyObject *self, PyObject *args) {
PyObject *dict = Py_None;
if (loadAsioDriver (ASIO_DRIVER_NAME)) {
if (ASIOInit (&asioDriverInfo.driverInfo) == ASE_OK){
dict = PyDict_New();
PyDict_SetItem(dict,
PyString_FromString("asioVersion"),
PyInt_FromLong(asioDriverInfo.driverInfo.asioVersion) );
PyDict_SetItem(dict,
PyString_FromString("driverName"),
PyString_FromString(asioDriverInfo.driverInfo.name) );
return dict;
}
}
return Null;
}
As nearly as I can tell from the Python source code, PyDict_SetItem will do a Py_INCREF on both the key and value parameters. However, it looks as if PyInt_FromLong will incref the object it is returning - at least if it is a "small value". Am I on the right track here? Or am I better off doing something like:
PyObject *str, *lng;
str = PyString_FromString("asioVersion");
lng = PyInt_FromLong(asioDriverInfo.driverInfo.asioVersion)
);
PyDict_SetItem(dict, str, lng);
Py_DECREF(str);
Py_DECREF(lng);
Thanks in advance for all advice!
Dan Colesworthy