Author: georg.brandl
Date: Mon Feb 26 15:46:30 2007
New Revision: 53939

Modified:
   python/branches/p3yk/Objects/longobject.c
Log:
Another refleak, this time in PyLong_AsLong. Fixes leaks showing in
test_getargs2 and test_email.



Modified: python/branches/p3yk/Objects/longobject.c
==============================================================================
--- python/branches/p3yk/Objects/longobject.c   (original)
+++ python/branches/p3yk/Objects/longobject.c   Mon Feb 26 15:46:30 2007
@@ -298,6 +298,7 @@
        /* 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 @@
                }
        }
 
+       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
_______________________________________________
Python-3000-checkins mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-3000-checkins

Reply via email to