Mailing List Archive

python/dist/src/Objects object.c,2.172,2.173
Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv4739

Modified Files:
object.c
Log Message:
PyNumber_CoerceEx: this took a shortcut (not doing anything) when the
left and right type were of the same type and not classic instances.

This shortcut is dangerous for proxy types, because it means that
coerce(Proxy(1), Proxy(2.1)) leaves Proxy(1) unchanged rather than
turning it into Proxy(1.0).

In an ever-so-slight change of semantics, I now only take the shortcut
when the left and right types are of the same type and don't have the
CHECKTYPES feature. It so happens that classic instances have this
flag, so the shortcut is still skipped in this case (i.e. nothing
changes for classic instances). Proxies also have this flag set
(otherwise implementing numeric operations on proxies would become
nightmarish) and this means that the shortcut is also skipped there,
as desired. It so happens that int, long and float also have this
flag set; that means that e.g. coerce(1, 1) will now invoke
int_coerce(). This is fine: int_coerce() can deal with this, and I'm
not worried about the performance; int_coerce() is only invoked when
the user explicitly calls coerce(), which should be rarer than rare.


Index: object.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/object.c,v
retrieving revision 2.172
retrieving revision 2.173
diff -C2 -d -r2.172 -r2.173
*** object.c 12 Apr 2002 07:22:56 -0000 2.172
--- object.c 26 Apr 2002 02:46:00 -0000 2.173
***************
*** 1428,1432 ****
int res;

! if (v->ob_type == w->ob_type && !PyInstance_Check(v)) {
Py_INCREF(v);
Py_INCREF(w);
--- 1428,1435 ----
int res;

! /* Shortcut only for old-style types */
! if (v->ob_type == w->ob_type &&
! !PyType_HasFeature(v->ob_type, Py_TPFLAGS_CHECKTYPES))
! {
Py_INCREF(v);
Py_INCREF(w);