cb_rules.pyc
1 o 2 [��cXd � @ s, d Z ddlmZ ddlmZmZmZmZmZm Z m 3 Z 4 mZmZm Z mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z! ddlm"Z" ej#Z$ddg d�dd d 5 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 d6ee �did7��d8ed9id:ed;igd<ed=id>gd?eeee�ee ��d@�edAidBdCdDedEidFedGigd<ed=idHdIgdJedK�dLdMdNdOed9idPedQigdRd<ed=idHd>dSge dT�dUdVe d6igdWedX�edJdY�gZ&eee�dZieee�dZiedUieee�d[e d6igieee�d[e d6igiedVee e�d6ee e�d\igieee�d]ieee�d]idd^� eee�d_eeee��d`e 6 daed_ieee�dbeeee��dce 7 dbedbieee�dSeeee��dde 8 ddedSieee 9 e�dSiedeiedfiedgidh�ee�diieeee!dj��diedkiedlieeeee�e��dmieeeee�ee���dnieeeee��doieeeeee���dpiged<d>gied=igedq�edriedsigedtieduiedSigeee�ddv�edwidxedyigdSdIed=idHgeee�dz�ed{ied|ied}iged~ieduigeee�ddv�dd�e 10 dd��ed�ied�ee�d�id�gee 11 eeee��dd��edkid�ed�id�ed�igd�edSigee 12 e�dz�d]ed��g 13 Z'i Z(d�d�� Z)d�d�� Z*d�S )�aK 14 15 Build call-back mechanism for f2py2e. 16 17 Copyright 2000 Pearu Peterson all rights reserved, 18 Pearu Peterson <pearu@ioc.ee> 19 Permission to use, modify, and distribute this software is given under the 20 terms of the NumPy License. 21 22 NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. 23 $Date: 2005/07/20 11:27:58 $ 24 Pearu Peterson 25 26 � )�__version__)� 27 applyrules� debugcapi� 28 dictappend�errmess�getargs�hasnote�isarray� iscomplex�iscomplexarray�iscomplexfunction� 29 isfunction� 30 isintent_c� isintent_hide�isintent_in�isintent_inout�isintent_nothide�isintent_out� 31 isoptional� 32 isrequired�isscalar�isstring�isstringfunction�issubroutine�l_and�l_not�l_or�outmess�replace� 33 stripcomma�throw_error)�cfuncszPtypedef #rctype#(*#name#_typedef)(#optargs_td##args_td##strarglens_td##noargs#);a^ 34 #begintitle# 35 typedef struct { 36 PyObject *capi; 37 PyTupleObject *args_capi; 38 int nofargs; 39 jmp_buf jmpbuf; 40 } #name#_t; 41 42 #if defined(F2PY_THREAD_LOCAL_DECL) && !defined(F2PY_USE_PYTHON_TLS) 43 44 static F2PY_THREAD_LOCAL_DECL #name#_t *_active_#name# = NULL; 45 46 static #name#_t *swap_active_#name#(#name#_t *ptr) { 47 #name#_t *prev = _active_#name#; 48 _active_#name# = ptr; 49 return prev; 50 } 51 52 static #name#_t *get_active_#name#(void) { 53 return _active_#name#; 54 } 55 56 #else 57 58 static #name#_t *swap_active_#name#(#name#_t *ptr) { 59 char *key = "__f2py_cb_#name#"; 60 return (#name#_t *)F2PySwapThreadLocalCallbackPtr(key, ptr); 61 } 62 63 static #name#_t *get_active_#name#(void) { 64 char *key = "__f2py_cb_#name#"; 65 return (#name#_t *)F2PyGetThreadLocalCallbackPtr(key); 66 } 67 68 #endif 69 70 /*typedef #rctype#(*#name#_typedef)(#optargs_td##args_td##strarglens_td##noargs#);*/ 71 #static# #rctype# #callbackname# (#optargs##args##strarglens##noargs#) { 72 #name#_t cb_local = { NULL, NULL, 0 }; 73 #name#_t *cb = NULL; 74 PyTupleObject *capi_arglist = NULL; 75 PyObject *capi_return = NULL; 76 PyObject *capi_tmp = NULL; 77 PyObject *capi_arglist_list = NULL; 78 int capi_j,capi_i = 0; 79 int capi_longjmp_ok = 1; 80 #decl# 81 #ifdef F2PY_REPORT_ATEXIT 82 f2py_cb_start_clock(); 83 #endif 84 cb = get_active_#name#(); 85 if (cb == NULL) { 86 capi_longjmp_ok = 0; 87 cb = &cb_local; 88 } 89 capi_arglist = cb->args_capi; 90 CFUNCSMESS("cb:Call-back function #name# (maxnofargs=#maxnofargs#(-#nofoptargs#))\n"); 91 CFUNCSMESSPY("cb:#name#_capi=",cb->capi); 92 if (cb->capi==NULL) { 93 capi_longjmp_ok = 0; 94 cb->capi = PyObject_GetAttrString(#modulename#_module,"#argname#"); 95 CFUNCSMESSPY("cb:#name#_capi=",cb->capi); 96 } 97 if (cb->capi==NULL) { 98 PyErr_SetString(#modulename#_error,"cb: Callback #argname# not defined (as an argument or module #modulename# attribute).\n"); 99 goto capi_fail; 100 } 101 if (F2PyCapsule_Check(cb->capi)) { 102 #name#_typedef #name#_cptr; 103 #name#_cptr = F2PyCapsule_AsVoidPtr(cb->capi); 104 #returncptr#(*#name#_cptr)(#optargs_nm##args_nm##strarglens_nm#); 105 #return# 106 } 107 if (capi_arglist==NULL) { 108 capi_longjmp_ok = 0; 109 capi_tmp = PyObject_GetAttrString(#modulename#_module,"#argname#_extra_args"); 110 if (capi_tmp) { 111 capi_arglist = (PyTupleObject *)PySequence_Tuple(capi_tmp); 112 Py_DECREF(capi_tmp); 113 if (capi_arglist==NULL) { 114 PyErr_SetString(#modulename#_error,"Failed to convert #modulename#.#argname#_extra_args to tuple.\n"); 115 goto capi_fail; 116 } 117 } else { 118 PyErr_Clear(); 119 capi_arglist = (PyTupleObject *)Py_BuildValue("()"); 120 } 121 } 122 if (capi_arglist == NULL) { 123 PyErr_SetString(#modulename#_error,"Callback #argname# argument list is not set.\n"); 124 goto capi_fail; 125 } 126 #setdims# 127 #ifdef PYPY_VERSION 128 #define CAPI_ARGLIST_SETITEM(idx, value) PyList_SetItem((PyObject *)capi_arglist_list, idx, value) 129 capi_arglist_list = PySequence_List(capi_arglist); 130 if (capi_arglist_list == NULL) goto capi_fail; 131 #else 132 #define CAPI_ARGLIST_SETITEM(idx, value) PyTuple_SetItem((PyObject *)capi_arglist, idx, value) 133 #endif 134 #pyobjfrom# 135 #undef CAPI_ARGLIST_SETITEM 136 #ifdef PYPY_VERSION 137 CFUNCSMESSPY("cb:capi_arglist=",capi_arglist_list); 138 #else 139 CFUNCSMESSPY("cb:capi_arglist=",capi_arglist); 140 #endif 141 CFUNCSMESS("cb:Call-back calling Python function #argname#.\n"); 142 #ifdef F2PY_REPORT_ATEXIT 143 f2py_cb_start_call_clock(); 144 #endif 145 #ifdef PYPY_VERSION 146 capi_return = PyObject_CallObject(cb->capi,(PyObject *)capi_arglist_list); 147 Py_DECREF(capi_arglist_list); 148 capi_arglist_list = NULL; 149 #else 150 capi_return = PyObject_CallObject(cb->capi,(PyObject *)capi_arglist); 151 #endif 152 #ifdef F2PY_REPORT_ATEXIT 153 f2py_cb_stop_call_clock(); 154 #endif 155 CFUNCSMESSPY("cb:capi_return=",capi_return); 156 if (capi_return == NULL) { 157 fprintf(stderr,"capi_return is NULL\n"); 158 goto capi_fail; 159 } 160 if (capi_return == Py_None) { 161 Py_DECREF(capi_return); 162 capi_return = Py_BuildValue("()"); 163 } 164 else if (!PyTuple_Check(capi_return)) { 165 capi_return = Py_BuildValue("(N)",capi_return); 166 } 167 capi_j = PyTuple_Size(capi_return); 168 capi_i = 0; 169 #frompyobj# 170 CFUNCSMESS("cb:#name#:successful\n"); 171 Py_DECREF(capi_return); 172 #ifdef F2PY_REPORT_ATEXIT 173 f2py_cb_stop_clock(); 174 #endif 175 goto capi_return_pt; 176 capi_fail: 177 fprintf(stderr,"Call-back #name# failed.\n"); 178 Py_XDECREF(capi_return); 179 Py_XDECREF(capi_arglist_list); 180 if (capi_longjmp_ok) { 181 longjmp(cb->jmpbuf,-1); 182 } 183 capi_return_pt: 184 ; 185 #return# 186 } 187 #endtitle# 188 )zsetjmp.h� 189 CFUNCSMESS�F2PY_THREAD_LOCAL_DECLz#maxnofargs#z#nofoptargs#zF def #argname#(#docsignature#): return #docreturn#\n\ 190 #docstrsigns#zc 191 {{}\verb@def #argname#(#latexdocsignature#): return #docreturn#@{}} 192 #routnote# 193 194 #latexdocstrsigns#z1def #argname#(#docsignature#): return #docreturn#)� 195 cbtypedefs�body�need� 196 maxnofargs� 197 nofoptargs�docstr�latexdocstr�docstrshort� separatorsfor�decl� 198 �args�,�optargs� � pyobjfrom�freemem�args_td� 199 optargs_td�args_nm� 200 optargs_nm� frompyobj�setdims�docstrsignsz\n" 201 "�latexdocstrsigns�latexdocstrreq�latexdocstropt�latexdocstrout�latexdocstrcbsz/*decl*/z /*pyobjfrom*/z /*frompyobj*/�return� 202 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 203 --- #note#)r; r<