
    "eB                     T   d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZmZmZ d dlZd dlmZ  G d d	      Z e       Z G d
 d      Zi Zd Zd Zdad Z eej4                  d      s.d Zej4                  j6                  Zd Zd Zej<                  Zd Zd Z  ee       Z y)    )nested_scopesN)get_global_debugger)call_only_once)	threading)update_custom_frameremove_custom_frameadd_custom_frame)	pydev_logc                   "    e Zd ZdZd Zd Zd Zy)TaskletToLastIdz
    So, why not a WeakKeyDictionary?
    The problem is that removals from the WeakKeyDictionary will create a new tasklet (as it adds a callback to
    remove the key when it's garbage-collected), so, we can get into a recursion.
    c                      i | _         d| _        y )Nr   )tasklet_ref_to_last_id_i)selfs    A/usr/lib/python3/dist-packages/_pydevd_bundle/pydevd_stackless.py__init__zTaskletToLastId.__init__   s    &(#    c                 ^    | j                   j                  t        j                  |            S N)r   getweakrefref)r   tasklets     r   r   zTaskletToLastId.get   s"    **..w{{7/CDDr   c                    || j                   t        j                  |      <   | xj                  dz  c_        | j                  dz  dk(  r>t	        | j                   j                               D ]  } |       | j                   |=  y y )N   d   r   )r   r   r   r   listkeys)r   r   last_idtasklet_refs       r   __setitem__zTaskletToLastId.__setitem__   sx    <C##GKK$89177S=A#D$?$?$D$D$FG A=(33K@A r   N)__name__
__module____qualname____doc__r   r   r!    r   r   r   r      s    EAr   r   c                   J    e Zd ZdZd Zd Z eej                  d      sd Zyy)_TaskletInfor   c                     d | _         || _        t        j                  |      }|2t        xj
                  dz  c_        t        j
                  }|t        |<   || _        | j                          y )Nr   )frame_idtasklet_weakref_tasklet_to_last_idr   r(   _last_id_tasklet_idupdate_name)r   r+   r   r   s       r   r   z_TaskletInfo.__init__1   sa    .%))'2?!!Q&!"++G+2("r   c                 r   | j                         }|r|j                  rd}n |j                  rd}n|j                  rd}nd}	 |j                  }|j                  }|dk7  rst        j                         D ]K  }|j                  |k(  s|j                  rd|j                  }nd	|j                  xs t        |      } n d	t        |      }d }nd
}t        |      }d }nd}d| j                  }d}d}|d|d|d|d| _        y # t
        $ r! |j                  rd}nd| j                  }Y w xY w)Nblockedpaused	scheduledz<UNEXPECTED>MainTaskletTasklet-of 
of Thread-zwithout threaddead -  ())r+   r1   r2   r3   nameAttributeErroris_mainr.   	thread_idr   	enumerateidentstridtasklet_name)r   r   stater?   rB   threadthread_nametids           r   r/   z_TaskletInfo.update_name?   sE   &&(! ""#&>||  ))IB'113 	EF||y0!;;5;[[*BK ' =CKK<Y3y><Y*[K	E 58	N"DK /W+CGE#'#3#35DKC/4dKM= " >??(D # ,0+;+;=D	>s   D 'D65D6trace_functionc                    | j                         }|r	 |j                  }|j
                  }t        j                         D ]K  }|j                  |k(  s|j                  rd|j                  }nd|j                  xs t        |      } n dt        |      }d }t        |      }d }nd| j                  }d}d}|d|d|d	| _        y # t        $ r! |j                  rd}nd| j                  }Y w xY w)
Nr4   r5   r7   r8   r:   r;   r<   r=   r>   )r+   r?   r@   rA   r.   rB   r   rC   rD   rE   rF   rG   )r   r   r?   rB   rI   rJ   rK   s          r   r/   z_TaskletInfo.update_nameq   s   **,GB"<<D $--	'113 	EF||y0!;;5;[[*BK ' =CKK<Y3y><Y*[K	E 58	N"DKk/ 2 (,'7'79 04k3 GD3 & B, ' 04/?/?A	Bs   C 'C:9C:N)	r"   r#   r$   r-   r   r/   hasattr	stacklessr   r&   r   r   r(   r(   -   s1    H,N\ 9$$&67	H	 8r   r(   c                     t        |       S r   )register_tasklet_info)r   s    r   get_tasklet_inforR      s     ))r   c                     t        j                  |       }t        j                  |      }|t	        ||       x}t        |<   |S r   )r   r    _weak_tasklet_registered_to_infor   r(   )r   rinfos      r   rQ   rQ      sA    GA+//2D|5A!W5MM/2Kr   c                    	 | s|syt        j                         }|rkt        |       t               }|R|j	                         |_        |j                  }||u r|j                  }t        |d      r|j	                         |_	        d}| rt        |        	 t        t        j                               D ]V  \  }} |       }||j                  s+	 t        |= |j                  1t!        |j                         Gt#        j$                  |j&                        d   |u }|| u s||ur|s|j                  }||u r|j                  }|t               }||j)                  |      p|j+                          |j                  't-        ||j.                  |j&                        |_        n-t1        |j                  ||j&                  |j.                         d}%||u s|s-|j                  ;t!        |j                         d|_        Y 	 d}d}d}	 t6        t7        | |      S y# t        $ r Y ]w xY w# d}d}d}w xY w#  t3        j4                          Y FxY w)zM
    Called when a context is stopped or a new context is made runnable.
    Nf_tracer   )r?   )sys	_getframerQ   r   get_thread_local_trace_funcrL   framef_backrN   rX   r   rT   itemsaliveKeyErrorr*   r   rO   get_thread_inforB   get_file_typer/   r	   rG   r   r
   	exception"_application_set_schedule_callback)	prevnextcurrent_framedebuggerr\   r    tasklet_infor   
is_runnings	            r   _schedule_callbackrk      sd   CD!$' +,H#&.&J&J&L#

M)!LLE5),$,$H$H$JEMH!$'(	-12R2X2X2Z-[ "9)\%-?'--<[I $,,8+L,A,AB!*!:!:7;L;L!Ma!PT[![J$7$+>z !( M1$)LLE ,':'<H'38N8Nu8U8] , 8 8 :#/#8#8#@<LUT`TmTmov  pA  pA  =BL$9$78M8MuV]VgVgnz  oH  oH  %I'+H DJ'00</0E0EF48L1E"9J GLE
 *51$== 6M $ > GLEsg   I BI 9H8 H(H8 $A"H8 BH8  H8 .H8 I (	H51H8 4H55H8 8I  I IrL   c                 h   	 | s|sy|rZt        |       t               }|A|j                  r5t        |j                  d      r|j	                         |j                  _        d}| rt        |        	 t        t        j                               D ]Q  \  }} |       }||j                  s+	 t        |= |j                  1t        |j                         G|j                  s|j                  s|j                  r|j                  sx|j                  j                   s|j                  j                   }t               }|e|j#                  |      T|j                  't%        ||j&                  |j(                        |_        n!t+        |j                  ||j(                         d}|j,                  s(|j                  6t        |j                         d|_        T 	 d}d}d}	 t2        t3        | |      S y# t        $ r Y Xw xY w# d}d}d}w xY w#  t/        j0                          Y FxY w)zU
        Called when a context is stopped or a new context is made runnable.
        NrX   )rQ   r   r\   rN   r[   rX   r   rT   r^   r_   r`   r*   r   r2   r1   r3   r]   rb   r	   rG   rB   r   
is_currentr
   rc   rd   )re   rf   rh   r    ri   r   r]   s          r   rk   rk      s   4	"%d+ /0'DJJtzz95-5-Q-Q-S

*%d+ 156V6\6\6^1_ =-K)mGgmm! @ M (00</0E0EF">>W__@Q@Q&}}1E1E)0)=)=+>+@#+#7H<R<RSY<Z<b'3'<'<'D@PQWYeYrYrt{  uF  uF  AG(=(;L<Q<QSY[b[l[l(m+/$//+44@ 3L4I4I J8< 55=: #
 .95dDAA :=  ( ! !. #	"!sm   H A)H 19H +G>2H ?AH H BH 6H H $H >	HH 
HH HH H1c                 P      j                   } fd}| _         t         |||      S )[
        Called to run a new tasklet: rebind the creation so that we can trace it.
        c                 t    t               }||j                          d }| _        t                | |i |S r   )r   enable_tracingtempvalrQ   )old_fargskwargsrh   r   s       r   new_fzsetup.<locals>.new_fI  sE    *,H#'')H !DL!$' $)&))r   )rr   _original_setup)r   rt   ru   frv   s   `    r   setupry   B  s-    
 LL	*( tQf55r   c                      t        | g|i |S )ro   )ry   )r   rt   ru   s      r   __call__r{   d  s    
 T+D+F++r   c                  T    t               }||j                          d }t        | i |S r   )r   rq   _original_run)rt   ru   rh   s      r   runr~   p  s1    &(##%d-f--r   c                     t        j                  t              ad } d }t         j                  j                  | _        t        t         d      rt         j                  j                  |_        | t         _        |t         _        t        t         j                  d      st         j                  j                  j                  t        _        t        t         j                  _        t         j                  j                  j                  t        _        t        t         j                  _	        t         j                  j                  t        _        t        t         _
        yy)z
    This function should be called to patch the stackless module so that new tasklets are properly tracked in the
    debugger.
    c                     t         }| a |S r   rd   )callableolds     r   set_schedule_callbackz.patch_stackless.<locals>.set_schedule_callback  s    0-5*
r   c                      t         S r   r   r&   r   r   get_schedule_callbackz.patch_stackless.<locals>.get_schedule_callback  s    11r   r   rL   N)rO   r   rk   rd   r%   rN   r   r   r{   ry   r~   )r   r   s     r   patch_stacklessr   |  s     *3)H)HI[)\&2 %.$C$C$K$K!y12(1(G(G(O(O%&;I#&;I#9$$&67$,,55==%-	"!))//77"'	mm++	 8r   )!
__future__r   r   rY   _pydevd_bundle.pydevd_commr   _pydevd_bundle.pydevd_constantsr   "_pydev_bundle._pydev_saved_modulesr   #_pydevd_bundle.pydevd_custom_framesr   r   r	   rO   _pydev_bundler
   r   r,   r(   rT   rR   rQ   rd   rk   rN   r   ry   rw   r{   r~   r}   r   r&   r   r   <module>r      s    $  
 : : 8 j j  #
A A. &' bH bHJ $&  * &* "J>Z y  "23
;Bz  ''--O
6D, MMM
.!H !1r   