]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
* tkintermodule.c (*FileHandler): generalize to arbitrary file ids
authorGuido van Rossum <guido@python.org>
Tue, 9 Aug 1994 14:15:19 +0000 (14:15 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 9 Aug 1994 14:15:19 +0000 (14:15 +0000)
and objects that hav a fileno() method; fix bug in FileHandler
(should call XDECREF instead of DECREF)

Modules/_tkinter.c

index 9db12df1630000a32f417a6ee753b517854f898d..1f702d39d9a553b519ba140ab5ca895ab3f9b361 100644 (file)
 #include "modsupport.h"
 #include "sysmodule.h"
 
+#ifndef PyObject
 #define PyObject object
 typedef struct methodlist PyMethodDef;
+#endif
 #define PyInit_tkinter inittkinter
 
 #undef Py_True
@@ -785,7 +787,42 @@ FileHandler (clientData, mask)
       errorInCmd = 1;
       PyErr_GetAndClear (&excInCmd, &valInCmd);
     }
-  Py_DECREF (res);
+  Py_XDECREF (res);
+}
+
+static int
+GetFileNo (file)
+       PyObject *file; /* Either an int >= 0 or an object with a
+                          .fileno() method that returns an int >= 0 */
+{
+       object *meth, *args, *res;
+       int id;
+       if (PyInt_Check(file)) {
+               id = PyInt_AsLong(file);
+               if (id < 0)
+                       PyErr_SetString(PyExc_ValueError, "invalid file id");
+               return id;
+       }
+       meth = PyObject_GetAttrString(file, "fileno");
+       if (meth == NULL)
+               return -1;
+       args = PyTuple_New(0);
+       if (args == NULL)
+               return -1;
+       res = PyEval_CallObject(meth, args);
+       Py_DECREF(args);
+       Py_DECREF(meth);
+       if (res == NULL)
+               return -1;
+       if (PyInt_Check(res))
+               id = PyInt_AsLong(res);
+       else
+               id = -1;
+       if (id < 0)
+               PyErr_SetString(PyExc_ValueError,
+                               "invalid fileno() return value");
+       Py_DECREF(res);
+       return id;
 }
 
 static PyObject *
@@ -798,8 +835,10 @@ Tkapp_CreateFileHandler (self, args)
 
   if (!PyArg_Parse (args, "(OiO)", &file, &mask, &func))
     return NULL;
-  if (!PyFile_Check (file) 
-      || !(PyMethod_Check(func) || PyFunction_Check(func)))
+  id = GetFileNo (file);
+  if (id < 0)
+    return NULL;
+  if (!(PyMethod_Check(func) || PyFunction_Check(func)))
     {
       PyErr_SetString (PyExc_TypeError, "bad argument list");
       return NULL;
@@ -808,7 +847,6 @@ Tkapp_CreateFileHandler (self, args)
   /* ClientData is: (func, file) */
   data = Py_BuildValue ("(OO)", func, file);
 
-  id = fileno (PyFile_AsFile (file));
   Tk_CreateFileHandler (id, mask, FileHandler, (ClientData) data);
   /* XXX fileHandlerDict */
 
@@ -821,15 +859,15 @@ Tkapp_DeleteFileHandler (self, args)
      PyObject *self;
      PyObject *args;           /* Args: file */
 {
+  PyObject *file;
   int id;
 
-  if (!PyFile_Check (args))
-    {
-      PyErr_SetString (PyExc_TypeError, "bad argument list");
-      return NULL;
-    }
+  if (!PyArg_Parse (args, "O", &file))
+    return NULL;
+  id = GetFileNo (file);
+  if (id < 0)
+    return NULL;
 
-  id = fileno (PyFile_AsFile (args));
   Tk_DeleteFileHandler (id);
   /* XXX fileHandlerDict */
   Py_INCREF (Py_None);