
    Ae                        d Z ddlmZ 	 e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Z	 eZeZ	 ddlmZ dZ	 ddlZddlZ 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jR                         xs dZ*d Z+dhdZ,d Z-didZ.d Z/d Z0 G d de1      Z2 G d de1      Z3 G d de3      Z4 G d de1      Z5 G d  d!e1      Z6 G d" d#ejn                        Z8 G d$ d%e8      Z9 G d& d'e9      Z: G d( d)ejv                        Z< G d* d+e<      Z= G d, d-e<      Z> G d. d/e<      Z? G d0 d1e1      Z@ e@       ZA G d2 d3ej                  e5      ZC G d4 d5eC      ZD G d6 d7eC      ZE G d8 d9eC      ZF G d: d;e5e$j                        ZH G d< d=eCe$j                        ZJ G d> d?eJe$j                        ZL G d@ dAeL      ZM G dB dCeJ      ZN G dD dEeJ      ZO G dF dGeJ      ZP G dH dIeC      ZQ G dJ dKeQ      ZR G dL dMeC      ZS G dN dOeC      ZT G dP dQeC      ZU G dR dSeC      ZVdT ZW G dU dVeC      ZX G dW dXeX      ZY G dY dZe1      ZZ G d[ d\eCe$j                  eZ      Z\ G d] d^eC      Z] G d_ d`ej                  e5      Z_ G da dbe_      Z` G dc ddej                  e5      Za G de dfej                  e5eZ      Zb eH       ZceDj                         Zeeeec_e        dg Zf ef        y# e$ r Y w xY w# e$ r eZeZY w xY w# e$ rC dZ	 ddlmZ n5# e$ r- 	 ddlmZ n"# e$ r 	 ddlZn# e$ r	 ddlmZ Y nw xY wY nw xY wY nw xY wY w xY w# e$ r! dZej:                  j=                  d	       Y -w xY w)jz)
GDB extension that adds Cython support.
    )print_functionN)etreeTF)cElementTree)ElementTreez,Install pygments for colorized source code.
string_to_argv)r   )split)	libpythonCObjectPythonObject)r
   r   zUTF-8c                 B     t        j                          fd       }|S )z*sigh*, readlinec                  Z    	  | i |S # t         $ r t        j                           w xY wN)	Exception	traceback	print_excargskwargsfunctions     9lib/python3.12/site-packages/Cython/Debugger/libcython.pywrapperz%dont_suppress_errors.<locals>.wrapperJ   s6    	T,V,, 	!	s    *	functoolswrapsr   r   s   ` r   dont_suppress_errorsr   H   s%    __X  N    c                       fd}|S )Nc                 H     t        j                         d fd	       }|S )Nc                     	 |xs t        j                         }r|j	                         
t                | |g|i |S # t        $ r t        j                  d      w xY wNzNo frame is currently selected.)gdbselected_frameRuntimeErrorGdbErrornameNoFunctionNameInFrameError)selfframer   r   errr   s       r   r   z>default_selected_gdb_frame.<locals>.decorator.<locals>.wrapperW   so    F5!3!3!5 uzz|+022D%9$9&99   Fll#DEEFs   A A#r   r   )r   r   r*   s   ` r   	decoratorz-default_selected_gdb_frame.<locals>.decoratorV   s%    		"		: 
#		: r    )r*   r+   s   ` r   default_selected_gdb_framer-   U   s     r   c                 T     t        j                         t         fd              }|S )Nc                     |j                  d      xs t        j                         }| j                  |      st        j                  d       | g|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>.wrapperg   s]     

7#;s'9'9';&&u-,,  @ A A.t.v..r   )r   r   require_running_programr   s   ` r   require_cython_framer3   f   s-    __X/  / Nr   c                       fd}|S )Nc                 H     t        j                          fd       }|S )Nc                    | j                         }| j                         }|s|rs | g|i | y |rt        j                         y | j	                         rt        j                         y t        j
                  d      )NzFNot a function cygdb knows about. Use the normal GDB commands instead.)r1   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>.wrappert   sx    ++-E++-E~///N+**,I&ll $J K Kr   r   )r   r   r<   r=   s   ` r   r+   z$dispatch_on_frame.<locals>.decorators   s'    		"	K 
#	K r   r,   )r<   r=   r+   s   `` r   dispatch_on_framer>   r   s    " r   c                 B     t        j                          fd       }|S )Nc                      	 t        j                           | i |S # t        $ r t        j                  d      w xY wr!   )r"   r#   r$   r%   r   s     r   r   z(require_running_program.<locals>.wrapper   sJ    	B  (((  	B,,@AA	Bs    >r   r   s   ` r   r2   r2      s%    __X) ) Nr   c                 B     t        j                          fd       }|S )Nc                 r    t        |t        j                        r|j                         } | |g|i |S r   )
isinstancer"   Valuestring)r(   rE   r   r   r   s       r   r   z.gdb_function_value_to_unicode.<locals>.wrapper   s3    fcii(]]_Ff6t6v66r   r   r   s   ` r   gdb_function_value_to_unicoderF      s%    __X7 7
 Nr   c                       e Zd Zd Zy)CythonModulec                 f    || _         || _        || _        i | _        i | _        i | _        i | _        y r   )r&   filename
c_filenameglobalslineno_cy2clineno_c2cy	functions)r(   module_namerJ   rK   s       r   __init__zCythonModule.__init__   s5    	 $r   N__name__
__module____qualname__rQ   r,   r   r   rH   rH      s    	r   rH   c                       e Zd Zd Zy)CythonVariablec                 \    || _         || _        || _        || _        t	        |      | _        y r   )r&   cnamequalified_nametypeintlineno)r(   r&   rY   rZ   r[   r]   s         r   rQ   zCythonVariable.__init__   s*    	
,	&kr   NrR   r,   r   r   rW   rW      s    "r   rW   c                   $     e Zd Zedf fd	Z xZS )CythonFunctionFalsec	                     t         t        |   |||||       || _        || _        |dk(  | _        i | _        g | _        t               | _	        y )NTrue)
superr_   rQ   modulepf_cnameis_initmodule_functionlocals	argumentssetstep_into_functions)
r(   rd   r&   rY   re   rZ   r]   r[   rf   	__class__s
            r   rQ   zCythonFunction.__init__   sW     	nd,T-2-;-1-3		5
  &<&F##&5 r   )rS   rT   rU   r
   rQ   __classcell__rk   s   @r   r_   r_      s     (/) )r   r_   c                   8   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y)
CythonBaseF)r*   c                 N    |j                         | j                  j                  v S r   )r&   cyfunctions_by_cnamer(   r)   s     r   r1   zCythonBase.is_cython_function   s    zz|tww9999r   c                     |j                         dk(  r8t        j                  |      j                         }|xr |j	                          S y)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   r7   zCythonBase.is_python_function   sD     ::<//ooe,557G=7#;#;#===r   c                 "    |j                         S r   )r&   rs   s     r   get_c_function_namezCythonBase.get_c_function_name   s    zz|r   c                 6    |j                         j                  S r   )find_salliners   s     r   get_c_linenozCythonBase.get_c_lineno   s    ~~$$$r   c                     | j                   j                  j                  |j                               }|
t	               |S r   )rq   rr   r0   r&   NoCythonFunctionInFrameError)r(   r)   results      r   get_cython_functionzCythonBase.get_cython_function   s5    ++//

=>.00r   c                     | j                  |      }|j                  j                  j                  | j	                  |      d      S )z
        Get the current Cython line number. Returns 0 if there is no
        correspondence between the C and Cython code.
        r   )r   rd   rN   r0   r   )r(   r)   cyfuncs      r   get_cython_linenozCythonBase.get_cython_lineno   s<     ))%0}}((,,T->->u-EqIIr   c                    d x}x}}| j                  |      r_| j                  |      j                  j                  }| j	                  |      }t
        r#t
        j                  j                  d      }n| j                  |      rt        j                  |      j                         }|st        j                  d      |j                         }|j                         }t
        rt
        j                  j                  d      }no|j!                         }|r|j"                  sd }d}nL|j"                  j%                         }|j&                  }t
        r t
        j                  j)                  d      }t+        ||      |fS )NF)stripallz*Unable to read information on python framer   )r1   r   rd   rJ   r   pygmentslexersCythonLexerr7   r	   rv   rw   r"   r%   current_line_numPythonLexerr}   symtabfullnamer~   CLexerSourceFileDescriptor)r(   r)   rJ   r]   lexerpyframeobjectsymbol_and_line_objs          r   get_source_desczCythonBase.get_source_desc   sI   $(((6E""5)//6==FFH++E2F 33U3C$$U+%OOE2;;=M llHJ J %--/H"335F 33U3C"'.."2&.A.H.H.55>>@,11$OO22E2BE#He4f<<r   c                 J    | j                         \  }}|j                  |      S r   )r   
get_source)r(   r)   source_descr]   s       r   get_source_linezCythonBase.get_source_line  s&    "224V%%f--r   c                     |j                         }|j                         }| j                  |      s| j                  |      ry|r0| j                  |      r| j	                  |      }||j
                  v S y)zl
        returns whether we care about a frame on the user-level when debugging
        Cython code
        TF)r&   olderr1   r7   r   rj   )r(   r)   r&   older_framecython_funcs        r   r9   zCythonBase.is_relevant_function   sl     zz|kkm""5)T-D-DU-KT44[A22;?K;::::r   c                 P    t        j                         }j                          	  j                        \  }}|sk j                        rZt        j                        j                         }||j                         r j                  |d      S |j                  }d}	g }
nk j                        r2 j                        } fd}|j                  }|j                   }	g }
n( j                        \  }}j                         }|}	g }
	 t        j"                  |	      }|j$                  }t'        |t(              s?t'        |t*        t,        f      st+        |      }t)        |j/                         d   d      }	 dj3                  d	 |
D              }t4        j6                  j9                  d
||||fz         |j:                  /t4        j6                  j9                  d|j:                  d|       t4        j6                  j9                  d       	 t4        j6                  j9                  d|j=                  |      z          |j                          y# t        $ r t        d|z         Y yw xY w# t0        $ r d}Y w xY w# t         j>                  $ r Y Uw xY w)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_cru   c                 R    j                   j                  j                  |       S )Nr)   )rq   	cy_cvalueinvoke)argr)   r(   s    r   <lambda>z-CythonBase.print_stackframe.<locals>.<lambda>M  s!    DGG--44S4F r   r   z, c              3   0   K   | ]  \  }}|d |  yw)=Nr,   ).0r&   vals      r   	<genexpr>z.CythonBase.print_stackframe.<locals>.<genexpr>d  s     G	cs+Gs   z#%-2d 0x%016x in %s(%s)z at :
    ) r"   r#   selectr   r'   printr7   r	   rv   rw   rx   print_stackframeco_namer1   r   r&   rY   parse_and_evaladdressrC   r\   strbytesr   r$   joinsysstdoutwriterJ   r   r%   )r(   r)   indexr   r#   r   r]   ry   	func_name
func_cname	func_argsr   f	gdb_valuefunc_addressas   ``              r   r   zCythonBase.print_stackframe1  sQ    ++-	"&"6"6u"=K
 //6ooe,557G'":":"<,,UE,EEI-JI$$U+--e4FFAIJI"&"6"6u"=K

I"JI
	?**:6I %,,LlC0!,e=#&|#4L"<#5#5#7#:A>IIGYGG

2e\9VW5XXY+JJK,@,@&IJ

	JJVk&<&<V&DDE 	g * 	9EAB	8  	L	( || 		s5   I  I= 1J  I:9I:=JJJ%$J%c                 
   t        j                  d      }	 t        j                  d      }|j                  |j                               }|d   S # t        $ r) t        j                  t        j                  d            w xY w)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_dicts  s{    y)	2 __-=>N FF>))+,|  	2,,x 00  1 2 2	2s   A 2Bc                     | j                         }t        j                  j                  |      }i }t	               }|j                         D ]  \  }}|||j                  |      <    |S )zk
        Get the Cython globals dict where the remote names are turned into
        local strings.
        )r   r	   PyObjectPtrfrom_pyobject_ptrri   itemsproxyval)r(   remote_dictpyobject_dictr   seenkvs          r   get_cython_globals_dictz"CythonBase.get_cython_globals_dict  sj    
 99;!--??Lu!'') 	)DAq'(F1::d#$	) r   Nc                     t        j                  |      rd}nd|j                  d}|t        ||d||       y t        d|||||fz         y )N (z)  = z%s%-*s = %s%s)r	   pretty_printer_lookupr[   r   )r(   r&   valuemax_name_lengthprefixtypenames         r   print_gdb_valuezCythonBase.print_gdb_value  sW    **51H 2 #(**.H"645AB/V_dHe$TTUr   c                    |j                   |   }| j                         }d|j                  v rL||j                  kD  r<|j                  t
        k(  r(t        t        j                  |j                              S yy||j                  kD  S )Nz->TF)	rg   r   rY   r]   r[   r   r\   r"   r   )r(   r   
local_namecyvar
cur_linenos        r   is_initializedzCythonBase.is_initialized  su    "":.++-
5;;K...::-s11%++>??ELL((r   )F)Nr   )rS   rT   rU   r-   r1   r7   r{   r   r   r   r   r   r9   r   r   r   r   r   r,   r   r   ro   ro      s   E*: +:  E* +  ! "  !% "%  ! "  !J "J  != "=@  !. ".  ! "   E*?  +? B	V)r   ro   c                   2    e Zd ZddZd Zd Zd Z	 	 ddZy)	r   Nc                 .    || _         || _        || _        y r   )rJ   r   	formatter)r(   rJ   r   r   s       r   rQ   zSourceFileDescriptor.__init__  s     
"r   c                     | j                   d uS r   )rJ   r(   s    r   validzSourceFileDescriptor.valid  s    }}D((r   c                 2   t         r| j                  rt        j                  rtt        j                  j
                  }| j                  !t         j                  j                  |      }n| j                  }t        j                  || j                  |      S |S )N)bg)
r   r   
parameterscolorize_codeterminal_backgroundr   r   
formattersTerminalFormatter	highlight)r(   coder   r   s       r   lexzSourceFileDescriptor.lex  sn    

z'?'?//55B~~%$//AARAH	 NN	%%dDJJ	BBr   c              #     K   t        | j                        5 }|r/|r-| j                  |j                               j	                         }t        j                  ||dz
  |dz
        }t        |      D ]B  \  }}	||z   |k(  rd}
nd}
|r|s| j                  |	      }	d|
||z   |	j                         fz   D 	 d d d        y # 1 sw Y   y xY ww)N   > z%s %4d    %s)	openrJ   r   read
splitlines	itertoolsislice	enumeraterstrip)r(   startstop
lex_source	mark_line
lex_entirer   sliceidxr~   r   s              r   _get_sourcez SourceFileDescriptor._get_source  s     $--  	LA
 jHHQVVX&113$$Q	4!8<E&u- 	L	T3;)+ F Fj88D>D$T[[]'KKK	L	L 	L 	Ls   CBC8	CC
Cc           	          t        j                  d      }| j                  s|t        |d      }||dz   }	 dj	                  | j                  |||||            S # t        $ r |w xY w)NzUnable to retrieve source coder   r   )r"   r%   rJ   maxr   r	  IOError)r(   r  r  r  r  r  excs          r   r   zSourceFileDescriptor.get_source  sx    ll;<}}IE1<19D	99  j)ZPR R 	I	s   #A A(r   )NTr   F)rS   rT   rU   rQ   r   r   r	  r   r,   r   r   r   r     s&    #
)
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    |xs | j                   f}t        t        |   |  y r   )msgrc   r  rQ   )r(   r   rk   s     r   rQ   zCyGDBError.__init__  s"    "{j$($/r   )rS   rT   rU   __doc__rQ   rl   rm   s   @r   r  r    s    0 0r   r  c                       e Zd ZdZdZy)r   z]
    raised when the user requests the current cython function, which is
    unavailable
    z7Current function is a function cygdb doesn't know aboutNrS   rT   rU   r  r  r,   r   r   r   r     s     DCr   r   c                       e Zd ZdZdZy)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 frameNr  r,   r   r   r'   r'     s    Cr   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
    c                     | j                   j                  x| _        | _        t        t
        |   |||       ||| _        y y r   )rk   r  show_docset_docrc   r  rQ   r   )r(   r&   command_classparameter_classdefaultrk   s        r   rQ   zCythonParameter.__init__  sC    '+~~'='==ot-dM.=	? DJ r   c                 ,    t        | j                        S r   )boolr   r   s    r   __bool__zCythonParameter.__bool__  s    DJJr   r   )rS   rT   rU   r  rQ   r   __nonzero__rl   rm   s   @r   r  r    s    !  Kr   r  c                       e Zd ZdZy) CompleteUnqualifiedFunctionNameszH
    Have 'cy break' complete unqualified function or method names.
    NrS   rT   rU   r  r,   r   r   r#  r#        r   r#  c                       e Zd ZdZy)ColorizeSourceCodez5
    Tell cygdb whether to colorize source code.
    Nr$  r,   r   r   r'  r'    r%  r   r'  c                       e Zd ZdZy)TerminalBackgroundzJ
    Tell cygdb about the user's terminal background (light or dark).
    Nr$  r,   r   r   r)  r)  %  r%  r   r)  c                       e Zd ZdZd Zy)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      | _
        y )Ncy_complete_unqualifiedTcy_colorize_codecy_terminal_background_colordark)r#  r"   COMMAND_BREAKPOINTSPARAM_BOOLEANcomplete_unqualifiedr'  COMMAND_FILESr   r)  PARAM_STRINGr   r   s    r   rQ   zCythonParameters.__init__1  su    $D%##	%!
 0	
 $6*	$ r   N)rS   rT   rU   r  rQ   r,   r   r   r+  r+  +  s    
r   r+  c                   H    e Zd ZdZej
                  Zed        Zed        Z	y)CythonCommandz(
    Base class for Cython commands
    c                     t        | d      s | || j                  g|i |S  | || j                  | j                  g|i |S )Ncompleter_class)hasattrr  r9  )clsclsnamer   r   s       r   	_registerzCythonCommand._registerN  sY    s-.w 1 1CDCFCCw 1 133F3F (( &( (r   c                     t        | dd       }|r| j                  | j                  ||       | j                  | j                  ||      S )Nalias)getattrr=  r?  r&   )r;  r   r   r?  s       r   registerzCythonCommand.registerV  s>    Wd+MM#))T62}}SXXtV44r   N)
rS   rT   rU   r  r"   COMMAND_NONEr  classmethodr=  rA  r,   r   r   r7  r7  G  s:     $$M( ( 5 5r   r7  c                   V     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
    rq   c           	      j   t         t        |   |||d       t        di dt        j                         dt        j                         dt        j                         dt        j                         dt        j                         dt        j                         d	t        j                         d
t        j                         dt        j                         dt        j                         dt        j                         dt         j                         dt"        j                         dt$        j                         dt&        j                         dt)        j*                  dd      dt,        j                         dt.        j                         dt1        d      dt3        d      dt5        d      dt7        d      }|j9                         D ]  \  }}| |_        t=        | ||        | | _        i | _        i | _         i | _!        tE        jF                  tH              | _%        y )NT)r   import_break_stepnextruncontfinishupdownr   btlistprint_rg   rL   exec_zcy exec-cy-exec_execri   cy_cnamer   	cy_linenocy_evalr,   )&rc   r7  rQ   dictCyImportrA  CyBreakCyStepCyNextCyRunCyContCyFinishCyUpCyDownCySelectCyBacktraceCyListCyPrintCyLocals	CyGlobalsr	   FixGdbCommandCyExecCySetCyCNameCyCValueCyLineCyEvalr   rq   setattrcython_namespacefunctions_by_qualified_namerr   collectionsdefaultdictrQ  functions_by_name)r(   r&   r  r9  commandscommand_namecommandrk   s          r   rQ   zCyCy.__init__z  s   mT+D-,;D 	, 	J  
'')
 %%'
 ??$	

 ??$
 .."
 ??$
 &&(
 
 ??$
 &&(
 %%'
 ??$
 %%'
 &&(
   ((*!
" ++IzB#
$ OO%%
& .."'
, z*-
. !-/
0 {+1
2 Y'3
8 &.^^%5 	1!L'GJD,0	1  !# ,.( #% "-!8!8!>r   )rS   rT   rU   r  r&   r"   rB  r  COMPLETE_COMMANDr9  rQ   rl   rm   s   @r   rE  rE  _  s/    , D$$M**O3? 3?r   rE  c                   J    e Zd ZdZdZej                  Zej                  Z	d Z
y)rZ  zb
    Import debug information outputted by the Cython compiler
    Example: cy import FILE...
    z	cy importc           
      F   t        |t              r|j                  t              }t	        |      D ]  }	 t        |      }t        j                  |      }|j                         D ]|  }t        di |j                  }|| j                  j                   |j"                  <   |j%                  d      D ])  }	|	j                  }
t'        di |
|j(                  |
d   <   + |j%                  d      D ]_  }t+        dd|i|j                  }|j"                  }|j,                  }| j                  j.                  |   j1                  |       || j                  j2                  |j,                  <   || j                  j4                  |j6                  <   |x}
|j8                  |<   |j%                  d      D ])  }|j                  }
t'        di |
|j:                  |
d   <   + |j%                  d	      D ],  }|j                  }
|j<                  j?                  |
d          . |j@                  jC                  d
 |j%                  d      D               b |j%                  d      D ]|  }tE        |j                  d         }tG        tI        tD        |j                  d   jK                                     }tM        |      |jN                  |<   |D ]  }||jP                  |<    ~   y # t        $ r-}t        j                  d|d|j                  d         d }~ww xY w)NzUnable to open file z: r   Globalsr&   	Functionsrd   LocalsStepIntoFunctionsc              3   4   K   | ]  }|j                     y wr   )tag)r   funcargs     r   r   z"CyImport.invoke.<locals>.<genexpr>  s      5O(/5Os   	ArgumentsLineNumberMappingcython_lineno	c_linenosr,   ))rC   BYTESdecode_filesystemencodingr   r   OSErrorr"   r%   r   r   parsegetrootrH   attribrq   rq  r&   findrW   rL   r_   rZ   ru  appendrr  rr   rY   rO   rg   rj   addrh   extendr\   rQ  mapr   minrM   rN   )r(   r   from_ttyr   r   etrd   cython_modulevariabledr   cython_functionr&   qnamelocalstep_into_funcmarkerr  r  c_linenos                        r   r   zCyImport.invoke  s   dE";;23D!$' 0	LCUI AA))+ (L , =v}} =?L((););< &I 6 KH A7E7J7JM))!F)4K !'K 8 OH&4 'HM 'H7?'HO +//D+::EGG--d3::?K:I GG77'668 2A GG..'--/ :IHA//6!)x!8 P!LL<J<OQ<O..qy9P +3--8K*L K*11';;??&	JK $--44 5O3;==3M5O O1O6 %kk*=> LF$'o(F$GM $SfmmK.H.N.N.P%Q RI?B9~M--m<$- L>K11(;L	LG(L0	L  Ull4PQ#STTUs   K**	L 3(LL N)rS   rT   rU   r  r&   r"   COMMAND_STATUSr  COMPLETE_FILENAMEr9  r   r,   r   r   rZ  rZ    s*    
 D&&M++O3Lr   rZ  c                   N    e Zd ZdZdZej                  Zd Zd Z	d Z
ed        Zy)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                 f   |j                  d      \  }}}t        |      }|r| j                  j                  |   }n| j	                         j
                  }||j                  v r9|j                  |   }|j                  d|}t        j                  d|z          y t        j                  d      )Nr   break z5Not a valid line number. Does it contain actual code?)	partitionr\   rq   rq  r   rd   rM   rK   r"   r8   r%   )r(   r&   
modulename_r]   r  r  
breakpoints           r   
_break_pyxzCyBreak._break_pyx  s     $s 3
AvV GG44Z@M 446==M]...$008H$1$<$<hGJKK:-.,,  > ? ?r   c                    | j                   j                  j                  |      }|r|j                  rd }|g}|s0| j                   j                  j                  |      xs g }|D cg c]  }|j                  r| }}|st        j                  d|z          y t        |      dkD  rt        d       t        |      D ]  \  }}t        d||j                  fz         ! 	 	 t        d      }|j                         dk(  ry |j                         dk(  r|}nS|j                         r0dt        |      cxk  rt        |      k  rn n|t        |         g}nt        d	       	 |d   g}|D ]S  }t        j                  d
|j                   z         |j"                  s2t        j                  d
|j"                  z         U y c c}w # t        $ r Y y w xY w)Nr  r   z"There are multiple such functions:z%3d) %szMSelect a function, press 'a' for all functions or press 'q' or '^D' to quit: qr   r   zNot understood...zbreak %s)rq   rr  r0   rf   ru  r"   r8   lenr   r   rZ   inputlowerisdigitr\   EOFErrorrY   re   )r(   funcnamefuncbreak_funcsfuncsr   r  r   s           r   _break_funcnamezCyBreak._break_funcname  s   ww2266x@D//DfGG--11(;ArE %F1Q-E-EQFEFHx/05zA~:;!*5!1 BIC)sD,?,?&@@AB 7!&G"H "<<>S0"#\\^s2*/K!$nn. !S[ =3u: =+0V+=*>K!!"56% (  %Qxj 	8DKK
TZZ/0}}J67	8E G" $ s   )G;G$G
 
	GGc                 ,   t        |t              r|j                  t              }t	        |      }|j                  d      r|dd  }d}nd}|D ]D  }|rt        j                  d|z         d|v r| j                  |       4| j                  |       F y )Nz-pr   TFzpy-break %sr   )
rC   r  r  r  r   
startswithr"   r8   r  r  )r(   function_namesr  argvpython_breakpointsr  s         r   r   zCyBreak.invokeL  s    ne,+223FGNn-$$T*8D!%!& 	/H!MH45)$$X.	/r   c                 R   | j                   j                  j                         D cg c]  \  }}t        d |D              r| }}}| j                   j                  j                         D cg c]  \  }}|j
                  s| }}}t        j                  rt        j                  ||      }n|}|j                         j                         }	|	rd|	d   vrKt        |d t        |        j                               }
|D cg c]  }|j                  |      r||
vr| c}S |	d   }|D cg c]  }|j                  |      s| }}t        |      t        |      kD  r)t        |      t        |      z
  }|D cg c]  }||d  	 }}|S c c}}w c c}}w c c}w c c}w c c}w )Nc              3   6   K   | ]  }|j                      y wr   )rf   )r   r   s     r   r   z#CyBreak.complete.<locals>.<genexpr>c  s     A!Q555As   .)rq   ru  r   anyrr  rf   r   r3  r   chainstripr   ri   r  r  )r(   textwordnLnamesr   qnames	all_nameswordsr   lastwordcomplstrip_prefix_lengths                 r   completezCyBreak.complete^  s    !% 9 9 ? ? A C1AqAA  C C $ C C I I K 3111  3 3 **!6II

""$59,tKc$iZ(..01D( C!\\$/ATM  C C 9"=qall8&<==x=3t9$ #&h-#d)";6;<Q*+,<E<7C3C
 > =s#   F0FF/FF>F$N)rS   rT   rU   r  r&   r"   r1  r  r  r  r   r   r  r,   r   r   r[  r[    s=    . D++M? /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                 n    | j                  |      r| j                  |      S t        t        |   |      S r   )r1   r   rc   r  r]   r(   r)   rk   s     r   r]   zCythonInfo.lineno  s6    
 ""5)))%00Z-e44r   c                     	 t         t        |   |      }|j                         xs d S # t        j
                  $ r Y y w xY wr   )rc   r  r   r  r"   r%   )r(   r)   r~   rk   s      r   r   zCythonInfo.get_source_line  sD    	(T:5AD ::<'4' || 		s   * A A c                 D    | j                   rt        t        |   |      S y r   )r7   rc   r  exc_infor  s     r   r  zCythonInfo.exc_info  s#    ""T3E:: #r   c                 X    | j                         r| j                         j                  S y)Nr,   )r1   r   rj   r   s    r   runtime_break_functionsz"CythonInfo.runtime_break_functions  s&    ""$++-AAAr   c                 V    dg}|j                  | j                  j                         |S )Nru   )r  rq   rr   )r(   r   s     r   static_break_functionsz!CythonInfo.static_break_functions  s%    &'dgg001r   )
rS   rT   rU   r  r]   r   r  r  r  rl   rm   s   @r   r  r    s!    5(;
r   r  c                       e Zd Zed        Zy)CythonExecutionControlCommandc                 0     | | j                   t              S r   )r&   cython_info)r;  s    r   rA  z&CythonExecutionControlCommand.register  s    388[))r   N)rS   rT   rU   rC  rA  r,   r   r   r  r    s     * *r   r  c                       e Zd ZdZdZdZd Zy)r\  z&Step through Cython, Python or C code.zcy -stepTc                 $   | j                         r| j                  | j                         y | j                         s8| j                  rd}nd}| j	                  t        j                  |d             y | j                  | j                         y )NrI  rJ  T	to_string)stepinto)r7   python_stepr  r1   finish_executingr"   r8   rI  )r(   r   r  rx  s       r   r   zCyStep.invoke  sh    ""$T]]+((*}}  !!#++g"FGIIt}}I-r   N)rS   rT   rU   r  r&   r  r   r,   r   r   r\  r\    s    ,DH.r   r\  c                       e Zd ZdZdZdZy)r]  z#Step-over Cython, Python or C code.zcy -nextFN)rS   rT   rU   r  r&   r  r,   r   r   r]  r]    s    )DHr   r]  c                   ,    e Zd ZdZdZej                  Zy)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)rS   rT   rU   r  r&   r  rK  r   r,   r   r   r^  r^    s    
 D*..Fr   r^  c                   ,    e Zd ZdZdZej                  Zy)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)rS   rT   rU   r  r&   r  rL  r   r,   r   r   r_  r_    s    
 D*//Fr   r_  c                   ,    e Zd ZdZdZej                  Zy)r`  z-
    Execute until the function returns.
    z	cy finishN)rS   rT   rU   r  r&   r  rM  r   r,   r   r   r`  r`    s     D*11Fr   r`  c                       e Zd ZdZdZdZd Zy)ra  z5
    Go up a Cython, Python or relevant C frame.
    zcy uprN  c                    	 t        j                  | j                  d       | j                  t        j                               sEt        j                  | j                  d       | j                  t        j                               sEt        j                         }d}|r|j                         }|dz  }|r| j                  |dz
         y # t
        $ r!}t        j                  |j                   d }~ww xY w)NTr  r   r   )r   )
r"   r8   _commandr9   r#   r$   r%   r   r   r   )r(   r   r  r)   r   s        r   r   zCyUp.invoke  s    	(KK6//0B0B0DEDMMT: //0B0B0DE
 ""$KKMEQJE  	EAI.  	(,,''	(s   BC 	C;C66C;N)rS   rT   rU   r  r&   r  r   r,   r   r   ra  ra    s     DH/r   ra  c                       e Zd ZdZdZdZy)rb  z7
    Go down a Cython, Python or relevant C frame.
    zcy downrO  N)rS   rT   rU   r  r&   r  r,   r   r   rb  rb    s     DHr   rb  c                       e Zd ZdZdZd Zy)rc  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        |      }t        j                         }|j                         r!|j                         }|j                         r!t        j                  |      }	 t        j                  d||z
  dz
  fz         y # t        $ r t        j                  d|      w xY w# t        $ r!}t        j                  |j                   d }~ww xY w)NzNot a valid number: z	select %dr   )r\   
ValueErrorr"   r%   r#   newerr	   
stackdepthr8   r$   r   )r(   stacknor  r)   r  r  s         r   r   zCySelect.invoke  s    	F'lG ""$kkmKKME kkm ))%0
	(KKzG';a'?&AAB  	F,,7DEE	F  	(,,''	(s#   B (B- "B*-	C6CCN)rS   rT   rU   r  r&   r   r,   r   r   rc  rc    s    
 D(r   rc  c                   X    e Zd ZdZdZdZej                  Zej                  Z
ed        Zy)rd  zPrint the Cython stackzcy btzcy backtracec                 D   t        j                         }|j                         r!|j                         }|j                         r!|dk(  }d}|rA	 | j                  |      }|s|r| j                  ||       |dz  }|j                         }|r@y y # t        $ r d}Y =w xY w)Nz-ar   Fr   )r"   r#   r   r9   r  r   r  )r(   r   r  r)   	print_allr   is_relevants          r   r   zCyBacktrace.invoke)  s     ""$kkmKKME kkm DL	$"77> K%%eU3QJEKKME   $#$s   B BBN)rS   rT   rU   r  r&   r?  r"   COMMAND_STACKr  COMPLETE_NONEr9  r2   r   r,   r   r   rd  rd  !  s7    DE%%M''O" "r   rd  c                   J    e Zd ZdZdZej                  Zej                  Z	d Z
y)re  za
    List Cython source code. To disable to customize colouring see the cy_*
    parameters.
    zcy listc                 v    | j                         \  }}|j                  |dz
  |dz   |d      }t        |       y )N   T)r  r  )r   r   r   )r(   r  r  sdr]   sources         r   r   zCyList.invokeK  s?    ))+
Fvz6A:*.  0fr   N)rS   rT   rU   r  r&   r"   r4  r  r  r9  r   r,   r   r   re  re  @  s)    
 D%%M''Or   re  c                   :    e Zd ZdZdZej                  ZddZd Z	y)rf  zT
    Print a Cython variable using 'cy-print x' or 'cy-print module.function.x'
    zcy printNc                 p   | j                         rt        j                  d|z         S | j                         rf| j                  j
                  j                  |j                  d            }|D ]  }|dk(  r|j                         } n | j                  |||       y t        j                  d|z          y )Nz	py-print *zprint )
r7   r"   r8   r1   rq   r   r   lstripdereferencer   )r(   r&   r  r   r   cs         r   r   zCyPrint.invokeZ  s    ""$;;{T122$$&GG%%,,T[[-=>E 8!--/E	   uo>KK4(r   c                     | j                         rC| j                         }t        t        j                  |j
                  |j                              S g S r   )r1   r   rQ  r   r  rg   rL   )r(   r   s     r   r  zCyPrint.completei  s?    ""$((*A	!))<==Ir   r   )
rS   rT   rU   r  r&   r"   COMMAND_DATAr  r   r  r,   r   r   rf  rf  R  s#     D$$M)r   rf  c                 (    | d   j                         S )Nr   )r  )items    r   r   r   q  s    tAw}} r   c                   d    e Zd ZdZdZej                  Zej                  Z	 e
dd      d        Zy)rg  z8
    List the locals from the current Cython frame.
    z	cy localszinfo localsz	py-localsr<   r=   c                    | j                         }|j                  r'| j                  j                  j	                  ||       y |j
                  }t        t        |t                    }t        |j                         t              D ]z  \  }}| j                  | j                         |j                        s1t        j                  |j                        }|j                   r]| j#                  |j                  ||d       | y )Nkeyr   )r   rf   rq   rL   r   rg   r  r  sortedr   sortkeyr   r&   r"   r   rY   rx   r   )	r(   r   r  r  local_cython_varsr   r&   r   r   s	            r   r   zCyLocals.invoke}  s    22411GGOO""42+22c"3=>!"3"9"9";I 	>KD%""4#;#;#=uzzJ**5;;7--((U)8">		>r   NrS   rT   rU   r  r&   r"   r  r  r  r9  r>   r   r,   r   r   rg  rg  t  s>     D%%M''O{K> L>r   rg  c                   d    e Zd ZdZdZej                  Zej                  Z	 e
dd      d        Zy)rh  z:
    List the globals from the current Cython module.
    z
cy globalszinfo variablesz
py-globalsr  c                    | j                         }| j                         j                  j                  }d}d}|rt	        t        |t                    }|rt	        t        |            }t        ||      }t               }t        d       t        |j                         t              D ]F  \  }	}
|
j                  t        j                        }
|j                  |	       t        d||	|
fz         H t        d       t        |j                         t              D ]U  \  }}||vs	 t        j                   |j"                        }|j$                  r8| j'                  |j(                  ||d       W y # t*        $ r Y dw xY w)Nr   r
  zPython globals:z    %-*s = %sz
C globals:r   )r   r   rd   rL   r  r  ri   r   r  r   r  get_truncated_reprr	   MAX_OUTPUT_LENr  r"   r   rY   rx   r   r&   r$   )r(   r   r  global_python_dictmodule_globals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::BB !#n#">?O#&s+='>#? o/CDu -3357C 	=DAq$$Y%=%=>AHHQK/_a$;;<	=
 	l!."6"6"8gF 		FKD%4F..u{{;E !11,,UZZ-<fF		F $ s   *E77	FFNr  r,   r   r   rh  rh    sA     D%%M''O!1,OF PFr   rh  c                   (    e Zd ZdZd Zd Zd Zd Zy)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                 J   | j                         }|j                  j                         D ]  \  }}|j                  t        k(  s| j                  ||      s-	 t        j                  |j                        }|j                  rZ|j                  |      }d|||j                  fz  }	 t        j                  |      dk  r*t        j                  d       t        j                  d      	 |j                  |        y# t        $ r Y w xY w# |j                  |       w xY w)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   rg   r   r[   r   r   r"   r   rY   rx   r$   alloc_pystringr%   xdecref)	r(   executorlocal_dict_pointerr   r&   r   r   	pystringpr   s	            r   _fill_locals_dictz,EvaluateOrExecuteCodeMixin._fill_locals_dict  s   ..0&--335 	0KD%zz\)d.A.A+t.T!,,U[[9C ++ $33D9	
 *9ekkBC0))$/!3**?;!ll+KLL 4
 $$Y/1	0 $ ( $$Y/s   D )AD 	DDD"c                     t        j                         }|rG| j                  |      s| j                  |      r|j	                          |S |j                         }|rGt        j                  d      )Nz0There is no Cython or Python frame on the stack.)r"   r#   r1   r7   r   r   r%   rs   s     r   "_find_first_cython_or_python_framez=EvaluateOrExecuteCodeMixin._find_first_cython_or_python_frame  s_    ""$''.''.KKME  llMNNr   c                    t        j                         5  t        j                  d      }t        j                  d      }	 | j	                  |t        j
                  |             |j                  ||||      }|j                  t        j
                  |             	 d d d        |S # |j                  t        j
                  |             w xY w# 1 sw Y   S xY w)Nz&(PyObject *) PyModule_GetDict(__pyx_m)z(PyObject *) PyDict_New())r	   FetchAndRestoreErrorr"   r   r   pointervalueevalcoder  )r(   r  r   
input_typeglobal_dict
local_dictr   s          r   _evalcode_cythonz+EvaluateOrExecuteCodeMixin._evalcode_cython  s    ++- 	E ,,8:K++,GHJE&&x'0'='=j'IK!**4[+57   !7!7
!CD	E    !7!7
!CD	E s#   +C9B):$C)&CCCc                     | j                         }t        j                         }| j                  |      rt        j                  |||      S | j                  |||      S )zi
        Evaluate `code` in a Python or Cython stack frame using the given
        `input_type`.
        )r"  r	   PythonCodeExecutorr7   _evalcode_pythonr*  )r(   r   r'  r)   r  s        r   r&  z#EvaluateOrExecuteCodeMixin.evalcode  sX    
 779//1""5)--hjII$$XtZ@@r   N)rS   rT   rU   r  r   r"  r*  r&  r,   r   r   r  r    s    0<
O$	Ar   r  c                   J    e Zd ZdZdZej                  Zej                  Z	d Z
y)rj  zD
    Execute Python code in the nearest Python or Cython frame.
    rT  c                     | j                  |      \  }}t        j                         }|j                  | j	                  ||j
                               y r   )readcoder	   r,  r  r&  Py_single_input)r(   exprr  r'  r  s        r   r   zCyExec.invoke  sB    ==.j//1tX-E-EFGr   N)rS   rT   rU   r  r&   r"   r  r  r  r9  r   r,   r   r   rj  rj  	  s*     D%%M''OHr   rj  c                   T    e Zd ZdZdZej                  Zej                  Z	e
d        Zy)rk  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                    |j                  dd      }t        |      dk7  rt        j                  d      |\  }}| j                  j
                  j                  |j                               }t        j                  d|d|       y )Nr   r      z,Invalid expression. Use 'cy set var = expr'.zset r   )	r   r  r"   r%   rq   rV  r   r  r8   )r(   r2  r  name_and_exprvarnamerY   s         r   r   zCySet.invoke(  si    

3*}",,MNN%  ''8UD12r   N)rS   rT   rU   r  r&   r"   r  r  r  r9  r3   r   r,   r   r   rk  rk    s6    	 D$$M''O3 3r   rk  c                   ,    e Zd ZdZeedd              Zy)rl  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                 t   |xs t        j                         }d }| j                  |      r| j                  |      }||j                  v r|j                  |   j
                  }n||j                  j                  v r$|j                  j                  |   j
                  }nV|j                  j                  d|}||j                  j                  v r#|j                  j                  |   j
                  }|s%| j                  j                  j                  |      }|st        j                  d|z        |S )Nr  zNo such Cython variable: %s)r"   r#   r1   r   rg   rY   rd   rL   r&   rO   rq   rr  r0   r%   )r(   cynamer)   rY   r  r  s         r   r   zCyCName.invoke?  s    -++-""5)"66u=O///'..v6<<?11999'..66v>DD#2#9#9#>#>GO22<<<+22<<UCIIEGG77;;FCE,,<vEFFr   r   )rS   rT   rU   r  r3   rF   r   r,   r   r   rl  rl  5  s#     " # r   rl  c                   8     e Zd ZdZeed fd	              Z xZS )rm  z-
    Get the value of a Cython variable.
    c                    | j                         }| j                  |      }| j                  ||      r*t        t        |   ||      }t        j                  |      S ||v r||   j                  S t        j                  d|z        )Nr   zVariable %s is not initialized.)
r   r   r   rc   rm  r   r"   r   _gdbvalr%   )r(   r:  r)   globals_dictr  rY   rk   s         r   r   zCyCValue.invoke^  s     33522597(D0u0EE%%e,,|#'///,,@6IJJr   r   )rS   rT   rU   r  r3   rF   r   rl   rm   s   @r   rm  rm  Y  s&     "
K # 
Kr   rm  c                        e Zd ZdZed        Zy)rn  z&
    Get the current Cython line.
    c                 "    | j                         S r   )r   r   s    r   r   zCyLine.invoker  s    %%''r   N)rS   rT   rU   r  r3   r   r,   r   r   rn  rn  m  s     ( (r   rn  c                        e Zd ZdZed        Zy)ro  zO
    Evaluate Python code in the nearest Python or Cython frame and return
    c                 Z    t         j                  j                  }| j                  ||      S r   )r	   r,  Py_eval_inputr&  )r(   python_expressionr'  s      r   r   zCyEval.invoke|  s%    11??
}}.
;;r   N)rS   rT   rU   r  rF   r   r,   r   r   ro  ro  w  s     #< #<r   ro  c                      t        j                  t        j                  d      t        j
                  t        j
                  fz         y )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\  r  r]  r,   r   r   register_definesrG    s7     1 !	  NNFNN+!!, -r   )Tr   )gr  
__future__r   	raw_inputr  	NameErrorr   r   r   r   r   rs  r"   unicodeUNICODEr   r  r   lxmlr   	have_lxmlImportError	xml.etreer   r   elementtree.ElementTreepygments.lexersr   pygments.formattersstderrr   r:  r   shlexr   Cython.Debuggerr	   r
   r   rY  _data_typesgetfilesystemencodingr  r   r-   r3   r>   r2   rF   objectrH   rW   r_   ro   r   r%   r  r   r'   	Parameterr  r#  r'  r)  r+  r   Commandr7  rE  rZ  r[  
PythonInfor  ExecutionControlCommandBaser  PythonStepperMixinr\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  r  rg  rh  r  PyExecrj  rk  Functionrl  rm  rn  ro  r  rA  rq   rG  r,   r   r   <module>ra     s   &	E       
GE
8I$F
 3 !"- % 7>/c//1<W 

"	*	
6 
"V ")^ )2W) W)t:6 :~0 0D: D!= cmm &   v . 

5CKK 50N?= N?b=L} =L@Mm M`"Y11 "J*M$-$I$I*.*I,H,H .(V /) /0* 02, 2/= /0T (} (4"- ">] $m > '>} >6(F (FVLA LA^H]I,,.H H3M 3:!cllJ !HKw K((S\\: (<S\\:'A < l	]]_-&  c,  		  GE  8I83 
8		86 	88, 878		8	
88(  FHJJDEFs   K  K, K< M  K)(K),	K98K9<ML
ML=LL=L7L#"L7#L1	.L70L1	1L74L=6L77L=:M<L==MM"M-,M-