summaryrefslogtreecommitdiff
path: root/Objects
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2016-12-09 00:22:56 +0100
committerVictor Stinner <victor.stinner@gmail.com>2016-12-09 00:22:56 +0100
commit7414b6dc42b094fd694321a85f375ddb4a8c0e19 (patch)
tree6cb5c0dadfd8ef026a038b9daeb139717ae3f20a /Objects
parent3eefbce427a8dbc88d9f1bf2490ef97484f63395 (diff)
downloadcpython-7414b6dc42b094fd694321a85f375ddb4a8c0e19.tar.gz
Add _PyObject_CallFunctionVa() helper
Issue #28915: Add _PyObject_CallFunctionVa() helper to factorize code of functions: * PyObject_CallFunction() * _PyObject_CallFunction_SizeT() * callmethod()
Diffstat (limited to 'Objects')
-rw-r--r--Objects/abstract.c83
1 files changed, 29 insertions, 54 deletions
diff --git a/Objects/abstract.c b/Objects/abstract.c
index b2cf07c08f..4f59f04731 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -2519,20 +2519,39 @@ _PyObject_FastCallKeywords(PyObject *callable, PyObject **stack, Py_ssize_t narg
}
}
-static PyObject*
-call_function_tail(PyObject *callable, PyObject *args)
+static PyObject *
+_PyObject_CallFunctionVa(PyObject *callable, const char *format,
+ va_list va, int is_size_t)
{
- PyObject *result;
+ PyObject *args, *result;
- assert(args != NULL);
+ if (callable == NULL) {
+ return null_error();
+ }
+
+ if (!format || !*format) {
+ return _PyObject_CallNoArg(callable);
+ }
+
+ if (is_size_t) {
+ args = Py_VaBuildValue(format, va);
+ }
+ else {
+ args = _Py_VaBuildValue_SizeT(format, va);
+ }
+ if (args == NULL) {
+ return NULL;
+ }
if (!PyTuple_Check(args)) {
- result = PyObject_CallFunctionObjArgs(callable, args, NULL);
+ PyObject *stack[1] = {args};
+ result = _PyObject_FastCall(callable, stack, 1);
}
else {
result = PyObject_Call(callable, args, NULL);
}
+ Py_DECREF(args);
return result;
}
@@ -2540,25 +2559,12 @@ PyObject *
PyObject_CallFunction(PyObject *callable, const char *format, ...)
{
va_list va;
- PyObject *args, *result;
-
- if (callable == NULL) {
- return null_error();
- }
-
- if (!format || !*format) {
- return _PyObject_CallNoArg(callable);
- }
+ PyObject *result;
va_start(va, format);
- args = Py_VaBuildValue(format, va);
+ result = _PyObject_CallFunctionVa(callable, format, va, 0);
va_end(va);
- if (args == NULL) {
- return NULL;
- }
- result = call_function_tail(callable, args);
- Py_DECREF(args);
return result;
}
@@ -2566,33 +2572,18 @@ PyObject *
_PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
{
va_list va;
- PyObject *args, *result;
-
- if (callable == NULL) {
- return null_error();
- }
-
- if (!format || !*format) {
- return _PyObject_CallNoArg(callable);
- }
+ PyObject *result;
va_start(va, format);
- args = _Py_VaBuildValue_SizeT(format, va);
+ result = _PyObject_CallFunctionVa(callable, format, va, 1);
va_end(va);
- if (args == NULL) {
- return NULL;
- }
- result = call_function_tail(callable, args);
- Py_DECREF(args);
return result;
}
static PyObject*
callmethod(PyObject* callable, const char *format, va_list va, int is_size_t)
{
- PyObject *args, *result;
-
assert(callable != NULL);
if (!PyCallable_Check(callable)) {
@@ -2600,23 +2591,7 @@ callmethod(PyObject* callable, const char *format, va_list va, int is_size_t)
return NULL;
}
- if (!format || !*format) {
- return _PyObject_CallNoArg(callable);
- }
-
- if (is_size_t) {
- args = _Py_VaBuildValue_SizeT(format, va);
- }
- else {
- args = Py_VaBuildValue(format, va);
- }
- if (args == NULL) {
- return NULL;
- }
-
- result = call_function_tail(callable, args);
- Py_DECREF(args);
- return result;
+ return _PyObject_CallFunctionVa(callable, format, va, is_size_t);
}
PyObject *