
    -Ph                        d Z ddlZddlZddlZddlZddlZddlZ	 ddlmZ dZ	n# e
$ r ddlmZ dZ	Y nw xY w	 ddlZddlZn'# e
$ r dZej                            d           Y nw xY w eed          rdd	lmZ ndd
lmZ ddlmZ dZdZ eee          Z ej                    pdZdhdZd ZdidZ d Z!d Z"djdZ# G d d          Z$ G d d          Z% G d de%          Z&h dZ'd Z( G d d          Z) G d  d!          Z* G d" d#ej+                  Z, G d$ d%e,          Z- G d& d'e-          Z. G d( d)ej/                  Z0 G d* d+e0          Z1 G d, d-e0          Z2 G d. d/e0          Z3 G d0 d1          Z4 e4            Z5 G d2 d3ej6        e)          Z7 G d4 d5e7          Z8 G d6 d7e7          Z9 G d8 d9e7          Z: G d: d;e)ej;                  Z< G d< d=e7ej=                  Z> G d> d?e>ej?                  Z@ G d@ dAe@          ZA G dB dCe>          ZB G dD dEe>          ZC G dF dGe>          ZD G dH dIe7          ZE G dJ dKeE          ZF G dL dMe7          ZG G dN dOe7          ZH G dP dQe7          ZI G dR dSe7          ZJdT ZK G dU dVe7          ZL G dW dXeL          ZM G dY dZ          ZN G d[ d\e7ejO        eN          ZP G d] d^e7          ZQ G d_ d`ejR        e)          ZS G da dbeS          ZT G dc ddejR        e)          ZU G de dfejR        e)eN          ZV e<            ZWe8X                                ZYeYeW_Y        dg ZZ eZ             dS )kz)
GDB extension that adds Cython support.
    N)etreeT)ElementTreeFz,Install pygments for colorized source code.
string_to_argv)r   )split)	libpythonCObjectPythonObject)r   r	   zUTF-8c                       fd}|S )Nc                 L     t          j                   d fd	            }|S )Nc                     	 |pt          j                    }n"# t          $ r t          j        d          w xY wr"|                                t                       | |g|R i |S NzNo frame is currently selected.)gdbselected_frameRuntimeErrorGdbErrornameNoFunctionNameInFrameError)selfframeargskwargserrfunctions       Y/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/Cython/Debugger/libcython.pywrapperz>default_selected_gdb_frame.<locals>.decorator.<locals>.wrapper/   s    F5!3!5!5 F F Fl#DEEEF  3uzz||+02228D%9$999&999s    8N	functoolswraps)r   r   r   s   ` r   	decoratorz-default_selected_gdb_frame.<locals>.decorator.   sC    		"	"		: 		: 		: 		: 		: 		: 
#	"		:      )r   r    s   ` r   default_selected_gdb_framer#   -   s$         r!   c                 `     t          j                   t           fd                        }|S )Nc                     |                     d          pt          j                    }|                     |          st          j        d           | g|R i |S )Nr   zHSelected frame does not correspond with a Cython function we know about.)getr   r   is_cython_functionr   )r   r   r   r   r   s       r   r   z%require_cython_frame.<locals>.wrapper?   sx     

7##;s'9';';&&u-- 	A,  @ A A Ax.t...v...r!   )r   r   require_running_programr   r   s   ` r   require_cython_framer*   >   sC    _X/ / / /  / Nr!   c                       fd}|S )Nc                 L     t          j                    fd            }|S )Nc                 (   |                                  }|                                 }|s|rs | g|R i | d S |rt          j                   d S |                                 rt          j                   d S t          j        d          )NzFNot a function cygdb knows about. Use the normal GDB commands instead.)r'   is_python_functionr   executeis_relevant_functionr   )r   r   r   is_cyis_py	c_commandr   python_commands        r   r   z5dispatch_on_frame.<locals>.decorator.<locals>.wrapperL   s    ++--E++--E K K~ K///////// KN+++++**,, KI&&&&&l $J K K Kr!   r   )r   r   r3   r4   s   ` r   r    z$dispatch_on_frame.<locals>.decoratorK   sJ    		"	"	K 	K 	K 	K 	K 	K 
#	"	K r!   r"   )r3   r4   r    s   `` r   dispatch_on_framer5   J   s*         " r!   c                 F     t          j                    fd            }|S )Nc                      	 t          j                     n"# t          $ r t          j        d          w xY w | i |S r   )r   r   r   r   )r   r   r   s     r   r   z(require_running_program.<locals>.wrapper`   sb    	B     	B 	B 	B,@AAA	B x((((s    6r   r)   s   ` r   r(   r(   _   s8    _X) ) ) ) ) Nr!   c                 F     t          j                    fd            }|S )Nc                 z    t          |t          j                  r|                                } | |g|R i |S r   )
isinstancer   Valuestring)r   r<   r   r   r   s       r   r   z.gdb_function_value_to_unicode.<locals>.wrapperl   sF    fci(( 	%]]__Fxf6t666v666r!   r   r)   s   ` r   gdb_function_value_to_unicoder=   k   s8    _X7 7 7 7 7
 Nr!   c                     ddl }t          |                     j                  j                  }rfd|D             n|d}|r<t          t                                                               }fd|D             }d fd	}d                     j	        j
        dd	                     |d
|                    dg |d|                    S )a7  Prints out all instance variables needed to recreate an object.

    Following the python convention for __repr__, this function prints all the
    information stored in an instance as opposed to its class. The working
    assumption is that most initialization arguments are stored as a property
    using the same name.

    The object contents are displayed as the initialization call followed by,
    optionally, the value of each of the instance's properties in the form:
    ```
    ClassName(
            init_arg_1 = "repr of some example str",
            ...
        )
    self.state_based_property = ...
    ```

    Function arguments:
    self        Instance to be represented

    renamed     Dictionary of initialization arguments that are stored under a
                different property name in the form { argument: property }

    state       Boolean representing whether properties outside the
                initialization parameters should be printed (self.prop = ...).
                Using `False` may make the class more amenable to recursive repr
    r   Nc                 <    g | ]}                     ||          S r"   )r&   ).0argrenameds     r   
<listcomp>zsimple_repr.<locals>.<listcomp>   s'    BBBC'++c3''BBBr!   r"   c                     g | ]}|v|	S r"   r"   )r@   attr
init_attrss     r   rC   zsimple_repr.<locals>.<listcomp>   s#    PPPtZ9O9Od9O9O9Or!   c              3      K   t          ||p|          D ]A\  }}t          t          |                                        dd          }|  | d| V  Bd S )N

		 = )zipreprgetattrreplace)prefixattrsr   rE   rA   paramr   s         r   names_and_valuesz%simple_repr.<locals>.names_and_values   s{      UDME22 	- 	-ID#t,,--55dHEEE,S,,U,,,,,,	- 	-r!    (,rI   z
	)z
self.r   )inspecttuple	signature__init__
parameterssortedvarskeysjoin	__class____qualname__)	r   rB   staterV   init_arg_names
state_reprinstance_attrsrR   rF   s	   ``      @r   simple_reprre   x   s   8 NNN7,,T];;FGGN+BBBB>BBBB* J QT

 1 122PPPP~PPP
- - - - - -
 77N'HH%%h
NKKLL
 '&y*==
   r!   c                       e Zd Zd Zd ZdS )CythonModulec                 h    || _         || _        || _        i | _        i | _        i | _        i | _        d S r   )r   filename
c_filenameglobalslineno_cy2clineno_c2cy	functions)r   module_nameri   rj   s       r   rY   zCythonModule.__init__   s9    	 $r!   c                 *    t          | ddid          S )Nro   r   F)rB   ra   re   r   s    r   __repr__zCythonModule.__repr__   s    4-)@NNNNr!   N__name__
__module__r`   rY   rs   r"   r!   r   rg   rg      s7        	 	 	O O O O Or!   rg   c                       e Zd Zd Zd ZdS )CythonVariablec                 f    || _         || _        || _        || _        t	          |          | _        d S r   )r   cnamequalified_nametypeintlineno)r   r   rz   r{   r|   r~   s         r   rY   zCythonVariable.__init__   s0    	
,	&kkr!   c                      t          |           S r   rq   rr   s    r   rs   zCythonVariable.__repr__   s    4   r!   Nrt   r"   r!   r   rx   rx      s2        " " "! ! ! ! !r!   rx   c                   $     e Zd Zedf fd	Z xZS )CythonFunctionFalsec	                     t                                          |||||           || _        || _        |dk    | _        i | _        g | _        t                      | _        d S )NTrue)	superrY   modulepf_cnameis_initmodule_functionlocals	argumentssetstep_into_functions)
r   r   r   rz   r   r{   r~   r|   r   r_   s
            r   rY   zCythonFunction.__init__   sl     	-2-;-1-3		5 	5 	5
  &<&F##&55   r!   )ru   rv   r`   r   rY   __classcell__r_   s   @r   r   r      sE         (/) ) ) ) ) ) ) ) ) )r!   r   >   Frame.pc
Frame.name
Frame.typeFrame.blockFrame.levelFrame.newerFrame.olderFrame.selectSymbol.valueFrame.find_salFrame.functionFrame.is_validFrame.languageSymbol.is_validSymtab.fullnameSymtab.is_validSymtab.linetableFrame.static_linkFrame.architectureSymtab.global_blockSymtab.static_blockSymtab_and_line.is_validc                    |  d}t          t          |                     D ]}|                    d          rt          | |          }t	          |          r|j        t          v r
 |            }t          |          t          j	        t          j
        t          j        fv r6t          |                              d                              dd          }|| dt          |t                     r|dk    r|ddn| dz   z  }|S )a  Returns a string representing the internal state of a provided GDB frame
    https://sourceware.org/gdb/current/onlinedocs/gdb.html/Frames-In-Python.html

    Created to serve as GDB.Frame.__repr__ for debugging purposes. GDB has many
    layers of abstraction separating the state of the debugger from the
    corresponding source code. This prints a tree of instance properties,
    expanding the values for Symtab_and_line, Symbol, and Symtab.

    Most of these properties require computation to determine, meaning much of
    relevant info is behind a monad, a subset of which are evaluated.

    Arguments
    frame       The GDB.Frame instance to be represented as a string
    rH   __z
	: linex)r[   dir
startswithrM   callabler`   frame_repr_whitelistr|   r   Symtab_and_lineSymbolSymtab
frame_reprrstriprN   r:   r}   )r   res	attributevalues       r   r   r      s    ,,,CCJJ'' # #	%% 	y))E?? 	u15IIIEGGE;;3.
CJGGGu%%,,T22::4HHE)",UC"8"8 "Y&=P=P5\\\# 	# Jr!   c                      e Zd Z ed          d             Z ed          d             Z e            d             Z e            d             Z e            d             Z e            d             Z	 e            d	             Z
 e            d
             Z e            d             Z ed          dd            Zd Zd ZddZd ZdS )
CythonBaseF)r   c                 B    |                                 | j        j        v S r   )r   cyfunctions_by_cnamer   r   s     r   r'   zCythonBase.is_cython_function  s    zz||tw999r!   c                     |                                 dk    r=t          j        |                                          }|o|                                 S dS )z
        Tells if a frame is associated with a Python function.
        If we can't read the Python frame information, don't regard it as such.
        PyEval_EvalFrameExF)r   r   Frameget_pyopis_optimized_out)r   r   pyframes      r   r.   zCythonBase.is_python_function  sR     ::<<///oe,,5577G=7#;#;#=#===ur!   c                 *    |                                 S r   )r   r   s     r   get_c_function_namezCythonBase.get_c_function_name(  s    zz||r!   c                 4    |                                 j        S r   )find_salr   r   s     r   get_c_linenozCythonBase.get_c_lineno,  s    ~~$$r!   c                     | j         j                            |                                          }|t	                      |S r   )r   r   r&   r   NoCythonFunctionInFrameError)r   r   results      r   get_cython_functionzCythonBase.get_cython_function0  s8    +//

==>.000r!   c                     |                      |          }|j        j                            |                     |          d          S )z
        Get the current Cython line number. Returns ("<no filename>", 0) if there is no
        correspondence between the C and Cython code.
        )z<no filename>r   )r   r   rm   r&   r   )r   r   cyfuncs      r   get_cython_linenozCythonBase.get_cython_lineno8  sA     ))%00}(,,T->->u-E-EG[\\\r!   c                 V   d x}x}}|                      |          rs|                     |          j        j        }|                     |          }||d         k    sJ |d         }t
          r t
          j                            d          }n
|                     |          rt          j
        |                                          }|st          j        d          |                                }|                                }t
          r t
          j                            d          }ni|                                }|r|j        sd }d}nG|j                                        }|j        }t
          r t
          j                            d          }t+          ||          |fS )Nr      F)stripallz*Unable to read information on python frame)r'   r   r   ri   r   pygmentslexersCythonLexerr.   r   r   r   r   r   current_line_numPythonLexerr   symtabfullnamer   CLexerSourceFileDescriptor)r   r   ri   r~   lexerfilename_and_linenopyframeobjectsymbol_and_line_objs           r   get_source_desczCythonBase.get_source_descA  s   $(((6E""5)) 	C//66=FH"&"8"8"?"?2155555(+F D 33U3CC$$U++ 	C%OE22;;==M  JlHJ J J %--//H"3355F D 33U3CC"'.."2"2& C.A.H C.5>>@@,1 C$O22E2BBE#He44f<<r!   c                 Z    |                                  \  }}|                    |          S r   )r   
get_source)r   r   source_descr~   s       r   get_source_linezCythonBase.get_source_lined  s,    "2244V%%f---r!   c                    |                                 }|                                }|                     |          s|                     |          rdS |r3|                     |          r|                     |          }||j        v S dS )zl
        returns whether we care about a frame on the user-level when debugging
        Cython code
        TF)r   olderr'   r.   r   r   )r   r   r   older_framecython_funcs        r   r0   zCythonBase.is_relevant_functioni  s     zz||kkmm""5)) 	;T-D-DU-K-K 	;4 	;T44[AA 	;22;??K;:::ur!   c                     t          j                    }                                 	                                \  }}n## t          $ r t          d|z             Y dS w xY w|su                               r`t          j                  	                                }||
                                r                     |d          S |j        }d}	g }
nq                               r,                               } fd}|j        }|j        }	g }
n0                               \  }}                                }|}	g }
	 t          j        |	          }|j        }t'          |t(                    sSt'          |t*          t,          f          st+          |          }t)          |                                d         d          }n# t0          $ r d}Y nw xY wd                    d	 |
D                       }t4          j                            d
||||fz             |j        *t4          j                            d|j        d|           t4          j                            d           	 t4          j                            d|                    |           d           n# t           j        $ r Y nw xY w|                                 dS )zk
        Print a C, Cython or Python stack frame and the line of source code
        if available.
        z%#%-2d Unknown Frame (compile with -g)NT)is_cr   c                 F    j         j                            |           S )Nr   )r   	cy_cvalueinvoke)rA   r   r   s    r   <lambda>z-CythonBase.print_stackframe.<locals>.<lambda>  s    DG-44S4FF r!   r   z, c              3   *   K   | ]\  }}|d |V  dS )=Nr"   )r@   r   vals      r   	<genexpr>z.CythonBase.print_stackframe.<locals>.<genexpr>  s1      GG	css+GGGGGGr!   z#%-2d 0x%016x in %s(%s)z at :rH       ) r   r   selectr   r   printr.   r   r   r   r   print_stackframeco_namer'   r   r   rz   parse_and_evaladdressr:   r}   strbytesr   r   r^   sysstdoutwriteri   r   r   )r   r   indexr   r   r   r~   r   	func_name
func_cname	func_argsr   f	gdb_valuefunc_addressas   ``              r   r   zCythonBase.print_stackframez  s    +--	"&"6"6u"="=K) 	 	 	9EABBBFF	  	//66 	oe,,5577G'":":"<"<,,UE,EEEI-JII$$U++ 	--e44FFFFFFAIJII"&"6"6u"="=K

I"JI
	?*:66I %,LlC00 ?!,e== 5#&|#4#4L"<#5#5#7#7#:A>>  	 	 	LLL	 IIGGYGGGGG
2e\9VW5XXYYY+JK,@,@,@&&IJJJ
	JFK$:$:6$B$BFFFGGGG| 	 	 	D	 	s5   A A$#A$G G#"G#<6J3 3KKc                    t          j        d          }	 t          j        d          }n4# t          $ r' t          j        t          j        d                    w xY w|                    |                                          }|d         S )N__pyx_mPyModuleObjectzy                Unable to lookup type PyModuleObject, did you compile python
                with debugging support (-g)?md_dict)	r   r   lookup_typer   r   textwrapdedentcastpointer)r   mr	  s      r   get_remote_cython_globals_dictz)CythonBase.get_remote_cython_globals_dict  s    y))	2 _-=>>NN 	2 	2 	2,x 00  1  1 2 2 2	2
 FF>))++,,|s	   + 1Ac                     |                                  }t          j                            |          }i }t	                      }|                                D ]\  }}|||                    |          <   |S )zk
        Get the Cython globals dict where the remote names are turned into
        local strings.
        )r  r   PyObjectPtrfrom_pyobject_ptrr   	iteritemsproxyval)r   remote_dictpyobject_dictr   seenkvs          r   get_cython_globals_dictz"CythonBase.get_cython_globals_dict  sv    
 99;;!-??LLuu!++-- 	) 	)DAq'(F1::d##$$r!   NrS   c                     t          j        |          rd}nd|j        d}|t          ||d||           d S t          d|||||fz             d S )NrS   rT   z) rJ   z%s%-*s = %s%s)r   pretty_printer_lookupr|   r   )r   r   r   max_name_lengthrO   typenames         r   print_gdb_valuezCythonBase.print_gdb_value  s    *511 	/HH	/ #(***.H"6644455ABBBBB/V_dHe$TTUUUUUr!   c                    |j         |         }|                                 d         }d|j        v rE||j        k    r8|j        t
          k    r&t          t          j        |j                            S dS dS ||j        k    S )Nr   z->TF)	r   r   rz   r~   r|   r	   r}   r   r   )r   r   
local_namecyvar
cur_linenos        r   is_initializedzCythonBase.is_initialized  s    ":.++--a0
5;K...:--s1%+>>???t5EL((r!   )F)NrS   )ru   rv   r`   r#   r'   r.   r   r   r   r   r   r   r0   r   r  r  r!  r&  r"   r!   r   r   r     s       E***: : +*:  E***  +*  !!  "!  !!% % "!%  !!  "!  !!] ] "!]  !! =  = "! =D  !!. . "!.  !!  "!   E***?  ?  ?  +*? B    	V 	V 	V 	V) ) ) ) )r!   r   c                   4    e Zd Zd
dZd Zd Zd Z	 	 dd	ZdS )r   Nc                 0    || _         || _        || _        d S r   )ri   r   	formatter)r   ri   r   r)  s       r   rY   zSourceFileDescriptor.__init__  s     
"r!   c                     | j         d uS r   )ri   rr   s    r   validzSourceFileDescriptor.valid  s    }D((r!   c                     t           rn| j        rgt          j        r[t          j        j        }| j        !t           j                            |          }n| j        }t          j	        || j        |          S |S )N)bg)
r   r   rZ   colorize_codeterminal_backgroundr   r)  
formattersTerminalFormatter	highlight)r   coder-  r)  s       r   lexzSourceFileDescriptor.lex  sq     	C
 	Cz'? 	C/5B~%$/AARAHH		 N	%dDJ	BBBr!   c              #     K   t          | j                  5 }|r;|r9|                     |                                                                          }t          j        ||dz
  |dz
            }t          |          D ]K\  }}	||z   |k    rd}
nd}
|r|s|                     |	          }	d|
||z   |	                                fz  V  L	 d d d            d S # 1 swxY w Y   d S )Nr   > z%s %4d    %s)	openri   r4  read
splitlines	itertoolsislice	enumerater   )r   startstop
lex_source	mark_line
lex_entirer  sliceidxr   rO   s              r   _get_sourcez SourceFileDescriptor._get_source  s_     $-   	LA
  4j 4HHQVVXX&&1133$Q	4!8<<E&u-- 	L 	L	T3;)++ FF F *j *88D>>D$T[[]]'KKKKKK	L	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	Ls   B5CC!CTr   Fc           	          t          j        d          }| j        s|t          |d          }||dz   }	 d                    |                     |||||                    S # t          $ r |w xY w)NzUnable to retrieve source coder   rH   )r   r   ri   maxr^   rE  OSError)r   r>  r?  r@  rA  rB  excs          r   r   zSourceFileDescriptor.get_source  s    l;<<} 	IE1<19D	99  j)ZPPR R R 	 	 	I	s   +A" "A/r   )NTr   F)ru   rv   r`   rY   r+  r4  rE  r   r"   r!   r   r   r     sv        # # # #
) ) )
 
 
L L L, GH#     r!   r   c                   "     e Zd ZdZ fdZ xZS )
CyGDBErrorz6
    Base class for Cython-command related errors
    c                 H    |p| j         f} t                      j        |  d S r   )msgr   rY   )r   r   r_   s     r   rY   zCyGDBError.__init__7  s+    "{$r!   )ru   rv   r`   __doc__rY   r   r   s   @r   rK  rK  2  sB                          r!   rK  c                       e Zd ZdZdZdS )r   z]
    raised when the user requests the current cython function, which is
    unavailable
    z7Current function is a function cygdb doesn't know aboutNru   rv   r`   rN  rM  r"   r!   r   r   r   <  s           DCCCr!   r   c                       e Zd ZdZdZdS )r   zi
    raised when the name of the C function could not be determined
    in the current C stack frame
    zDC function name could not be determined in the current C stack frameNrP  r"   r!   r   r   r   D  s         CCCr!   r   c                   .     e Zd ZdZd fd	Zd ZeZ xZS )CythonParameterz*
    Base class for cython parameters
    Nc                     | j         j        x| _        | _        t	                                          |||           |	|| _        d S d S r   )r_   rN  show_docset_docr   rY   r   )r   r   command_classparameter_classdefaultr_   s        r   rY   zCythonParameter.__init__T  sR    '+~'==}.=	? 	? 	? DJJJ r!   c                 *    t          | j                  S r   )boolr   rr   s    r   __bool__zCythonParameter.__bool__[  s    DJr!   r   )ru   rv   r`   rN  rY   r\  __nonzero__r   r   s   @r   rS  rS  O  sQ         ! ! ! ! ! !      KKKKKr!   rS  c                       e Zd ZdZdS ) CompleteUnqualifiedFunctionNameszH
    Have 'cy break' complete unqualified function or method names.
    Nru   rv   r`   rN  r"   r!   r   r_  r_  b             r!   r_  c                       e Zd ZdZdS )ColorizeSourceCodez5
    Tell cygdb whether to colorize source code.
    Nr`  r"   r!   r   rc  rc  h  ra  r!   rc  c                       e Zd ZdZdS )TerminalBackgroundzJ
    Tell cygdb about the user's terminal background (light or dark).
    Nr`  r"   r!   r   re  re  n  ra  r!   re  c                       e Zd ZdZd ZdS )CythonParametersz
    Simple container class that might get more functionality in the distant
    future (mostly to remind us that we're dealing with parameters).
    c                    t          dt          j        t          j        d          | _        t          dt          j        t          j        d          | _        t          dt          j        t          j	        d          | _
        d S )Ncy_complete_unqualifiedTcy_colorize_codecy_terminal_background_colordark)r_  r   COMMAND_BREAKPOINTSPARAM_BOOLEANcomplete_unqualifiedrc  COMMAND_FILESr.  re  PARAM_STRINGr/  rr   s    r   rY   zCythonParameters.__init__z  sx    $D%#	% %!
 0	 
 $6*	$ $   r!   N)ru   rv   r`   rN  rY   r"   r!   r   rg  rg  t  s-         
    r!   rg  c                   L    e Zd ZdZej        Zed             Zed             Z	dS )CythonCommandz(
    Base class for Cython commands
    c                 v    t          | d          s | || j        g|R i |S  | || j        | j        g|R i |S )Ncompleter_class)hasattrrW  ru  )clsclsnamer   r   s       r   	_registerzCythonCommand._register  st    s-.. 	(3w 1CDCCCFCCC3w 133F (( ( ( &( ( (r!   c                     t          | dd           }|r|                     | j        ||           |                     | j        ||          S )Nalias)rM   ry  r{  r   )rw  r   r   r{  s       r   registerzCythonCommand.register  sK    Wd++ 	3MM#)T6222}}SXtV444r!   N)
ru   rv   r`   rN  r   COMMAND_NONErW  classmethodry  r|  r"   r!   r   rs  rs    s\          $M( ( [( 5 5 [5 5 5r!   rs  c                   B     e Zd ZdZdZej        Zej        Z	 fdZ
 xZS )CyCyaa  
    Invoke a Cython command. Available commands are:

        cy import
        cy break
        cy step
        cy next
        cy run
        cy cont
        cy finish
        cy up
        cy down
        cy select
        cy bt / cy backtrace
        cy list
        cy print
        cy set
        cy locals
        cy globals
        cy exec
    r   c           	      l   t          t          |                               |||d           t          di dt                                          dt                                          dt                                          dt                                          dt                                          dt                                          d	t                                          d
t                                          dt                                          dt                                          dt                                          dt                                           dt"                                          dt$                                          dt&                                          dt)          j        dd          dt,                                          dt.                                          dt1          d          dt3          d          dt5          d          dt7          d          }|                                D ]\  }}| |_        t=          | ||           | | _        i | _        i | _         i | _!        tE          j#        tH                    | _%        d S )NT)rO   import_break_stepnextruncontfinishupdownr   btlistprint_r   rk   exec_zcy exec-cy-exec_execr   cy_cnamer   	cy_linenocy_evalr"   )&r   rs  rY   dictCyImportr|  CyBreakCyStepCyNextCyRunCyContCyFinishCyUpCyDownCySelectCyBacktraceCyListCyPrintCyLocals	CyGlobalsr   FixGdbCommandCyExecCySetCyCNameCyCValueCyLineCyEvalitemsr   setattrcython_namespacefunctions_by_qualified_namer   collectionsdefaultdictr  functions_by_name)r   r   rW  ru  commandscommand_namecommandr_   s          r   rY   zCyCy.__init__  s   mT""++D-,;D 	, 	J 	J 	J  
 
 
'')))
 %%'''
 ??$$$	

 ??$$$
 .."""
 ??$$$
 &&(((
 
 ??$$$
 &&(((
 %%'''
 ??$$$
 %%'''
 &&(((
   ((***!
" +IzBBB#
$ OO%%%%
& .."""'
, z***-
. !---/
0 {+++1
2 Y'''3
8 &.^^%5%5 	1 	1!L'GJD,0000 !# ,.( #% "-!8!>!>r!   )ru   rv   r`   rN  r   r   r}  rW  COMPLETE_COMMANDru  rY   r   r   s   @r   r  r    sY         , D$M*O3? 3? 3? 3? 3? 3? 3? 3? 3?r!   r  c                   R    e Zd ZdZdZej        Zej        Z	e
j        d             ZdS )r  zb
    Import debug information outputted by the Cython compiler
    Example: cy import FILE...
    z	cy importc           
         t          |t                    r|                    t                    }t	          |          D ]}	 t          |          }n7# t          $ r*}t          j        d|d|j	        d                   d }~ww xY wt          j        |          }|                                D ]L}t          di |j        }|| j        j        |j        <   |                    d          D ]#}	|	j        }
t'          di |
|j        |
d         <   $|                    d          D ],}t+          dd|i|j        }|j        }|j        }| j        j        |                             |           || j        j        |j        <   || j        j        |j        <   |x}
|j        |<   |                    d          D ]#}|j        }
t'          di |
|j        |
d         <   $|                    d	          D ])}|j        }
|j                            |
d                    *|j         !                    d
 |                    d          D                        .|                    d          D ]}tE          |j        d                   }|j        d         }tG          tI          tD          |j        d         %                                                    }tM          |          |j'        ||f<   |D ]}||f|j(        |<   Nd S )NzUnable to open file r   r   Globalsr   	Functionsr   LocalsStepIntoFunctionsc              3   $   K   | ]}|j         V  d S r   )tag)r@   funcargs     r   r   z"CyImport.invoke.<locals>.<genexpr>/  s=       5O 5O(/5O 5O 5O 5O 5O 5Or!   	ArgumentsLineNumberMapping
src_linenosrc_path	c_linenosr"   ))r:   r   decode_filesystemencodingr   r8  rH  r   r   r   r   parsegetrootrg   attribr   r  r   findrx   rk   r   r{   r  appendr  r   rz   rn   r   r   addr   extendr}   r  mapr   minrl   rm   )r   r   from_ttyrA   r  etr   cython_modulevariabledr   cython_functionr   qnamelocalstep_into_funcmarkerr  r  r  c_linenos                         r   r   zCyImport.invoke  s   dE"" 	4;;233D!$'' 1	U 1	UCUII U U Ull444PQ#STTTU AA))++ )U )U , = =v} = =?L();< &I 6 6 K KH A7E7J7J7J7JM)!F)44 &K 8 8 O OH&4 'H 'HM 'H7?'H 'HO +/D+:EG-d3::?KKK:I G7'68 2A G.'-/ :IHA/6!)x!8!8 P P!L<J<O<OQ<O<O.qy99*2--8K*L*L K K*1';??&	JJJJ#-44 5O 5O3;==3M3M5O 5O 5O O O O O %kk*=>> U UF!$V]<%@!A!AJ%}Z8H $SfmK.H.N.N.P.P%Q%Q R RIFI)nnM-h
.BC$- U U?G>T1(;;UUG)U1	U 1	Us   A
B%BBN)ru   rv   r`   rN  r   r   COMMAND_STATUSrW  COMPLETE_FILENAMEru  r   dont_suppress_errorsr   r"   r!   r   r  r    sW         
 D&M+O#4U 4U $#4U 4U 4Ur!   r  c                   p    e Zd ZdZdZej        Zd Zd Z	e
j        d             Ze
j        d             ZdS )r  a  
    Set a breakpoint for Cython code using Cython qualified name notation, e.g.:

        cy break cython_modulename.ClassName.method_name...

    or normal notation:

        cy break function_or_method_name...

    or for a line number:

        cy break cython_module:lineno...

    Set a Python breakpoint:
        Break on any function or method named 'func' in module 'modname'

            cy break -p modname.func...

        Break on any function or method named 'func'

            cy break -p func...
    zcy breakc                 h   |                     d          \  }}}t          |          }|r| j        j        |         }n|                                 j        }|j        |f|j        v r9|j        |j        |f         }|j        d|}t          j
        d|z              d S t          j        d          )Nr   break z5Not a valid line number. Does it contain actual code?)	partitionr}   r   r  r   r   ri   rl   rj   r   r/   r   )r   r   
modulename_r~   r  r  
breakpoints           r   
_break_pyxzCyBreak._break_pyxV  s     $s 3 3
AvV 	> G4Z@MM 4466=M"F+}/HHH$01G1OPH$1$<$<$<hhGJK:-.....,  > ? ? ?r!   c                    | j         j                            |          }|r	|j        rd }|g}|s_| j         j                            |          pg }d |D             }|st          j        d|z              d S t          |          dk    rt          d           t          |          D ]\  }}t          d||j
        fz             	 	 t          d          }|                                dk    rd S |                                d	k    r|}nw|                                rAd
t          |          cxk    rt          |          k     rn n|t          |                   g}n"t          d           n# t          $ r Y d S w xY wn	|d
         g}|D ]A}t          j        d|j        z             |j        rt          j        d|j        z             Bd S )Nc                      g | ]}|j         	|S r"   r   r@   r  s     r   rC   z+CyBreak._break_funcname.<locals>.<listcomp>p  s     FFF1Q-EFQFFFr!   r  r   z"There are multiple such functions:z%3d) %sTzMSelect a function, press 'a' for all functions or press 'q' or '^D' to quit: qr  r   zNot understood...zbreak %s)r   r  r&   r   r  r   r/   lenr   r=  r{   inputlowerisdigitr}   EOFErrorrz   r   )r   funcnamefuncbreak_funcsfuncsrD  r   s          r   _break_funcnamezCyBreak._break_funcnamef  s2   w266x@@ 	D/ 	Df "	)G-11(;;ArEFFFFFE Hx/0005zzA~~:;;;!*5!1!1 B BIC)sD,?&@@AAAA77!&G"H "H "<<>>S00"F#\\^^s22*/K!$nn.. 7 !S[[ = = = =3u:: = = = = =+0V+=*>K!!"56666 $   7(  %Qxj 	8 	8DK
TZ/000} 8J6777	8 	8s   E4 4
FFc                 f   t          |t                    r|                    t                    }t	          |          }|                    d          r|dd          }d}nd}|D ]K}|rt          j        d|z             d|v r|                     |           6| 	                    |           Ld S )Nz-pr   TFzpy-break %sr   )
r:   r   r  r  r   r   r   r/   r  r  )r   function_namesr  argvpython_breakpointsr  s         r   r   zCyBreak.invoke  s    ne,, 	H+223FGGNn--$$T** 	'8D!%!& 	/ 	/H! /MH45555))))$$X....	/ 	/r!   c                   	
 pdd | j         j                                        D             }d | j         j                                        D             }t          j        rt          j        ||          }n|}|                                	                                }|r
d|d         vrFt          |d t                              	                                          		fd|D             S |d         fd|D             }t                    t                    k    r-t                    t                    z
  

fd|D             }|S )	NrS   c                 J    g | ] \  }}t          d  |D                       |!S )c              3   &   K   | ]}|j          V  d S r   r  r  s     r   r   z.CyBreak.complete.<locals>.<listcomp>.<genexpr>  s(      AA!Q55AAAAAAr!   )any)r@   nLs      r   rC   z$CyBreak.complete.<locals>.<listcomp>  sN     C C C1AAqAAAAAC! C C Cr!   c                 &    g | ]\  }}|j         |S r"   r  )r@   r  r  s      r   rC   z$CyBreak.complete.<locals>.<listcomp>  s3     3 3 3113! 3 3 3r!   .c                 F    g | ]}|                               r|v|S r"   r   )r@   r  r  words     r   rC   z$CyBreak.complete.<locals>.<listcomp>  sA     C C C!\\$//C45TMM 4AMMr!   c                 >    g | ]}|                               |S r"   r  )r@   r  lastwords     r   rC   z$CyBreak.complete.<locals>.<listcomp>  s*    ===qall8&<&<====r!   c                 $    g | ]}|d          S r   r"   )r@   r  strip_prefix_lengths     r   rC   z$CyBreak.complete.<locals>.<listcomp>  s%    <<<Q*++,<<<r!   )r   r  r  r  rZ   ro  r;  chainstripr   r   r  )r   textr  namesqnames	all_nameswordscomplr  r  r  s     `     @@@r   completezCyBreak.complete  s    zrC C 9 ? ? A A C C C3 3 C I I K K 3 3 3 * 	!66III

""$$ 	C59,,tKc$iiZK(..0011DC C C C Cy C C C C 9====F===x==3t99$$ #&h--#d))";<<<<e<<<Er!   N)ru   rv   r`   rN  r   r   rm  rW  r  r  r   r  r   r  r"   r!   r   r  r  ;  s         . D+M? ? ? /8 /8 /8b #/ / $#/$ #    $#     r!   r  c                   B     e Zd ZdZ fdZ fdZ fdZd Zd Z xZ	S )
CythonInfozM
    Implementation of the interface dictated by libpython.LanguageInfo.
    c                     |                      |          r|                     |          d         S t                                          |          S Nr   )r'   r   r   r~   r   r   r_   s     r   r~   zCythonInfo.lineno  sJ    
 ""5)) 	4))%0033ww~~e$$$r!   c                     	 t                                          |          }|                                pd S # t          j        $ r Y d S w xY wr   )r   r   r
  r   r   )r   r   r   r_   s      r   r   zCythonInfo.get_source_line  sZ    	(77**511D ::<<'4' | 	 	 	44	s   !: AAc                 X    | j         r!t                                          |          S d S r   )r.   r   exc_infor  s     r   r  zCythonInfo.exc_info  s0    " 	+77##E***	+ 	+r!   c                 `    |                                  r|                                 j        S dS )Nr"   )r'   r   r   rr   s    r   runtime_break_functionsz"CythonInfo.runtime_break_functions  s1    ""$$ 	B++--AArr!   c                 J    dg}|                     | j        j                   |S )Nr   )r  r   r   )r   r   s     r   static_break_functionsz!CythonInfo.static_break_functions  s&    &'dg0111r!   )
ru   rv   r`   rN  r~   r   r  r  r  r   r   s   @r   r  r    s         % % % % %( ( ( ( (+ + + + +  
      r!   r  c                   $    e Zd Zed             ZdS )CythonExecutionControlCommandc                 .     | | j         t                    S r   )r   cython_info)rw  s    r   r|  z&CythonExecutionControlCommand.register  s    s38[)))r!   N)ru   rv   r`   r~  r|  r"   r!   r   r  r    s/         * * [* * *r!   r  c                   :    e Zd ZdZdZdZej        d             ZdS )r  z&Step through Cython, Python or C code.zcy -stepTc                 2   |                                  r|                     | j                   d S |                                 s7| j        rd}nd}|                     t          j        |d                     d S |                     | j                   d S )Nr  r  T	to_string)stepinto)r.   python_stepr&  r'   finish_executingr   r/   r  )r   r   r  r  s       r   r   zCyStep.invoke  s    ""$$ 
	.T]+++++((** 	.} !  !!#+g"F"F"FGGGGGIIt}I-----r!   N)	ru   rv   r`   rN  r   r&  r   r  r   r"   r!   r   r  r    sA        ,,DH#. . $#. . .r!   r  c                       e Zd ZdZdZdZdS )r  z#Step-over Cython, Python or C code.zcy -nextFN)ru   rv   r`   rN  r   r&  r"   r!   r   r  r    s        ))DHHHr!   r  c                   @    e Zd ZdZdZ ej        ej                  Z	dS )r  z
    Run a Cython program. This is like the 'run' command, except that it
    displays Cython or Python source lines as well
    zcy runN)
ru   rv   r`   rN  r   r   r  r  r  r   r"   r!   r   r  r    s5         
 D+Y+,I,MNNFFFr!   r  c                   @    e Zd ZdZdZ ej        ej                  Z	dS )r  z
    Continue a Cython program. This is like the 'run' command, except that it
    displays Cython or Python source lines as well.
    zcy contN)
ru   rv   r`   rN  r   r   r  r  r  r   r"   r!   r   r  r  "  s5         
 D+Y+,I,NOOFFFr!   r  c                   @    e Zd ZdZdZ ej        ej                  Z	dS )r  z-
    Execute until the function returns.
    z	cy finishN)
ru   rv   r`   rN  r   r   r  r  r  r   r"   r!   r   r  r  ,  s5          D+Y+,I,PQQFFFr!   r  c                   :    e Zd ZdZdZdZej        d             ZdS )r  z5
    Go up a Cython, Python or relevant C frame.
    zcy upr  c                    	 t          j        | j        d           |                     t          j                              sAt          j        | j        d           |                     t          j                              An%# t
          $ r}t          j        |j         d }~ww xY wt          j                    }d}|r|                                }|dz  }|| 	                    |dz
             d S )NTr$  r   r   )r   )
r   r/   _commandr0   r   r   r   r   r   r   )r   r   r  r   r   s        r   r   zCyUp.invoke<  s   	(K6666//0B0D0DEE ;DMT:::: //0B0D0DEE ; 	( 	( 	(,''	( "$$ 	KKMMEQJE  	 	EAI.....s   BB 
B'B""B'N)	ru   rv   r`   rN  r   r/  r   r  r   r"   r!   r   r  r  5  sG          DH#/ / $#/ / /r!   r  c                       e Zd ZdZdZdZdS )r  z7
    Go down a Cython, Python or relevant C frame.
    zcy downr  N)ru   rv   r`   rN  r   r/  r"   r!   r   r  r  N  s$          DHHHr!   r  c                   6    e Zd ZdZdZej        d             ZdS )r  z
    Select a frame. Use frame numbers as listed in `cy backtrace`.
    This command is useful because `cy backtrace` prints a reversed backtrace.
    z	cy selectc                    	 t          |          }n%# t          $ r t          j        d|          w xY wt          j                    }|                                r(|                                }|                                (t          j        |          }	 t          j        d||z
  dz
  fz             d S # t          $ r}t          j        |j
         d }~ww xY w)NzNot a valid number: z	select %dr   )r}   
ValueErrorr   r   r   newerr   
stackdepthr/   r   r   )r   stacknor  r   r5  r  s         r   r   zCySelect.invoke_  s    	F'llGG 	F 	F 	F,,77DEEE	F "$$kkmm 	"KKMME kkmm 	" )%00
	(KzG';a'?&AABBBBB 	( 	( 	(,''	(s     "4B; ;
CCCN)ru   rv   r`   rN  r   r   r  r   r"   r!   r   r  r  W  sB         
 D#( ( $#( ( (r!   r  c                   f    e Zd ZdZdZdZej        Zej	        Z
ej        ed                         ZdS )r  zPrint the Cython stackzcy btzcy backtracec                 x   t          j                    }|                                r(|                                }|                                (|dk    }d}|r`	 |                     |          }n# t          $ r d}Y nw xY w|s|r|                     ||           |dz  }|                                }|^d S d S )Nz-ar   Fr   )r   r   r   r0   rK  r   r4  )r   r   r  r   	print_allr   is_relevants          r   r   zCyBacktrace.invokez  s     "$$kkmm 	"KKMME kkmm 	" DL	 
	"$"77>> $ $ $#$  4K 4%%eU333QJEKKMME  
	" 
	" 
	" 
	" 
	"s   A1 1B ?B N)ru   rv   r`   rN  r   r{  r   COMMAND_STACKrW  COMPLETE_NONEru  r   r  r(   r   r"   r!   r   r  r  r  s\        DE%M'O#" "  $#" " "r!   r  c                   R    e Zd ZdZdZej        Zej        Z	e
j        d             ZdS )r  za
    List Cython source code. To disable to customize colouring see the cy_*
    parameters.
    zcy listc                     |                                  \  }}|                    |dz
  |dz   |d          }t          |           d S )N   T)rA  rB  )r   r   r   )r   r  r  sdr~   sources         r   r   zCyList.invoke  sQ     ))++
Fvz6A:*.  0 0fr!   N)ru   rv   r`   rN  r   r   rp  rW  r<  ru  r   r  r   r"   r!   r   r  r    sR         
 D%M'O#  $#  r!   r  c                   J    e Zd ZdZdZej        Zej	        d             Z
d ZdS )r  zT
    Print a Cython variable using 'cy-print x' or 'cy-print module.function.x'
    zcy printc                 `   |                                  }|                                 j        j        }||v r;||                             t
          j                  }t          |d|           d S ||v rx||         j        }	 t          j
        |          }|j        s|                     ||           d S t          d|z             d S # t          $ r t          d|z             Y d S w xY w|                                 rt          j        d|z             S |                                 rj| j        j                            |                    d                    }|D ]}|dk    r|                                } |                     ||           d S t          j        d|z              d S )NrJ   z%s is optimized outzunable to get value of %sz	py-print *zprint )r  r   r   rk   get_truncated_reprr   MAX_OUTPUT_LENr   rz   r   r   r   r!  r   r.   r/   r'   r   r   r   lstripdereference)r   r   r  global_python_dictmodule_globalsr   rz   cs           r   r   zCyPrint.invoke  s   !99;;1133:B%%%&t,??	@XYYEtttUU+,,,,, ^##"4(.E8*511 - 8((u55555/$677777   : : :1D8999999: $$&& 	);{T1222$$&& 
	)G%,,T[[-=-=>>E  88!--//EE  u-----K4(((((s   C C+*C+c                     |                                  r@|                                 }t          t          j        |j        |j                            S g S r   )r'   r   r  r;  r	  r   rk   )r   r  s     r   r  zCyPrint.complete  sJ    ""$$ 	((**A	!)<<===Ir!   N)ru   rv   r`   rN  r   r   COMMAND_DATArW  r   r  r   r  r"   r!   r   r  r    sZ          D$M# )  ) $# )D    r!   r  c                 6    | d                                          S )Nr   )r  )items    r   r   r     s    tAw}} r!   c                   x    e Zd ZdZdZej        Zej        Z	e
j         edd          d                         ZdS )r  z8
    List the locals from the current Cython frame.
    z	cy localszinfo localsz	py-localsr3   r4   c                    |                                  }|j        r"| j        j                            ||           d S |j        }t          t          |t                              }t          |	                                t                    D ]o\  }}|                     |                                  |j                  r=t          j        |j                  }|j        s|                     |j        ||d           pd S )NkeyrS   )r   r   r   rk   r   r   r  rG  r[   r  sortkeyr&  r   r   r   rz   r   r!  )	r   r   r  r  local_cython_varsr  r   r$  r   s	            r   r   zCyLocals.invoke  s    22441 	GO""4222F+2c"3===>>!"3"9"9";";III 	> 	>KD%""4#;#;#=#=uzJJ >*5;77- >((U)8"> > >		> 	>r!   Nru   rv   r`   rN  r   r   r;  rW  r<  ru  r   r  r5   r   r"   r!   r   r  r    sn          D%M'O#{KKK> > LK $#> > >r!   r  c                   x    e Zd ZdZdZej        Zej        Z	e
j         edd          d                         ZdS )r  z:
    List the globals from the current Cython module.
    z
cy globalszinfo variablesz
py-globalsrQ  c                 `   |                                  }|                                 j        j        }d}d}|r#t	          t          |t                              }|rt	          t          |                    }t          ||          }t                      }t          d           t          |	                                t                    D ]N\  }	}
|
                    t          j                  }
|                    |	           t          d||	|
fz             Ot          d           t          |	                                t                    D ]X\  }}||vrO	 t          j        |j                  }|j        s|                     |j        ||d           H# t*          $ r Y Tw xY wYd S )Nr   rS  zPython globals:z    %-*s = %sz
C globals:r   )r  r   r   rk   r  rG  r   r   r[   r  rU  rE  r   rF  r  r   r   rz   r   r!  r   r   )r   r   r  rI  rJ  max_globals_lenmax_globals_dict_lenr  r  r  r  r   r$  r   s                 r   r   zCyGlobals.invoke   s    "99;;1133:B  	@!#n#">">">??O 	@#&s+='>'>#?#? o/CDDuu   -33557CCC 	= 	=DAq$$Y%=>>AHHQKKK/_a$;;<<<<l!."6"6"8"8gFFF 		F 		FKD%4F.u{;;E !1 F,,UZ-<fF F F	 $   D  		F 		Fs   F
F*)F*NrW  r"   r!   r   r  r    st          D%M'O#!1,OOOF F PO $#F F Fr!   r  c                   *    e Zd ZdZd Zd Zd Zd ZdS )EvaluateOrExecuteCodeMixinz
    Evaluate or execute Python code in a Cython or Python frame. The 'evalcode'
    method evaluations Python code, prints a traceback if an exception went
    uncaught, and returns any return value as a gdb.Value (NULL on exception).
    c                 F   |                                  }|j                                        D ]\  }}|j        t          k    r|                     ||          r	 t          j        |j                  }|j	        rMn# t          $ r Y Zw xY w|                    |          }d|||j        fz  }	 t          j        |          dk     r(t          j        d           t          j        d          	 |                    |           # |                    |           w xY wdS )zBFill a remotely allocated dict with values from the Cython C stackz
                    (PyObject *) PyDict_SetItem(
                        (PyObject *) %d,
                        (PyObject *) %d,
                        (PyObject *) %s)
                r   zPyErr_Print()zUnable to execute Python code.N)r   r   r  r|   r	   r&  r   r   rz   r   r   alloc_pystringr   xdecref)	r   executorlocal_dict_pointerr   r   r$  r   	pystringpr3  s	            r   _fill_locals_dictz,EvaluateOrExecuteCodeMixin._fill_locals_dict+  sX   ..00&-3355 	0 	0KD%
l**++K>> +!,U[99C + ! ! $   H %33D99	
 *9ekBC0)$//!33*?;;;!l+KLLL 4
 $$Y////H$$Y////5	0 	0s   A<<
B	B	/A DDc                     t          j                    }|rV|                     |          s|                     |          r|                                 |S |                                }|Vt          j        d          )Nz0There is no Cython or Python frame on the stack.)r   r   r'   r.   r   r   r   r   s     r   "_find_first_cython_or_python_framez=EvaluateOrExecuteCodeMixin._find_first_cython_or_python_frameK  s    "$$ 	"''.. ..u55KKMME  	" lMNNNr!   c                    t          j                    5  t          j        d          }t          j        d          }	 |                     |t          j        |                     |                    ||||          }|                    t          j        |                     n,# |                    t          j        |                     w xY w	 d d d            n# 1 swxY w Y   |S )Nz&(PyObject *) PyModule_GetDict(__pyx_m)z(PyObject *) PyDict_New())r   FetchAndRestoreErrorr   r   rd  pointervalueevalcoder`  )r   ra  r3  
input_typeglobal_dict
local_dictr   s          r   _evalcode_cythonz+EvaluateOrExecuteCodeMixin._evalcode_cythonW  sA   +-- 	E 	E ,8: :K+,GHHJE&&x'0'=j'I'IK K K!**4[+57 7   !7
!C!CDDDD  !7
!C!CDDDDD	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E s)   )CA B&>(C&)CCC#&C#c                     |                                  }t          j                    }|                     |          rt          j        |||          S |                     |||          S )zi
        Evaluate `code` in a Python or Cython stack frame using the given
        `input_type`.
        )rf  r   PythonCodeExecutorr.   _evalcode_pythonrn  )r   r3  rk  r   ra  s        r   rj  z#EvaluateOrExecuteCodeMixin.evalcodei  sg    
 7799/11""5)) 	J-hjIII$$XtZ@@@r!   N)ru   rv   r`   rN  rd  rf  rn  rj  r"   r!   r   r]  r]  $  sc         0 0 0@
O 
O 
O  $	A 	A 	A 	A 	Ar!   r]  c                   R    e Zd ZdZdZej        Zej        Z	e
j        d             ZdS )r  zD
    Execute Python code in the nearest Python or Cython frame.
    r  c                     |                      |          \  }}t          j                    }|                    |                     ||j                             d S r   )readcoder   rp  r`  rj  Py_file_input)r   exprr  rk  ra  s        r   r   zCyExec.invoke~  sQ    ==..j/11tX-CDDEEEEEr!   N)ru   rv   r`   rN  r   r   r;  rW  r<  ru  r   r  r   r"   r!   r   r  r  u  sW          D%M'O#F F $#F F Fr!   r  c                   b    e Zd ZdZdZej        Zej        Z	e
j        ed                         ZdS )r  z
    Set a Cython variable to a certain value

        cy set my_cython_c_variable = 10
        cy set my_cython_py_variable = $cy_eval("{'doner': 'kebab'}")

    This is equivalent to

        set $cy_value("my_cython_variable") = 10
    zcy setc                     |                     dd          }t          |          dk    rt          j        d          |\  }}| j        j                            |                                          }t          j        d|d|           d S )Nr   r      z,Invalid expression. Use 'cy set var = expr'.zset rJ   )	r   r  r   r   r   r  r   r
  r/   )r   rv  r  name_and_exprvarnamerz   s         r   r   zCySet.invoke  s     

3**}"",MNNN% ''88UUUDD122222r!   N)ru   rv   r`   rN  r   r   rM  rW  r<  ru  r   r  r*   r   r"   r!   r   r  r    s]        	 	 D$M'O#3 3  $#3 3 3r!   r  c                   T    e Zd ZdZej        eedd                                    ZdS )r  z
    Get the C name of a Cython variable in the current context.
    Examples:

        print $cy_cname("function")
        print $cy_cname("Class.method")
        print $cy_cname("module.function")
    Nc                    |pt          j                    }d }|                     |          r|                     |          }||j        v r|j        |         j        }n\||j        j        v r|j        j        |         j        }n6|j        j        d|}||j        j	        v r|j        j	        |         j        }|s| j
        j                            |          }|st          j        d|z            |S )Nr   zNo such Cython variable: %s)r   r   r'   r   r   rz   r   rk   r   rn   r   r  r&   r   )r   cynamer   rz   r  r  s         r   r   zCyCName.invoke  s    -+--""5)) 		J"66u==O///'.v6<?1999'.6v>D#2#9#>#>#>GO2<<<+2<UCIE 	DG7;;FCCE 	G,<vEFFFr!   r   )	ru   rv   r`   rN  r   r  r*   r=   r   r"   r!   r   r  r    sX          #"   #"  $#  r!   r  c                   ^     e Zd ZdZej        eed fd	                                    Z xZ	S )r  z-
    Get the value of a Cython variable.
    Nc                 @   |                                  }|                     |          }|                     ||          r7t                                          ||          }t          j        |          S ||v r||         j        S t          j        d|z            )Nr   zVariable %s is not initialized.)	r  r   r&  r   r   r   r   _gdbvalr   )r   r~  r   globals_dictr  rz   r_   s         r   r   zCyCValue.invoke  s     33552259977 	KGGNN6N77E%e,,,|##'//,@6IJJJr!   r   )
ru   rv   r`   rN  r   r  r*   r=   r   r   r   s   @r   r  r    sw          #"
K 
K 
K 
K 
K #"  $#
K 
K 
K 
K 
Kr!   r  c                   B    e Zd ZdZej        ed                         ZdS )r  z&
    Get the current Cython line.
    c                 6    |                                  d         S r  )r   rr   s    r   r   zCyLine.invoke  s     %%''**r!   N)ru   rv   r`   rN  r   r  r*   r   r"   r!   r   r  r    sH          #+ +  $#+ + +r!   r  c                   B    e Zd ZdZej        ed                         ZdS )r  zO
    Evaluate Python code in the nearest Python or Cython frame and return
    c                 P    t           j        j        }|                     ||          S r   )r   rp  Py_eval_inputrj  )r   python_expressionrk  s      r   r   zCyEval.invoke  s$     1?
}}.
;;;r!   N)ru   rv   r`   rN  r   r  r=   r   r"   r!   r   r  r    sH          #"< < #" $#< < <r!   r  c                      t          j        t          j        d          t          j        t          j        fz             d S )Nz        define cy step
        cy -step
        end

        define cy next
        cy -next
        end

        document cy step
        %s
        end

        document cy next
        %s
        end
    )r   source_gdb_scriptr  r  r  rN  r  r"   r!   r   register_definesr    sG     1 !	 !	  NFN+!!, - - - - -r!   )Tr   )NT)[rN  r   r  r   r;  r  r   lxmlr   	have_lxmlImportError	xml.etreer   pygments.lexersr   pygments.formattersstderrr   rv  r   shlexr   Cython.Debuggerr   r   r	   r  _data_typesgetfilesystemencodingr  r#   r*   r5   r(   r=   re   rg   rx   r   r   r   r   r   r   rK  r   r   	ParameterrS  r_  rc  re  rg  rZ   Commandrs  r  r  r  
PythonInfor  ExecutionControlCommandBaser  PythonStepperMixinr  r  r  r  r  r  r  r  r  r  r  rU  r  r  r]  PyExecr  r  Functionr  r  r  r  r!  r|  r   r  r"   r!   r   <module>r     s	   
 


              



II   ......IIIF F F FHJDEEEEEF 73 !! ."""""""------ % % % % % % d7>>>/c/11<W 
   "	 	 	   *	 	 	  . . . .bO O O O O O O O 
! 
! 
! 
! 
! 
! 
! 
!) ) ) ) )^ ) ) )2   2  >Y) Y) Y) Y) Y) Y) Y) Y)x: : : : : : : :~               D D D D D: D D D    !=       cm   &                            . 

5 5 5 5 5CK 5 5 50N? N? N? N? N?= N? N? N?b?U ?U ?U ?U ?U} ?U ?U ?UDP P P P Pm P P Pf" " " " "Y1 " " "J* * * * *M$-$I* * *. . . . .*I,H . . .*    V   O O O O O) O O OP P P P P* P P PR R R R R, R R R/ / / / /= / / /2    T   ( ( ( ( (} ( ( (6" " " " "- " " "@    ]   &0 0 0 0 0m 0 0 0f '
&> > > > >} > > >8*F *F *F *F *F *F *F *FZNA NA NA NA NA NA NA NAbF F F F F]I,.H F F F 3 3 3 3 3M 3 3 3<" " " " "clJ " " "JK K K K Kw K K K*+ + + + +S\: + + +	< 	< 	< 	< 	<S\:'A 	< 	< 	< jll	]]__- - -&       s   % 55A !A&%A&