a
    b                     @   s  d Z ddlmZ zeZW n ey*   Y n0 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zeZeZW n ey   eZeZY n0 zddlmZ dZW n ey2   dZzddlmZ W nh ey,   zddlmZ W nB ey&   zddlZW n  ey    ddlmZ Y n0 Y n0 Y n0 Y n0 zddlZddlZW n$ eyl   dZejd	 Y n0 eed
rddlm Z  nddl!m"Z  ddl#m$Z$ dZ%dZ&e'e%e&dZ(e) pdZ*dd Z+dpddZ,dd Z-dqddZ.dd Z/dd Z0G dd de1Z2G d d! d!e1Z3G d"d# d#e3Z4G d$d% d%e1Z5G d&d' d'e1Z6G d(d) d)ej7Z8G d*d+ d+e8Z9G d,d- d-e9Z:G d.d/ d/ej;Z<G d0d1 d1e<Z=G d2d3 d3e<Z>G d4d5 d5e<Z?G d6d7 d7e1Z@e@ ZAG d8d9 d9ejBe5ZCG d:d; d;eCZDG d<d= d=eCZEG d>d? d?eCZFG d@dA dAe5e$jGZHG dBdC dCeCe$jIZJG dDdE dEeJe$jKZLG dFdG dGeLZMG dHdI dIeJZNG dJdK dKeJZOG dLdM dMeJZPG dNdO dOeCZQG dPdQ dQeQZRG dRdS dSeCZSG dTdU dUeCZTG dVdW dWeCZUG dXdY dYeCZVdZd[ ZWG d\d] d]eCZXG d^d_ d_eXZYG d`da dae1ZZG dbdc dceCe$j[eZZ\G ddde deeCZ]G dfdg dgej^e5Z_G dhdi die_Z`G djdk dkej^e5ZaG dldm dmej^e5eZZbeH ZceDd Zeeeec_edndo Zfef  dS )rz)
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                    s   t   fdd}|S )z*sigh*, readlinec                     s2   z | i |W S  t y,   t   Y n0 d S N)	Exception	traceback	print_excargskwargsfunction i/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/Cython/Debugger/libcython.pywrapperJ   s
    z%dont_suppress_errors.<locals>.wrapper	functoolswrapsr   r   r   r   r   dont_suppress_errorsH   s    r   c                    s    fdd}|S )Nc                    s   t  d fdd	}|S )Nc                    s\   z|pt  }W n ty,   t dY n0  rD| d u rDt | |g|R i |S NzNo frame is currently selected.)gdbselected_frameRuntimeErrorGdbErrornameNoFunctionNameInFrameError)selfframer   r   )errr   r   r   r   W   s    z>default_selected_gdb_frame.<locals>.decorator.<locals>.wrapper)Nr   r   r%   r   r   	decoratorV   s    
z-default_selected_gdb_frame.<locals>.decoratorr   )r%   r'   r   r&   r   default_selected_gdb_frameU   s    r(   c                    s   t  t fdd}|S )Nc                    s<   | dpt }| |s&t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   r   r   r   g   s    

z%require_cython_frame.<locals>.wrapper)r   r   require_running_programr   r   r   r   require_cython_framef   s    r,   c                    s    fdd}|S )Nc                    s   t   fdd}|S )Nc                    sf   |   }|  }|s|r4s4| g|R i | n.|rDt n|  rXt  n
tdd S )NzFNot a function cygdb knows about. Use the normal GDB commands instead.)r*   is_python_functionr   executeis_relevant_functionr    )r#   r   r   Zis_cyZis_py)	c_commandr   python_commandr   r   r   t   s    z5dispatch_on_frame.<locals>.decorator.<locals>.wrapperr   r   r0   r1   r   r   r'   s   s    z$dispatch_on_frame.<locals>.decoratorr   )r0   r1   r'   r   r2   r   dispatch_on_framer   s    r3   c                    s   t   fdd}|S )Nc                     s8   zt   W n ty(   t dY n0  | i |S r   )r   r   r   r    r   r   r   r   r      s
    z(require_running_program.<locals>.wrapperr   r   r   r   r   r+      s    r+   c                    s   t   fdd}|S )Nc                    s,   t |tjr| } | |g|R i |S r   )
isinstancer   Valuestring)r#   r6   r   r   r   r   r   r      s    z.gdb_function_value_to_unicode.<locals>.wrapperr   r   r   r   r   gdb_function_value_to_unicode   s    r7   c                   @   s   e Zd Zdd ZdS )CythonModulec                 C   s.   || _ || _|| _i | _i | _i | _i | _d S r   )r!   filename
c_filenameglobalslineno_cy2clineno_c2cy	functions)r#   module_namer9   r:   r   r   r   __init__   s    zCythonModule.__init__N__name__
__module____qualname__r@   r   r   r   r   r8      s   r8   c                   @   s   e Zd Zdd ZdS )CythonVariablec                 C   s&   || _ || _|| _|| _t|| _d S r   )r!   cnamequalified_nametypeintlineno)r#   r!   rF   rG   rH   rJ   r   r   r   r@      s
    zCythonVariable.__init__NrA   r   r   r   r   rE      s   rE   c                       s"   e Zd Zedf fdd	Z  ZS )CythonFunctionFalsec	           	         sF   t t| ||||| || _|| _|dk| _i | _g | _t | _	d S )NTrue)
superrK   r@   modulepf_cnameis_initmodule_functionlocals	argumentssetstep_into_functions)	r#   rO   r!   rF   rP   rG   rJ   rH   rQ   	__class__r   r   r@      s    	
zCythonFunction.__init__)rB   rC   rD   r	   r@   __classcell__r   r   rV   r   rK      s   rK   c                   @   s   e Zd Zedddd Zedddd Ze dd Ze d	d
 Ze dd Ze dd Z	e dd Z
e dd Ze dd Zeddd!ddZdd Zdd Zd"ddZdd  ZdS )#
CythonBaseFr&   c                 C   s   |  | jjv S r   )r!   cyfunctions_by_cnamer#   r$   r   r   r   r*      s    zCythonBase.is_cython_functionc                 C   s,   |  dkr(t| }|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$   pyframer   r   r   r-      s    zCythonBase.is_python_functionc                 C   s   |  S r   )r!   r\   r   r   r   get_c_function_name   s    zCythonBase.get_c_function_namec                 C   s
   |  jS r   )find_salliner\   r   r   r   get_c_lineno   s    zCythonBase.get_c_linenoc                 C   s$   | j j| }|d u r t |S r   )rZ   r[   r)   r!   NoCythonFunctionInFrameError)r#   r$   resultr   r   r   get_cython_function   s    zCythonBase.get_cython_functionc                 C   s    |  |}|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   )rh   rO   r=   r)   re   )r#   r$   cyfuncr   r   r   get_cython_lineno   s    
zCythonBase.get_cython_linenoc                 C   s   d  } }}|  |rB| |jj}| |}trtjjdd}n| |rt	
| }|shtd| }| }trtjjdd}n>| }|r|jsd }d}n"|j }|j}trtjjdd}t|||fS )NF)Zstripallz*Unable to read information on python framer   )r*   rh   rO   r9   rj   pygmentsZlexersZCythonLexerr-   r   r^   r_   r   r    Zcurrent_line_numZPythonLexerrc   Zsymtabfullnamerd   ZCLexerSourceFileDescriptor)r#   r$   r9   rJ   lexerZpyframeobjectZsymbol_and_line_objr   r   r   get_source_desc   s2    




zCythonBase.get_source_descc                 C   s   |   \}}||S r   )ro   
get_source)r#   r$   source_descrJ   r   r   r   get_source_line  s    zCythonBase.get_source_linec                 C   sN   |  }| }| |s$| |r(dS |rJ| |rJ| |}||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-   rh   rU   )r#   r$   r!   Zolder_framecython_funcr   r   r   r/      s    

zCythonBase.is_relevant_functionc                    s  t  }   z \}}W n  tyB   td|  Y dS 0 |s rt 	 }|du sp|
 rj |ddS |j}d}	g }
nR rĈ } fdd}|j}|j}	g }
n \}}  }|}	g }
zt |	}W n ty   d}Y n>0 |j}t|tsFt|ttfs4t|}t| d d}d	d
d |
D }tjd||||f  |jdurtjd|j|f  tjd ztjd||  W n t jy   Y n0 |  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                    s   j jj|  dS )Nr$   )rZ   	cy_cvalueinvoke)argr$   r#   r   r   <lambda>M      z-CythonBase.print_stackframe.<locals>.<lambda>r   z, c                 s   s   | ]\}}d ||f V  qdS )z%s=%sNr   ).0r!   valr   r   r   	<genexpr>d  r|   z.CythonBase.print_stackframe.<locals>.<genexpr>z#%-2d 0x%016x in %s(%s)z	 at %s:%s
    ) r   r   selectro   r"   printr-   r   r^   r_   r`   print_stackframeco_namer*   rh   r!   rF   parse_and_evalr   addressr4   rI   strbytesr   joinsysstdoutwriter9   rp   r    )r#   r$   indexru   r   rq   rJ   ra   	func_nameZ
func_cname	func_argsri   fZ	gdb_valueZfunc_addressar   rz   r   r   1  sV    


zCythonBase.print_stackframec                 C   sR   t d}zt d}W n" ty:   t tdY n0 || }|d S )NZ__pyx_mPyModuleObjectzy                Unable to lookup type PyModuleObject, did you compile python
                with debugging support (-g)?Zmd_dict)	r   r   Zlookup_typer   r    textwrapdedentcastpointer)r#   mr   r   r   r   get_remote_cython_globals_dicts  s    
z)CythonBase.get_remote_cython_globals_dictc                 C   sB   |   }tj|}i }t }| D ]\}}||||< q&|S )zk
        Get the Cython globals dict where the remote names are turned into
        local strings.
        )r   r   ZPyObjectPtrZfrom_pyobject_ptrrT   itemsZproxyval)r#   Zremote_dictZpyobject_dictrg   seenkvr   r   r   get_cython_globals_dict  s    z"CythonBase.get_cython_globals_dictN c                 C   sT   t |rd}nd|jf }|d u r:td||||f  ntd|||||f  d S )Nr   z(%s) z%s%s = %s%sz%s%-*s = %s%s)r   Zpretty_printer_lookuprH   r   )r#   r!   valuemax_name_lengthprefixtypenamer   r   r   print_gdb_value  s    
zCythonBase.print_gdb_valuec                 C   sR   |j | }|  }d|jv rH||jkrD|jtkr@tt|jS dS dS ||jkS )Nz->TF)	rR   rj   rF   rJ   rH   r
   rI   r   r   )r#   rt   Z
local_namecyvarZ
cur_linenor   r   r   is_initialized  s    



zCythonBase.is_initialized)F)Nr   )rB   rC   rD   r(   r*   r-   rb   re   rh   rj   ro   rr   r/   r   r   r   r   r   r   r   r   r   rY      s0   







 

A
rY   c                   @   s8   e Zd ZdddZdd Zdd Zdd	 ZdddZdS )rm   Nc                 C   s   || _ || _|| _d S r   )r9   rn   	formatter)r#   r9   rn   r   r   r   r   r@     s    zSourceFileDescriptor.__init__c                 C   s
   | j d uS r   )r9   r#   r   r   r   valid  s    zSourceFileDescriptor.validc                 C   sL   t rH| jrHtjrHtjj}| jd u r2t jj|d}n| j}t 	|| j|S |S )N)bg)
rk   rn   
parameterscolorize_codeterminal_backgroundr   r   
formattersZTerminalFormatterZ	highlight)r#   coder   r   r   r   r   lex  s    
zSourceFileDescriptor.lexc                 c   s   t | j}|r&|r&| |  }t||d |d }t|D ]H\}}	|| |kr^d}
nd}
|rt|st| |	}	d|
|| |	 f V  qDW d    n1 s0    Y  d S )N   > z%s %4d    %s)	openr9   r   read
splitlines	itertoolsislice	enumeraterstrip)r#   startstop
lex_source	mark_line
lex_entirer   sliceidxrd   r   r   r   r   _get_source  s    
z SourceFileDescriptor._get_sourceTr   Fc              	   C   sd   t d}| js|t|d}|d u r.|d }zd| |||||W S  ty^   |Y n0 d S )NzUnable to retrieve source coder   r   )r   r    r9   maxr   r   IOError)r#   r   r   r   r   r   excr   r   r   rp     s    

zSourceFileDescriptor.get_source)N)NTr   F)rB   rC   rD   r@   r   r   r   rp   r   r   r   r   rm     s   
  rm   c                       s    e Zd ZdZ fddZ  ZS )
CyGDBErrorz6
    Base class for Cython-command related errors
    c                    s    |p
| j f}tt| j|  d S r   )msgrN   r   r@   )r#   r   rV   r   r   r@     s    zCyGDBError.__init__)rB   rC   rD   __doc__r@   rX   r   r   rV   r   r     s   r   c                   @   s   e Zd ZdZdZdS )rf   z]
    raised when the user requests the current cython function, which is
    unavailable
    z7Current function is a function cygdb doesn't know aboutNrB   rC   rD   r   r   r   r   r   r   rf     s   rf   c                   @   s   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 frameNr   r   r   r   r   r"     s   r"   c                       s.   e Zd ZdZd fdd	Zdd ZeZ  ZS )CythonParameterz*
    Base class for cython parameters
    Nc                    s6   | j j | _| _tt| ||| |d ur2|| _d S r   )rW   r   Zshow_docZset_docrN   r   r@   r   )r#   r!   command_classZparameter_classdefaultrV   r   r   r@     s    zCythonParameter.__init__c                 C   s
   t | jS r   )boolr   r   r   r   r   __bool__  s    zCythonParameter.__bool__)N)rB   rC   rD   r   r@   r   __nonzero__rX   r   r   rV   r   r     s   r   c                   @   s   e Zd ZdZdS ) CompleteUnqualifiedFunctionNameszH
    Have 'cy break' complete unqualified function or method names.
    NrB   rC   rD   r   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdS )ColorizeSourceCodez5
    Tell cygdb whether to colorize source code.
    Nr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdS )TerminalBackgroundzJ
    Tell cygdb about the user's terminal background (light or dark).
    Nr   r   r   r   r   r   %  s   r   c                   @   s   e Zd ZdZd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                 C   s@   t dtjtjd| _tdtjtjd| _tdtjtj	d| _
d S )NZcy_complete_unqualifiedTZcy_colorize_codeZcy_terminal_background_colorZdark)r   r   COMMAND_BREAKPOINTSZPARAM_BOOLEANcomplete_unqualifiedr   COMMAND_FILESr   r   ZPARAM_STRINGr   r   r   r   r   r@   1  s$    zCythonParameters.__init__N)rB   rC   rD   r   r@   r   r   r   r   r   +  s   r   c                   @   s.   e Zd ZdZejZedd Zedd Z	dS )CythonCommandz(
    Base class for Cython commands
    c                 C   sF   t | ds$| || jg|R i |S | || j| jg|R i |S d S )Ncompleter_class)hasattrr   r   )clsclsnamer   r   r   r   r   	_registerN  s    
zCythonCommand._registerc                 O   s0   t | dd }|r | | j|| | | j||S )Nalias)getattrr   r   r!   )r   r   r   r   r   r   r   registerV  s    zCythonCommand.registerN)
rB   rC   rD   r   r   COMMAND_NONEr   classmethodr   r   r   r   r   r   r   G  s   
r   c                       s0   e Zd ZdZdZejZejZ	 fddZ
  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
    rZ   c                    s   t t| j|||dd tt t t t t	 t
 t t t t t t t t t tddt t tdtdtdtdd	}| D ]\}}| |_t| || q| | _i | _i | _ i | _!t"#t$| _%d S )
NT)r   zcy exec-cy-execcy_cnamerw   	cy_linenocy_eval)import_Zbreak_stepnextruncontfinishupdownr   Zbtlistprint_rR   r;   exec__execrT   r   rw   r   r   )&rN   r   r@   dictCyImportr   CyBreakCyStepCyNextCyRunCyContCyFinishCyUpCyDownCySelectCyBacktraceCyListCyPrintCyLocals	CyGlobalsr   ZFixGdbCommandCyExecCySetCyCNameCyCValueCyLineCyEvalr   rZ   setattrcython_namespacefunctions_by_qualified_namer[   collectionsdefaultdictr   functions_by_name)r#   r!   r   r   commandscommand_namecommandrV   r   r   r@   z  sF    
zCyCy.__init__)rB   rC   rD   r   r!   r   r   r   ZCOMPLETE_COMMANDr   r@   rX   r   r   rV   r   r   _  s
   r   c                   @   s(   e Zd ZdZdZejZejZ	dd Z
dS )r   zb
    Import debug information outputted by the Cython compiler
    Example: cy import FILE...
    z	cy importc                 C   s  t |tr|t}t|D ]}zt|}W n< tyj } z$td||j	d f W Y d }~n
d }~0 0 t
|}| D ]}tf i |j}|| jj|j< |dD ]"}	|	j}
tf i |
|j|
d < q|dD ]}tf d|i|j}|j}|j}| jj| | || jj|j< || jj|j< | }
|j|< |dD ]$}|j}
tf i |
|j|
d < qD|dD ]}|j}
|j|
d  qt|j !d	d
 |dD  q|dD ]P}t"|jd }t#t$t"|jd % }t&||j'|< |D ]}||j(|< qqq~qd S )NzUnable to open file %r: %sr   ZGlobalsr!   Z	FunctionsrO   ZLocalsZStepIntoFunctionsc                 s   s   | ]}|j V  qd S r   )tag)r}   Zfuncargr   r   r   r     s   z"CyImport.invoke.<locals>.<genexpr>	ArgumentsZLineNumberMappingcython_lineno	c_linenos))r4   BYTESdecode_filesystemencodingr   r   OSErrorr   r    r   r   parsegetrootr8   attribrZ   r  r!   findrE   r;   rK   rG   r  appendr  r[   rF   r>   rR   rU   addrS   extendrI   r   mapr   minr<   r=   )r#   r   from_ttyry   r   etrO   cython_modulevariabledr   cython_functionr!   qnamelocalZstep_into_funcmarkerr  r  c_linenor   r   r   rx     sZ    

.


zCyImport.invokeN)rB   rC   rD   r   r!   r   ZCOMMAND_STATUSr   ZCOMPLETE_FILENAMEr   rx   r   r   r   r   r     s
   r   c                   @   s>   e Zd ZdZdZejZdd Zdd Z	dd Z
ed	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                 C   st   | d\}}}t|}|r*| jj| }n
|  j}||jv rf|j| }d|j|f }t	d|  n
t
dd S )N:z%s:%sbreak z5Not a valid line number. Does it contain actual code?)	partitionrI   rZ   r  rh   rO   r<   r:   r   r.   r    )r#   r!   
modulename_rJ   r'  r.  
breakpointr   r   r   
_break_pyx  s    


zCyBreak._break_pyxc                 C   sp  | j j|}|r|jrd }|g}|s8| j j|p8g }dd |D }|s^td|  d S t|dkr.td t	|D ]\}}td||j
f  q|ztd}W n ty   Y d S 0 | dkrd S | d	kr|}q8q| r"d
t|  kr
t|k r"n n|t| g}q8qtd qn
|d
 g}|D ].}td|j  |jr<td|j  q<d S )Nc                 S   s   g | ]}|j s|qS r   rQ   r}   r   r   r   r   
<listcomp>%  r|   z+CyBreak._break_funcname.<locals>.<listcomp>r0  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)rZ   r  r)   rQ   r  r   r.   lenr   r   rG   inputEOFErrorlowerisdigitrI   rF   rP   )r#   funcnamefuncZbreak_funcsfuncsr   rg   r   r   r   _break_funcname  sL    



zCyBreak._break_funcnamec                 C   s|   t |tr|t}t|}|dr8|dd  }d}nd}|D ]6}|rXtd|  q@d|v rl| | q@| 	| q@d S )Nz-pr   TFzpy-break %sr/  )
r4   r  r  r  r   
startswithr   r.   r5  rB  )r#   Zfunction_namesr$  argvZpython_breakpointsr?  r   r   r   rx   L  s    


zCyBreak.invokec                    s   dd | j j D }dd | j j D }tjr@t||}n|}| 	 }|r`d|d vrt
|d t  	 fdd|D S |d   fdd|D }t tkrt t fdd|D }|S )	Nc                 S   s&   g | ]\}}t d d |D r|qS )c                 s   s   | ]}|j  V  qd S r   r6  r7  r   r   r   r   c  r|   z.CyBreak.complete.<locals>.<listcomp>.<genexpr>)any)r}   nLr   r   r   r8  b  s   z$CyBreak.complete.<locals>.<listcomp>c                 S   s   g | ]\}}|j s|qS r   r6  )r}   rF  r   r   r   r   r8  d  s   .c                    s"   g | ]}| r| vr|qS r   rC  r}   rF  )r   wordr   r   r8  p  s   c                    s   g | ]}|  r|qS r   rJ  rK  )lastwordr   r   r8  u  r|   c                    s   g | ]}| d  qS r   r   rK  )strip_prefix_lengthr   r   r8  {  r|   )rZ   r  r   r  r   r   r   chainstripr   rT   r:  )r#   textrL  namesqnamesZ	all_nameswordsZcomplr   )rM  r   rN  rL  r   complete^  s    zCyBreak.completeN)rB   rC   rD   r   r!   r   r   r   r5  rB  rx   r   rU  r   r   r   r   r     s   1r   c                       sH   e Zd ZdZ fddZ fddZ fddZdd	 Zd
d Z  Z	S )
CythonInfozM
    Implementation of the interface dictated by libpython.LanguageInfo.
    c                    s$   |  |r| |S tt| |S r   )r*   rj   rN   rV  rJ   r\   rV   r   r   rJ     s    

zCythonInfo.linenoc                    s<   zt t| |}W n tjy*   Y d S 0 | p6d S d S r   )rN   rV  rr   r   r    rP  )r#   r$   rd   rV   r   r   rr     s
    zCythonInfo.get_source_linec                    s   | j rtt| |S d S r   )r-   rN   rV  exc_infor\   rV   r   r   rW    s    zCythonInfo.exc_infoc                 C   s   |   r|  jS dS )Nr   )r*   rh   rU   r   r   r   r   runtime_break_functions  s    
z"CythonInfo.runtime_break_functionsc                 C   s   dg}| | jj |S )Nr]   )r!  rZ   r[   )r#   rg   r   r   r   static_break_functions  s    z!CythonInfo.static_break_functions)
rB   rC   rD   r   rJ   rr   rW  rX  rY  rX   r   r   rV   r   rV    s   	rV  c                   @   s   e Zd Zedd ZdS )CythonExecutionControlCommandc                 C   s   | | j tS r   )r!   cython_info)r   r   r   r   r     s    z&CythonExecutionControlCommand.registerN)rB   rC   rD   r   r   r   r   r   r   rZ    s   rZ  c                   @   s    e Zd ZdZdZdZdd ZdS )r   z&Step through Cython, Python or C code.zcy -stepTc                 C   sV   |   r| | j n<|  sD| jr*d}nd}| tj|dd n| j| jd d S )Nr   r   TZ	to_string)stepinto)r-   Zpython_stepr]  r*   Zfinish_executingr   r.   r   )r#   r   r$  r  r   r   r   rx     s    zCyStep.invokeN)rB   rC   rD   r   r!   r]  rx   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZdZdS )r   z#Step-over Cython, Python or C code.zcy -nextFN)rB   rC   rD   r   r!   r]  r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZ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)rB   rC   rD   r   r!   rZ  r   rx   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZ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)rB   rC   rD   r   r!   rZ  r   rx   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZejZdS )r   z-
    Execute until the function returns.
    z	cy finishN)rB   rC   rD   r   r!   rZ  r   rx   r   r   r   r   r     s   r   c                   @   s    e Zd ZdZdZdZdd ZdS )r   z5
    Go up a Cython, Python or relevant C frame.
    zcy upr   c              
   G   s   z4t j| jdd | t  s2t j| jdd qW n0 tyd } zt j|j W Y d }~n
d }~0 0 t  }d}|r| }|d7 }qr| j	|d d d S )NTr\  r   r   )r   )
r   r.   _commandr/   r   r   r    r   rs   r   )r#   r   r%  r$   r   r   r   r   rx     s    "
zCyUp.invokeN)rB   rC   rD   r   r!   r^  rx   r   r   r   r   r     s   r   c                   @   s   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)rB   rC   rD   r   r!   r^  r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZd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              
   C   s   zt |}W n" ty.   td|f Y n0 t }| rJ| }q8t|}ztd|| d f  W n0 t	y } ztj|j
 W Y d }~n
d }~0 0 d S )NzNot a valid number: %rz	select %dr   )rI   
ValueErrorr   r    r   newerr   
stackdepthr.   r   r   )r#   Zstacknor$  r$   ra  r%  r   r   r   rx     s    

zCySelect.invokeN)rB   rC   rD   r   r!   rx   r   r   r   r   r     s   r   c                   @   s0   e Zd ZdZdZdZejZej	Z
edd ZdS )r   zPrint the Cython stackzcy btzcy backtracec                 C   sz   t  }| r| }q|dk}d}|rvz| |}W n tyN   d}Y n0 |sX|rd| || |d7 }| }q&d S )Nz-ar   Fr   )r   r   rs   r/   r   r   r`  )r#   r   r$  r$   Z	print_allr   Zis_relevantr   r   r   rx   )  s    

zCyBacktrace.invokeN)rB   rC   rD   r   r!   r   r   COMMAND_STACKr   COMPLETE_NONEr   r+   rx   r   r   r   r   r   !  s   r   c                   @   s(   e Zd ZdZdZejZejZ	dd Z
dS )r   za
    List Cython source code. To disable to customize colouring see the cy_*
    parameters.
    zcy listc                 C   s2   |   \}}|j|d |d |dd}t| d S )N   T)r   r   )ro   rp   r   )r#   r3  r$  sdrJ   sourcer   r   r   rx   K  s
    zCyList.invokeN)rB   rC   rD   r   r!   r   r   r   rc  r   rx   r   r   r   r   r   @  s
   r   c                   @   s,   e Zd ZdZdZejZdddZdd Z	dS )	r  zT
    Print a Cython variable using 'cy-print x' or 'cy-print module.function.x'
    zcy printNc                 C   st   |   rtd| S |  rb| jj|d}|D ]}|dkrL| }q6 qRq6| 	||| ntd|  d S )Nz	py-print *zprint )
r-   r   r.   r*   rZ   rw   rx   lstripdereferencer   )r#   r!   r$  r   r   cr   r   r   rx   Z  s    
zCyPrint.invokec                 C   s,   |   r$|  }tt|j|jS g S d S r   )r*   rh   r   r   rO  rR   r;   )r#   r   r   r   r   rU  i  s    zCyPrint.complete)N)
rB   rC   rD   r   r!   r   COMMAND_DATAr   rx   rU  r   r   r   r   r  R  s
   
r  c                 C   s   | d   S )Nr   )r=  )itemr   r   r   r{   q  r|   r{   c                   @   s4   e Zd ZdZdZejZejZ	e
ddddd ZdS )	r  z8
    List the locals from the current Cython frame.
    z	cy localszinfo localsz	py-localsr2   c           	      C   s   |   }|jr"| jj|| d S |j}tt|td}t|	 t
dD ]>\}}| |   |jrHt|j}|jsH| |j||d qHd S )Nkeyr   )rh   rQ   rZ   r;   rx   rR   r:  r   sortedr   sortkeyr   r!   r   r   rF   r`   r   )	r#   r   r$  r*  Zlocal_cython_varsr   r!   r   r   r   r   r   rx   }  s    
zCyLocals.invokeNrB   rC   rD   r   r!   r   rb  r   rc  r   r3   rx   r   r   r   r   r  t  s   
r  c                   @   s4   e Zd ZdZdZejZejZ	e
ddddd ZdS )	r  z:
    List the globals from the current Cython module.
    z
cy globalszinfo variablesz
py-globalsr2   c              	   C   s  |   }|  jj}d}d}|r0tt|td}|r@tt|}t||}t }td t|	 t
dD ]0\}	}
|
tj}
||	 td||	|
f  qhtd t|	 t
dD ]L\}}||vrzt|j}W n ty   Y q0 |js| |j||d qd S )Nr   rm  zPython globals:z    %-*s = %sz
C globals:r   )r   rh   rO   r;   r:  r   rT   r   ro  r   rp  Zget_truncated_reprr   ZMAX_OUTPUT_LENr   r   r   rF   r   r`   r   r!   )r#   r   r$  Zglobal_python_dictmodule_globalsZmax_globals_lenZmax_globals_dict_lenr   r   r   r   r!   r   r   r   r   r   rx     s4    


zCyGlobals.invokeNrq  r   r   r   r   r    s   
r  c                   @   s0   e Zd ZdZdd Zdd Zdd Zd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           	   
   C   s   |   }|j D ]\}}|jtkr| ||rzt|j}W n t	yV   Y qY n
0 |j
r`q||}d|||jf }z0t|dk rtd tdW || q|| 0 q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)rh   rR   r   rH   r
   r   r   r   rF   r   r`   Zalloc_pystringr    xdecref)	r#   executorZlocal_dict_pointerrt   r!   r   r~   Z	pystringpr   r   r   r   _fill_locals_dict  s$    



z,EvaluateOrExecuteCodeMixin._fill_locals_dictc                 C   sD   t  }|r6| |s | |r,|  |S | }qt dd S )Nz0There is no Cython or Python frame on the stack.)r   r   r*   r-   r   rs   r    r\   r   r   r   "_find_first_cython_or_python_frame  s    

z=EvaluateOrExecuteCodeMixin._find_first_cython_or_python_framec                 C   s   t  n td}td}z6| |t | |||||}W |t | n|t | 0 W d    n1 s|0    Y  |S )Nz&(PyObject *) PyModule_GetDict(__pyx_m)z(PyObject *) PyDict_New())r   ZFetchAndRestoreErrorr   r   rv  Zpointervalueevalcodert  )r#   ru  r   
input_typeZglobal_dictZ
local_dictrg   r   r   r   _evalcode_cython  s    


Bz+EvaluateOrExecuteCodeMixin._evalcode_cythonc                 C   s6   |   }t }| |r(t|||S | |||S )zi
        Evaluate `code` in a Python or Cython stack frame using the given
        `input_type`.
        )rw  r   PythonCodeExecutorr-   Z_evalcode_pythonrz  )r#   r   ry  r$   ru  r   r   r   rx    s
    
z#EvaluateOrExecuteCodeMixin.evalcodeN)rB   rC   rD   r   rv  rw  rz  rx  r   r   r   r   rs    s
   rs  c                   @   s(   e Zd ZdZdZejZejZ	dd Z
dS )r  zD
    Execute Python code in the nearest Python or Cython frame.
    r   c                 C   s.   |  |\}}t }|| ||j d S r   )Zreadcoder   r{  rt  rx  ZPy_single_input)r#   exprr$  ry  ru  r   r   r   rx     s    zCyExec.invokeN)rB   rC   rD   r   r!   r   rb  r   rc  r   rx   r   r   r   r   r  	  s
   r  c                   @   s,   e Zd ZdZdZejZejZ	e
d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                 C   sR   | dd}t|dkr"td|\}}| jj| }td||f  d S )N=r      z,Invalid expression. Use 'cy set var = expr'.zset %s = %s)	r   r:  r   r    rZ   r   rx   rP  r.   )r#   r|  r$  Zname_and_exprvarnamerF   r   r   r   rx   (  s    
zCySet.invokeN)rB   rC   rD   r   r!   r   rk  r   rc  r   r,   rx   r   r   r   r   r    s   r  c                   @   s"   e Zd ZdZeed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                 C   s   |p
t  }d }| |r| |}||jv r<|j| j}nF||jjv rX|jj| j}n*d|jj|f }||jj	v r|jj	| j}|s| j
j|}|st d| |S )Nz%s.%szNo such Cython variable: %s)r   r   r*   rh   rR   rF   rO   r;   r!   r>   rZ   r  r)   r    )r#   cynamer$   rF   r*  r+  r   r   r   rx   ?  s     


zCyCName.invoke)N)rB   rC   rD   r   r,   r7   rx   r   r   r   r   r  5  s   	r  c                       s*   e Zd ZdZeed fdd	Z  ZS )r  z-
    Get the value of a Cython variable.
    Nc                    s`   |   }| |}| ||r<tt| j||d}t|S ||v rN|| jS t	d| d S )Nrv   zVariable %s is not initialized.)
r   rh   r   rN   r  rx   r   r   Z_gdbvalr    )r#   r  r$   Zglobals_dictr*  rF   rV   r   r   rx   ^  s    


zCyCValue.invoke)N)rB   rC   rD   r   r,   r7   rx   rX   r   r   rV   r   r  Y  s   r  c                   @   s   e Zd ZdZedd ZdS )r  z&
    Get the current Cython line.
    c                 C   s   |   S r   )rj   r   r   r   r   rx   r  s    zCyLine.invokeN)rB   rC   rD   r   r,   rx   r   r   r   r   r  m  s   r  c                   @   s   e Zd ZdZedd ZdS )r	  zO
    Evaluate Python code in the nearest Python or Cython frame and return
    c                 C   s   t jj}| ||S r   )r   r{  ZPy_eval_inputrx  )r#   Zpython_expressionry  r   r   r   rx   |  s    zCyEval.invokeN)rB   rC   rD   r   r7   rx   r   r   r   r   r	  w  s   r	  c                   C   s    t tdtjtjf  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   Zsource_gdb_scriptr   r   r   r   r   r   r   r   r   register_defines  s    
r  )T)N)gr   
__future__r   	raw_inputr;  	NameErrorr   r   r   r   r   r  r   unicodeUNICODEr   r  r   lxmlr   Z	have_lxmlImportErrorZ	xml.etreer   r   Zelementtree.ElementTreeZpygments.lexersrk   Zpygments.formattersstderrr   r   r   shlexr   ZCython.Debuggerr   r	   r
   r   Z_data_typesgetfilesystemencodingr  r   r(   r,   r3   r+   r7   objectr8   rE   rK   rY   rm   r    r   rf   r"   	Parameterr   r   r   r   r   r   Commandr   r   r   r   Z
PythonInforV  ZExecutionControlCommandBaserZ  ZPythonStepperMixinr   r   r   r   r   r   r   r   r   r   r  rp  r  r  rs  ZPyExecr  r  ZFunctionr  r  r  r	  r[  r   rZ   r  r   r   r   r   <module>   s   
$


 [?
Q@ %
		+O$
