[New-bugs-announce] [issue37812] Make implicit returns explicit in longobject.c (in CHECK_SMALL_INT)
Greg Price
report at bugs.python.org
Sat Aug 10 17:07:30 EDT 2019
New submission from Greg Price <gnprice at gmail.com>:
In longobject.c we have the following usage a few times:
PyObject *
PyLong_FromLong(long ival)
{
PyLongObject *v;
// ... more locals ...
CHECK_SMALL_INT(ival);
if (ival < 0) {
/* negate: can't write this as abs_ival = -ival since that
invokes undefined behaviour when ival is LONG_MIN */
abs_ival = 0U-(unsigned long)ival;
sign = -1;
}
else {
// ... etc. etc.
The CHECK_SMALL_INT macro contains a `return`, so the function can actually return before it reaches any of the other code.
#define CHECK_SMALL_INT(ival) \
do if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { \
return get_small_int((sdigit)ival); \
} while(0)
That's not even an error condition -- in fact it's the fast, hopefully reasonably-common, path.
An implicit return like this is pretty surprising for the reader. And it only takes one more line (plus a close-brace) to make it explicit:
if (IS_SMALL_INT(ival)) {
return get_small_int((sdigit)ival);
}
so that seems like a much better trade.
Patch written, will post shortly.
----------
components: Interpreter Core
messages: 349359
nosy: Greg Price
priority: normal
severity: normal
status: open
title: Make implicit returns explicit in longobject.c (in CHECK_SMALL_INT)
versions: Python 3.9
_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue37812>
_______________________________________
More information about the New-bugs-announce
mailing list