Remove size constraints in SLICE opcodes.

This commit is contained in:
Martin v. Löwis 2006-02-17 15:57:41 +00:00
parent 5c97c798d2
commit dde99d2633
2 changed files with 14 additions and 19 deletions

View File

@ -1170,7 +1170,7 @@ instance_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j)
return NULL; return NULL;
arg = Py_BuildValue("(N)", sliceobj_from_intint(i, j)); arg = Py_BuildValue("(N)", sliceobj_from_intint(i, j));
} else } else
arg = Py_BuildValue("(ii)", i, j); arg = Py_BuildValue("(nn)", i, j);
if (arg == NULL) { if (arg == NULL) {
Py_DECREF(func); Py_DECREF(func);
@ -1241,7 +1241,7 @@ instance_ass_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j, PyObject
arg = Py_BuildValue("(N)", arg = Py_BuildValue("(N)",
sliceobj_from_intint(i, j)); sliceobj_from_intint(i, j));
} else } else
arg = Py_BuildValue("(ii)", i, j); arg = Py_BuildValue("(nn)", i, j);
} }
else { else {
if (setslicestr == NULL) if (setslicestr == NULL)
@ -1262,7 +1262,7 @@ instance_ass_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j, PyObject
arg = Py_BuildValue("(NO)", arg = Py_BuildValue("(NO)",
sliceobj_from_intint(i, j), value); sliceobj_from_intint(i, j), value);
} else } else
arg = Py_BuildValue("(iiO)", i, j, value); arg = Py_BuildValue("(nnO)", i, j, value);
} }
if (arg == NULL) { if (arg == NULL) {
Py_DECREF(func); Py_DECREF(func);

View File

@ -3851,8 +3851,9 @@ ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
} }
/* Extract a slice index from a PyInt or PyLong, and store in *pi. /* Extract a slice index from a PyInt or PyLong, and store in *pi.
Silently reduce values larger than INT_MAX to INT_MAX, and silently Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
boost values less than -INT_MAX to 0. Return 0 on error, 1 on success. and silently boost values less than -PY_SSIZE_T_MAX to 0.
Return 0 on error, 1 on success.
*/ */
/* Note: If v is NULL, return success without storing into *pi. This /* Note: If v is NULL, return success without storing into *pi. This
is because_PyEval_SliceIndex() is called by apply_slice(), which can be is because_PyEval_SliceIndex() is called by apply_slice(), which can be
@ -3862,11 +3863,11 @@ int
_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi) _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
{ {
if (v != NULL) { if (v != NULL) {
long x; Py_ssize_t x;
if (PyInt_Check(v)) { if (PyInt_Check(v)) {
x = PyInt_AsLong(v); x = PyInt_AsLong(v);
} else if (PyLong_Check(v)) { } else if (PyLong_Check(v)) {
x = PyLong_AsLong(v); x = PyInt_AsSsize_t(v);
if (x==-1 && PyErr_Occurred()) { if (x==-1 && PyErr_Occurred()) {
PyObject *long_zero; PyObject *long_zero;
int cmp; int cmp;
@ -3883,8 +3884,8 @@ _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
/* It's an overflow error, so we need to /* It's an overflow error, so we need to
check the sign of the long integer, check the sign of the long integer,
set the value to INT_MAX or -INT_MAX, set the value to PY_SSIZE_T_MAX or
and clear the error. */ -PY_SSIZE_T_MAX, and clear the error. */
/* Create a long integer with a value of 0 */ /* Create a long integer with a value of 0 */
long_zero = PyLong_FromLong(0L); long_zero = PyLong_FromLong(0L);
@ -3898,21 +3899,15 @@ _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
if (cmp < 0) if (cmp < 0)
return 0; return 0;
else if (cmp) else if (cmp)
x = INT_MAX; x = PY_SSIZE_T_MAX;
else else
x = -INT_MAX; x = -PY_SSIZE_T_MAX;
} }
} else { } else {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
"slice indices must be integers"); "slice indices must be integers");
return 0; return 0;
} }
/* Truncate -- very long indices are truncated anyway */
/* XXX truncate by ssize maximum */
if (x > INT_MAX)
x = INT_MAX;
else if (x < -INT_MAX)
x = -INT_MAX;
*pi = x; *pi = x;
} }
return 1; return 1;
@ -3928,7 +3923,7 @@ apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
PySequenceMethods *sq = tp->tp_as_sequence; PySequenceMethods *sq = tp->tp_as_sequence;
if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) { if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
Py_ssize_t ilow = 0, ihigh = INT_MAX; Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
if (!_PyEval_SliceIndex(v, &ilow)) if (!_PyEval_SliceIndex(v, &ilow))
return NULL; return NULL;
if (!_PyEval_SliceIndex(w, &ihigh)) if (!_PyEval_SliceIndex(w, &ihigh))
@ -3955,7 +3950,7 @@ assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
PySequenceMethods *sq = tp->tp_as_sequence; PySequenceMethods *sq = tp->tp_as_sequence;
if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) { if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) {
Py_ssize_t ilow = 0, ihigh = INT_MAX; Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
if (!_PyEval_SliceIndex(v, &ilow)) if (!_PyEval_SliceIndex(v, &ilow))
return -1; return -1;
if (!_PyEval_SliceIndex(w, &ihigh)) if (!_PyEval_SliceIndex(w, &ihigh))