
    "eV                        d dl mZ d dlmZ d dlmZ d dlmZm	Z	m
Z
mZ d dlmZmZ d dlmZmZ dZdZd	Zd
Zi Zi Zda e       Zd Zd Zd Z G d de      Z G d de      Z G d de      Z e
rd dlm!Z! e jD                  Z#d Z"e"e _"        yy)    )is_thread_alive)	exception)	threading)get_current_thread_id	NO_FTRACE!USE_CUSTOM_SYS_CURRENT_FRAMES_MAPForkSafeLock)*get_abs_path_real_path_and_base_from_frameNORM_PATHS_AND_BASE_CONTAINER)	PyDBFrameis_unhandled_exceptionk      m      Fc                     t         5  t        r
	 d d d        y da| j                  |       d d d        y # 1 sw Y   y xY w)NT)#_global_notify_skipped_step_in_lock_global_notify_skipped_step_in)notify_skipped_step_in_because_of_filters)py_dbframes     N/usr/lib/python3/dist-packages/_pydevd_bundle/pydevd_trace_dispatch_regular.pyr   r   (   sD     
- ?) 	? ?
 *.&77>? ? ?s   44=c                 ~   d }|}d}|W|j                   j                  }|j                  d      }|j                  d      }||kD  r|}|dk\  r||dz   d  }|j                  d      }|dk\  r|d | }|dk(  rm|j                   j                  dv ry	|j                   j                  d
v r|j                  j                  d      }d}|t        |t        j                        rq|}n~|dk(  r|j                   j                  dk(  rPd}n]|dk(  r5|j                   j                  dv ry	|j                   j                  dk(  rd}n#|dk(  ry	|j                  n|j                  }|W|H| j                  ,| j                  j                  | j                               }|y	| j                         }t        |dd       r| j                          y		 |j                  }	|	
t!               	 | ||	t$        t&        f}
|~|j                  3|s1t)        t+        |
      |
      }|	j,                  j/                  |       n |	j0                  }|t3        |
      }||	_        |j5                         }||_        ||u r|dfS |	j8                  }||j:                  d   | urt+        |
      }||	_        |dfS #  | j#                  |      }	Y xY w)NF/\r      .r   )__bootstrap
_bootstrap)NF)__bootstrap_inner_bootstrap_innerselfTpydev_monkey__call__pydevd)runmain_execpydevd_tracingpydev_do_not_trace)f_codeco_filenamerfindco_namef_localsget
isinstancer   Threadf_backthreading_get_identthreading_activethreading_current_threadgetattrdisable_tracingadditional_infoAttributeErrorset_additional_thread_infoglobal_cache_skipsglobal_cache_frame_skipsTopLevelThreadTracerNoBackFrameThreadTracer&top_level_thread_tracer_no_back_framesappend!top_level_thread_tracer_unhandled+TopLevelThreadTracerOnlyUnhandledExceptionsget_trace_dispatch_funcf_tracethread_tracer_args)r   r   threadf_unhandledforce_only_unhandled_tracernameijtr9   argstop_level_thread_tracerrE   rF   s                 r   &fix_top_level_trace_and_get_trace_funcrQ   F   s    F K"'

! !!--JJsOJJtq5A6A<DJJsO68D;!!))-JJ"##++/XX((,,V4.2+=Z93C3C%DF^#!!))Z7.2+X!!))_<"!!))W4.2+%%'!((c 
!f ~ $$0++//0I0I0KLF~" 335Fv+T2C 00" "" # 6?,>@XYD%.I&ElSWFXZ^&_#BBIIJab&5&W&W#&.*UVZ*['D[A *AAC &KE>!#11M 3 3A 6e C$T*(5%
 $IC::6Bs   
J' 'J<c                     | j                  | |      \  }}||dk(  rd S t        S |r| j                  |        ||||      S )Ncall)rQ   r   enable_tracing)r   r   eventargthread_trace_funcapply_to_settraces         r   trace_dispatchrY      sU    +0+W+WX]_d+e(( t5I5./UE3//    c                       e Zd Zd Zd Zd Zy)rC   c                     || _         y NrG   r"   rO   s     r   __init__z4TopLevelThreadTracerOnlyUnhandledExceptions.__init__   	    
rZ   c                     |dk(  r>|<| j                   dd \  }}}|'|j                  sd|_        |j                  ||||       | j                  S )Nr   r      T)rG   suspended_at_unhandledstop_on_unhandled_exceptiontrace_unhandled_exceptions)r"   r   rU   rV   r   rN   r9   s          r   rf   zFTopLevelThreadTracerOnlyUnhandledExceptions.trace_unhandled_exceptions   s_     KCO(,

1Q%E1o&===AO:55eQQTU ...rZ   c                     | j                   S r]   )rf   r"   s    r   rD   zCTopLevelThreadTracerOnlyUnhandledExceptions.get_trace_dispatch_func   s    ...rZ   N)__name__
__module____qualname__r`   rf   rD    rZ   r   rC   rC      s    //rZ   rC   c                   "    e Zd ZdZd Zd Zd Zy)r>   a  
    This tracer is pretty special in that it's dealing with a frame without f_back (i.e.: top frame
    on remote attach or QThread).

    This means that we have to carefully inspect exceptions to discover whether the exception will
    be unhandled or not (if we're dealing with an unhandled exception we need to stop as unhandled,
    otherwise we need to use the regular tracer -- unfortunately the debugger has little info to
    work with in the tracing -- see: https://bugs.python.org/issue34099, so, we inspect bytecode to
    determine if some exception will be traced or not... note that if this is not available -- such
    as on Jython -- we consider any top-level exception to be unnhandled).
    c                 h    || _         || _        d | _        d | _        t	               | _        d| _        y )N)_frame_trace_dispatchrG   try_except_infos_last_exc_argset_raise_lines_last_raise_line)r"   frame_trace_dispatchrO   s      r   r`   z(TopLevelThreadTracerNoBackFrame.__init__  s3    %9"
 $!E "rZ   c                    | j                   }| ||||      | _         |dk(  r>|| _        | j                  j                  |j                         |j                  | _        ny|dk(  rt| j                  h	 | j                  dd \  }}}|j                  sAt        | ||| j
                  | j                        r|j                  |||| j                         d | _        | j                  }||_        |S # d | _        w xY w)Nr   returnr   rc   )rp   rr   rt   addf_linenoru   rG   rd   r   re   'trace_dispatch_and_unhandled_exceptionsrE   )	r"   r   rU   rV   rv   r   rN   r9   rets	            r   r{   zGTopLevelThreadTracerNoBackFrame.trace_dispatch_and_unhandled_exceptions  s      $99+)=eUC)PD&K!$D!!%..1$)NND!h4#5#5#A*,0JJqO)q/&==-dE5$BWBWY]YjYjk99%OUYUgUgh &*":: 
 &*"s   3A C/ /	C8c                     | j                   S r]   )r{   rh   s    r   rD   z7TopLevelThreadTracerNoBackFrame.get_trace_dispatch_func6  s    ;;;rZ   N)ri   rj   rk   __doc__r`   r{   rD   rl   rZ   r   r>   r>      s    
#B<rZ   r>   c                       e Zd Zd Zd Zy)r?   c                     || _         y r]   r^   r_   s     r   r`   zThreadTracer.__init__B  ra   rZ   c                 2	   | j                   \  }}}}}|j                  r|dk(  rdS t        S |xj                  dz  c_        	 |j                  }	|	dk7  }
|j                  r#|dk(  rdnt        	 |xj                  dz  c_        S t        |      s=|j                  t        |             |dk(  rdnt        	 |xj                  dz  c_        S |j                  }||v r|
s#|dk(  rdnt        	 |xj                  dz  c_        S |j                  |      dk(  r|j                  t        t        fv rt        st        ||       |j                  }|[|	t        t        t         t"        fv rC|j                  }|j                  |      dk(  rF|dk(  rdnt        	 |xj                  dz  c_        S |dk(  rdnt        	 |xj                  dz  c_        S 	 t$        |j                  j&                     }|j+                  ||      }|j|dk(  r=|j-                  ||d         sPd||<   |dk(  rdnt        	 |xj                  dz  c_        S d||<   |dk(  rdnt        	 |xj                  dz  c_        S |j.                  r|j1                  ||d   d      rd||<   |
r*|j                  t        t        fv rt        st        ||       |j                  }|s|	t        t        t         t"        fv r[|j1                  ||j                  j&                  d      rW|j                  }d||<   |dk(  rdnt        	 |xj                  dz  c_        S |dk(  rdnt        	 |xj                  dz  c_        S t3        ||||||f      j5                  |||      }|(d||<   |dk(  rdnt        	 |xj                  dz  c_        S ||_        ||xj                  dz  c_        S #  t)        |      }Y xY w# t8        $ r% |dk(  rdnt        cY |xj                  dz  c_        S t:        $ rn |j                  r$|dk(  rdnt        cY |xj                  dz  c_        S 	 t<        
t=                n#  Y nxY w|dk(  rdnt        cY |xj                  dz  c_        S w xY w# |xj                  dz  c_        w xY w)a   This is the callback used when we enter some context in the debugger.

        We also decorate the thread we are in with info about the debugging.
        The attributes added are:
            pydev_state
            pydev_step_stop
            pydev_step_cmd
            pydev_notify_kill

        :param PyDB py_db:
            This is the global debugger (this method should actually be added as a method to it).
        rS   Nr   ro   r   F   )rG   
is_tracingr   pydev_step_cmdpydb_disposedr   notify_thread_not_aliver   r+   r0   pydev_original_step_cmdCMD_STEP_INTOCMD_STEP_INTO_MY_CODEr   r   r3   CMD_STEP_RETURNCMD_STEP_RETURN_MY_CODEr   r,   r
   get_file_typein_project_scopeis_files_filter_enabledapply_files_filterr   rY   rE   
SystemExit	Exceptionpydev_log_exception)r"   r   rU   rV   r   rN   r9   cache_skipsframe_skips_cacher   is_steppingframe_cache_key
back_frameback_frame_cache_key abs_path_canonical_path_and_base	file_typer|   s                    r   r$   zThreadTracer.__call__F  s   4 EIJJAq/;0A%% F?49	9""a'"r	,,;;N(B.K""$tI=\ &&!+&W #1%--.CA.FG$tI=R &&!+&K $llO+-"#(F?4	AB &&!+&} #71<*BB}VkFll  vTEeUS%*\\
%1nXmo~  AX  IY  7Y3=3D3D0*/CDI/4tI Mh &&!+&c ,1F?4	Ib &&!+&_e3PQVQ]Q]QiQi3j0 ++E3STI$> 11%9YZ[9\]78O4',tIED &&!+& 45K0#(F?4	A| &&!+&y ,,++E3STU3VX]^34K0"'N'NS`bwRx'x  B`A%O
 "'J!-.]Tikz  }T  EU  3U 33J
@Q@Q@]@]_de3=3D3D0@AK(<=+0F?4	IX &&!+&S (-tIER &&!+&G ;_aQbds nUE3/	 
 { 01O,$tI=4 &&!+&+  EM& &&!+&Ye3]^c3d0t  	: F?4	9  &&!+&  	:""$tI= &&!+&&2')  F?4	9&&!+&	: &&!+&s   )O 1O 
O ?BO &O 
O '?O =O %B=O 9O 5O (O OO Q</Q? !Q<'Q? ?QQ<QQ<$Q? ;Q<<Q? ?RN)ri   rj   rk   r`   r$   rl   rZ   r   r?   r?   @  s    Q,rZ   r?   )constructed_tid_to_last_framec                 ^    |t         | j                  d   j                  <   t        | |||      S )Nr   )r   rG   ident_original_call)r"   r   rU   rV   s       r   r$   r$     s,    =B%djjm&9&9:dE5#66rZ   N)$#_pydev_bundle.pydev_is_thread_aliver   _pydev_bundle.pydev_logr   r   "_pydev_bundle._pydev_saved_modulesr   _pydevd_bundle.pydevd_constantsr   r   r   r	   pydevd_file_utilsr
   r   _pydevd_bundle.pydevd_framer   r   r   r   r   r   r<   r=   r   r   r   rQ   rY   objectrC   r>   r?   r   r$   r   rl   rZ   r   <module>r      s    ? D 85 5 g J      !& &2n #	?<|@0/& /T8<f 8<BW,6 W,t % N!**N7 %L! %rZ   