You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
3.4 KiB
167 lines
3.4 KiB
#include "_cffi_include.h"
|
|
|
|
|
|
#define AA (42)
|
|
#define BB (&bb)
|
|
static int bb = 16261;
|
|
|
|
int foo42(int a, int *b)
|
|
{
|
|
return a - *b;
|
|
}
|
|
|
|
int foo64(int a)
|
|
{
|
|
return ~a;
|
|
}
|
|
|
|
struct foo_s {
|
|
int a;
|
|
};
|
|
|
|
/************************************************************/
|
|
|
|
static void *_cffi_types[] = {
|
|
_CFFI_OP(_CFFI_OP_FUNCTION, 1),
|
|
_CFFI_OP(_CFFI_OP_PRIMITIVE, _CFFI_PRIM_INT),
|
|
_CFFI_OP(_CFFI_OP_POINTER, 1),
|
|
_CFFI_OP(_CFFI_OP_FUNCTION_END, 0),
|
|
_CFFI_OP(_CFFI_OP_FUNCTION, 1),
|
|
_CFFI_OP(_CFFI_OP_PRIMITIVE, _CFFI_PRIM_INT),
|
|
_CFFI_OP(_CFFI_OP_FUNCTION_END, 0),
|
|
_CFFI_OP(_CFFI_OP_STRUCT_UNION, 0),
|
|
};
|
|
|
|
#ifndef PYPY_VERSION
|
|
static PyObject *
|
|
_cffi_f_foo42(PyObject *self, PyObject *args)
|
|
{
|
|
int x0;
|
|
int * x1;
|
|
Py_ssize_t datasize;
|
|
int result;
|
|
PyObject *arg0;
|
|
PyObject *arg1;
|
|
|
|
if (!PyArg_ParseTuple(args, "OO:foo42", &arg0, &arg1))
|
|
return NULL;
|
|
|
|
x0 = _cffi_to_c_int(arg0, int);
|
|
if (x0 == (int)-1 && PyErr_Occurred())
|
|
return NULL;
|
|
|
|
datasize = _cffi_prepare_pointer_call_argument(
|
|
_cffi_types[1], arg1, (char **)&x1);
|
|
if (datasize != 0) {
|
|
if (datasize < 0)
|
|
return NULL;
|
|
x1 = alloca(datasize);
|
|
memset((void *)x1, 0, datasize);
|
|
if (_cffi_convert_array_from_object((char *)x1, _cffi_types[1], arg1) < 0)
|
|
return NULL;
|
|
}
|
|
|
|
Py_BEGIN_ALLOW_THREADS
|
|
_cffi_restore_errno();
|
|
{ result = foo42(x0, x1); }
|
|
_cffi_save_errno();
|
|
Py_END_ALLOW_THREADS
|
|
|
|
return _cffi_from_c_int(result, int);
|
|
}
|
|
#else
|
|
static int _cffi_f_foo42(int x0, int *x1)
|
|
{
|
|
return foo42(x0, x1);
|
|
}
|
|
#endif
|
|
|
|
#ifndef PYPY_VERSION
|
|
static PyObject *
|
|
_cffi_f_foo64(PyObject *self, PyObject *arg0)
|
|
{
|
|
int x0;
|
|
int result;
|
|
|
|
x0 = _cffi_to_c_int(arg0, int);
|
|
if (x0 == (int)-1 && PyErr_Occurred())
|
|
return NULL;
|
|
|
|
Py_BEGIN_ALLOW_THREADS
|
|
_cffi_restore_errno();
|
|
{ result = foo64(x0); }
|
|
_cffi_save_errno();
|
|
Py_END_ALLOW_THREADS
|
|
|
|
return _cffi_from_c_int(result, int);
|
|
}
|
|
#else
|
|
static int _cffi_f_foo64(int x0)
|
|
{
|
|
return foo64(x0);
|
|
}
|
|
#endif
|
|
|
|
static int _cffi_const_AA(unsigned long long *output)
|
|
{
|
|
*output = (unsigned long long)((AA) << 0); // integer
|
|
return (AA) <= 0;
|
|
}
|
|
|
|
static void _cffi_const_BB(char *output)
|
|
{
|
|
*(int **)output = BB;
|
|
}
|
|
|
|
static const struct _cffi_global_s _cffi_globals[] = {
|
|
{ "AA", &_cffi_const_AA, _CFFI_OP(_CFFI_OP_CONSTANT_INT, 0) },
|
|
{ "BB", &_cffi_const_BB, _CFFI_OP(_CFFI_OP_CONSTANT, 2) },
|
|
{ "bb", &bb, _CFFI_OP(_CFFI_OP_GLOBAL_VAR, 1) },
|
|
{ "foo42", &_cffi_f_foo42, _CFFI_OP(_CFFI_OP_CPYTHON_BLTN_V, 0) },
|
|
{ "foo64", &_cffi_f_foo64, _CFFI_OP(_CFFI_OP_CPYTHON_BLTN_O, 4) },
|
|
};
|
|
|
|
struct _cffi_align_foo_s { char x; struct foo_s y; };
|
|
|
|
static const struct _cffi_struct_union_s _cffi_struct_unions[] = {
|
|
{ "foo_s", 7, 0,
|
|
sizeof(struct foo_s),
|
|
offsetof(struct _cffi_align_foo_s, y),
|
|
1, 0 },
|
|
};
|
|
|
|
static const struct _cffi_field_s _cffi_fields[] = {
|
|
{ "a", offsetof(struct foo_s, a), sizeof(((struct foo_s *)0)->a),
|
|
_CFFI_OP(_CFFI_OP_NOOP, 1) },
|
|
};
|
|
|
|
static const struct _cffi_type_context_s _cffi_type_context = {
|
|
_cffi_types,
|
|
_cffi_globals,
|
|
_cffi_fields,
|
|
_cffi_struct_unions,
|
|
NULL,
|
|
NULL,
|
|
5, /* num_globals */
|
|
1, /* num_struct_unions */
|
|
0,
|
|
0,
|
|
NULL,
|
|
8, /* num_types */
|
|
};
|
|
|
|
#ifndef PYPY_VERSION
|
|
PyMODINIT_FUNC
|
|
initmanual(void)
|
|
{
|
|
_cffi_init("manual", 0x2601, &_cffi_type_context);
|
|
}
|
|
#else
|
|
PyMODINIT_FUNC
|
|
_cffi_pypyinit_manual(const void *p[])
|
|
{
|
|
p[0] = (const void *)0x2601;
|
|
p[1] = &_cffi_type_context;
|
|
}
|
|
#endif
|