Antoine Pitrou wrote:
Stefan Behnel
writes: BTW, I noticed that the code in typeobject.c uses "DECREF before set" two times, like this:
method_cache[h].version = type->tp_version_tag; method_cache[h].value = res; /* borrowed */ Py_INCREF(name); Py_DECREF(method_cache[h].name); method_cache[h].name = name;
Since this is so common, would it be useful to define a macro for the correct construct?
Something like
#define Py_SETREF(var, obj) \ { PyObject *tmp = (var); Py_INCREF(obj); \ (var) = (obj); Py_XDECREF(tmp); }
Or, if we want to allow more optimizations, make two versions of it:
#define Py_SETREF(var, obj) \ { PyObject *tmp = (var); Py_INCREF(obj); \ (var) = (obj); Py_DECREF(tmp); }
#define Py_XSETREF(var, obj) \ { PyObject *tmp = (var); Py_INCREF(obj); \ (var) = (obj); Py_XDECREF(tmp); }
Both sound like a good idea to me. Having to think about whether or not DECREF poses a problem in a specific case is just cumbersome. Stefan