diff options
author | Ivan Levkivskyi <levkivskyi@gmail.com> | 2019-02-17 23:13:46 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-17 23:13:46 (GMT) |
commit | ac28147e78c45a6217d348ce90ca5281d91f676f (patch) | |
tree | 891d00108f7066f1174788f72dd1696079950b68 /Objects | |
parent | 1bf8845f74013c5f1cc5f49a11e52c652a1fb9dd (diff) | |
download | cpython-ac28147e78c45a6217d348ce90ca5281d91f676f.zip cpython-ac28147e78c45a6217d348ce90ca5281d91f676f.tar.gz cpython-ac28147e78c45a6217d348ce90ca5281d91f676f.tar.bz2 |
bpo-35992: Use PySequence_GetItem only if sq_item is not NULL (GH-11857)
Not using `__class_getitem__()` fallback if there is a non-subcriptable metaclass was caused by a certain asymmetry between how `PySequenceMethods` and `PyMappingMethods` are used in `PyObject_GetItem`. This PR removes this asymmetry. No tests failed, so I assume it was not intentional.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/abstract.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/Objects/abstract.c b/Objects/abstract.c index 567da2d..0565ba3 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -143,6 +143,7 @@ PyObject * PyObject_GetItem(PyObject *o, PyObject *key) { PyMappingMethods *m; + PySequenceMethods *ms; if (o == NULL || key == NULL) { return null_error(); @@ -155,7 +156,8 @@ PyObject_GetItem(PyObject *o, PyObject *key) return item; } - if (o->ob_type->tp_as_sequence) { + ms = o->ob_type->tp_as_sequence; + if (ms && ms->sq_item) { if (PyIndex_Check(key)) { Py_ssize_t key_value; key_value = PyNumber_AsSsize_t(key, PyExc_IndexError); @@ -163,9 +165,10 @@ PyObject_GetItem(PyObject *o, PyObject *key) return NULL; return PySequence_GetItem(o, key_value); } - else if (o->ob_type->tp_as_sequence->sq_item) + else { return type_error("sequence index must " "be integer, not '%.200s'", key); + } } if (PyType_Check(o)) { |