Squash a few calls to the hideously expensive PyObject_CallObject(o,a)
authorGuido van Rossum <guido@python.org>
Fri, 16 Aug 2002 17:01:09 +0000 (17:01 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 16 Aug 2002 17:01:09 +0000 (17:01 +0000)
-- replace then with slightly faster PyObject_Call(o,a,NULL).  (The
difference is that the latter requires a to be a tuple; the former
allows other values and wraps them in a tuple if necessary; it
involves two more levels of C function calls to accomplish all that.)

Modules/pyexpat.c
Objects/abstract.c
Objects/iterobject.c
Objects/typeobject.c
Parser/tokenizer.c

index fc419b14cd058107bb5d9747628816a0676b9387..8b73e1efaf6e9d4c2d543a39409916ab0737c0c8 100644 (file)
@@ -829,7 +829,7 @@ readinst(char *buf, int buf_size, PyObject *meth)
 
     PyTuple_SET_ITEM(arg, 0, bytes);
 
-    if ((str = PyObject_CallObject(meth, arg)) == NULL)
+    if ((str = PyObject_Call(meth, arg, NULL)) == NULL)
         goto finally;
 
     /* XXX what to do if it returns a Unicode string? */
index fc73a9f0ceaf26d9111f147b8233152dae98aa23..9940fd3c95bdb39f592e71fb315f194e8f8f64e5 100644 (file)
@@ -1727,7 +1727,7 @@ PyObject_CallFunction(PyObject *callable, char *format, ...)
                        return NULL;
                args = a;
        }
-       retval = PyObject_CallObject(callable, args);
+       retval = PyObject_Call(callable, args, NULL);
 
        Py_DECREF(args);
 
@@ -1774,7 +1774,7 @@ PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
                args = a;
        }
 
-       retval = PyObject_CallObject(func, args);
+       retval = PyObject_Call(func, args, NULL);
 
        Py_DECREF(args);
        Py_DECREF(func);
index 4dc225a521fabdaa9078ada81b21639977a03862..2e1caae543708a8978623ab4301c11c6a123daab 100644 (file)
@@ -163,7 +163,12 @@ static PyObject *
 calliter_iternext(calliterobject *it)
 {
        if (it->it_callable != NULL) {
-               PyObject *result = PyObject_CallObject(it->it_callable, NULL);
+               PyObject *args = PyTuple_New(0);
+               PyObject *result;
+               if (args == NULL)
+                       return NULL;
+               result = PyObject_Call(it->it_callable, args, NULL);
+               Py_DECREF(args);
                if (result != NULL) {
                        int ok;
                        ok = PyObject_RichCompareBool(result,
index c3c5893c1f15b677dcc31351a96a0cc655c6d3a3..a12e7df84f4b6fc5cba1a7c8ea23271491428b96 100644 (file)
@@ -3257,7 +3257,7 @@ SLOT0(slot_nb_absolute, "__abs__")
 static int
 slot_nb_nonzero(PyObject *self)
 {
-       PyObject *func, *res;
+       PyObject *func, *res, *args;
        static PyObject *nonzero_str, *len_str;
 
        func = lookup_maybe(self, "__nonzero__", &nonzero_str);
@@ -3272,7 +3272,11 @@ slot_nb_nonzero(PyObject *self)
                                return 1;
                }
        }
-       res = PyObject_CallObject(func, NULL);
+       args = res = PyTuple_New(0);
+       if (args != NULL) {
+               res = PyObject_Call(func, args, NULL);
+               Py_DECREF(args);
+       }
        Py_DECREF(func);
        if (res == NULL)
                return -1;
@@ -3651,9 +3655,14 @@ slot_tp_iter(PyObject *self)
 
        func = lookup_method(self, "__iter__", &iter_str);
        if (func != NULL) {
-                res = PyObject_CallObject(func, NULL);
-                Py_DECREF(func);
-                return res;
+               PyObject *args;
+               args = res = PyTuple_New(0);
+               if (args != NULL) {
+                       res = PyObject_Call(func, args, NULL);
+                       Py_DECREF(args);
+               }
+               Py_DECREF(func);
+               return res;
        }
        PyErr_Clear();
        func = lookup_method(self, "__getitem__", &getitem_str);
index 7e7a37025ca763f041369de912e6541f9814b868..4119c43d5d3eeb05431341036cf7108df107fdda 100644 (file)
@@ -327,12 +327,16 @@ fp_readl(char *s, int size, struct tok_state *tok)
 #ifndef Py_USING_UNICODE
        /* In a non-Unicode built, this should never be called. */
        Py_FatalError("fp_readl should not be called in this build.");
-       return NULL;
+       return NULL; /* Keep compiler happy (not reachable) */
 #else
        PyObject* utf8;
        PyObject* buf = tok->decoding_buffer;
        if (buf == NULL) {
-               buf = PyObject_CallObject(tok->decoding_readline, NULL);
+               PyObject *args = PyTuple_New(0);
+               if (args == NULL)
+                       return error_ret(tok);
+               buf = PyObject_Call(tok->decoding_readline, args, NULL);
+               Py_DECREF(args);
                if (buf == NULL)
                        return error_ret(tok);
        } else {
@@ -464,7 +468,14 @@ decoding_feof(struct tok_state *tok)
        } else {
                PyObject* buf = tok->decoding_buffer;
                if (buf == NULL) {
-                       buf = PyObject_CallObject(tok->decoding_readline, NULL);
+                       PyObject *args = PyTuple_New(0);
+                       if (args == NULL) {
+                               error_ret(tok);
+                               return 1;
+                       }
+                       buf = PyObject_Call(tok->decoding_readline,
+                                           args, NULL);
+                       Py_DECREF(args);
                        if (buf == NULL) {
                                error_ret(tok);
                                return 1;