mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Wrap multiline macros in a 'do {} while(0)', for safety.
This commit is contained in:
parent
fda8d114ea
commit
43ca377e45
1 changed files with 43 additions and 37 deletions
|
@ -32,10 +32,12 @@
|
||||||
#define MIN(x, y) ((x) > (y) ? (y) : (x))
|
#define MIN(x, y) ((x) > (y) ? (y) : (x))
|
||||||
|
|
||||||
#define SIGCHECK(PyTryBlock) \
|
#define SIGCHECK(PyTryBlock) \
|
||||||
|
do { \
|
||||||
if (--_Py_Ticker < 0) { \
|
if (--_Py_Ticker < 0) { \
|
||||||
_Py_Ticker = _Py_CheckInterval; \
|
_Py_Ticker = _Py_CheckInterval; \
|
||||||
if (PyErr_CheckSignals()) PyTryBlock \
|
if (PyErr_CheckSignals()) PyTryBlock \
|
||||||
}
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
/* Normalize (remove leading zeros from) a long int object.
|
/* Normalize (remove leading zeros from) a long int object.
|
||||||
Doesn't attempt to free the storage--in most cases, due to the nature
|
Doesn't attempt to free the storage--in most cases, due to the nature
|
||||||
|
@ -1152,10 +1154,12 @@ convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CONVERT_BINOP(v, w, a, b) \
|
#define CONVERT_BINOP(v, w, a, b) \
|
||||||
|
do { \
|
||||||
if (!convert_binop(v, w, a, b)) { \
|
if (!convert_binop(v, w, a, b)) { \
|
||||||
Py_INCREF(Py_NotImplemented); \
|
Py_INCREF(Py_NotImplemented); \
|
||||||
return Py_NotImplemented; \
|
return Py_NotImplemented; \
|
||||||
}
|
} \
|
||||||
|
} while(0) \
|
||||||
|
|
||||||
/* bits_in_digit(d) returns the unique integer k such that 2**(k-1) <= d <
|
/* bits_in_digit(d) returns the unique integer k such that 2**(k-1) <= d <
|
||||||
2**k if d is nonzero, else 0. */
|
2**k if d is nonzero, else 0. */
|
||||||
|
@ -1371,7 +1375,7 @@ long_to_decimal_string(PyObject *aa, int addL)
|
||||||
SIGCHECK({
|
SIGCHECK({
|
||||||
Py_DECREF(scratch);
|
Py_DECREF(scratch);
|
||||||
return NULL;
|
return NULL;
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
/* pout should have at least one digit, so that the case when a = 0
|
/* pout should have at least one digit, so that the case when a = 0
|
||||||
works correctly */
|
works correctly */
|
||||||
|
@ -1540,7 +1544,7 @@ _PyLong_Format(PyObject *aa, int base, int addL, int newstyle)
|
||||||
Py_DECREF(scratch);
|
Py_DECREF(scratch);
|
||||||
Py_DECREF(str);
|
Py_DECREF(str);
|
||||||
return NULL;
|
return NULL;
|
||||||
})
|
});
|
||||||
|
|
||||||
/* Break rem into digits. */
|
/* Break rem into digits. */
|
||||||
assert(ntostore > 0);
|
assert(ntostore > 0);
|
||||||
|
@ -2121,7 +2125,7 @@ x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
|
||||||
Py_DECREF(v);
|
Py_DECREF(v);
|
||||||
*prem = NULL;
|
*prem = NULL;
|
||||||
return NULL;
|
return NULL;
|
||||||
})
|
});
|
||||||
|
|
||||||
/* estimate quotient digit q; may overestimate by 1 (rare) */
|
/* estimate quotient digit q; may overestimate by 1 (rare) */
|
||||||
vtop = vk[size_w];
|
vtop = vk[size_w];
|
||||||
|
@ -2578,7 +2582,7 @@ x_mul(PyLongObject *a, PyLongObject *b)
|
||||||
SIGCHECK({
|
SIGCHECK({
|
||||||
Py_DECREF(z);
|
Py_DECREF(z);
|
||||||
return NULL;
|
return NULL;
|
||||||
})
|
});
|
||||||
|
|
||||||
carry = *pz + f * f;
|
carry = *pz + f * f;
|
||||||
*pz++ = (digit)(carry & PyLong_MASK);
|
*pz++ = (digit)(carry & PyLong_MASK);
|
||||||
|
@ -2616,7 +2620,7 @@ x_mul(PyLongObject *a, PyLongObject *b)
|
||||||
SIGCHECK({
|
SIGCHECK({
|
||||||
Py_DECREF(z);
|
Py_DECREF(z);
|
||||||
return NULL;
|
return NULL;
|
||||||
})
|
});
|
||||||
|
|
||||||
while (pb < pbend) {
|
while (pb < pbend) {
|
||||||
carry += *pz + *pb++ * f;
|
carry += *pz + *pb++ * f;
|
||||||
|
@ -3475,26 +3479,28 @@ long_pow(PyObject *v, PyObject *w, PyObject *x)
|
||||||
* is NULL.
|
* is NULL.
|
||||||
*/
|
*/
|
||||||
#define REDUCE(X) \
|
#define REDUCE(X) \
|
||||||
|
do { \
|
||||||
if (c != NULL) { \
|
if (c != NULL) { \
|
||||||
if (l_divmod(X, c, NULL, &temp) < 0) \
|
if (l_divmod(X, c, NULL, &temp) < 0) \
|
||||||
goto Error; \
|
goto Error; \
|
||||||
Py_XDECREF(X); \
|
Py_XDECREF(X); \
|
||||||
X = temp; \
|
X = temp; \
|
||||||
temp = NULL; \
|
temp = NULL; \
|
||||||
}
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
/* Multiply two values, then reduce the result:
|
/* Multiply two values, then reduce the result:
|
||||||
result = X*Y % c. If c is NULL, skip the mod. */
|
result = X*Y % c. If c is NULL, skip the mod. */
|
||||||
#define MULT(X, Y, result) \
|
#define MULT(X, Y, result) \
|
||||||
{ \
|
do { \
|
||||||
temp = (PyLongObject *)long_mul(X, Y); \
|
temp = (PyLongObject *)long_mul(X, Y); \
|
||||||
if (temp == NULL) \
|
if (temp == NULL) \
|
||||||
goto Error; \
|
goto Error; \
|
||||||
Py_XDECREF(result); \
|
Py_XDECREF(result); \
|
||||||
result = temp; \
|
result = temp; \
|
||||||
temp = NULL; \
|
temp = NULL; \
|
||||||
REDUCE(result) \
|
REDUCE(result); \
|
||||||
}
|
} while(0)
|
||||||
|
|
||||||
if (Py_SIZE(b) <= FIVEARY_CUTOFF) {
|
if (Py_SIZE(b) <= FIVEARY_CUTOFF) {
|
||||||
/* Left-to-right binary exponentiation (HAC Algorithm 14.79) */
|
/* Left-to-right binary exponentiation (HAC Algorithm 14.79) */
|
||||||
|
@ -3503,9 +3509,9 @@ long_pow(PyObject *v, PyObject *w, PyObject *x)
|
||||||
digit bi = b->ob_digit[i];
|
digit bi = b->ob_digit[i];
|
||||||
|
|
||||||
for (j = (digit)1 << (PyLong_SHIFT-1); j != 0; j >>= 1) {
|
for (j = (digit)1 << (PyLong_SHIFT-1); j != 0; j >>= 1) {
|
||||||
MULT(z, z, z)
|
MULT(z, z, z);
|
||||||
if (bi & j)
|
if (bi & j)
|
||||||
MULT(z, a, z)
|
MULT(z, a, z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3514,7 +3520,7 @@ long_pow(PyObject *v, PyObject *w, PyObject *x)
|
||||||
Py_INCREF(z); /* still holds 1L */
|
Py_INCREF(z); /* still holds 1L */
|
||||||
table[0] = z;
|
table[0] = z;
|
||||||
for (i = 1; i < 32; ++i)
|
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) {
|
for (i = Py_SIZE(b) - 1; i >= 0; --i) {
|
||||||
const digit bi = b->ob_digit[i];
|
const digit bi = b->ob_digit[i];
|
||||||
|
@ -3522,9 +3528,9 @@ long_pow(PyObject *v, PyObject *w, PyObject *x)
|
||||||
for (j = PyLong_SHIFT - 5; j >= 0; j -= 5) {
|
for (j = PyLong_SHIFT - 5; j >= 0; j -= 5) {
|
||||||
const int index = (bi >> j) & 0x1f;
|
const int index = (bi >> j) & 0x1f;
|
||||||
for (k = 0; k < 5; ++k)
|
for (k = 0; k < 5; ++k)
|
||||||
MULT(z, z, z)
|
MULT(z, z, z);
|
||||||
if (index)
|
if (index)
|
||||||
MULT(z, table[index], z)
|
MULT(z, table[index], z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue