]> granicus.if.org Git - python/commitdiff
PyObject_CallFunction(), PyObject_CallMethod(): Make sure we do not touch
authorFred Drake <fdrake@acm.org>
Sat, 27 Oct 2001 06:16:31 +0000 (06:16 +0000)
committerFred Drake <fdrake@acm.org>
Sat, 27 Oct 2001 06:16:31 +0000 (06:16 +0000)
the va_list until we are sure we have a format string and need to use it;
this avoid premature initialization and having to finalize it several
different places because of error returns.

Objects/abstract.c

index 003c9a362d964928659194bd4c1c972695e0fdf7..8f771205448cbab44c8e337ec6959bef52074708 100644 (file)
@@ -1670,20 +1670,18 @@ PyObject_CallFunction(PyObject *callable, char *format, ...)
 {
        va_list va;
        PyObject *args, *retval;
-       va_start(va, format);
 
-       if (callable == NULL) {
-               va_end(va);
+       if (callable == NULL)
                return null_error();
-       }
 
-       if (format)
+       if (format && *format) {
+               va_start(va, format);
                args = Py_VaBuildValue(format, va);
+               va_end(va);
+       }
        else
                args = PyTuple_New(0);
 
-       va_end(va);
-       
        if (args == NULL)
                return NULL;
 
@@ -1709,32 +1707,27 @@ PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
 {
        va_list va;
        PyObject *args, *func = 0, *retval;
-       va_start(va, format);
 
-       if (o == NULL || name == NULL) {
-               va_end(va);
+       if (o == NULL || name == NULL)
                return null_error();
-       }
 
        func = PyObject_GetAttrString(o, name);
        if (func == NULL) {
-               va_end(va);
                PyErr_SetString(PyExc_AttributeError, name);
                return 0;
        }
 
-       if (!PyCallable_Check(func)) {
-               va_end(va);
+       if (!PyCallable_Check(func))
                return type_error("call of non-callable attribute");
-       }
 
-       if (format && *format)
+       if (format && *format) {
+               va_start(va, format);
                args = Py_VaBuildValue(format, va);
+               va_end(va);
+       }
        else
                args = PyTuple_New(0);
 
-       va_end(va);
-
        if (!args)
                return NULL;