Skip to content
Permalink
master
Go to file
 
 
Cannot retrieve contributors at this time
93 lines (74 sloc) 2.57 KB
#include "_dynfunc.c"
/* Python-facing function to dynamically create a new C function object */
static PyObject*
make_function(PyObject *self, PyObject *args)
{
PyObject *module, *fname, *fdoc, *fnaddrobj;
void *fnaddr;
EnvironmentObject *env;
PyObject *keepalive;
if (!PyArg_ParseTuple(args, "OOOOO!|O",
&module, &fname, &fdoc, &fnaddrobj, &EnvironmentType, &env,
&keepalive)) {
return NULL;
}
fnaddr = PyLong_AsVoidPtr(fnaddrobj);
if (fnaddr == NULL && PyErr_Occurred())
return NULL;
return pycfunction_new(module, fname, fdoc, fnaddr, env, keepalive);
}
static PyMethodDef ext_methods[] = {
#define declmethod(func) { #func , ( PyCFunction )func , METH_VARARGS , NULL }
declmethod(make_function),
{ NULL },
#undef declmethod
};
static PyObject *
build_c_helpers_dict(void)
{
PyObject *dct = PyDict_New();
if (dct == NULL)
goto error;
#define _declpointer(name, value) do { \
PyObject *o = PyLong_FromVoidPtr(value); \
if (o == NULL) goto error; \
if (PyDict_SetItemString(dct, name, o)) { \
Py_DECREF(o); \
goto error; \
} \
Py_DECREF(o); \
} while (0)
#define declmethod(func) _declpointer(#func, &Numba_##func)
#define declpointer(ptr) _declpointer(#ptr, &ptr)
declmethod(make_generator);
#undef declmethod
return dct;
error:
Py_XDECREF(dct);
return NULL;
}
MOD_INIT(_dynfunc) {
PyObject *m, *impl_info;
MOD_DEF(m, "_dynfunc", "No docs", ext_methods)
if (m == NULL)
return MOD_ERROR_VAL;
if (init_dynfunc_module(m))
return MOD_ERROR_VAL;
impl_info = Py_BuildValue(
"{snsnsn}",
"offsetof_closure_body", offsetof(ClosureObject, env),
"offsetof_env_body", offsetof(EnvironmentObject, globals),
"offsetof_generator_state", offsetof(GeneratorObject, state)
);
if (impl_info == NULL)
return MOD_ERROR_VAL;
PyModule_AddObject(m, "_impl_info", impl_info);
Py_INCREF(&ClosureType);
PyModule_AddObject(m, "_Closure", (PyObject *) (&ClosureType));
Py_INCREF(&EnvironmentType);
PyModule_AddObject(m, "Environment", (PyObject *) (&EnvironmentType));
Py_INCREF(&GeneratorType);
PyModule_AddObject(m, "_Generator", (PyObject *) (&GeneratorType));
PyModule_AddObject(m, "c_helpers", build_c_helpers_dict());
return MOD_SUCCESS_VAL(m);
}
You can’t perform that action at this time.