summaryrefslogtreecommitdiffstats
path: root/Modules/ossaudiodev.c
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2018-10-04 07:42:06 (GMT)
committerGitHub <noreply@github.com>2018-10-04 07:42:06 (GMT)
commit5f5a7781c8bf7bcc476d3e05d980711be3920724 (patch)
tree80c6e47d75477e4cd499e1c85edbc7c74f393aa8 /Modules/ossaudiodev.c
parentb2953fa3dda5898fcb0029792d9229f150e6e2cb (diff)
downloadcpython-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.c69
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 = {