Replace PyObject_CallFunction() with fastcall
authorVictor Stinner <victor.stinner@gmail.com>
Thu, 1 Dec 2016 13:51:04 +0000 (14:51 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Thu, 1 Dec 2016 13:51:04 +0000 (14:51 +0100)
Replace
    PyObject_CallFunction(func, "O", arg)
and
    PyObject_CallFunction(func, "O", arg, NULL)
with
    _PyObject_CallArg1(func, arg)

Replace
    PyObject_CallFunction(func, NULL)
with
    _PyObject_CallNoArg(func)

_PyObject_CallNoArg() and _PyObject_CallArg1() are simpler and don't allocate
memory on the C stack.

Modules/_collectionsmodule.c
Modules/_elementtree.c
Modules/pyexpat.c
Modules/readline.c
Objects/genobject.c
Python/_warnings.c
Python/codecs.c
Python/marshal.c

index 660879824748e5f1a6eb4ab976d5a018fc4a71fc..cbf5b50cc9554cf3a989b4d8fef60caff6402115 100644 (file)
@@ -538,7 +538,7 @@ deque_copy(PyObject *deque)
         return NULL;
     }
     if (old_deque->maxlen < 0)
-        return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "O", deque, NULL);
+        return _PyObject_CallArg1((PyObject *)(Py_TYPE(deque)), deque);
     else
         return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi",
             deque, old_deque->maxlen, NULL);
index f3e1e9f2272ee0f59ab32067f9eeb102eb3018bf..bafcaa5402fda5556962bb257f81344fdf41e714 100644 (file)
@@ -2831,7 +2831,7 @@ expat_set_error(enum XML_Error error_code, Py_ssize_t line, Py_ssize_t column,
     if (errmsg == NULL)
         return;
 
-    error = PyObject_CallFunction(st->parseerror_obj, "O", errmsg);
+    error = _PyObject_CallArg1(st->parseerror_obj, errmsg);
     Py_DECREF(errmsg);
     if (!error)
         return;
@@ -2894,7 +2894,7 @@ expat_default_handler(XMLParserObject* self, const XML_Char* data_in,
                 (TreeBuilderObject*) self->target, value
                 );
         else if (self->handle_data)
-            res = PyObject_CallFunction(self->handle_data, "O", value);
+            res = _PyObject_CallArg1(self->handle_data, value);
         else
             res = NULL;
         Py_XDECREF(res);
@@ -3004,7 +3004,7 @@ expat_data_handler(XMLParserObject* self, const XML_Char* data_in,
         /* shortcut */
         res = treebuilder_handle_data((TreeBuilderObject*) self->target, data);
     else if (self->handle_data)
-        res = PyObject_CallFunction(self->handle_data, "O", data);
+        res = _PyObject_CallArg1(self->handle_data, data);
     else
         res = NULL;
 
@@ -3031,7 +3031,7 @@ expat_end_handler(XMLParserObject* self, const XML_Char* tag_in)
     else if (self->handle_end) {
         tag = makeuniversal(self, tag_in);
         if (tag) {
-            res = PyObject_CallFunction(self->handle_end, "O", tag);
+            res = _PyObject_CallArg1(self->handle_end, tag);
             Py_DECREF(tag);
         }
     }
@@ -3090,7 +3090,7 @@ expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in)
     if (self->handle_comment) {
         comment = PyUnicode_DecodeUTF8(comment_in, strlen(comment_in), "strict");
         if (comment) {
-            res = PyObject_CallFunction(self->handle_comment, "O", comment);
+            res = _PyObject_CallArg1(self->handle_comment, comment);
             Py_XDECREF(res);
             Py_DECREF(comment);
         }
index b3259d57aa114c644ac01fa11c0d04b62b97d197..541eee7beb00e7f1380c7e59111f85bc5698b705 100644 (file)
@@ -119,7 +119,7 @@ set_error(xmlparseobject *self, enum XML_Error code)
                                   XML_ErrorString(code), lineno, column);
     if (buffer == NULL)
         return NULL;
-    err = PyObject_CallFunction(ErrorObject, "O", buffer);
+    err = _PyObject_CallArg1(ErrorObject, buffer);
     Py_DECREF(buffer);
     if (  err != NULL
           && set_error_attr(err, "code", code)
index 3b94d4a0d1d7599ac58e8ee2059f27ed0486f598..389954f08718302e4e2db6f51be4be30f5f83ef7 100644 (file)
@@ -868,7 +868,7 @@ on_hook(PyObject *func)
     int result = 0;
     if (func != NULL) {
         PyObject *r;
-        r = PyObject_CallFunction(func, NULL);
+        r = _PyObject_CallNoArg(func);
         if (r == NULL)
             goto error;
         if (r == Py_None)
index 1db83c9d64bd070ea24619d194ff7f7cc6284fa2..0484b1c677718e43dae5d62721af7ff640bbef41 100644 (file)
@@ -1341,7 +1341,7 @@ async_gen_init_hooks(PyAsyncGenObject *o)
         PyObject *res;
 
         Py_INCREF(firstiter);
-        res = PyObject_CallFunction(firstiter, "O", o);
+        res = _PyObject_CallArg1(firstiter, o);
         Py_DECREF(firstiter);
         if (res == NULL) {
             return 1;
index a4ce7d19251e4c06063d75cf5cf8c29a11a035f7..1b2c6cdfd42d6d210c7b9e2b1b5d89ce010525d3 100644 (file)
@@ -476,7 +476,7 @@ warn_explicit(PyObject *category, PyObject *message,
     }
     else {
         text = message;
-        message = PyObject_CallFunction(category, "O", message);
+        message = _PyObject_CallArg1(category, message);
         if (message == NULL)
             goto cleanup;
     }
index bf152c2e56f997f463e0dbed9912273acbc57254..55f6ca85e3cd1e6ea96f665d0bd079aafbbc2f25 100644 (file)
@@ -284,7 +284,7 @@ PyObject *codec_makeincrementalcodec(PyObject *codec_info,
     if (errors)
         ret = PyObject_CallFunction(inccodec, "s", errors);
     else
-        ret = PyObject_CallFunction(inccodec, NULL);
+        ret = _PyObject_CallNoArg(inccodec);
     Py_DECREF(inccodec);
     return ret;
 }
@@ -322,7 +322,7 @@ PyObject *codec_getstreamcodec(const char *encoding,
     if (errors != NULL)
         streamcodec = PyObject_CallFunction(codeccls, "Os", stream, errors);
     else
-        streamcodec = PyObject_CallFunction(codeccls, "O", stream);
+        streamcodec = _PyObject_CallArg1(codeccls, stream);
     Py_DECREF(codecs);
     return streamcodec;
 }
index 87a4b240a41c8776dbb0ee16cad56594e24e2a45..0889e410505491bde1ae90c43212978bc5b9fef8 100644 (file)
@@ -1274,7 +1274,7 @@ r_object(RFILE *p)
 
         if (n == 0 && type == TYPE_FROZENSET) {
             /* call frozenset() to get the empty frozenset singleton */
-            v = PyObject_CallFunction((PyObject*)&PyFrozenSet_Type, NULL);
+            v = _PyObject_CallNoArg((PyObject*)&PyFrozenSet_Type);
             if (v == NULL)
                 break;
             R_REF(v);