From: Serhiy Storchaka Date: Thu, 4 Oct 2018 07:42:06 +0000 (+0300) Subject: bpo-34740: Get rid of tp_getattro in ossaudiodev.oss_audio_device. (GH-9421) X-Git-Tag: v3.8.0a1~838 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5f5a7781c8bf7bcc476d3e05d980711be3920724;p=python bpo-34740: Get rid of tp_getattro in ossaudiodev.oss_audio_device. (GH-9421) Use tp_members and tp_getset instead. --- diff --git a/Modules/ossaudiodev.c b/Modules/ossaudiodev.c index 150a14eb38..2222148c85 100644 --- a/Modules/ossaudiodev.c +++ b/Modules/ossaudiodev.c @@ -921,46 +921,43 @@ static PyMethodDef oss_mixer_methods[] = { { NULL, NULL} }; +static PyMemberDef oss_members[] = { + {"name", T_STRING, offsetof(oss_audio_t, devicename), READONLY, NULL}, + {NULL} +}; + static PyObject * -oss_getattro(oss_audio_t *self, PyObject *nameobj) +oss_closed_getter(oss_audio_t *self, void *closure) { - const char *name = ""; - PyObject * rval = NULL; - - if (PyUnicode_Check(nameobj)) { - name = PyUnicode_AsUTF8(nameobj); - if (name == NULL) - return NULL; - } + return PyBool_FromLong(self->fd == -1); +} - if (strcmp(name, "closed") == 0) { - rval = (self->fd == -1) ? Py_True : Py_False; - Py_INCREF(rval); - } - else if (strcmp(name, "name") == 0) { - rval = PyUnicode_FromString(self->devicename); - } - else if (strcmp(name, "mode") == 0) { - /* No need for a "default" in this switch: from newossobject(), - self->mode can only be one of these three values. */ - switch(self->mode) { - case O_RDONLY: - rval = PyUnicode_FromString("r"); - break; - case O_RDWR: - rval = PyUnicode_FromString("rw"); - break; - case O_WRONLY: - rval = PyUnicode_FromString("w"); - break; - } - } - else { - rval = PyObject_GenericGetAttr((PyObject *)self, nameobj); +static PyObject * +oss_mode_getter(oss_audio_t *self, void *closure) +{ + switch(self->mode) { + case O_RDONLY: + return PyUnicode_FromString("r"); + break; + case O_RDWR: + return PyUnicode_FromString("rw"); + break; + case O_WRONLY: + return PyUnicode_FromString("w"); + break; + default: + /* From newossobject(), self->mode can only be one + of these three values. */ + Py_UNREACHABLE(); } - return rval; } +static PyGetSetDef oss_getsetlist[] = { + {"closed", (getter)oss_closed_getter, (setter)NULL, NULL}, + {"mode", (getter)oss_mode_getter, (setter)NULL, NULL}, + {NULL}, +}; + static PyTypeObject OSSAudioType = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "ossaudiodev.oss_audio_device", /*tp_name*/ @@ -979,7 +976,7 @@ static PyTypeObject OSSAudioType = { 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ - (getattrofunc)oss_getattro, /*tp_getattro*/ + 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ @@ -991,6 +988,8 @@ static PyTypeObject OSSAudioType = { 0, /*tp_iter*/ 0, /*tp_iternext*/ oss_methods, /*tp_methods*/ + oss_members, /*tp_members*/ + oss_getsetlist, /*tp_getset*/ }; static PyTypeObject OSSMixerType = {