Kaydet (Commit) e83aab12 authored tarafından Victor Stinner's avatar Victor Stinner

Add _PyObject_CallFunctionVa() helper

Issue #28915: Add _PyObject_CallFunctionVa() helper to factorize code of
functions:

* PyObject_CallFunction()
* _PyObject_CallFunction_SizeT()
* callmethod()
üst 3bb71199
...@@ -2519,20 +2519,39 @@ _PyObject_FastCallKeywords(PyObject *callable, PyObject **stack, Py_ssize_t narg ...@@ -2519,20 +2519,39 @@ _PyObject_FastCallKeywords(PyObject *callable, PyObject **stack, Py_ssize_t narg
} }
} }
static PyObject* static PyObject *
call_function_tail(PyObject *callable, PyObject *args) _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)) { if (!PyTuple_Check(args)) {
result = PyObject_CallFunctionObjArgs(callable, args, NULL); PyObject *stack[1] = {args};
result = _PyObject_FastCall(callable, stack, 1);
} }
else { else {
result = PyObject_Call(callable, args, NULL); result = PyObject_Call(callable, args, NULL);
} }
Py_DECREF(args);
return result; return result;
} }
...@@ -2540,25 +2559,12 @@ PyObject * ...@@ -2540,25 +2559,12 @@ PyObject *
PyObject_CallFunction(PyObject *callable, const char *format, ...) PyObject_CallFunction(PyObject *callable, const char *format, ...)
{ {
va_list va; va_list va;
PyObject *args, *result; PyObject *result;
if (callable == NULL) {
return null_error();
}
if (!format || !*format) {
return _PyObject_CallNoArg(callable);
}
va_start(va, format); va_start(va, format);
args = Py_VaBuildValue(format, va); result = _PyObject_CallFunctionVa(callable, format, va, 0);
va_end(va); va_end(va);
if (args == NULL) {
return NULL;
}
result = call_function_tail(callable, args);
Py_DECREF(args);
return result; return result;
} }
...@@ -2566,33 +2572,18 @@ PyObject * ...@@ -2566,33 +2572,18 @@ PyObject *
_PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...) _PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
{ {
va_list va; va_list va;
PyObject *args, *result; PyObject *result;
if (callable == NULL) {
return null_error();
}
if (!format || !*format) {
return _PyObject_CallNoArg(callable);
}
va_start(va, format); va_start(va, format);
args = _Py_VaBuildValue_SizeT(format, va); result = _PyObject_CallFunctionVa(callable, format, va, 1);
va_end(va); va_end(va);
if (args == NULL) {
return NULL;
}
result = call_function_tail(callable, args);
Py_DECREF(args);
return result; return result;
} }
static PyObject* static PyObject*
callmethod(PyObject* callable, const char *format, va_list va, int is_size_t) callmethod(PyObject* callable, const char *format, va_list va, int is_size_t)
{ {
PyObject *args, *result;
assert(callable != NULL); assert(callable != NULL);
if (!PyCallable_Check(callable)) { if (!PyCallable_Check(callable)) {
...@@ -2600,23 +2591,7 @@ callmethod(PyObject* callable, const char *format, va_list va, int is_size_t) ...@@ -2600,23 +2591,7 @@ callmethod(PyObject* callable, const char *format, va_list va, int is_size_t)
return NULL; return NULL;
} }
if (!format || !*format) { return _PyObject_CallFunctionVa(callable, format, va, is_size_t);
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;
} }
PyObject * PyObject *
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment