(original) (raw)
changeset: 101664:c21bf38a9d07 user: Serhiy Storchaka storchaka@gmail.com date: Sat Jun 04 00:06:45 2016 +0300 files: Objects/longobject.c description: Issue #27073: Removed redundant checks in long_add and long_sub. Patch by Oren Milman. diff -r 8b6b6add8e47 -r c21bf38a9d07 Objects/longobject.c --- a/Objects/longobject.c Fri Jun 03 15:40:29 2016 -0400 +++ b/Objects/longobject.c Sat Jun 04 00:06:45 2016 +0300 @@ -3022,8 +3022,14 @@ if (Py_SIZE(a) < 0) { if (Py_SIZE(b) < 0) { z = x_add(a, b); - if (z != NULL && Py_SIZE(z) != 0) + if (z != NULL) { + /* x_add received at least one multiple-digit int, + and thus z must be a multiple-digit int. + That also means z is not an element of + small_ints, so negating it in-place is safe. */ + assert(Py_REFCNT(z) == 1); Py_SIZE(z) = -(Py_SIZE(z)); + } } else z = x_sub(b, a); @@ -3054,8 +3060,10 @@ z = x_sub(a, b); else z = x_add(a, b); - if (z != NULL && Py_SIZE(z) != 0) + if (z != NULL) { + assert(Py_SIZE(z) == 0 || Py_REFCNT(z) == 1); Py_SIZE(z) = -(Py_SIZE(z)); + } } else { if (Py_SIZE(b) < 0) /storchaka@gmail.com