]> granicus.if.org Git - python/commitdiff
builtin_apply(): Second argument type check is relaxed to allow any sequence.
authorBarry Warsaw <barry@python.org>
Thu, 1 Oct 1998 15:33:12 +0000 (15:33 +0000)
committerBarry Warsaw <barry@python.org>
Thu, 1 Oct 1998 15:33:12 +0000 (15:33 +0000)
Python/bltinmodule.c

index 4f913975cb237c9a1c723018e382e1232764065f..f88ed7ab4277f5d19b9ded7721b3e42fe2776482 100644 (file)
@@ -101,20 +101,32 @@ builtin_apply(self, args)
        PyObject *args;
 {
        PyObject *func, *alist = NULL, *kwdict = NULL;
+       PyObject *t = NULL, *retval = NULL;
 
        if (!PyArg_ParseTuple(args, "O|OO:apply", &func, &alist, &kwdict))
                return NULL;
-       if (alist != NULL && !PyTuple_Check(alist)) {
-               PyErr_SetString(PyExc_TypeError,
-                               "apply() 2nd argument must be tuple");
-               return NULL;
+       if (alist != NULL) {
+               if (!PyTuple_Check(alist)) {
+                       if (!PySequence_Check(alist)) {
+                               PyErr_SetString(PyExc_TypeError,
+                                   "apply() 2nd argument must be a sequence");
+                               return NULL;
+                       }
+                       t = PySequence_Tuple(alist);
+                       if (t == NULL)
+                               return NULL;
+                       alist = t;
+               }
        }
        if (kwdict != NULL && !PyDict_Check(kwdict)) {
                PyErr_SetString(PyExc_TypeError,
                           "apply() 3rd argument must be dictionary");
-               return NULL;
+               goto finally;
        }
-       return PyEval_CallObjectWithKeywords(func, alist, kwdict);
+       retval = PyEval_CallObjectWithKeywords(func, alist, kwdict);
+  finally:
+       Py_XDECREF(t);
+       return retval;
 }
 
 static char apply_doc[] =