[pypy-svn] r74173 - in pypy/branch/cpython-extension/pypy/module/cpyext: . src
afa at codespeak.net
afa at codespeak.net
Wed Apr 28 14:57:26 CEST 2010
Author: afa
Date: Wed Apr 28 14:57:25 2010
New Revision: 74173
Modified:
pypy/branch/cpython-extension/pypy/module/cpyext/api.py
pypy/branch/cpython-extension/pypy/module/cpyext/src/modsupport.c
Log:
PyObject_CallFunctionObjArgs, PyObject_CallMethodObjArgs
Modified: pypy/branch/cpython-extension/pypy/module/cpyext/api.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/api.py (original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/api.py Wed Apr 28 14:57:25 2010
@@ -254,7 +254,7 @@
'PyModule_AddObject', 'PyModule_AddIntConstant', 'PyModule_AddStringConstant',
'Py_BuildValue', 'PyTuple_Pack', 'PyErr_Format', 'PyErr_NewException',
'PyEval_CallFunction', 'PyEval_CallMethod', 'PyObject_CallFunction',
- 'PyObject_CallMethod',
+ 'PyObject_CallMethod', 'PyObject_CallFunctionObjArgs', 'PyObject_CallMethodObjArgs',
'PyBuffer_FromMemory', 'PyBuffer_New', 'PyBuffer_Type', 'init_bufferobject',
'_PyArg_NoKeywords',
'PyObject_AsReadBuffer', 'PyObject_AsWriteBuffer', 'PyObject_CheckReadBuffer',
Modified: pypy/branch/cpython-extension/pypy/module/cpyext/src/modsupport.c
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/src/modsupport.c (original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/src/modsupport.c Wed Apr 28 14:57:25 2010
@@ -592,6 +592,79 @@
return retval;
}
+static PyObject *
+objargs_mktuple(va_list va)
+{
+ int i, n = 0;
+ va_list countva;
+ PyObject *result, *tmp;
+
+#ifdef VA_LIST_IS_ARRAY
+ memcpy(countva, va, sizeof(va_list));
+#else
+#ifdef __va_copy
+ __va_copy(countva, va);
+#else
+ countva = va;
+#endif
+#endif
+
+ while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
+ ++n;
+ result = PyTuple_New(n);
+ if (result != NULL && n > 0) {
+ for (i = 0; i < n; ++i) {
+ tmp = (PyObject *)va_arg(va, PyObject *);
+ PyTuple_SET_ITEM(result, i, tmp);
+ Py_INCREF(tmp);
+ }
+ }
+ return result;
+}
+
+PyObject *
+PyObject_CallFunctionObjArgs(PyObject *callable, ...)
+{
+ PyObject *args, *tmp;
+ va_list vargs;
+
+ /* count the args */
+ va_start(vargs, callable);
+ args = objargs_mktuple(vargs);
+ va_end(vargs);
+ if (args == NULL)
+ return NULL;
+ tmp = PyObject_Call(callable, args, NULL);
+ Py_DECREF(args);
+
+ return tmp;
+}
+
+PyObject *
+PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
+{
+ PyObject *args, *tmp;
+ va_list vargs;
+
+ callable = PyObject_GetAttr(callable, name);
+ if (callable == NULL)
+ return NULL;
+
+ /* count the args */
+ va_start(vargs, name);
+ args = objargs_mktuple(vargs);
+ va_end(vargs);
+ if (args == NULL) {
+ Py_DECREF(callable);
+ return NULL;
+ }
+ tmp = PyObject_Call(callable, args, NULL);
+ Py_DECREF(args);
+ Py_DECREF(callable);
+
+ return tmp;
+}
+
int
PyModule_AddObject(PyObject *m, const char *name, PyObject *o)
{
More information about the Pypy-commit
mailing list