summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1997-05-23 00:06:51 (GMT)
committerGuido van Rossum <guido@python.org>1997-05-23 00:06:51 (GMT)
commitc8b6df90045a3f419e6fab272d93ad4159e54ccc (patch)
tree20cb4b6f0ba2718577079198780d5fc3852e4a70
parent5b2121b25fc6a50fe229fe25ef6be8a2f883d1f4 (diff)
downloadcpython-c8b6df90045a3f419e6fab272d93ad4159e54ccc.zip
cpython-c8b6df90045a3f419e6fab272d93ad4159e54ccc.tar.gz
cpython-c8b6df90045a3f419e6fab272d93ad4159e54ccc.tar.bz2
PyObject_Compare can raise an exception now.
-rw-r--r--Modules/arraymodule.c8
-rw-r--r--Objects/classobject.c16
-rw-r--r--Objects/listobject.c15
-rw-r--r--Objects/object.c31
-rw-r--r--Python/bltinmodule.c18
-rw-r--r--Python/ceval.c7
-rw-r--r--Python/compile.c3
7 files changed, 67 insertions, 31 deletions
diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c
index 190600e..97af9ac 100644
--- a/Modules/arraymodule.c
+++ b/Modules/arraymodule.c
@@ -484,10 +484,8 @@ array_compare(v, w)
cmp = -1;
Py_XDECREF(ai);
Py_XDECREF(bi);
- if (cmp != 0) {
- PyErr_Clear(); /* XXX Can't report errors here */
+ if (cmp != 0)
return cmp;
- }
}
return v->ob_size - w->ob_size;
}
@@ -823,6 +821,7 @@ array_index(self, args)
for (i = 0; i < self->ob_size; i++) {
if (PyObject_Compare(self->ob_item[i], args) == 0)
return PyInt_FromLong((long)i);
+ /* XXX PyErr_Occurred */
}
PyErr_SetString(PyExc_ValueError, "array.index(x): x not in array");
return NULL;
@@ -845,6 +844,7 @@ array_count(self, args)
for (i = 0; i < self->ob_size; i++) {
if (PyObject_Compare(self->ob_item[i], args) == 0)
count++;
+ /* XXX PyErr_Occurred */
}
return PyInt_FromLong((long)count);
}
@@ -870,7 +870,7 @@ array_remove(self, args)
Py_INCREF(Py_None);
return Py_None;
}
-
+ /* XXX PyErr_Occurred */
}
PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in array");
return NULL;
diff --git a/Objects/classobject.c b/Objects/classobject.c
index 4ff34be..749a06a0 100644
--- a/Objects/classobject.c
+++ b/Objects/classobject.c
@@ -349,7 +349,6 @@ instance_dealloc(inst)
PyObject *f, *t, *v, *tb;
PyErr_Fetch(&t, &v, &tb);
f = PySys_GetObject("stderr");
- PyErr_Clear();
if (f != NULL) {
PyFile_WriteString("Exception ", f);
if (t) {
@@ -565,9 +564,13 @@ instance_compare(inst, other)
PyObject *result;
long outcome;
result = instance_compare1(inst, other);
- if (result == NULL || !PyInt_Check(result)) {
- PyErr_Clear();
- return (inst < other) ? -1 : 1;
+ if (result == NULL)
+ return -1;
+ if (!PyInt_Check(result)) {
+ Py_DECREF(result);
+ PyErr_SetString(PyExc_TypeError,
+ "comparison did not return an int");
+ return -1;
}
outcome = PyInt_AsLong(result);
Py_DECREF(result);
@@ -899,6 +902,11 @@ PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
return result;
if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
return result;
+ /* Sigh -- special case for comnparisons */
+ if (strcmp(opname, "__cmp__") == 0) {
+ long c = (v < w) ? -1 : (v > w) ? 1 : 0;
+ return PyInt_FromLong(c);
+ }
sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
PyErr_SetString(PyExc_TypeError, buf);
return NULL;
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 16d63b8..588053c 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -580,8 +580,12 @@ docompare(x, y, compare)
PyObject *args, *res;
int i;
- if (compare == NULL)
- return PyObject_Compare(x, y);
+ if (compare == NULL) {
+ i = PyObject_Compare(x, y);
+ if (i && PyErr_Occurred())
+ i = CMPERROR;
+ return i;
+ }
args = Py_BuildValue("(OO)", x, y);
if (args == NULL)
@@ -955,6 +959,8 @@ listindex(self, args)
for (i = 0; i < self->ob_size; i++) {
if (PyObject_Compare(self->ob_item[i], args) == 0)
return PyInt_FromLong((long)i);
+ if (PyErr_Occurred())
+ return NULL;
}
PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
return NULL;
@@ -975,6 +981,8 @@ listcount(self, args)
for (i = 0; i < self->ob_size; i++) {
if (PyObject_Compare(self->ob_item[i], args) == 0)
count++;
+ if (PyErr_Occurred())
+ return NULL;
}
return PyInt_FromLong((long)count);
}
@@ -998,7 +1006,8 @@ listremove(self, args)
Py_INCREF(Py_None);
return Py_None;
}
-
+ if (PyErr_Occurred())
+ return NULL;
}
PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
return NULL;
diff --git a/Objects/object.c b/Objects/object.c
index 29269d0..023477f 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -255,13 +255,17 @@ static PyObject *
do_cmp(v, w)
PyObject *v, *w;
{
+ long c;
/* __rcmp__ actually won't be called unless __cmp__ isn't defined,
because the check in cmpobject() reverses the objects first.
This is intentional -- it makes no sense to define cmp(x,y)
different than -cmp(y,x). */
if (PyInstance_Check(v) || PyInstance_Check(w))
return PyInstance_DoBinOp(v, w, "__cmp__", "__rcmp__", do_cmp);
- return PyInt_FromLong((long)PyObject_Compare(v, w));
+ c = PyObject_Compare(v, w);
+ if (c && PyErr_Occurred())
+ return NULL;
+ return PyInt_FromLong(c);
}
int
@@ -269,25 +273,25 @@ PyObject_Compare(v, w)
PyObject *v, *w;
{
PyTypeObject *tp;
+ if (v == NULL || w == NULL) {
+ PyErr_BadInternalCall();
+ return -1;
+ }
if (v == w)
return 0;
- if (v == NULL)
- return -1;
- if (w == NULL)
- return 1;
if (PyInstance_Check(v) || PyInstance_Check(w)) {
PyObject *res;
int c;
if (!PyInstance_Check(v))
return -PyObject_Compare(w, v);
res = do_cmp(v, w);
- if (res == NULL) {
- PyErr_Clear();
- return (v < w) ? -1 : 1;
- }
+ if (res == NULL)
+ return -1;
if (!PyInt_Check(res)) {
Py_DECREF(res);
- return (v < w) ? -1 : 1;
+ PyErr_SetString(PyExc_TypeError,
+ "comparison did not return an int");
+ return -1;
}
c = PyInt_AsLong(res);
Py_DECREF(res);
@@ -296,11 +300,8 @@ PyObject_Compare(v, w)
if ((tp = v->ob_type) != w->ob_type) {
if (tp->tp_as_number != NULL &&
w->ob_type->tp_as_number != NULL) {
- if (PyNumber_Coerce(&v, &w) != 0) {
- PyErr_Clear();
- /* XXX Should report the error,
- XXX but the interface isn't there... */
- }
+ if (PyNumber_Coerce(&v, &w) != 0)
+ return -1;
else {
int cmp = (*v->ob_type->tp_compare)(v, w);
Py_DECREF(v);
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 4029e1b..245d31e 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -245,10 +245,14 @@ builtin_cmp(self, args)
PyObject *args;
{
PyObject *a, *b;
+ long c;
if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
return NULL;
- return PyInt_FromLong((long)PyObject_Compare(a, b));
+ c = PyObject_Compare(a, b);
+ if (c && PyErr_Occurred())
+ return NULL;
+ return PyInt_FromLong(c);
}
static PyObject *
@@ -1073,7 +1077,13 @@ min_max(args, sign)
if (w == NULL)
w = x;
else {
- if (PyObject_Compare(x, w) * sign > 0) {
+ int c = PyObject_Compare(x, w);
+ if (c && PyErr_Occurred()) {
+ Py_DECREF(x);
+ Py_XDECREF(w);
+ return NULL;
+ }
+ if (c * sign > 0) {
Py_DECREF(w);
w = x;
}
@@ -1360,8 +1370,8 @@ builtin_raw_input(self, args)
PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
return NULL;
}
- Py_FlushLine();
- if (PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
+ if (Py_FlushLine() != 0 ||
+ PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
return NULL;
}
f = PySys_GetObject("stdin");
diff --git a/Python/ceval.c b/Python/ceval.c
index 7897006..bd312b2 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -456,6 +456,9 @@ eval_code2(co, globals, locals,
if (PyObject_Compare(keyword, nm) == 0)
break;
}
+ /* Check errors from Compare */
+ if (PyErr_Occurred())
+ goto fail;
if (j >= co->co_argcount) {
if (kwdict == NULL) {
PyErr_Format(PyExc_TypeError,
@@ -2475,6 +2478,8 @@ cmp_member(v, w)
Py_XDECREF(x);
if (cmp == 0)
return 1;
+ if (PyErr_Occurred())
+ return -1;
}
return 0;
}
@@ -2507,6 +2512,8 @@ cmp_outcome(op, v, w)
break;
default:
cmp = PyObject_Compare(v, w);
+ if (cmp && PyErr_Occurred())
+ return NULL;
switch (op) {
case LT: res = cmp < 0; break;
case LE: res = cmp <= 0; break;
diff --git a/Python/compile.c b/Python/compile.c
index 155142a..36304e3 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -666,7 +666,8 @@ com_add(c, list, v)
if (v->ob_type == w->ob_type && PyObject_Compare(v, w) == 0)
return i;
}
- if (PyList_Append(list, v) != 0)
+ /* Check for error from PyObject_Compare */
+ if (PyErr_Occurred() || PyList_Append(list, v) != 0)
c->c_errors++;
return n;
}