]> granicus.if.org Git - python/commitdiff
Another refleak, this time in PyLong_AsLong. Fixes leaks showing in
authorGeorg Brandl <georg@python.org>
Mon, 26 Feb 2007 14:46:30 +0000 (14:46 +0000)
committerGeorg Brandl <georg@python.org>
Mon, 26 Feb 2007 14:46:30 +0000 (14:46 +0000)
test_getargs2 and test_email.

Objects/longobject.c

index 22d4741bcdcb762e1bc328eeba7e1c28fe8b877e..3b4a6756a09b6181274284c2e8981d7abef300e7 100644 (file)
@@ -298,6 +298,7 @@ PyLong_AsLong(PyObject *vv)
        /* This version by Tim Peters */
        register PyLongObject *v;
        unsigned long x, prev;
+       long res;
        Py_ssize_t i;
        int sign;
        int do_decref = 0; /* if nb_int was called */
@@ -326,46 +327,55 @@ PyLong_AsLong(PyObject *vv)
                }
        }
 
+       res = -1;
        v = (PyLongObject *)vv;
        i = v->ob_size;
+
        switch (i) {
-       case -1: return -v->ob_digit[0];
-       case 0: return 0;
-       case 1: return v->ob_digit[0];
-       }
-       sign = 1;
-       x = 0;
-       if (i < 0) {
-               sign = -1;
-               i = -(i);
-       }
-       while (--i >= 0) {
-               prev = x;
-               x = (x << SHIFT) + v->ob_digit[i];
-               if ((x >> SHIFT) != prev)
-                       goto overflow;
-       }
-       if (do_decref) {
-               Py_DECREF(vv);
-       }
-       /* Haven't lost any bits, but casting to long requires extra care
-        * (see comment above).
-         */
-       if (x <= (unsigned long)LONG_MAX) {
-               return (long)x * sign;
-       }
-       else if (sign < 0 && x == PY_ABS_LONG_MIN) {
-               return LONG_MIN;
+       case -1:
+               res = -v->ob_digit[0];
+               break;
+       case 0:
+               res = 0;
+               break;
+       case 1:
+               res = v->ob_digit[0];
+               break;
+       default:
+               sign = 1;
+               x = 0;
+               if (i < 0) {
+                       sign = -1;
+                       i = -(i);
+               }
+               while (--i >= 0) {
+                       prev = x;
+                       x = (x << SHIFT) + v->ob_digit[i];
+                       if ((x >> SHIFT) != prev) {
+                               PyErr_SetString(PyExc_OverflowError,
+                                       "Python int too large to convert to C long");
+                               goto exit;
+                       }
+               }
+               /* Haven't lost any bits, but casting to long requires extra care
+                * (see comment above).
+                */
+               if (x <= (unsigned long)LONG_MAX) {
+                       res = (long)x * sign;
+               }
+               else if (sign < 0 && x == PY_ABS_LONG_MIN) {
+                       res = LONG_MIN;
+               }
+               else {
+                       PyErr_SetString(PyExc_OverflowError,
+                               "Python int too large to convert to C long");
+               }       
        }
-       /* else overflow */
-
- overflow:
+ exit:
        if (do_decref) {
                Py_DECREF(vv);
        }
-       PyErr_SetString(PyExc_OverflowError,
-                       "Python int too large to convert to C long");
-       return -1;
+       return res;
 }
 
 int