diff options
author | Mark Dickinson <dickinsm@gmail.com> | 2010-05-10 21:37:34 (GMT) |
---|---|---|
committer | Mark Dickinson <dickinsm@gmail.com> | 2010-05-10 21:37:34 (GMT) |
commit | cdd01d2ddb2e3cd5a86a04d7abdabdcd64be6590 (patch) | |
tree | 9f692bda248d1fbe4ce8c0079cc5f7667aba72ec /Objects/longobject.c | |
parent | 22b20183d514df7c2c491927ed0f5c0aa135b980 (diff) | |
download | cpython-cdd01d2ddb2e3cd5a86a04d7abdabdcd64be6590.zip cpython-cdd01d2ddb2e3cd5a86a04d7abdabdcd64be6590.tar.gz cpython-cdd01d2ddb2e3cd5a86a04d7abdabdcd64be6590.tar.bz2 |
Merged revisions 81037 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r81037 | mark.dickinson | 2010-05-09 21:42:09 +0100 (Sun, 09 May 2010) | 1 line
Wrap multiline macros in a 'do {} while(0)', for safety.
........
Diffstat (limited to 'Objects/longobject.c')
-rw-r--r-- | Objects/longobject.c | 72 |
1 files changed, 39 insertions, 33 deletions
diff --git a/Objects/longobject.c b/Objects/longobject.c index ca069f6..850396b 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -95,8 +95,10 @@ maybe_small_long(PyLongObject *v) #define MAX(x, y) ((x) < (y) ? (y) : (x)) #define MIN(x, y) ((x) > (y) ? (y) : (x)) -#define SIGCHECK(PyTryBlock) \ - if (PyErr_CheckSignals()) PyTryBlock \ +#define SIGCHECK(PyTryBlock) \ + do { \ + if (PyErr_CheckSignals()) PyTryBlock \ + } while(0) /* Normalize (remove leading zeros from) a long int object. Doesn't attempt to free the storage--in most cases, due to the nature @@ -1379,11 +1381,13 @@ PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow) #endif /* HAVE_LONG_LONG */ -#define CHECK_BINOP(v,w) \ - if (!PyLong_Check(v) || !PyLong_Check(w)) { \ - Py_INCREF(Py_NotImplemented); \ - return Py_NotImplemented; \ - } +#define CHECK_BINOP(v,w) \ + do { \ + if (!PyLong_Check(v) || !PyLong_Check(w)) { \ + Py_INCREF(Py_NotImplemented); \ + return Py_NotImplemented; \ + } \ + } while(0) /* bits_in_digit(d) returns the unique integer k such that 2**(k-1) <= d < 2**k if d is nonzero, else 0. */ @@ -1599,7 +1603,7 @@ long_to_decimal_string(PyObject *aa) SIGCHECK({ Py_DECREF(scratch); return NULL; - }) + }); } /* pout should have at least one digit, so that the case when a = 0 works correctly */ @@ -2274,7 +2278,7 @@ x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem) Py_DECREF(v); *prem = NULL; return NULL; - }) + }); /* estimate quotient digit q; may overestimate by 1 (rare) */ vtop = vk[size_w]; @@ -2768,7 +2772,7 @@ x_mul(PyLongObject *a, PyLongObject *b) SIGCHECK({ Py_DECREF(z); return NULL; - }) + }); carry = *pz + f * f; *pz++ = (digit)(carry & PyLong_MASK); @@ -2806,7 +2810,7 @@ x_mul(PyLongObject *a, PyLongObject *b) SIGCHECK({ Py_DECREF(z); return NULL; - }) + }); while (pb < pbend) { carry += *pz + *pb++ * f; @@ -3645,26 +3649,28 @@ long_pow(PyObject *v, PyObject *w, PyObject *x) * is NULL. */ #define REDUCE(X) \ - if (c != NULL) { \ - if (l_divmod(X, c, NULL, &temp) < 0) \ - goto Error; \ - Py_XDECREF(X); \ - X = temp; \ - temp = NULL; \ - } + do { \ + if (c != NULL) { \ + if (l_divmod(X, c, NULL, &temp) < 0) \ + goto Error; \ + Py_XDECREF(X); \ + X = temp; \ + temp = NULL; \ + } \ + } while(0) /* Multiply two values, then reduce the result: result = X*Y % c. If c is NULL, skip the mod. */ -#define MULT(X, Y, result) \ -{ \ - temp = (PyLongObject *)long_mul(X, Y); \ - if (temp == NULL) \ - goto Error; \ - Py_XDECREF(result); \ - result = temp; \ - temp = NULL; \ - REDUCE(result) \ -} +#define MULT(X, Y, result) \ + do { \ + temp = (PyLongObject *)long_mul(X, Y); \ + if (temp == NULL) \ + goto Error; \ + Py_XDECREF(result); \ + result = temp; \ + temp = NULL; \ + REDUCE(result); \ + } while(0) if (Py_SIZE(b) <= FIVEARY_CUTOFF) { /* Left-to-right binary exponentiation (HAC Algorithm 14.79) */ @@ -3673,9 +3679,9 @@ long_pow(PyObject *v, PyObject *w, PyObject *x) digit bi = b->ob_digit[i]; for (j = (digit)1 << (PyLong_SHIFT-1); j != 0; j >>= 1) { - MULT(z, z, z) + MULT(z, z, z); if (bi & j) - MULT(z, a, z) + MULT(z, a, z); } } } @@ -3684,7 +3690,7 @@ long_pow(PyObject *v, PyObject *w, PyObject *x) Py_INCREF(z); /* still holds 1L */ table[0] = z; for (i = 1; i < 32; ++i) - MULT(table[i-1], a, table[i]) + MULT(table[i-1], a, table[i]); for (i = Py_SIZE(b) - 1; i >= 0; --i) { const digit bi = b->ob_digit[i]; @@ -3692,9 +3698,9 @@ long_pow(PyObject *v, PyObject *w, PyObject *x) for (j = PyLong_SHIFT - 5; j >= 0; j -= 5) { const int index = (bi >> j) & 0x1f; for (k = 0; k < 5; ++k) - MULT(z, z, z) + MULT(z, z, z); if (index) - MULT(z, table[index], z) + MULT(z, table[index], z); } } } |