
    "eQ                     4   d dl mZ d dlZd dlmZmZmZmZmZ d dl	m
Z
mZ d dlmZ d dlmZmZmZ d dlmZ d dlm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 m!Z!  G d de"      Z# G d de#      Z$d Z% G d de#      Z& G d de"      Z' G d de"      Z(y)    )contextmanagerN)	get_frameRETURN_VALUES_DICTForkSafeLockGENERATED_LEN_ATTR_NAMEsilence_warnings_decorator)get_variable_detailsget_type)	overrides)sorted_attributes_keyTOO_LARGE_ATTRget_var_scope)SafeRepr)	pydev_log)pydevd_vars)Exec)
FramesList)ScopeRequest
DAPGrouperTimer)Optionalc                   d    e Zd ZdZdZdZd Zd Zd Zd Z	dde
e   de
e   fdZdd	Zdd
Zd Zy)_AbstractVariableNc                     |J || _         y N)py_db)selfr   s     H/usr/lib/python3/dist-packages/_pydevd_bundle/pydevd_suspended_frames.py__init__z_AbstractVariable.__init__   s       
    c                     | j                   S r   )namer   s    r   get_namez_AbstractVariable.get_name   s    yyr    c                     | j                   S r   )valuer#   s    r   	get_valuez_AbstractVariable.get_value!   s    zzr    c                 ,    t        | j                        S r   )idr&   r#   s    r   get_variable_referencez(_AbstractVariable.get_variable_reference$   s    $**~r    fmtcontextc                    t               }t               }|.|j                  dd      |_        |j                  dd      |_        |j                         D ]  \  }}t        |||        t        | j                  ||      \  }}	}
}}|dv }g }|r|j                  d       | j                  }| j                  r|j                  d       d|}n|t        t        fv r|j                  d       	 | j                  j                  t        k(  rd}|||d	}| j                   | j                   |d
<   || j#                         |d<   nd|d<   t%        |      dkD  rd|i|d<   |j'                  d||       |S #  Y jxY w)aG  
        :param dict fmt:
            Format expected by the DAP (keys: 'hex': bool, 'rawString': bool)

        :param context:
            This is the context in which the variable is being requested. Valid values:
                "watch",
                "repl",
                "hover",
                "clipboard"
        hexF	rawString)	to_stringr,   )strbytes	bytearrayreadOnlyz	(return)  )r"   r&   typeevaluateNamevariablesReferencer   
attributespresentationHint)r   r   getconvert_to_hex	raw_valueitemssetattrr	   r&   appendr"   _is_return_valuer   r   	__class__r   evaluate_namer*   len report_if_compute_repr_attr_slow)r   r+   r,   safe_repr_custom_attrstimer	safe_reprkeyval	type_name_type_qualifier_is_exception_on_evalresolverr&   is_raw_stringr9   r"   var_datas                    r   get_var_dataz_AbstractVariable.get_var_data'   s    J	?'*wwue'<I$"%''+u"=I.446 	)HCIsC(	) NbJJ)WN>J	?$98U "%BB
k*yy  j)$(*Dn&=>>j)	zz##z1	
 
 )'+'9'9H^$-1-H-H-JH)*-.H)*z?Q,8*+EH'(..r4C+	s   0E5 5E9c                     t               r   )NotImplementedError)r   r+   scopes      r   get_children_variablesz(_AbstractVariable.get_children_variablesh   s    !##r    c                 b    | j                  ||      D ]  }|j                         |k(  s|c S  y )N)r+   rT   )rU   r$   )r   r"   r+   rT   	child_vars        r   get_child_variable_namedz*_AbstractVariable.get_child_variable_namedk   s=    44E4J 	!I!!#t+  	! r    c                 (   i }g }t        | j                  t              r|}||fS g }| j                  j                  j
                  }|D ]  \  }}}	t        |||	|      }
|||	f}|
r[ ||
      }|dk(  r*|dk(  r|j                  |       A|
|vrt        |
      }|||
<   n||
   }|j                  j                  |       w|j                  |        t        j                  D ]*  }
|j                  |
      }||j                  |
|d f       , ||fS )Nhideinline)
isinstancer&   r   r   variable_presentationget_presentationr   r@   contents_debug_adapter_protocolSCOPES_SORTEDr;   )r   lsthandle_return_valuesscope_to_groupergroup_entriesnew_lstr^   	attr_name
attr_valuerC   rT   entrypresentationgroupers                 r   _group_entriesz _AbstractVariable._group_entriesq   sH   djj*-GD %%A G#zz??PP8; *4	:}%i]L`a"J>#3E#:L#v- %1u- !(88&0&7G6=,U3&6u&=G??FFuM NN5)-*0 $11 A*..u5&!((%$)?@A
 %%r    NN)__name__
__module____qualname__r"   r&   rC   r   r$   r'   r*   r   dictr1   rQ   rU   rX   rk    r    r   r   r      sR     DEM? ?hsm ?B$'&r    r   c                   X    e Zd ZddZe eej                        dd              ZddZy)_ObjectVariableNc                     t         j                  | |       || _        || _        || _        || _        | j                  |        || _        || _        y r   )r   r   framer"   r&   _register_variablerA   rC   )r   r   r"   r&   register_variableis_return_valuerC   ru   s           r   r   z_ObjectVariable.__init__   sM    ""4/
	
"3% /*r    c           	         t        | j                        \  }}}g }|Ut        |d      r|j                  | j                  |      }nN|j	                  | j                        }t        |j                         d       }|D 	
cg c]
  \  }	}
|	|
d f }}	}
| j                  |d      \  }}|r||z   }| j                  }|rh|D ]a  \  }	}}|t        |      r	 ||      }n||z   }t        | j                  |	|| j                  || j                        }|j                  |       c |S |D ]E  \  }	}}t        | j                  |	|| j                  | j                        }|j                  |       G |S c c}
}	w )	N#get_contents_debug_adapter_protocolr+   c                     t        | d         S Nr   r   )tups    r   <lambda>z8_ObjectVariable.get_children_variables.<locals>.<lambda>   s    :OPSTUPV:W r    rI   Frb   rC   ru   ru   )r
   r&   hasattrrz   get_dictionarysortedr>   rk   rC   callablers   r   rv   ru   r@   )r   r+   rT   _type
_type_namerN   children_variablesra   dctrI   r&   rd   parent_evaluate_namerJ   rC   variables                   r   rU   z&_ObjectVariable.get_children_variables   s    '/tzz&:#z8x!FGBB4::SVBW --djj9SYY[.WX>ABlsEUD)BB!%!4!4Su!4!UC#c)#'#5#5 #/2 8+Cm$0#M2,9:N,OM,@=,PM.

Cd.E.EUbjnjtjt vH&--h78 "! 03 8+Cm.tzz3TE\E\dhdndnoH&--h78
 "!- Cs   E6c                     | j                  |      }|y |j                         }|j                  d      }|st        | j                        \  }}	}
t        |
d      r[	 t        |      }|
j                  | j                  ||      }|/t        | j                  ||| j                  d | j                        S y y | j                  }|y 	 t        |d||j                  |j                         | j                  ||      S #  Y y xY w#  Y y xY w)Nr7   change_var_from_namer   =r{   )rX   rQ   r;   r
   r&   r   evalr   rs   r   rv   ru   r   	f_globalsf_locals)r   r"   r&   r   r+   children_variablerP   rC   r   r   container_resolver	new_valuenew_keyru   s                 r   change_variablez_ObjectVariable.change_variable   s    99$?$$113 ^4
 5=TZZ4H1E:1)+AB  $UI -AA$**dT]^&*

GY8O8O_ckokukuw w 

=	M515??ENNS ,,Ts,;;+ "	s   D 	&D	 D	D)FNNrl   r   )	rm   rn   ro   r   r   r   r   rU   r   rq   r    r   rs   rs      s5    +   778#" 9  #"J'<r    rs   c                 ,    t        | j                        S r   )r   r"   )objs    r   sorted_variables_keyr      s     **r    c                   V    e Zd Zd ZddZe eej                        dd              Zy)_FrameVariablec                     t         j                  | |       || _        | j                  j                  j                  | _        || _        || _        | j                  |        y r   )r   r   ru   f_codeco_namer"   r&   rv   )r   r   ru   rw   s       r   r   z_FrameVariable.__init__   sM    ""4/
JJ%%--	
"3%r    Nc                 p    | j                   }t        j                  ||||       | j                  ||      S )Nr{   )ru   r   change_attr_expressionrX   )r   r"   r&   r   r+   ru   s         r   r   z_FrameVariable.change_variable  s5    

**5$uE,,Ts,;;r    c                    g }|t        |t              sJ |j                  }|dv r| j                  j                  }n*|dk(  r| j                  j
                  }nt        d|      | j                  t        |j                               D cg c]  }|d   dk7  s|d   |d   d f c}d      \  }}g }|D ]d  \  }	}
}|
j                  j                  d	 
       t        | j                  |	|
| j                  d|	| j                        }|j                  |       f |D ]  \  }	}
}|	t         k(  }|r`|
j                         D ]L  \  }}t        | j                  ||| j                  ||	d|d| j                        }|j                  |       N rt        | j                  |	|
| j                  ||	| j                        }|j                  |        |j                  t"        
       |r||z   }|S c c}w )N)localsNglobalszUnexpected scope: r   _pydev_stop_at_break   Tr   c                     t        | d         S r}   r~   )vs    r   r   z7_FrameVariable.get_children_variables.<locals>.<lambda>#  s    BWXYZ[X\B] r    r   Fr   [])r\   r   rT   ru   r   r   AssertionErrorrk   listr>   r_   sortrs   r   rv   r@   r   r   )r   r+   rT   r   r   xra   rd   group_variablesrI   rJ   _r   rx   
return_keyreturn_values                   r   rU   z%_FrameVariable.get_children_variables  s>     e\222KKE$$**%%Ci**&&C 5!BCC!00dSVS\S\S^N_  2Ccdefcg  lB  dB1Q41t2D  2C  Z^0  _]( 	-KCa//449]4^&tzz3T=T=TV[]`hlhrhrsH""8,		-  		4KCa!%77O03		 8,J.

Jd>U>UWftw  zD  iE  MQ  MW  MW XH&--h78
 +4::sCAXAXZiknvz  wA  wA  B"))(3		4 	$89!03E!E!!5 2Cs   G6G6r   rl   )	rm   rn   ro   r   r   r   r   r   rU   rq   r    r   r   r      s4    &<   778'" 9  '"r    r   c                   P    e Zd ZdZd Zd ZddZd Zd ZddZ	d	 Z
d
 Zd Zd Zy)_FramesTrackerz\
    This is a helper class to be used to track frames when a thread becomes suspended.
    c                     || _         || _        i | _        i | _        i | _        i | _        d | _        d| _        t               | _	        i | _
        y )NF)_suspended_frames_managerr   _frame_id_to_frame_frame_id_to_main_thread_id_thread_id_to_frame_ids_thread_id_to_frames_list_main_thread_id
_untrackedr   _lock_variable_reference_to_variable)r   suspended_frames_managerr   s      r   r   z_FramesTracker.__init__@  s[    )A&
"$ ,.( (*$)+&  $   "^
/1,r    c                 B    |j                         }|| j                  |<   y r   )r*   r   )r   r   variable_references      r   rv   z!_FramesTracker._register_variable]  s"    %<<>CK,,-?@r    Nc           	          ||}t        |      }| j                  j                  |      }||S t        | j                  ||| j
                  d||      S )NF)rx   rC   ru   )r)   r   r;   rs   r   rv   )r   r"   r&   rC   ru   r   r   s          r   obtain_as_variablez!_FramesTracker.obtain_as_variablea  se      MY77;;<NOO JJeT%<%<ecpx} 	r    c                     | j                   S r   )r   r#   s    r   get_main_thread_idz!_FramesTracker.get_main_thread_idn  s    ###r    c                      | j                   |   S r   )r   )r   r   s     r   get_variablez_FramesTracker.get_variableq  s    334FGGr    c                 z   |j                   t        k(  sJ | j                  5  |xs |}|| j                  j                  v rt
        j                  j                  d       | | j                  j                  |<   || _        | j                  j                  |g       }|| j                  |<   |D ]v  }t        |      }|| j                  |<   t        | j                  || j                          | | j                  j"                  |<   |j%                  |       || j&                  |<   x d}ddd       y# 1 sw Y   yxY w)a}  
        :param thread_id:
            The thread id to be used for this frame.

        :param FramesList frames_list:
            A list of frames to be tracked (the first is the topmost frame which is suspended at the given thread).

        :param frame_custom_thread_id:
            If None this this is the id of the thread id for the custom frame (i.e.: coroutine).
        zMpydevd: Something is wrong. Tracker being added twice to the same thread id.
N)rB   r   r   r   _thread_id_to_trackersysstderrwriter   r   
setdefaultr   r)   r   r   r   rv   %_variable_reference_to_frames_trackerr@   r   )r   	thread_idframes_listframe_custom_thread_idcoroutine_or_main_thread_idframe_ids_from_threadru   frame_ids           r   trackz_FramesTracker.trackt  s2    $$
222ZZ 	*@*MI'*d.L.L.b.bb

  !qr`dD**@@A\]#,D $($@$@$K$K+R%1! KVD**+FG$ Ge949''1tzz5$2I2IJae..TTU]^%,,X6=F00:G E-	 	 	s   DD11D:c                 ^   | j                   5  | j                  r
	 d d d        y d| _        | j                  D ](  }| j                  j                  j                  |d        * | j                  D ]  }| j                  j                  |=  | j                  j                          | j                  j                          | j                  j                          | j                  j                          d | _        d | _        | j                  j                          d d d        y # 1 sw Y   y xY w)NT)r   r   r   r   r   popr   r   clearr   r   r   r   r   r   r   s      r   untrack_allz_FramesTracker.untrack_all  s	   ZZ 	9	9 	9 #DO!99 Z	..DDHHTXYZ !33 c22XXYabc ##))+,,224((..0**002#'D -1D*00668#	9 	9 	9s   D#C6D##D,c                 |    | j                   5  | j                  j                  |      cd d d        S # 1 sw Y   y xY wr   )r   r   r;   r   r   s     r   get_frames_listz_FramesTracker.get_frames_list  s6    ZZ 	A1155i@	A 	A 	A   2;c                 |    | j                   5  | j                  j                  |      cd d d        S # 1 sw Y   y xY wr   )r   r   r;   r   s      r   
find_framez_FramesTracker.find_frame  s2    ZZ 	9**..x8	9 	9 	9r   c           	          | j                   5  | j                  |   }| j                  j                  j	                  | j                  |||||      }d }|cd d d        S # 1 sw Y   y xY wr   )r   r   r   cmd_factorymake_thread_suspend_message)r   r   stop_reasonmessagesuspend_typer   cmds          r   create_thread_suspend_commandz,_FramesTracker.create_thread_suspend_command  sd    ZZ 	88CK**((DD

I{K,XC K	 	 	s   AAA'rl   r   )rm   rn   ro   __doc__r   rv   r   r   r   r   r   r   r   r   rq   r    r   r   r   ;  s>    2:L$H"H9(A9	r    r   c                   L    e Zd Zd Zd Zd Zd Zd Zd Ze	d        Z
d Zd	 Zy
)SuspendedFramesManagerc                 .    i | _         i | _        i | _        y r   )_thread_id_to_fake_framesr   r   r#   s    r   r   zSuspendedFramesManager.__init__  s    )+&%'" 682r    c                     | j                   j                  |      }||S | j                  j                         D ]  \  }}	 |j	                  |       |c S  y # t
        $ r Y )w xY wr   )r   r;   r   r>   r   KeyError)r   r   tracker
_thread_ids       r   #_get_tracker_for_variable_referencez:SuspendedFramesManager._get_tracker_for_variable_reference  s{    <<@@ASTN#'#=#=#C#C#E 	J$$%78 	   s   A	A$#A$c                 J    | j                  |      }||j                         S y)aO  
        We can't evaluate variable references values on any thread, only in the suspended
        thread (the main reason for this is that in UI frameworks inspecting a UI object
        from a different thread can potentially crash the application).

        :param int variable_reference:
            The variable reference (can be either a frame id or a reference to a previously
            gotten variable).

        :return str:
            The thread id for the thread to be used to inspect the given variable reference or
            None if the thread was already resumed.
        N)r   r   r   r   frames_trackers      r   $get_thread_id_for_variable_referencez;SuspendedFramesManager.get_thread_id_for_variable_reference  s-     AABTU%!4466r    c                 8    | j                   j                  |      S r   )r   r;   r   s     r   get_frame_trackerz(SuspendedFramesManager.get_frame_tracker  s    ))--i88r    c                 ^    | j                  |      }|
t               |j                  |      S )z"
        :raises KeyError
        )r   r   r   r   s      r   r   z#SuspendedFramesManager.get_variable  s5     AABTU!***+=>>r    c                 `    | j                   j                  |      }|y |j                  |      S r   )r   r;   r   )r   r   r   s      r   r   z&SuspendedFramesManager.get_frames_list  s1    ,,00;?&&y11r    c              #   x   K   t        | |      }	 | |j                          y # |j                          w xY wwr   )r   r   )r   r   r   s      r   track_framesz#SuspendedFramesManager.track_frames  s4      u-	"M!G!s   :% :7:c                 T    || j                   j                  |i       t        |      <   y r   )r   r   int)r   r   r   ru   s       r   add_fake_framez%SuspendedFramesManager.add_fake_frame  s#    RW&&11)R@XOr    c                 :   	 |dk(  r
t               S t        |      }| j                  j                  |      }||j                  |      }||S | j                  j                  |      }||j                  ||      }||S y #  t        j                          Y y xY w)N*)r   r   r   r;   r   r   r   	exception)r   r   r   fake_framesru   r   s         r   r   z!SuspendedFramesManager.find_frame  s    	3 {"8}H88<<YGK&#1$ L!77;;IFN)&11)XF$ L	!s   B <B 2B BN)rm   rn   ro   r   r   r   r   r   r   r   r   r  r   rq   r    r   r   r     s?    8&9?2 " "Xr    r   ))
contextlibr   r   _pydevd_bundle.pydevd_constantsr   r   r   r   r   _pydevd_bundle.pydevd_xmlr	   r
   _pydev_bundle.pydev_overrider   _pydevd_bundle.pydevd_resolverr   r   r   _pydevd_bundle.pydevd_safe_reprr   _pydev_bundler   _pydevd_bundler   _pydev_bundle.pydev_importsr   !_pydevd_bundle.pydevd_frame_utilsr   _pydevd_bundle.pydevd_utilsr   r   r   typingr   objectr   rs   r   r   r   r   rq   r    r   <module>r     s    % 
F F D 2 _ _ 4 # & , 8 G G F& F&RZ<' Z<z+<"& <"~BV BJ]V ]r    