[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