bpo-32492: Tweak _collections._tuplegetter. (GH-11367)

* Replace the docstrings cache with sys.intern().
* Improve tests.
* Unify names of tp_descr_get and tp_descr_set functions.
This commit is contained in:
Serhiy Storchaka 2018-12-31 14:15:16 +02:00 committed by GitHub
parent 5c117dd227
commit 052b2dfdc9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 75 additions and 37 deletions

View file

@ -2336,7 +2336,7 @@ done:
Py_RETURN_NONE;
}
/* Helper functions for namedtuples */
/* Helper function for namedtuple() ************************************/
typedef struct {
PyObject_HEAD
@ -2369,9 +2369,11 @@ tuplegetter_new_impl(PyTypeObject *type, Py_ssize_t index, PyObject *doc)
}
static PyObject *
tuplegetterdescr_get(PyObject *self, PyObject *obj, PyObject *type)
tuplegetter_descr_get(PyObject *self, PyObject *obj, PyObject *type)
{
Py_ssize_t index = ((_tuplegetterobject*)self)->index;
PyObject *result;
if (obj == NULL) {
Py_INCREF(self);
return self;
@ -2384,13 +2386,11 @@ tuplegetterdescr_get(PyObject *self, PyObject *obj, PyObject *type)
PyErr_Format(PyExc_TypeError,
"descriptor for index '%d' for tuple subclasses "
"doesn't apply to '%s' object",
((_tuplegetterobject*)self)->index,
index,
obj->ob_type->tp_name);
return NULL;
}
Py_ssize_t index = ((_tuplegetterobject*)self)->index;
if (!valid_index(index, PyTuple_GET_SIZE(obj))) {
PyErr_SetString(PyExc_IndexError, "tuple index out of range");
return NULL;
@ -2402,7 +2402,7 @@ tuplegetterdescr_get(PyObject *self, PyObject *obj, PyObject *type)
}
static int
tuplegetter_set(PyObject *self, PyObject *obj, PyObject *value)
tuplegetter_descr_set(PyObject *self, PyObject *obj, PyObject *value)
{
if (value == NULL) {
PyErr_SetString(PyExc_AttributeError, "can't delete attribute");
@ -2476,8 +2476,8 @@ static PyTypeObject tuplegetter_type = {
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
tuplegetterdescr_get, /* tp_descr_get */
tuplegetter_set, /* tp_descr_set */
tuplegetter_descr_get, /* tp_descr_get */
tuplegetter_descr_set, /* tp_descr_set */
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */