Martin v. Löwis wrote:
>> To me, the killer feature would be that in C++ you can implement a smart
>> pointer which takes care of incref/decref automatically for 99% of the code.
>> This would be a terrific tool for the extension/core writers.
>
> Of course, this would also break in presence of binary-incompatible
> compilers, in particular when it relates to exception handling.
Details? Is that a problem, given that you can't compile Python core and
extensions with different MSVC versions?
We could also avoid the smart pointer, but use cleanups anyway. For example:
struct ScopedIncRef
{
public:
ScopedIncRef(PyObject *o) { Py_INCREF(o); }
~ScopedIncRef() { Py_DECREF(o); }
};
#define WITH_INCREF(o)
for (ScopedIncRef _sc_ = ScopedIncRef(o), \
bool _stat_ = true; \
_stat_; \
_stat_ = false)
Usage:
WITH_INCREF(o)
// do something with o
or:
WITH_INCREF(o)
{
// do
// something
// with o
}
A variadic version of this macro is also possible, of course:
WITH_INCREF(o1,o2,o3)
// do something with them
(even if it requires using compiler-specific preprocessor extensions,
available at least on MSVC and GCC).
--
Giovanni Bajo
_______________________________________________
Python-3000 mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-3000
Unsubscribe:
http://mail.python.org/mailman/options/python-3000/archive%40mail-archive.com