Antoine Pitrou wrote: > Stefan Behnel <stefan_ml <at> behnel.de> 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 _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com