B
    n\Y              "   @   s  d Z ddlmZmZmZ ddlmZ ddlmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% ddlm&Z& ej'Z(ddd	d
gddddddZ)dddddddddddddddddddddg ddddg ddg ddddddddddddddd d!d"ed#e edid$d%e	d&id'e	d(igd)e	d
id*gd+eee ee ed,e	d-id.d/d0e	d1id2e	d3igd)e	d
id4d5gd6ed7d8d9d:d;e	d&id<e	d=igd>d)e	d
id4d*d?ged@dAdBed#igdCedDed6dEgZ*eeedFieeedFiedAieeedGed#igieeedGed#igiedBeeed#eeedHigieeedIieeedIiddJ	eeedKeee edLedMedKieeedNeee edOedNedNieeed?eee edPedPed?iedQiedRiedSidTe edUieeee%dVdie	dWiedXiee	ee eedYiee	ee ee edZiee	eeed[iee	eee ed\iged)d*gie	d
iged]ed^ied_iged`iedaied?igeeeddbe	dcidde	deigd?d5e	d
id4geeedfe	dgiedhiediigedjiedaigeeeddbdkdleddme	dniedoe edpidqgeeee!eeddre	dWidsedtidue	dvigdwed?igeeedfdIedxg
Z+i a,dydz Z-d{d| Z.d}S )~aK  

Build call-back mechanism for f2py2e.

Copyright 2000 Pearu Peterson all rights reserved,
Pearu Peterson <pearu@ioc.ee>
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

    )divisionabsolute_importprint_function   )__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#
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;
	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
	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 (F2PyCapsule_Check(#name#_capi)) {
	#name#_typedef #name#_cptr;
	#name#_cptr = F2PyCapsule_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#
#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(#name#_capi,(PyObject *)capi_arglist_list);
	Py_DECREF(capi_arglist_list);
	capi_arglist_list = NULL;
#else
	capi_return = PyObject_CallObject(#name#_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(#name#_jmpbuf,-1);
capi_return_pt:
	;
#return#
}
#endtitle#
zsetjmp.hZ
CFUNCSMESSz#maxnofargs#z#nofoptargs#zC	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
, z\n"
")declargsoptargs	pyobjfromfreememargs_td
optargs_tdargs_nm
optargs_nm	frompyobjsetdimsdocstrsignslatexdocstrsignslatexdocstrreqlatexdocstroptlatexdocstroutlatexdocstrcbsz/*decl*/z/*pyobjfrom*/z/*frompyobj*/z/*freemem*/z/*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#)Zseparatorsforr1   r4   r:   r2   r3   return
strarglensr5   r6   r7   strarglens_tdr8   r9   strarglens_nmnoargsr;   r<   r=   	docstrreq	docstropt	docstrout	docstrcbs	docreturndocsign
docsignoptr>   r?   r@   rA   Zroutnotez	#ctype# return_value;z)	CFUNCSMESS("cb:Getting return_value->");z	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");z5	fprintf(stderr,"#showvalueformat#.\n",return_value);z#ctype#_from_pyobjZGETSCALARFROMPYTUPLEz	return return_value;)r1   r:   r(   rB   _checkz?	fprintf(stderr,"debug-capi:cb:#name#:%d:\n",return_value_len);z)#ctype# return_value,int return_value_lenzreturn_value,&return_value_lenz#ctype# ,intz+	CFUNCSMESS("cb:Getting return_value->\"");z\	if (capi_j>capi_i)
		GETSTRFROMPYTUPLE(capi_return,capi_i++,return_value,return_value_len);z7	fprintf(stderr,"#showvalueformat#\".\n",return_value);zstring.hZGETSTRFROMPYTUPLEzreturn;)r4   r2   r8   r6   r:   r(   rB   rN   z<
#ifndef F2PY_CB_RETURNCOMPLEX
#ctype# *return_value
#endif
z3
#ifndef F2PY_CB_RETURNCOMPLEX
return_value
#endif
z0
#ifndef F2PY_CB_RETURNCOMPLEX
#ctype# *
#endif
z<
#ifdef F2PY_CB_RETURNCOMPLEX
	#ctype# return_value;
#endif
a  	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
z
#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

zJ
#ifdef F2PY_CB_RETURNCOMPLEX
	return return_value;
#else
	return;
#endif
z#ctype#)r3   r9   r7   r1   r:   rB   r(   rN   z		#pydocsignout#z"\item[]{{}\verb@#pydocsignout#@{}}z#rname#,)rI   r@   rK   rN   )rN   rB   z		#pydocsign#z\item[]{{}\verb@#pydocsign#@{}}z--- See above.z
#varname#,)	rH   rG   rI   r?   r>   r@   rL   rM   Zdependz#ctype# #varname_i#z#ctype# *#varname_i#_cb_capiz#ctype# *#varname_i#z#varname_i#z#varname_i#_cb_capiz	#ctype# *z,int #varname_i#_cb_lenz,intz,#varname_i#_cb_len)r2   r8   r6   rC   rD   rE   z,	#ctype# #varname_i#=(*#varname_i#_cb_capi);z8intent(c,out) is forbidden for callback scalar argumentsz&	CFUNCSMESS("cb:Getting #varname#->");z	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");z4	fprintf(stderr,"#showvalueformat#.\n",#varname_i#);z=	fprintf(stderr,"#showvalueformat#.\n",*#varname_i#_cb_capi);zH	fprintf(stderr,"#showvalueformat#.\n",(#varname_i#).r,(#varname_i#).i);zZ	fprintf(stderr,"#showvalueformat#.\n",(*#varname_i#_cb_capi).r,(*#varname_i#_cb_capi).i);)r1   errorr:   r(   rN   zu	if (#name#_nofargs>capi_i)
		if (CAPI_ARGLIST_SETITEM(capi_i++,pyobj_from_#ctype#1(#varname_i#)))
			goto capi_fail;z	if (#name#_nofargs>capi_i)
		if (CAPI_ARGLIST_SETITEM(capi_i++,pyarr_from_p_#ctype#1(#varname_i#_cb_capi)))
			goto capi_fail;zpyobj_from_#ctype#1zpyarr_from_p_#ctype#1)r4   r(   rN   	_optionalz(	CFUNCSMESS("cb:Getting #varname#->\"");z]	if (capi_j>capi_i)
		GETSTRFROMPYTUPLE(capi_return,capi_i++,#varname_i#,#varname_i#_cb_len);zM	fprintf(stderr,"#showvalueformat#\":%d:.\n",#varname_i#,#varname_i#_cb_len);)r:   r(   rN   zf	fprintf(stderr,"debug-capi:cb:#varname#=\"#showvalueformat#\":%d:\n",#varname_i#,#varname_i#_cb_len);z	if (#name#_nofargs>capi_i)
		if (CAPI_ARGLIST_SETITEM(capi_i++,pyobj_from_#ctype#1size(#varname_i#,#varname_i#_cb_len)))
			goto capi_fail;z	if (#name#_nofargs>capi_i) {
		int #varname_i#_cb_dims[] = {#varname_i#_cb_len};
		if (CAPI_ARGLIST_SETITEM(capi_i++,pyarr_from_p_#ctype#1(#varname_i#,#varname_i#_cb_dims)))
			goto capi_fail;
	}zpyobj_from_#ctype#1sizez3	npy_intp #varname_i#_Dims[#rank#] = {#rank*[-1]#};z	#cbsetdims#;)r1   r;   rN   _dependz-	fprintf(stderr,"debug-capi:cb:#varname#\n");a   	if (#name#_nofargs>capi_i) {
		int itemsize_ = #atype# == NPY_STRING ? 1 : 0;
		/*XXX: Hmm, what will destroy this array??? */
		PyArrayObject *tmp_arr = (PyArrayObject *)PyArray_New(&PyArray_Type,#rank#,#varname_i#_Dims,#atype#,NULL,(char*)#varname_i#,itemsize_,NPY_ARRAY_CARRAY,NULL);
a   	if (#name#_nofargs>capi_i) {
		int itemsize_ = #atype# == NPY_STRING ? 1 : 0;
		/*XXX: Hmm, what will destroy this array??? */
		PyArrayObject *tmp_arr = (PyArrayObject *)PyArray_New(&PyArray_Type,#rank#,#varname_i#_Dims,#atype#,NULL,(char*)#varname_i#,itemsize_,NPY_ARRAY_FARRAY,NULL);
zw
		if (tmp_arr==NULL)
			goto capi_fail;
		if (CAPI_ARGLIST_SETITEM(capi_i++,(PyObject *)tmp_arr))
			goto capi_fail;
})r4   rN   rP   z	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_INz|F2PY_INTENT_Cz,capi_tmp);
		if (rv_cb_arr == NULL) {
			fprintf(stderr,"rv_cb_arr is NULL\n");
			goto capi_fail;
		}
		MEMCOPY(#varname_i#,PyArray_DATA(rv_cb_arr),PyArray_NBYTES(rv_cb_arr));
		if (capi_tmp != (PyObject *)rv_cb_arr) {
			Py_DECREF(rv_cb_arr);
		}
	}z	fprintf(stderr,"<-.\n");ZMEMCOPY)rK   rN   c             C   sd   g t | d < xR| d D ]F}|d dkrx4|d D ](}|rHt|| d  q0td| d   q0W qW d S )Nnamer'   blockZ	interfacezwarning: empty body for %s
)cb_mapbuildcallbackr
   )mZbib rX   2lib/python3.7/site-packages/numpy/f2py/cb_rules.pybuildcallbacks  s    rZ   c             C   s~  ddl m} td| d |f  t| \}}||_| d }|| |}ti |}t| | d |d g x>t	D ]6}d|kr|d | sd|krpt
||| }	t||	}qpW i }
xt|D ]\}}|j||| |d}||
|< xxtD ]p}d|krqd	|kr
t|| r
qd|kr&|d || s.d|krt
|||| }	t||	}d
|krP qW qW x|D ]}|
| }xtD ]}d|krqrd	|ksrd	|krt|| rqrd|kr|d || sd|krrt
|||| }	t||	}d
|krrP qrW q`W x|D ]}|
| }xvtD ]n}d|kr,qd	|kr:qd|krV|d || s`d|krt
|||| }	t||	}d
|krP qW qW d|krd|krt|d tr|d dg |d< |d dg |d< |d dg |d< t|d trttdd|d i|d< ttdd|d i}|dkrRttdd|d i|d< ntd|d |d|d< |d dd|d< |d dd|d< g |d< g |d < xd!D ]}||krt|| tr|d ||  |d< d"| }||krt|| tr|d  || d#d  d$g || dd   d%g |d < qW d|kr\d|d< d|d&< d|d'< |ds|ds|d(sd)|d*< t
t|}	|	d+ tj|d < t|	d, tr|	d, g|	d,< d,|krx0tj D ]"}||d, kr|	d, | qW |	d- tj|d d. < |	d, |d d.  |	d, tj|d < |	d/ |	d0 |	d1 |	d2 |d3 d4|j|d < td5|	d6   d S )7Nr   )	capi_mapsz/	Constructing call-back function "cb_%s_in_%s"
rR   varsrN   )indexrQ   rP   Z_breakr2   r3   z(
#ifndef F2PY_CB_RETURNCOMPLEX
,
#endif
r9   r7   rK   z#docreturn#z#docsignopt#rM   r0   z	#docsign#rL   Zdocsignaturez#docsign#[#docsignopt#])rL   rM   _z\_Zlatexdocsignaturer/   z, r<   r=   )rG   rH   rI   rJ   Zlatexr   z\begin{description}z\end{description}r6   r8   rC   ZvoidrF   r'   r(   r&   Z_typedefr)   r*   r+   r,   argname)r)   r*   r+   r,   r_   z	  %s
r-   )r0   r[   r!   r   depargsZcb_routsign2mapr	   rT   appendcb_rout_rulesr   	enumerateZcb_sign2mapcb_arg_rulesr   r   
isinstancelistr#   r"   getcb_routine_rulesr%   Z	callbacksstrZtypedefskeysZtypedefs_generatedZneedsZlcb2_map)ZroutZumr[   r2   r`   varZvrdZrdrZarZsavevrdiar3   ktrX   rX   rY   rU     s    


$




"&





&



,
$

rU   N)/__doc__Z
__future__r   r   r   r0   r   Zauxfuncsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   versionZf2py_versionrh   rb   rd   rT   rZ   rU   rX   rX   rX   rY   <module>   sX  r















