diff options
author | Guido van Rossum <guido@python.org> | 1998-05-22 00:52:29 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1998-05-22 00:52:29 (GMT) |
commit | 7e33c6e89673afd4791f35aef6893a04b0218849 (patch) | |
tree | 8a524d76838cd5d9b920d5ee498a4af2d9210304 | |
parent | 09df08a105c054a82c1c3d52efa2a21553c0b4d1 (diff) | |
download | cpython-7e33c6e89673afd4791f35aef6893a04b0218849.zip cpython-7e33c6e89673afd4791f35aef6893a04b0218849.tar.gz cpython-7e33c6e89673afd4791f35aef6893a04b0218849.tar.bz2 |
Moved cmp_member() to abstract.c, as PySequence_Contains() [with
swapped arguments].
Also make sure that no use of a function pointer gotten from a
tp_as_sequence or tp_as_mapping structure is made without checking it
for NULL first.
-rw-r--r-- | Python/ceval.c | 55 |
1 files changed, 2 insertions, 53 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index cffe89a..5aed5ff 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -84,7 +84,6 @@ static int slice_index Py_PROTO((PyObject *, int *)); static PyObject *apply_slice Py_PROTO((PyObject *, PyObject *, PyObject *)); static int assign_slice Py_PROTO((PyObject *, PyObject *, PyObject *, PyObject *)); -static int cmp_member Py_PROTO((PyObject *, PyObject *)); static PyObject *cmp_outcome Py_PROTO((int, PyObject *, PyObject *)); static int import_from Py_PROTO((PyObject *, PyObject *, PyObject *)); static PyObject *build_class Py_PROTO((PyObject *, PyObject *, PyObject *)); @@ -2496,7 +2495,7 @@ loop_subscript(v, w) { PySequenceMethods *sq = v->ob_type->tp_as_sequence; int i; - if (sq == NULL) { + if (sq == NULL || sq->sq_item == NULL) { PyErr_SetString(PyExc_TypeError, "loop over non-sequence"); return NULL; } @@ -2559,56 +2558,6 @@ assign_slice(u, v, w, x) /* u[v:w] = x */ return PySequence_SetSlice(u, ilow, ihigh, x); } -static int -cmp_member(v, w) - PyObject *v, *w; -{ - int i, cmp; - PyObject *x; - PySequenceMethods *sq; - /* Special case for char in string */ - if (PyString_Check(w)) { - register char *s, *end; - register char c; - if (!PyString_Check(v) || PyString_Size(v) != 1) { - PyErr_SetString(PyExc_TypeError, - "string member test needs char left operand"); - return -1; - } - c = PyString_AsString(v)[0]; - s = PyString_AsString(w); - end = s + PyString_Size(w); - while (s < end) { - if (c == *s++) - return 1; - } - return 0; - } - sq = w->ob_type->tp_as_sequence; - if (sq == NULL) { - PyErr_SetString(PyExc_TypeError, - "'in' or 'not in' needs sequence right argument"); - return -1; - } - for (i = 0; ; i++) { - x = (*sq->sq_item)(w, i); - if (x == NULL) { - if (PyErr_Occurred() == PyExc_IndexError) { - PyErr_Clear(); - break; - } - return -1; - } - cmp = PyObject_Compare(v, x); - Py_XDECREF(x); - if (cmp == 0) - return 1; - if (PyErr_Occurred()) - return -1; - } - return 0; -} - static PyObject * cmp_outcome(op, v, w) int op; @@ -2626,7 +2575,7 @@ cmp_outcome(op, v, w) break; case IN: case NOT_IN: - res = cmp_member(v, w); + res = PySequence_Contains(w, v); if (res < 0) return NULL; if (op == (int) NOT_IN) |