diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2018-10-04 07:42:06 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-04 07:42:06 (GMT) |
commit | 5f5a7781c8bf7bcc476d3e05d980711be3920724 (patch) | |
tree | 80c6e47d75477e4cd499e1c85edbc7c74f393aa8 /Modules/ossaudiodev.c | |
parent | b2953fa3dda5898fcb0029792d9229f150e6e2cb (diff) | |
download | cpython-5f5a7781c8bf7bcc476d3e05d980711be3920724.zip cpython-5f5a7781c8bf7bcc476d3e05d980711be3920724.tar.gz cpython-5f5a7781c8bf7bcc476d3e05d980711be3920724.tar.bz2 |
bpo-34740: Get rid of tp_getattro in ossaudiodev.oss_audio_device. (GH-9421)
Use tp_members and tp_getset instead.
Diffstat (limited to 'Modules/ossaudiodev.c')
-rw-r--r-- | Modules/ossaudiodev.c | 69 |
1 files changed, 34 insertions, 35 deletions
diff --git a/Modules/ossaudiodev.c b/Modules/ossaudiodev.c index 150a14e..2222148 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 = { |