[Python-Dev] RE: [Python-checkins] python/dist/src/Objects typeobject.c, 2.244, 2.245

Guido van Rossum guido at python.org
Wed Oct 8 23:45:45 EDT 2003


> 	if (res == -1 && PyErr_Occurred())
> 		return NULL;
> ! 	return PyInt_FromLong((long)res);
> }
>> --- 3577,3583 ----
> 	if (res == -1 && PyErr_Occurred())
> 		return NULL;
> ! 	ret = PyObject_IsTrue(PyInt_FromLong((long)res)) ? Py_True :
> Py_False;
>>> The line above leaks and does unnecessary work. I believe it should
> read:
>> 	ret = res ? Py_True : Py_False;

Ai. I did the review while only half awake. :-)
But the correct thing to do is to use PyBool_FromLong(res); there's
really no need to inline what that function does.
> Also, there is another one of these in Objects/descrobject.c line 712.

I'll fix that one while I'm at it.
BTW, I notice there are a bunch of uses of PyBool_FromLong() that are
preceded by something like "if (res < 0) return NULL;" (or "!= -1").
Maybe PyBool_FromLong() itself could make this unneeded by adding
something like
 if (ok < 0 && PyErr_Occurred())
 return NULL;
to its start?
And, while we're reviewing usage patterns of PyBool_FromLong(), the
string and unicode types are full of places where it is called by a
return statement with a constant 1 or 0 as argument. This seems
wasteful to me; I imagine that
 Py_INCREF(Py_True);
 return Py_True;
takes less time than
 return PyBool_FromLong(1);
Maybe a pair of macros Py_return_True and Py_return_False would make
sense?
--Guido van Rossum (home page: http://www.python.org/~guido/)


More information about the Python-Dev mailing list

AltStyle によって変換されたページ (->オリジナル) /