[issue7353] cporting docs recommend using Include/intobject.h, which was removed in 3.1?
Eric Smith
report at bugs.python.org
Mon Nov 23 13:24:15 CET 2009
Eric Smith <eric at trueblade.com> added the comment:
MvL made this comment in
http://www.mail-archive.com/python-dev@python.org/msg43844.html
I'm copying it here so it doesn't get lost and because I think he makes
a good point that many people would miss (at least I didn't think of it).
-----------------------------------------------
The macros (unfortunately) allowed
to make non-obvious mistakes. Now that they are gone, people need to
really think of what precisely they want to do.
For example, consider
if (PyInt_Check(o)){
long val = PyInt_AsLong(o);
// process
} else if (PyLong_Check(o)) {
long long val = PyLong_AsLongLong(o);
// check for overflow
// process
}
With intobject.h, this code would continue to compile, but work
incorrectly, as the second case will never be executed. It would
be better to port this as
#if Py2.x
if (PyInt_Check(o)){
long val = PyInt_AsLong(o);
// process
} else
#endif
if (PyLong_Check(o)) {
i.e. eliminating the int case altogether. For another example,
long foo = PyInt_AsLong(Foo);
has a hidden error in 3.x, with intobject: PyLong_AsLong might
overflow, which the 2.x case doesn't.
So eliminating intobject.h likely helps avoiding subtle errors.
Regards,
Martin
----------
nosy: +eric.smith
_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue7353>
_______________________________________
More information about the Python-bugs-list
mailing list