Author: Armin Rigo <[email protected]>
Branch:
Changeset: r618:1cba40aac890
Date: 2012-07-09 21:38 +0200
http://bitbucket.org/cffi/cffi/changeset/1cba40aac890/
Log: A feature not exposed so far via the normal interface: specify the
ABI of function types.
diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c
--- a/c/_cffi_backend.c
+++ b/c/_cffi_backend.c
@@ -54,7 +54,7 @@
struct _ctypedescr *ct_itemdescr; /* ptrs and arrays: the item type */
PyObject *ct_stuff; /* structs: dict of the fields
arrays: ctypedescr of the ptr type
- function: tuple(ctres, ctargs...)
+ function: tuple(abi, ctres, ctargs..)
enum: pair {"name":x},{x:"name"} */
void *ct_extra; /* structs: first field (not a ref!)
function types: cif_description
@@ -1563,7 +1563,7 @@
convert_struct_to_owning_object(char *data, CTypeDescrObject *ct); /*forward*/
static cif_description_t *
-fb_prepare_cif(PyObject *fargs, CTypeDescrObject *fresult); /* forward */
+fb_prepare_cif(PyObject *fargs, CTypeDescrObject *, ffi_abi); /*forward*/
static PyObject*
cdata_call(CDataObject *cd, PyObject *args, PyObject *kwds)
@@ -1591,8 +1591,8 @@
nargs = PyTuple_Size(args);
if (nargs < 0)
return NULL;
- nargs_declared = PyTuple_GET_SIZE(signature) - 1;
- fresult = (CTypeDescrObject *)PyTuple_GET_ITEM(signature, 0);
+ nargs_declared = PyTuple_GET_SIZE(signature) - 2;
+ fresult = (CTypeDescrObject *)PyTuple_GET_ITEM(signature, 1);
fvarargs = NULL;
buffer = NULL;
@@ -1607,6 +1607,7 @@
}
else {
/* call of a variadic function */
+ ffi_abi fabi;
if (nargs < nargs_declared) {
errormsg = "%s expects at least %zd arguments, got %zd";
goto bad_number_of_arguments;
@@ -1615,7 +1616,7 @@
if (fvarargs == NULL)
goto error;
for (i = 0; i < nargs_declared; i++) {
- PyObject *o = PyTuple_GET_ITEM(signature, 1 + i);
+ PyObject *o = PyTuple_GET_ITEM(signature, 2 + i);
Py_INCREF(o);
PyTuple_SET_ITEM(fvarargs, i, o);
}
@@ -1638,7 +1639,8 @@
}
PyTuple_SET_ITEM(fvarargs, i, (PyObject *)ct);
}
- cif_descr = fb_prepare_cif(fvarargs, fresult);
+ fabi = PyInt_AS_LONG(PyTuple_GET_ITEM(signature, 0));
+ cif_descr = fb_prepare_cif(fvarargs, fresult, fabi);
if (cif_descr == NULL)
goto error;
}
@@ -1659,7 +1661,7 @@
buffer_array[i] = data;
if (i < nargs_declared)
- argtype = (CTypeDescrObject *)PyTuple_GET_ITEM(signature, 1 + i);
+ argtype = (CTypeDescrObject *)PyTuple_GET_ITEM(signature, 2 + i);
else
argtype = (CTypeDescrObject *)PyTuple_GET_ITEM(fvarargs, i);
@@ -3169,7 +3171,8 @@
}
static cif_description_t *fb_prepare_cif(PyObject *fargs,
- CTypeDescrObject *fresult)
+ CTypeDescrObject *fresult,
+ ffi_abi fabi)
{
char *buffer;
cif_description_t *cif_descr;
@@ -3196,7 +3199,7 @@
assert(funcbuffer.bufferp == buffer + funcbuffer.nb_bytes);
cif_descr = (cif_description_t *)buffer;
- if (ffi_prep_cif(&cif_descr->cif, FFI_DEFAULT_ABI, funcbuffer.nargs,
+ if (ffi_prep_cif(&cif_descr->cif, fabi, funcbuffer.nargs,
funcbuffer.rtype, funcbuffer.atypes) != FFI_OK) {
PyErr_SetString(PyExc_SystemError,
"libffi failed to build this function type");
@@ -3211,17 +3214,18 @@
static PyObject *b_new_function_type(PyObject *self, PyObject *args)
{
- PyObject *fargs;
+ PyObject *fargs, *fabiobj;
CTypeDescrObject *fresult;
CTypeDescrObject *fct;
- int ellipsis = 0;
+ int ellipsis = 0, fabi = FFI_DEFAULT_ABI;
struct funcbuilder_s funcbuilder;
Py_ssize_t i;
- if (!PyArg_ParseTuple(args, "O!O!|i:new_function_type",
+ if (!PyArg_ParseTuple(args, "O!O!|ii:new_function_type",
&PyTuple_Type, &fargs,
&CTypeDescr_Type, &fresult,
- &ellipsis))
+ &ellipsis,
+ &fabi))
return NULL;
if (fresult->ct_flags & CT_UNION) {
@@ -3247,7 +3251,7 @@
is computed here. */
cif_description_t *cif_descr;
- cif_descr = fb_prepare_cif(fargs, fresult);
+ cif_descr = fb_prepare_cif(fargs, fresult, fabi);
if (cif_descr == NULL)
goto error;
@@ -3255,18 +3259,23 @@
}
/* build the signature, given by a tuple of ctype objects */
- fct->ct_stuff = PyTuple_New(1 + funcbuilder.nargs);
+ fct->ct_stuff = PyTuple_New(2 + funcbuilder.nargs);
if (fct->ct_stuff == NULL)
goto error;
+ fabiobj = PyInt_FromLong(fabi);
+ if (fabiobj == NULL)
+ goto error;
+ PyTuple_SET_ITEM(fct->ct_stuff, 0, fabiobj);
+
Py_INCREF(fresult);
- PyTuple_SET_ITEM(fct->ct_stuff, 0, (PyObject *)fresult);
+ PyTuple_SET_ITEM(fct->ct_stuff, 1, (PyObject *)fresult);
for (i=0; i<funcbuilder.nargs; i++) {
PyObject *o = PyTuple_GET_ITEM(fargs, i);
/* convert arrays into pointers */
if (((CTypeDescrObject *)o)->ct_flags & CT_ARRAY)
o = ((CTypeDescrObject *)o)->ct_stuff;
Py_INCREF(o);
- PyTuple_SET_ITEM(fct->ct_stuff, 1 + i, o);
+ PyTuple_SET_ITEM(fct->ct_stuff, 2 + i, o);
}
fct->ct_size = sizeof(void(*)(void));
fct->ct_flags = CT_FUNCTIONPTR;
@@ -3295,13 +3304,13 @@
Py_INCREF(cb_args);
- n = PyTuple_GET_SIZE(signature) - 1;
+ n = PyTuple_GET_SIZE(signature) - 2;
py_args = PyTuple_New(n);
if (py_args == NULL)
goto error;
for (i=0; i<n; i++) {
- PyObject *a = convert_to_object(args[i], SIGNATURE(i + 1));
+ PyObject *a = convert_to_object(args[i], SIGNATURE(2 + i));
if (a == NULL)
goto error;
PyTuple_SET_ITEM(py_args, i, a);
@@ -3311,8 +3320,8 @@
if (py_res == NULL)
goto error;
- if (SIGNATURE(0)->ct_size > 0) {
- if (convert_from_object(result, SIGNATURE(0), py_res) < 0)
+ if (SIGNATURE(1)->ct_size > 0) {
+ if (convert_from_object(result, SIGNATURE(1), py_res) < 0)
goto error;
}
else if (py_res != Py_None) {
@@ -3329,9 +3338,9 @@
error:
PyErr_WriteUnraisable(py_ob);
- if (SIGNATURE(0)->ct_size > 0) {
+ if (SIGNATURE(1)->ct_size > 0) {
py_rawerr = PyTuple_GET_ITEM(cb_args, 2);
- memcpy(result, PyString_AS_STRING(py_rawerr), SIGNATURE(0)->ct_size);
+ memcpy(result, PyString_AS_STRING(py_rawerr), SIGNATURE(1)->ct_size);
}
goto done;
}
@@ -3365,7 +3374,7 @@
return NULL;
}
- ctresult = (CTypeDescrObject *)PyTuple_GET_ITEM(ct->ct_stuff, 0);
+ ctresult = (CTypeDescrObject *)PyTuple_GET_ITEM(ct->ct_stuff, 1);
size = ctresult->ct_size;
if (size < 0)
size = 0;
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit