summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-04-16 06:21:44 (GMT)
committerGitHub <noreply@github.com>2017-04-16 06:21:44 (GMT)
commit813f943c592cf225871b99cffc99304c8cbbee40 (patch)
tree7c953b19864281e454abb78a8348843faf2cfd19 /Objects
parent026435ce49419a3366171416c68114dd8a1144c7 (diff)
downloadcpython-813f943c592cf225871b99cffc99304c8cbbee40.zip
cpython-813f943c592cf225871b99cffc99304c8cbbee40.tar.gz
cpython-813f943c592cf225871b99cffc99304c8cbbee40.tar.bz2
bpo-29838: Add asserts for checking results of sq_length and mq_length slots. (#700)
Negative result should be returned only when an error is set.
Diffstat (limited to 'Objects')
-rw-r--r--Objects/abstract.c32
-rw-r--r--Objects/typeobject.c4
2 files changed, 26 insertions, 10 deletions
diff --git a/Objects/abstract.c b/Objects/abstract.c
index 4a75b92..0f1ee9d 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -52,8 +52,11 @@ PyObject_Size(PyObject *o)
}
m = o->ob_type->tp_as_sequence;
- if (m && m->sq_length)
- return m->sq_length(o);
+ if (m && m->sq_length) {
+ Py_ssize_t len = m->sq_length(o);
+ assert(len >= 0 || PyErr_Occurred());
+ return len;
+ }
return PyMapping_Size(o);
}
@@ -86,7 +89,8 @@ PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
_Py_IDENTIFIER(__length_hint__);
if (_PyObject_HasLen(o)) {
res = PyObject_Length(o);
- if (res < 0 && PyErr_Occurred()) {
+ if (res < 0) {
+ assert(PyErr_Occurred());
if (!PyErr_ExceptionMatches(PyExc_TypeError)) {
return -1;
}
@@ -1483,8 +1487,11 @@ PySequence_Size(PyObject *s)
}
m = s->ob_type->tp_as_sequence;
- if (m && m->sq_length)
- return m->sq_length(s);
+ if (m && m->sq_length) {
+ Py_ssize_t len = m->sq_length(s);
+ assert(len >= 0 || PyErr_Occurred());
+ return len;
+ }
type_error("object of type '%.200s' has no len()", s);
return -1;
@@ -1673,8 +1680,10 @@ PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
if (i < 0) {
if (m->sq_length) {
Py_ssize_t l = (*m->sq_length)(s);
- if (l < 0)
+ if (l < 0) {
+ assert(PyErr_Occurred());
return -1;
+ }
i += l;
}
}
@@ -1700,8 +1709,10 @@ PySequence_DelItem(PyObject *s, Py_ssize_t i)
if (i < 0) {
if (m->sq_length) {
Py_ssize_t l = (*m->sq_length)(s);
- if (l < 0)
+ if (l < 0) {
+ assert(PyErr_Occurred());
return -1;
+ }
i += l;
}
}
@@ -2038,8 +2049,11 @@ PyMapping_Size(PyObject *o)
}
m = o->ob_type->tp_as_mapping;
- if (m && m->mp_length)
- return m->mp_length(o);
+ if (m && m->mp_length) {
+ Py_ssize_t len = m->mp_length(o);
+ assert(len >= 0 || PyErr_Occurred());
+ return len;
+ }
type_error("object of type '%.200s' has no len()", o);
return -1;
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 369c72f..ed50946 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -5427,8 +5427,10 @@ getindex(PyObject *self, PyObject *arg)
PySequenceMethods *sq = Py_TYPE(self)->tp_as_sequence;
if (sq && sq->sq_length) {
Py_ssize_t n = (*sq->sq_length)(self);
- if (n < 0)
+ if (n < 0) {
+ assert(PyErr_Occurred());
return -1;
+ }
i += n;
}
}