§
y<ˆjÏa ã óš — d Z ddlmZ ddlmZmZmZmZmZm Z m
Z
mZmZm
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z! ddlm"Z" ej# Z$ddg d¢dd d
ddd
œZ%i di dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“d d“d!d“d"d“d#d““dd$“dd%“dd&“dg “dd“d'd“d(d“dd)“dg “dd“d*d“dg “dd“d+d“d,d“dd-“ddd.d/d0d1dddd2d3d4d5e d6 ee ¦ « did7œ¥d8ed9id:ed;igdgd? ee ee¦ « ee
¦ « ¦ « d@œedAidBdCdDedEidFedGigddSge
dTœdUdVe d6igdWedXœedJdYœgZ& eee¦ « dZi eee¦ « dZiedUi eee¦ « d[e d6igi eee¦ « d[e d6igiedV ee e¦ « d6 ee e¦ « d\igi eee¦ « d]i eee¦ « d]idd^œ eee¦ « d_ ee ee¦ « ¦ « d`e
daed_i eee¦ « db ee ee¦ « ¦ « dce
dbedbi eee¦ « dS ee ee¦ « ¦ « dde
ddedSi eee
e¦ « dSiedeiedfiedgidhœ ee¦ « dii eee e!dj¦ « ¦ « diedkiedli ee e ee¦ « e¦ « ¦ « dmi ee e ee¦ « ee¦ « ¦ « ¦ « dni ee eee¦ « ¦ « doi ee ee ee¦ « ¦ « ¦ « dpigedgied=igedqœedriedsigedtieduiedSig eee¦ « ddvœedwidxedyigdSdIed=idHg eee¦ « dzœed{ied|ied}iged~ieduig eee¦ « ddvœdd€e
dd�œed‚iedƒ ee¦ « d„id…g ee
e eee¦ « ¦ « dd†œedkid‡edˆid‰edŠigd‹edSig ee
e¦ « dzœd]edŒœg
Z'i Z(d�„ Z)dŽ„ Z*d�S )�aK
Build call-back mechanism for f2py2e.
Copyright 2000 Pearu Peterson all rights reserved,
Pearu Peterson
Permission to use, modify, and distribute this software is given under the
terms of the NumPy License.
NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
$Date: 2005/07/20 11:27:58 $
Pearu Peterson
é )Ú__version__)Ú
applyrulesÚ debugcapiÚ
dictappendÚerrmessÚgetargsÚhasnoteÚisarrayÚ iscomplexÚiscomplexarrayÚiscomplexfunctionÚ
isfunctionÚ
isintent_cÚ
isintent_hideÚisintent_inÚisintent_inoutÚisintent_nothideÚisintent_outÚ
isoptionalÚ
isrequiredÚisscalarÚisstringÚisstringfunctionÚissubroutineÚl_andÚl_notÚl_orÚoutmessÚreplaceÚ
stripcommaÚthrow_error)ÚcfuncszPtypedef #rctype#(*#name#_typedef)(#optargs_td##args_td##strarglens_td##noargs#);a^
#begintitle#
typedef struct {
PyObject *capi;
PyTupleObject *args_capi;
int nofargs;
jmp_buf jmpbuf;
} #name#_t;
#if defined(F2PY_THREAD_LOCAL_DECL) && !defined(F2PY_USE_PYTHON_TLS)
static F2PY_THREAD_LOCAL_DECL #name#_t *_active_#name# = NULL;
static #name#_t *swap_active_#name#(#name#_t *ptr) {
#name#_t *prev = _active_#name#;
_active_#name# = ptr;
return prev;
}
static #name#_t *get_active_#name#(void) {
return _active_#name#;
}
#else
static #name#_t *swap_active_#name#(#name#_t *ptr) {
char *key = "__f2py_cb_#name#";
return (#name#_t *)F2PySwapThreadLocalCallbackPtr(key, ptr);
}
static #name#_t *get_active_#name#(void) {
char *key = "__f2py_cb_#name#";
return (#name#_t *)F2PyGetThreadLocalCallbackPtr(key);
}
#endif
/*typedef #rctype#(*#name#_typedef)(#optargs_td##args_td##strarglens_td##noargs#);*/
#static# #rctype# #callbackname# (#optargs##args##strarglens##noargs#) {
#name#_t cb_local = { NULL, NULL, 0 };
#name#_t *cb = NULL;
PyTupleObject *capi_arglist = NULL;
PyObject *capi_return = NULL;
PyObject *capi_tmp = NULL;
PyObject *capi_arglist_list = NULL;
int capi_j,capi_i = 0;
int capi_longjmp_ok = 1;
#decl#
#ifdef F2PY_REPORT_ATEXIT
f2py_cb_start_clock();
#endif
cb = get_active_#name#();
if (cb == NULL) {
capi_longjmp_ok = 0;
cb = &cb_local;
}
capi_arglist = cb->args_capi;
CFUNCSMESS("cb:Call-back function #name# (maxnofargs=#maxnofargs#(-#nofoptargs#))\n");
CFUNCSMESSPY("cb:#name#_capi=",cb->capi);
if (cb->capi==NULL) {
capi_longjmp_ok = 0;
cb->capi = PyObject_GetAttrString(#modulename#_module,"#argname#");
CFUNCSMESSPY("cb:#name#_capi=",cb->capi);
}
if (cb->capi==NULL) {
PyErr_SetString(#modulename#_error,"cb: Callback #argname# not defined (as an argument or module #modulename# attribute).\n");
goto capi_fail;
}
if (F2PyCapsule_Check(cb->capi)) {
#name#_typedef #name#_cptr;
#name#_cptr = F2PyCapsule_AsVoidPtr(cb->capi);
#returncptr#(*#name#_cptr)(#optargs_nm##args_nm##strarglens_nm#);
#return#
}
if (capi_arglist==NULL) {
capi_longjmp_ok = 0;
capi_tmp = PyObject_GetAttrString(#modulename#_module,"#argname#_extra_args");
if (capi_tmp) {
capi_arglist = (PyTupleObject *)PySequence_Tuple(capi_tmp);
Py_DECREF(capi_tmp);
if (capi_arglist==NULL) {
PyErr_SetString(#modulename#_error,"Failed to convert #modulename#.#argname#_extra_args to tuple.\n");
goto capi_fail;
}
} else {
PyErr_Clear();
capi_arglist = (PyTupleObject *)Py_BuildValue("()");
}
}
if (capi_arglist == NULL) {
PyErr_SetString(#modulename#_error,"Callback #argname# argument list is not set.\n");
goto capi_fail;
}
#setdims#
#ifdef PYPY_VERSION
#define CAPI_ARGLIST_SETITEM(idx, value) PyList_SetItem((PyObject *)capi_arglist_list, idx, value)
capi_arglist_list = PySequence_List(capi_arglist);
if (capi_arglist_list == NULL) goto capi_fail;
#else
#define CAPI_ARGLIST_SETITEM(idx, value) PyTuple_SetItem((PyObject *)capi_arglist, idx, value)
#endif
#pyobjfrom#
#undef CAPI_ARGLIST_SETITEM
#ifdef PYPY_VERSION
CFUNCSMESSPY("cb:capi_arglist=",capi_arglist_list);
#else
CFUNCSMESSPY("cb:capi_arglist=",capi_arglist);
#endif
CFUNCSMESS("cb:Call-back calling Python function #argname#.\n");
#ifdef F2PY_REPORT_ATEXIT
f2py_cb_start_call_clock();
#endif
#ifdef PYPY_VERSION
capi_return = PyObject_CallObject(cb->capi,(PyObject *)capi_arglist_list);
Py_DECREF(capi_arglist_list);
capi_arglist_list = NULL;
#else
capi_return = PyObject_CallObject(cb->capi,(PyObject *)capi_arglist);
#endif
#ifdef F2PY_REPORT_ATEXIT
f2py_cb_stop_call_clock();
#endif
CFUNCSMESSPY("cb:capi_return=",capi_return);
if (capi_return == NULL) {
fprintf(stderr,"capi_return is NULL\n");
goto capi_fail;
}
if (capi_return == Py_None) {
Py_DECREF(capi_return);
capi_return = Py_BuildValue("()");
}
else if (!PyTuple_Check(capi_return)) {
capi_return = Py_BuildValue("(N)",capi_return);
}
capi_j = PyTuple_Size(capi_return);
capi_i = 0;
#frompyobj#
CFUNCSMESS("cb:#name#:successful\n");
Py_DECREF(capi_return);
#ifdef F2PY_REPORT_ATEXIT
f2py_cb_stop_clock();
#endif
goto capi_return_pt;
capi_fail:
fprintf(stderr,"Call-back #name# failed.\n");
Py_XDECREF(capi_return);
Py_XDECREF(capi_arglist_list);
if (capi_longjmp_ok) {
longjmp(cb->jmpbuf,-1);
}
capi_return_pt:
;
#return#
}
#endtitle#
)zsetjmp.hÚ
CFUNCSMESSÚF2PY_THREAD_LOCAL_DECLz#maxnofargs#z#nofoptargs#zF def #argname#(#docsignature#): return #docreturn#\n\
#docstrsigns#zc
{{}\verb@def #argname#(#latexdocsignature#): return #docreturn#@{}}
#routnote#
#latexdocstrsigns#z1def #argname#(#docsignature#): return #docreturn#)Ú
cbtypedefsÚbodyÚneedÚ
maxnofargsÚ
nofoptargsÚdocstrÚlatexdocstrÚdocstrshortÚ
separatorsforÚdeclú
Úargsú,ÚoptargsÚ Ú pyobjfromÚfreememÚargs_tdÚ
optargs_tdÚargs_nmÚ
optargs_nmÚ frompyobjÚsetdimsÚdocstrsignsz\n"
"ÚlatexdocstrsignsÚlatexdocstrreqÚlatexdocstroptÚlatexdocstroutÚlatexdocstrcbsz/*decl*/z
/*pyobjfrom*/z
/*frompyobj*/ÚreturnÚ
strarglensz/*freemem*/Ú
strarglens_tdÚ
strarglens_nmÚnoargsz/*setdims*/z Required arguments:z Optional arguments:z Return objects:z Call-back functions:z\noindent Required arguments:z\noindent Optional arguments:z\noindent Return objects:z\noindent Call-back functions:z
--- #note#)r<