Uc@szdZddd!ZddlZejZddlZddlZddlZejjZ ej jZ ejZ ddl TddlZddlZidd6dd 6d d gd 6d d6dd6dd6dd6dd6Ziidd6dd6dd6dd6dd6dd6dd 6dd!6dd"6dd#6dd$6d%d&6dd'6dd(6dd)6dd*6dd+6d,6d-d6d.d6d/d#6gd6dd6dd06dd16d2d6gd6dd 6dd36gd!6dd"6dd46dd56d6d$6dd&6dd'6d7d86d9d:6d;d<6d=d>6dd?6dd@6ddA6dBd(6dCd)6dDd*6dEd+6idFe6dee6dG6idHd6idIe6dJidKe6gd#6dLid e6dMgd 6dNd06eeeeeedO6iidPe6d6dQd6dRd!6dSd6idTe6dUidVe6gd#6dLid e6dWdXgd 6dYd06edO6idZd6d[d"6d\d 6d]d6idIe6d^id_e6gd#6d`d06dLid e6dWdMdagd 6edO6idbd<6dcidFe6gd*6ddd?6edO6iedO6dYd06gZi ideeee6d:6ideeee6d86idbe6d<6idfidFe6geee6d)6idfidFe6geee6d(6idcidFeee6dgeee6ge6d*6idheee6d@6idheee6dA6ddi6iidjeee 6dkeeee 6dle!6dje"6d6idmeee 6dneeee 6dme!6dme"6d!6idaeee 6doeeee 6doe!6dae"6d6idpe"6d16idqe"6d36idre"6d46iidsee 6d6idee ee#dt6du6idve6idwe6idxeeeee$e 6idyeeeee$ee 6idzeeee$e 6id{eeee$ee 6gd#6idLdMge6id e6gd 6edO6iid|e%6id}e&6gd6id~e%6ide&6idae$6gd 6eeedO6dd6iide6dide6gd#6dadXid e6dWgd 6ee"edO6iide6id|e%6ide&6gd6id~e%6ide&6gd 6ee"edO6dd6idd6dd$6e!dO6dd6iide6ide 6dee 6dgd6ee!ee'e%e&dO6dd6iidve6dide 6dide6gd#6didae(6gd 6ee!edO6idhd?6edO6g Z)ia*dZ+dZ,dS(sJ 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 s$Revision: 1.53 $i iN(t*sPtypedef #rctype#(*#name#_typedef)(#optargs_td##args_td##strarglens_td##noargs#);t cbtypedefss #begintitle# PyObject *#name#_capi = NULL;/*was Py_None*/ PyTupleObject *#name#_args_capi = NULL; int #name#_nofargs = 0; jmp_buf #name#_jmpbuf; /*typedef #rctype#(*#name#_typedef)(#optargs_td##args_td##strarglens_td##noargs#);*/ #static# #rctype# #callbackname# (#optargs##args##strarglens##noargs#) { PyTupleObject *capi_arglist = #name#_args_capi; PyObject *capi_return = NULL; PyObject *capi_tmp = NULL; int capi_j,capi_i = 0; int capi_longjmp_ok = 1; #decl# #ifdef F2PY_REPORT_ATEXIT f2py_cb_start_clock(); #endif CFUNCSMESS("cb:Call-back function #name# (maxnofargs=#maxnofargs#(-#nofoptargs#))\n"); CFUNCSMESSPY("cb:#name#_capi=",#name#_capi); if (#name#_capi==NULL) { capi_longjmp_ok = 0; #name#_capi = PyObject_GetAttrString(#modulename#_module,"#argname#"); } if (#name#_capi==NULL) { PyErr_SetString(#modulename#_error,"cb: Callback #argname# not defined (as an argument or module #modulename# attribute).\n"); goto capi_fail; } if (PyCObject_Check(#name#_capi)) { #name#_typedef #name#_cptr; #name#_cptr = PyCObject_AsVoidPtr(#name#_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); 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# #pyobjfrom# CFUNCSMESSPY("cb:capi_arglist=",capi_arglist); CFUNCSMESS("cb:Call-back calling Python function #argname#.\n"); #ifdef F2PY_REPORT_ATEXIT f2py_cb_start_call_clock(); #endif capi_return = PyObject_CallObject(#name#_capi,(PyObject *)capi_arglist); #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); if (capi_longjmp_ok) longjmp(#name#_jmpbuf,-1); capi_return_pt: ; #return# } #endtitle# tbodyssetjmp.ht CFUNCSMESStneeds #maxnofargs#t maxnofargss #nofoptargs#t nofoptargssC def #argname#(#docsignature#): return #docreturn#\n\ #docstrsigns#tdocstrsc {{}\verb@def #argname#(#latexdocsignature#): return #docreturn#@{}} #routnote# #latexdocstrsigns#t latexdocstrs1def #argname#(#docsignature#): return #docreturn#t docstrshorts tdeclt,targsttoptargst pyobjfromtfreememtargs_tdt optargs_tdtargs_nmt optargs_nmt frompyobjtsetdimss\n" "t docstrsignstlatexdocstrsignstlatexdocstrreqtlatexdocstropttlatexdocstrouttlatexdocstrcbst separatorsfors/*decl*/s /*pyobjfrom*/s /*frompyobj*/treturnt strarglenss /*freemem*/t strarglens_tdt strarglens_nmtnoargss /*setdims*/s Required arguments:t docstrreqs Optional arguments:t docstropts Return objects:t docstrouts Call-back functions:t docstrcbst docreturntdocsignt docsignopts\noindent Required arguments:s\noindent Optional arguments:s\noindent Return objects:s\noindent Call-back functions:s --- #note#troutnotes #ctype# return_value;s) CFUNCSMESS("cb:Getting return_value->");s if (capi_j>capi_i) GETSCALARFROMPYTUPLE(capi_return,capi_i++,&return_value,#ctype#,"#ctype#_from_pyobj failed in converting return_value of call-back function #name# to C #ctype#\n");s5 fprintf(stderr,"#showvalueformat#.\n",return_value);s#ctype#_from_pyobjtGETSCALARFROMPYTUPLEs return return_value;t_checks? fprintf(stderr,"debug-capi:cb:#name#:%d:\n",return_value_len);s)#ctype# return_value,int return_value_lensreturn_value,&return_value_lens #ctype# ,ints+ CFUNCSMESS("cb:Getting return_value->\"");s\ if (capi_j>capi_i) GETSTRFROMPYTUPLE(capi_return,capi_i++,return_value,return_value_len);s7 fprintf(stderr,"#showvalueformat#\".\n",return_value);sstring.htGETSTRFROMPYTUPLEsreturn;s< #ifndef F2PY_CB_RETURNCOMPLEX #ctype# *return_value #endif s3 #ifndef F2PY_CB_RETURNCOMPLEX return_value #endif s0 #ifndef F2PY_CB_RETURNCOMPLEX #ctype# * #endif s< #ifdef F2PY_CB_RETURNCOMPLEX #ctype# return_value; #endif s if (capi_j>capi_i) #ifdef F2PY_CB_RETURNCOMPLEX GETSCALARFROMPYTUPLE(capi_return,capi_i++,&return_value,#ctype#,"#ctype#_from_pyobj failed in converting return_value of call-back function #name# to C #ctype#\n"); #else GETSCALARFROMPYTUPLE(capi_return,capi_i++,return_value,#ctype#,"#ctype#_from_pyobj failed in converting return_value of call-back function #name# to C #ctype#\n"); #endif s #ifdef F2PY_CB_RETURNCOMPLEX fprintf(stderr,"#showvalueformat#.\n",(return_value).r,(return_value).i); #else fprintf(stderr,"#showvalueformat#.\n",(*return_value).r,(*return_value).i); #endif sJ #ifdef F2PY_CB_RETURNCOMPLEX return return_value; #else return; #endif s#ctype#s #pydocsignout#s"\item[]{{}\verb@#pydocsignout#@{}}s#rname#,s #pydocsign#s\item[]{{}\verb@#pydocsign#@{}}s--- See above.s #varname#,tdepends#ctype# #varname_i#s#ctype# *#varname_i#_cb_capis#ctype# *#varname_i#s #varname_i#s#varname_i#_cb_capis #ctype# *s,int #varname_i#_cb_lens,ints,#varname_i#_cb_lens, #ctype# #varname_i#=(*#varname_i#_cb_capi);s8intent(c,out) is forbidden for callback scalar argumentsterrors& CFUNCSMESS("cb:Getting #varname#->");s if (capi_j>capi_i) GETSCALARFROMPYTUPLE(capi_return,capi_i++,#varname_i#_cb_capi,#ctype#,"#ctype#_from_pyobj failed in converting argument #varname# of call-back function #name# to C #ctype#\n");s4 fprintf(stderr,"#showvalueformat#.\n",#varname_i#);s= fprintf(stderr,"#showvalueformat#.\n",*#varname_i#_cb_capi);sH fprintf(stderr,"#showvalueformat#.\n",(#varname_i#).r,(#varname_i#).i);sZ fprintf(stderr,"#showvalueformat#.\n",(*#varname_i#_cb_capi).r,(*#varname_i#_cb_capi).i);s if (#name#_nofargs>capi_i) if (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyobj_from_#ctype#1(#varname_i#))) goto capi_fail;s if (#name#_nofargs>capi_i) if (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyarr_from_p_#ctype#1(#varname_i#_cb_capi))) goto capi_fail;spyobj_from_#ctype#1spyarr_from_p_#ctype#1t _optionals( CFUNCSMESS("cb:Getting #varname#->\"");s] if (capi_j>capi_i) GETSTRFROMPYTUPLE(capi_return,capi_i++,#varname_i#,#varname_i#_cb_len);sM fprintf(stderr,"#showvalueformat#\":%d:.\n",#varname_i#,#varname_i#_cb_len);sf fprintf(stderr,"debug-capi:cb:#varname#=\"#showvalueformat#\":%d:\n",#varname_i#,#varname_i#_cb_len);s if (#name#_nofargs>capi_i) { int #varname_i#_cb_dims[] = {#varname_i#_cb_len}; if (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyarr_from_p_#ctype#1(#varname_i#,#varname_i#_cb_dims))) goto capi_fail; }s3 npy_intp #varname_i#_Dims[#rank#] = {#rank*[-1]#};s #cbsetdims#;t_depends- fprintf(stderr,"debug-capi:cb:#varname#\n");s if (#name#_nofargs>capi_i) { PyArrayObject *tmp_arr = (PyArrayObject *)PyArray_New(&PyArray_Type,#rank#,#varname_i#_Dims,#atype#,NULL,(char*)#varname_i#,0,NPY_CARRAY,NULL); /*XXX: Hmm, what will destroy this array??? */ s if (#name#_nofargs>capi_i) { PyArrayObject *tmp_arr = (PyArrayObject *)PyArray_New(&PyArray_Type,#rank#,#varname_i#_Dims,#atype#,NULL,(char*)#varname_i#,0,NPY_FARRAY,NULL); /*XXX: Hmm, what will destroy this array??? */ s if (tmp_arr==NULL) goto capi_fail; if (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,(PyObject *)tmp_arr)) goto capi_fail; }s if (capi_j>capi_i) { PyArrayObject *rv_cb_arr = NULL; if ((capi_tmp = PyTuple_GetItem(capi_return,capi_i++))==NULL) goto capi_fail; rv_cb_arr = array_from_pyobj(#atype#,#varname_i#_Dims,#rank#,F2PY_INTENT_INs|F2PY_INTENT_Cs,capi_tmp); if (rv_cb_arr == NULL) { fprintf(stderr,"rv_cb_arr is NULL\n"); goto capi_fail; } MEMCOPY(#varname_i#,rv_cb_arr->data,PyArray_NBYTES(rv_cb_arr)); if (capi_tmp != (PyObject *)rv_cb_arr) { Py_DECREF(rv_cb_arr); } }s fprintf(stderr,"<-.\n");tMEMCOPYcCs{gt|dq&nd|kr`t || r`q&nd|kr|d|| sd|kr&t |||| }t||}d|krPqq&q&WqWx|D]} | | }xt D]}d|krqnd|ksd|kr0t|| r0qnd|krP|d|| s\d|krt |||| }t||}d|krPqqqWqWx|D]} | | }xt D]}d|krqnd|krqnd|kr|d|| sd|krt |||| }t||}d|krHPqHqqWqWd |krd |krt|d tgkr|d d g|d <|d d g|d <|d d g|d tjjD]*}||d-kra|d-j|qaqaWn|d.tj|dd/<|d-j|dd/|d-tj|dsv            ^   #            "()