
    3j                    H   S r SSKJr  SSKrSSKrSSKrSSKJr  SSKJ	r	J
r
  SSKJrJrJr  \(       a  SSKJrJr  SSKJr  S	S
KJrJrJr  \" \S5      r " S S5      r\" 5       rSSKJr  \	 " S S5      5       r\	 " S S5      5       r " S S5      r \SS j5       r!SS jr"g)a  
Bytecode debugger for Dynamo-optimized code.

This module provides a pdb-like debugger for stepping through Python bytecode
one instruction at a time, with the ability to inspect the value stack,
locals, and globals.

Usage:
    >>> # xdoctest: +SKIP
    >>> import torch
    >>>
    >>> @torch.compile
    >>> def my_fn(x):
    ...     return x + 1
    >>>
    >>> with torch._dynamo.bytecode_debugger.debug():
    ...     my_fn(torch.randn(3))  # Debugger activates on Dynamo-generated code

Programmatic breakpoints (for Dynamo developers):
    In PyCodegen, use create_breakpoint() to insert a debugger stop:

        from torch._dynamo.bytecode_transformation import create_breakpoint
        codegen.extend_output(create_breakpoint())
    )annotationsN)contextmanager)	dataclassfield)AnycastTYPE_CHECKING)Callable	Generator)Self   )convert_instructionInstructioninstruction_size
monitoringc                  @    \ rS rSr% SrSrSrS\S'   S	S jrS
S jr	Sr
g)_BreakpointMarker1   zSentinel constant that signals the debugger to break.

Usage in PyCodegen:
    from torch._dynamo.bytecode_transformation import create_breakpoint
    codegen.extend_output(create_breakpoint())
 Nz_BreakpointMarker | None	_instancec                |    U R                   c$  [        S[        R                  U 5      5      U l         U R                   $ )Nr   )r   r   object__new__)clss    Y/home/wildlama/miniconda3/lib/python3.13/site-packages/torch/_dynamo/bytecode_debugger.pyr   _BreakpointMarker.__new__<   s.    ==  !4fnnS6IJCM}}    c                    g)Nz<BREAKPOINT>r   selfs    r   __repr___BreakpointMarker.__repr__A   s    r   returnr   )r$   str)__name__
__module____qualname____firstlineno____doc__	__slots__r   __annotations__r   r!   __static_attributes__r   r   r   r   r   1   s#     I*.I'.
r   r   )NULL_STACK_VALUEc                  l    \ rS rSr% SrS\S'   S\S'   S\S'   S	\S
'   S\S'   S\S'   \" \S9rS\S'   Sr	g)CodeInfoM   zFPer-code-object data shared across all frames executing the same code.types.CodeTypecodelist[Instruction]instructionsdict[int, Instruction]offset_to_instdict[int, int]offset_to_indexintindex_widthoffset_widthdefault_factoryset[int]breakpointsr   N)
r&   r'   r(   r)   r*   r,   r   setr@   r-   r   r   r   r0   r0   M   s8    P
##**##!#6K6r   r0   c                  2   \ rS rSr% SrS\S'   S\S'   SrS\S	'   S
rS\S'   SrS\S'   Sr	S\S'   S
r
S\S'   \" \S9rS\S'   SrS\S'   SrS\S'   \S#S j5       r\S$S j5       r\S%S j5       r\S&S j5       r\S'S j5       r\S'S  j5       r\S(S! j5       rS"rg))DebuggerStateZ   zPer-frame debugging state.r0   	code_infotypes.FrameTypeframer:   current_offsetr   current_stack_depthFboolfirst_instruction_seenT	step_mode
step_countr=   dict[str, Any]user_localssr%   last_commandNz
int | None
list_indexc                .    U R                   R                  $ N)rE   r3   r   s    r   r3   DebuggerState.codem   s    ~~"""r   c                .    U R                   R                  $ rU   )rE   r5   r   s    r   r5   DebuggerState.instructionsq       ~~***r   c                .    U R                   R                  $ rU   )rE   r7   r   s    r   r7   DebuggerState.offset_to_instu   s    ~~,,,r   c                .    U R                   R                  $ rU   )rE   r9   r   s    r   r9   DebuggerState.offset_to_indexy   s    ~~---r   c                .    U R                   R                  $ rU   )rE   r;   r   s    r   r;   DebuggerState.index_width}       ~~)))r   c                .    U R                   R                  $ rU   )rE   r<   r   s    r   r<   DebuggerState.offset_width   rY   r   c                .    U R                   R                  $ rU   )rE   r@   r   s    r   r@   DebuggerState.breakpoints   r`   r   r   )r$   r2   )r$   r4   )r$   r6   )r$   r8   )r$   r:   )r$   r?   )r&   r'   r(   r)   r*   r,   rI   rJ   rL   rM   rN   r   dictrP   rR   rS   propertyr3   r5   r7   r9   r;   r<   r@   r-   r   r   r   rC   rC   Z   s    $NC  #(D(ItJ"'#K  L# 
  # # + + - - . . * * + + * *r   rC   c                  2   \ rS rSrSrS#S jrS$S%S jjrS&S jr\S'S j5       r	S(S jr
      S)S	 jrS*S
 jrS+S jr S,       S-S jjrS.S jr S/       S0S jjrS1S jrS,S2S jjrS3S jrS$S4S jjrS3S jrS#S jr S,     S5S jjr S,     S6S jjrS3S jr S$       S7S jjr S$       S8S jjr        S9S jrS:S jr        S;S jr      S<S jr        S=S jr         S>S jr!S?S  jr"        S@S! jr#S"r$g)A_DebugContext   z:Internal debug context that manages the debugging session.c                    0 U l         0 U l        SU l        [        5       U l        S U l        S U l        S U l        SU l        S U l	        SU l
        SU l        SU l        SU l        [        (       a   [        R                   R"                  U l        g g )NFr   T)
_code_info_frame_states_activerA   _tracked_codes
_old_trace_prev_callback_return_from_frame_stop_after_return_next_in_frame_next_count_verbose_stop_at_new_code	_quitting_HAS_SYS_MONITORINGsysr   DEBUGGER_ID_tool_idr   s    r   __init___DebugContext.__init__   s    :<CE365599=:>(-6: !#'+$NN66DM r   Nc                    U R                   (       d  / $ Uc8  [        [        U R                   R                  5       5      5      nUR
                  $ U R                   R	                  U5      nUc  / $ UR
                  $ )a  Get the list of instructions for a tracked code object.

Args:
    code: The code object to get instructions for. If None, returns
          instructions from the most recently tracked code object.

Returns:
    List of instructions, or empty list if the code is not tracked.
)rk   nextreversedvaluesgetr5   )r    r3   infos      r   get_instructions_DebugContext.get_instructions   sk     I<!7!7!9:;D
     ??&&t,D|	   r   c                H    [        U R                  R                  5       5      $ )z<Get all code objects that have been tracked by the debugger.)listrk   keysr   s    r   get_tracked_codes_DebugContext.get_tracked_codes   s    DOO((*++r   c                R    U R                   S:H  =(       a    U R                  [        L $ )N
LOAD_CONST)opnameargvalBREAKPOINT_MARKER)insts    r   is_programmatic_breakpoint(_DebugContext.is_programmatic_breakpoint   s     {{l*Ot{{>O/OOr   c                   XR                   ;  GaG  [        R                  " U5       Vs/ s H  n[        U5      PM     nn0 n0 n[	        U5       HR  u  p&UR
                  c  M  [        U5      n[        UR
                  UR
                  U-   S5       H  nXdU'   X%U'   M     MT     U(       a  [        U5      S-
  OSn	[        S U 5       SS9n
[	        U5       VVs1 s H  u  p&U R                  U5      (       d  M  UiM!     nnn[        UUUU[        S[        [        U	5      5      5      [        S[        [        U
5      5      5      US9U R                   U'   U R                   U   $ s  snf s  snnf )z)Get or create CodeInfo for a code object.   r   r   c              3  V   #    U  H  oR                   c  M  UR                   v   M!     g 7frU   )offset).0r   s     r   	<genexpr>9_DebugContext._get_or_create_code_info.<locals>.<genexpr>   s     Qs   )))default)r3   r5   r7   r9   r;   r<   r@   )rk   disr   r   	enumerater   r   rangelenmaxr   r0   r%   )r    r3   ir5   r7   r9   r   	inst_sizeoff	max_index
max_offsetprogrammatic_breakpointss               r   _get_or_create_code_info&_DebugContext._get_or_create_code_info   sa   & =@<P<PQU<VW<Vq/2<VLW 68N.0O$\2;;* 0 6I$T[[$++	2I1M.2s+/0,  N 3 2>L)A-1IQQJ  )626GA2248 6 % 2 %-)- /3s9~#67 CJ$894%DOOD! t$$M X.2s   E'E,;E,c                    X R                   ;  a'  U R                  U5      n[        X2S9U R                   U'   U R                   U   $ )z&Get or create per-frame DebuggerState.)rE   rG   )rl   r   rC   )r    r3   rG   rE   s       r   _get_or_create_frame_state(_DebugContext._get_or_create_frame_state   sF     ***55d;I(5	(WDu%!!%((r   c                x    [         R                  " 5       nUb"  UR                  UL a  U$ UR                  nUb  M"  g)z:Walk the stack to find the frame executing the given code.N)ry   	_getframef_codef_back)r    r3   fs      r   _find_frame_for_code"_DebugContext._find_frame_for_code   s8    $'MMOmxx4A m r   c                    / nUR                   R                  nUb@  U R                  R                  U5      nUb  UR	                  U5        UR                  nUb  M@  UR                  5         UR	                  U5        U$ )a  Build list of tracked ancestor frames, outermost-first.

Walks f_back from the current execution frame to find all ancestor
frames whose code is tracked by the debugger. Returns the corresponding
DebuggerState objects with the execution state (state) last.
)rG   r   rl   r   appendreverse)r    state	ancestorsr   ancestor_states        r   _build_tracked_frame_stack(_DebugContext._build_tracked_frame_stack   sy     *,	$)KK$6$6m!//33A6N)  0A	 m
 	r   c           	        UR                   R                  U5      nUR                  UR                  peUc	  SX& S3 S3$ UR                  R                  US5      nU(       a  X!R
                  :X  a  SOSnUR                  R                  US5      UR                  ;   a  SOSn	UR                  b  SUR                   3OS	n
U U	 SXu S3 S
X& S3 SUR                   U
 3	$ )z"Format an instruction for display.z    [dz]: <unknown>rH   z>>>z   *   [z]: )
r7   r   r;   r<   r9   rI   r@   argr   r   )r    r   r   mark_currentr   iwowindexmarker	bp_markerarg_strs              r   _format_instruction!_DebugContext._format_instruction  s     ##''/""E$6$6B<6$a.55%%))&"5&65I5I+Iu((,,VR8E<M<MMCSV 	 (,xx';Adkk]#)AeD6]"VD6N#dkk]SZR[\\r   c                R    UR                   UR                  p2SSSU 3 SSSU 3 S3$ )z0Format the header line for instruction listings.z     #>r   r   ])r;   r<   )r    r   r   r   s       r   _format_header_DebugContext._format_header  s;    ""E$6$6Bs1RD&kHQrdF#3155r   c                   UR                   R                  UR                  S5      n[        SXB-
  5      n[	        [        UR                  5      XC-   S-   5      n[        SU SUR                   S35        [        U R                  U5      5        [        XV5       HE  nUR                  U   nUR                  c  M!  [        U R                  XR                  5      5        MG     [        5         g)z/Print instructions around the current position.r   r   z
Instruction  at offset :N)r9   r   rI   r   minr   r5   printr   r   r   r   )	r    r   beforeaftercurrent_idxstartendr   r   s	            r   _print_context_DebugContext._print_context"  s     ++//0D0DaHA{+,#e(();+>+BC{m;u7K7K6LANOd!!%()u"A%%a(D{{&d..ukkBC # 	r   c                N   UR                   nU(       dz  UR                  S:  aj  UR                  R                  UR                  5      nUbB   [        R
                  " UR                  UR                  5      nUS:  a  [        SX5-   5      nU$ U$ ! [        [        4 a     U$ f = f)aI  Compute a safe stack depth for reading frame values.

For parent frames suspended at a CALL instruction, CPython has already
popped (and DECREF'd) the call arguments.  The tracked depth still
includes those consumed entries, so reading them would dereference
dangling pointers.  Adjust by the current instruction's stack_effect.
r   )rJ   rI   r7   r   r   stack_effectopcoder   r   
ValueError	TypeError)r    r   is_current_framedepthr   effects         r   _safe_stack_depth_DebugContext._safe_stack_depth2  s     ))E$8$8A$=''++E,@,@AD --dkk488DFz #Au~ 6 u #I. s   ?B B$#B$c           	     ~   SSK Jn  U R                  X5      n U" UR                  U5      n[        S5        U(       d  [        S5        OD[        U5       H5  u  pxU[        L a  Sn	OS	[        U5      S
 3n	[        SU SU	 SU< 35        M7     [        5         g! [         a  n[        SU S35         SnAgSnAff = f)zPrint the current value stack.r   !_get_frame_value_stack_with_depthz
Stack: (error reading stack: )Nz
Stack (TOS at end):z	  (empty)0x00xxz  [] r   )	torch._C._dynamo.eval_framer   r   rG   	Exceptionr   r   r.   id)
r    r   r   r   r   stacker   valueaddrs
             r   _print_stack_DebugContext._print_stackF  s    Q&&u?	5ekk5IE 	%&+%e,,, D5	!}-DA3bay12 - 	  	3A3a89	s   B 
B<#B77B<c                    [        S5        UR                  R                  nU(       d  [        S5        O+UR                  5        H  u  p4[        SU SU< 35        M     [        5         g)zPrint local variables.z
Locals:  (none)   = N)r   rG   f_localsitems)r    r   locals_dictnamer   s        r   _print_locals_DebugContext._print_locals\  sS    kkk****0024&E9-.  3r   c                f   [        S5        UR                  R                  R                  5        Ht  u  p4U(       a  X#;  a  M  UR	                  S5      (       a  UR                  S5      (       a  MA  [        U[        R                  5      (       a  Mb  [        SU SU< 35        Mv     [        5         g)zPrint global variables.z	
Globals:__r   r   N)	r   rG   	f_globalsr   
startswithendswith
isinstancetypes
ModuleType)r    r   patternr   r   s        r   _print_globals_DebugContext._print_globalsg  s    l ;;00668KD7.t$$t)<)<%!1!122BtfCy)* 9 	r   c           	        [        S[        UR                  5       S35        [        U R                  U5      5        UR                   H5  nUR                  c  M  [        U R                  XR                  SS95        M7     [        5         g)zPrint the full disassembly.z
Disassembly (z instructions):NFr   )r   r   r5   r   r   r   )r    r   r   s      r   _disassemble_DebugContext._disassemblet  sp    E$6$6 78HId!!%()&&D{{&d..ukkPU.VW ' 	r   c                <   [        S5        [        S5        [        S5        [        S5        [        S5        [        S5        [        S5        [        S5        [        S	5        [        S
5        [        S5        [        S5        [        S5        [        S5        [        S5        [        S5        [        S5        [        S5        [        S5        [        S5        [        S5        [        S5        [        5         [        S5        [        S5        [        5         g)zPrint help message.z

Commands:zD  s [n]       - Step n instructions (default 1), stepping into callszD  n [n]       - Step n instructions (default 1), stepping over callsz6  c, cont     - Continue until breakpoint or exceptionzD  r           - Continue until current function's return instructionzM  v, verbose  - Toggle verbose mode (print each instruction before executing)zG                Use with 'c' to find segfaults - last printed = culpritzE  u [count]   - Move up the call stack (toward caller) for inspectionz8  d [count]   - Move down the call stack (toward callee)z-  bt, w       - Print tracked frame backtracez   p <expr>    - Print expressionz3  l [first[, last]]  - List instructions (like pdb)z/  l .         - List around current instructionz(  ll          - Disassemble all bytecodez!  stack       - Print value stackz%  locals      - Print local variablesz&  globals     - Print global variablesz>  b <n>       - Set breakpoint at instruction n (see # column)z   b           - List breakpointsz1  cl <n>      - Clear breakpoint at instruction nz  q, quit     - Exit debuggerz5  <expr>      - Evaluate Python expression (like pdb)z?Special variables: __stack__ (list of stack values, TOS at end)zENote: Debugger stops on exceptions and shows the failing instruction.N)r   r   s    r   _print_help_DebugContext._print_help}  s    mTUTUFGTU[	
 	WXUVHI=>01CD?@89125667NO01AB-.EFOPUVr   c                |    SSK Jn  U R                  X5      n U" UR                  U5      $ ! [         a    / s $ f = f)z7Get the current stack for use in expression evaluation.r   r   )r   r   r   rG   r   )r    r   r   r   r   s        r   _get_stack_for_eval!_DebugContext._get_stack_for_eval  sB     	R&&u?	4U[[%HH 	I	s   , ;;c                    [        UR                  R                  5      nUR                  UR                  5        U R                  X5      US'   U$ )zNBuild locals dict for expression evaluation, including user-defined variables.	__stack__)re   rG   r   updaterP   r  )r    r   r   eval_localss       r   _build_eval_locals _DebugContext._build_eval_locals  sG     5;;//05,,-#'#;#;E#TK r   c                   U R                  U5      n[        U5      S-
  nX#   nU R                  U5          [        S5      R	                  5       nU(       d  UR                  nOXQl	        UR                  SS9nUS   R                  5       n[        U5      S:  a  US   OSnUS	;   a4  SUl        SU l        U(       a   [        U5      n	U	S-
  Ul        gSUl        gUS;   aE  UR"                  U l        U(       a   [        U5      n	U	S-
  U l        OSU l        SUl        SU l        gUS;   a  SUl        SU l        SU l        gUS;   a   UR"                  U l        SUl        SU l        gUS;   ag  Sn	U(       a   [        U5      n	X9-
  n
U
S:  a  Sn
[        S5        U
nX#   n[        SUR,                  R.                   35        U R                  U5        GOVUS;   at  Sn	U(       a   [        U5      n	[        U5      S-
  nX9-   n
X:  a  Un
[        S5        U
nX#   n[        SUR,                  R.                   35        U R                  U5        GOUS;   a  [1        U5       H  u  pX:X  a  SOSnUR2                  R5                  UR6                  S5      nUR8                  R5                  UR6                  5      nU(       a  UR:                  OSn[        SU SU SUR,                  R.                   SU SU S35        M     GO(US;   a<  U R<                  (       + U l        U R<                  (       a  S OS!n[        S"U S#35        GOUS$;   Ga  S%nSnSnUS#:X  a  SUl        OU(       ax  S&U;   aa  UR                  S&S5      n [        US   R	                  5       5      n[        US   R	                  5       5      nUU:  a  UnUU-   nOUnUS-   nO [        U5      nUU-   nUcW  UR>                  c9  UR2                  R5                  UR6                  S5      n[A        SUUS)-  -
  5      nOUR>                  nUU-   nUc   e[C        [        URD                  5      U5      nU[        URD                  5      :  a  [        S*5        GO[        U RG                  U5      5        [I        UU5       HF  nURD                  U   nURJ                  c  M!  [        U RM                  UURJ                  5      5        MH     [        5         UUl        GO%US+:X  a  U RO                  U5        GOUS,:X  a  U RQ                  U5        GOUS-:X  a  U RS                  XH(       a  UOS5        GOUS.:X  a  XBS   L nU RU                  UUS/9  GOUS0:X  Ga&  U(       ao   [        U5      n[        URD                  5      nUS:  d  UU:  a  [        S1U S2US-
   S35        GOaURV                  RY                  U5        [        S3U 35        GO6[        S45        URV                  (       d  [        S55        O|[[        URV                  5       Hc  nU[        URD                  5      :  d  M  URD                  U   nURJ                  c  M<  [        SU RM                  UURJ                  SS69 35        Me     [        5         GOUS7:X  a  U(       a   [        U5      n[        URD                  5      nUS:  d  UU:  a  [        S1U S2US-
   S35        GO5UURV                  ;   a*  URV                  R]                  U5        [        S8U 35        O[        S9U 35        OOUS::X  a_  U(       aL   XBS   L nUR"                  R^                  nU Ra                  UUS/9n[c        UUU5      n[        U S;U< 35        O[        S>5        OUS?;   a  U Rg                  5         OoUS@;   a  [        SA5        SU l        [        eXBS   L nUR"                  R^                  nU Ra                  UUS/9n [c        UUU5      nUb  [        [i        U5      5        GM  ! [
        [        4 a    [        S5        SU l        [        Sef = f! [          a    [        S
U 35         GMC  f = f! [          a    [        S
U 35         GMc  f = f! [          a    [        S
U 35         GM  f = f! [          a    [        S
U 35         GM  f = f! [          a    [        S'U 35         GM  f = f! [          a    [        S(U 35         GM  f = f! [          a    [        S1U 35         GNf = f! [          a    [        S1U 35         GN*f = f! [d         a  n [        S<U S=U  35         Sn A GNOSn A ff = f! [j         Ga     [m        URo                  5       5      n!URq                  5        V"V#s0 s H  u  n"n#U"[s        U#5      _M     Os  sn#n"f n$n"n#[u        UUU5        U Hh  n%U%U!;  n&U%URv                  ;   n'[s        UU%   5      U$R5                  U%5      :g  n(U&(       d  U'(       d	  U((       d  MN  U%SB:w  d  MV  UU%   URv                  U%'   Mj      GN0! [d         a0  n [        SC[y        U 5      Rz                   SDU  35         Sn A  GNeSn A ff = f[d         a/  n [        SC[y        U 5      Rz                   SDU  35         Sn A GNSn A ff = f)Ez$Interactive prompt during debugging.r   Tz(bdb) z
Exiting debugger.N)maxsplitr   r   )rQ   stepzInvalid count: )nr   F)ccontcontinue)rr$   )uupzOldest tracked framez> )r   downzNewest tracked frame)btwwherer   r   rH   	<unknown>r   r   r   z instruction z (r   )vverboseenableddisabledzVerbose mode .)lr      ,zInvalid range: zInvalid argument: r   z(End of bytecode)lllocalsglobalsr   )r   bzInvalid instruction number: z (must be 0-zBreakpoint set at instruction z
Breakpoints:r   r  clz"Breakpoint cleared at instruction zNo breakpoint at instruction pr   zError evaluating 'z': zUsage: p <expression>)hhelp?)qquitexitzExiting debugger.r  z*** : )>r   r   r   inputstripEOFErrorKeyboardInterruptr   rw   rR   splitlowerrM   rv   r:   rN   r   rG   rs   rt   rr   rq   r3   co_namer   r9   r   rI   r7   r   ru   rS   r   r   r5   r   r   r   r   r  r   r
  r   r@   addsorteddiscardr  r  evalr   r  reprSyntaxErrorrA   r   r   r   execrP   typer&   ))r    r   frame_stack
view_index
view_statecmdpartsactionr   count	new_indexr   r   fsr   idxr   inst_strstatus	num_linesr   r   firstsecondr   
is_currentr   num_instructionsbp_indexframe_globalsr  resultr   keys_beforekr+  
ids_beforekeyis_newis_user_varis_modifieds)                                            r   _interactive_prompt!_DebugContext._interactive_prompt  s
   55e<%)
 ,
J'2Ho++- ((%("IIqI)E1X^^%F!%j1n%("C&"&)-&! #C!AI (  ()E$=(&0&6&6#! #C+019(
 ()D$"').&44"').&*/'?**/++'"').&;&! #C '.	q= !I01&
(4
:??22345##J/=(! #C  ,q0	&.	( )I01&
(4
:??22345##J///&{3EA$%OSF,,001B1BBGC,,001B1BCD.2t{{HVHBqcBGGOO+<M#bQYPZZ[\ 4 ++$(MM 1&*mmfXQ/0=( 	$("&#:,0J)cz #		#q 1%$'a(8$9E%(q)9%:F%~(-&+fn(-&,qj%$'HE"')"3C
 =!,,4&0&@&@&D&D&55q' !$A{Y!^'C D * 5 5)+C&#j556<C
 7 788-.$--j9:"5#.)66q9;;2!$":"::t{{"ST / G,/J)4!!*-8#"":.9$##JsE7"'r?:
!!*z!J3D #C+.z/F/F+G( 191A(A!">ug F..>.B-C1!F
 '2266u=!$B5'"JK *+%11j)(.z/E/E(FH'#j.E.E*FF'1'>'>x'H#';;#:$)*,T-E-EjRVR]R]lq-E-r,s(t%&	 )G G4D #C+.z/F/F+G( 191A(A!">ug F..>.B-C1!F #j&<&<<&22::5A!$Fug"NO!$A%"IJ " 3	@%/r?%B
(2(8(8(B(B&*&=&=& '> ' "&c=+!FS
34 12--  "00)*!%'' (r?:
 * 0 0 : :"55 6 :!#}kBF)d6l+[  /0 2+,!%'T120 & !u56 ! & !u56 !4 & !u56 !" & !u56 !n  * %!OC5"9:$%  * %!$6se"<=$%l & D <SEBCD> & D <SEBCD % @ 23%s1#>??@4 # >>&)+*:*:*<&=;F;L;L;N%O;N41aaAh;N%O
%OS-=#.C%(%;F*-1G1G*GK*,[-=*>*..QTBU*UK &+"%"4>I#>N
 6 6s ; $/ % >T!W%5%5$6b<==>  :Da!1!1 2"QC899:s$  `/ >a ;a< 9b &b< Ac c c< Ad )d 4Ad; 79d; 1d; A
e $f /*aa98a9<bbb98b9<ccc98c9<ddd87d8;ee
f $e;;f k,i;gA#i;ii
j&$j
kjk"$kkc                   Uc  U R                  U5      nUc   eU R                  X5      nUR                  nUS:  a  UR                  R	                  U5      nUb  UR
                  R	                  US5      nUS-   nUR
                  R	                  US5      n	X:g  n
 [        R                  " UR                  UR                  U
S9nU=R                  U-  sl
        UR                  S:  a(  [        SUR                   SU SUR                   35      e X$l        SUl        U R                   (       a  S	U l        S
Ul        SUl        S
U l        U R(                  by  X0R(                  L ak  U R*                  S:  a  U =R*                  S-  sl        OSU l        S
Ul        SUl        S
U l        [,        (       a  [.        R0                  R3                  5         UR4                  (       d  S
Ul        U R&                  (       d  S	Ul        UR"                  (       a*  [7        SUR8                   S35        U R;                  5         O*U R<                  (       a  [7        SUR8                   S35        U R<                  (       ax  UR                  R	                  U5      nU(       aV  UR
                  R	                  US5      nUR                  b  SUR>                   3OSn[7        SU SUR                   U 3S
S9  UR                  R	                  U5      nUR
                  R	                  US5      n	XR@                  ;   nS	nU RB                  b1  X0RB                  L a#  Ub   UR                  S;   a  SU l!        S
U l        S
nUR$                  S:  a,  U=R$                  S-  sl        U(       d  U(       a  SUl        OgUR"                  =(       d    U=(       d    UnU(       al  U(       a4  Ub"  U RE                  U5      (       a  [7        S5        O.[7        SU	 35        OU(       a  [7        SUR8                   35        U RG                  U5        gg! [        [        4 a     GNDf = f)z<Common instruction handling logic for both tracing backends.Nr   rH   r   )jumpz Stack depth went negative after r   z: depth=FTz%
=== Entering Dynamo-generated code:  ===r   r   z	Running [r   )flush)RETURN_VALUERETURN_CONSTzBreakpoint hit (programmatic)zBreakpoint hit at instruction zAbout to return from )$r   r   rI   r7   r   r9   r   r   r   r   rJ   RuntimeErrorr   r   r   rS   rr   rM   rN   rv   rs   rt   rx   ry   r   restart_eventsrL   r   rF  r  ru   r   r@   rq   r   rj  )r    r3   r   rG   r   previous_offset	prev_inst
prev_indexexpected_next_indexcurrent_indexdid_jumpr   r   rX  r   hit_breakpointhit_return_targetshould_stops                     r   _handle_instruction!_DebugContext._handle_instruction  s    =--d3E$$$//<
  ..a,,00AI$"2266K
&01n# % 5 5 9 9&" E(? --!(()--hF --7-0014*>y?O?O>P Q))8(9%B[B[A\^  5  & ""&+D#"EO E%)D" *u8K8K/K!#  A% &*#"&#$ )-&""--/ +++/E())"'>t||nDQR  ">t||nDQR ==''++F3D++//;/3xx/CAdkk]+	#bgY?tL##''/ --11&"=&*;*;; """.5<S<S3SDKK3S$S*.'*.'$(! a!!2#$ ooLL;L#(G(G(M(M9::=/JK"-dll^<=$$U+ Q #I. s   A7Q QQc                   U R                   (       a  g[        SUR                   SU< S35        U R                  b`  X0R                  L d  UcO  XR                  R                  L a7  SU l        SU l        [        (       a  [        R                  R                  5         U R                  b`  X0R                  L d  UcO  XR                  R                  L a7  SU l
        SU l        [        (       a  [        R                  R                  5         Ub  U R                  R                  US5        g[        U R                  R                  5       5       H2  u  pEUR                  UL d  M  U R                  R                  US5          g   g)zCommon return handling logic.Nz
=== z returned: rn  T)rw   r   rF  rq   r   rr   rx   ry   r   rs  rs   rl   popr   r   r3   )r    r3   retvalrG   r   rQ   s         r   _handle_return_DebugContext._handle_returnM  s7    >>t||nKz>?
 "".,,,$*A*A*H*H"H&*D#&*D#""--/*((($*=*=*D*D"D"&D&*D#""--/ ""5$/ T//557866T>&&**1d3 9r   c                   U R                   (       a  gU R                  U5      nUc  gU R                  R                  U5      nUc  gU R                  b-  X@R                  L d  XR                  R
                  L a  SU l        U R                  b4  X@R                  L d  XR                  R
                  L a  SU l        SU l        X%l        UR                  R                  U5      nU(       a  UR                  OSnUR                  R                  US5      n[        SU SU S35        [        S[        U5      R                   SU S35        U R                  U5        g)	z Common exception handling logic.NTr*  rH   z%
=== Exception raised at instruction r?  rn  z=== )rw   r   rl   r   rq   r   rs   rv   rI   r7   r   r9   r   rN  r&   rj  )	r    r3   r   	exceptionrG   r   r   rY  rx  s	            r   _handle_exception_DebugContext._handle_exceptions  s<    >>))$/=""&&u-= "".,,,8O8O8V8V0V&*D# *(((D4G4G4N4N,N"&D%)D"%##''/"&4;;K--11&"=6}oRzQUVWT)_--.b4@A  'r   c                v   XR                   ;   a  gU R                   R                  U5        [        (       ar  [        R                  R                  U R                  U[        R                  R                  R                  [        R                  R                  R                  -  5        U R                  U5        g)z5Called by C++ before executing Dynamo-generated code.N)rn   rG  rx   ry   r   set_local_eventsr{   eventsINSTRUCTION	PY_RETURNr   )r    r3   s     r   _dynamo_code_callback#_DebugContext._dynamo_code_callback  s    &&&% NN++%%11CNN4I4I4S4SS 	%%d+r   c                &    U R                  X5        g)z/Callback for PY_RETURN events (sys.monitoring).N)r  )r    r3   instruction_offsetr  s       r   _monitoring_return_callback)_DebugContext._monitoring_return_callback  s     	D)r   c                X    U R                  X5        [        R                  R                  $ )z1Callback for INSTRUCTION events (sys.monitoring).)r}  ry   r   DISABLE)r    r3   r   s      r    _monitoring_instruction_callback._DebugContext._monitoring_instruction_callback  s"     	  .~~%%%r   c                H    XR                   ;  a  gU R                  XU5        g)z+Callback for RAISE events (sys.monitoring).N)rn   r  )r    r3   r   r  s       r   _monitoring_raise_callback(_DebugContext._monitoring_raise_callback  s&    
 ***tY7r   c                   UR                   nX@R                  ;  a  U R                  $ US:X  a  SUl        U R                  $ US:X  a*  UR                  nU R                  XEU5        U R                  $ US:X  a  U R                  XCU5        U R                  $ US:X  a/  UR                  nUu  pgnU R                  XEU5        U R                  $ U R                  $ )z Trace function for sys.settrace.callTr   r$   r  )r   rn   _settrace_callbackf_trace_opcodesf_lastir}  r  r  )	r    rG   eventr   r3   r   exc_type	exc_valueexc_tbs	            r   r   _DebugContext._settrace_callback  s     || ******F?$(E!***h]]F$$T59***h51***k!]]F*-'H""4;***&&&r   c                   SSK JnJn  SU l        U" 5       U l        U R
                  R                  5         U R                  R                  5         U R                  R                  5         [        (       Ga}   [        R                  R                  U R                  S5        [        R                  R                  U R                  [        R                  R                   R"                  U R$                  5        [        R                  R                  U R                  [        R                  R                   R&                  U R(                  5        [        R                  R                  U R                  [        R                  R                   R*                  U R,                  5        [        R                  R/                  U R                  [        R                  R                   R*                  5        O:[        R0                  " 5       U l        [        R4                  " U R6                  5        U" U R8                  5        U $ ! [         a     GNf = f)zStart the debug context.r   )get_bytecode_debugger_callbackset_bytecode_debugger_callbackTbytecode_debugger)r   r  r  rm   rp   rk   clearrl   rn   rx   ry   r   use_tool_idr{   r   register_callbackr  r  r  r  r  RAISEr  
set_eventsgettracero   settracer  r  )r    r  r  s      r   	__enter___DebugContext.__enter__  s   	

 <>  "!!#**4==:MN
 NN,,%%1155
 NN,,%%//00
 NN,,%%++// NN%%dmmS^^5J5J5P5PQ "llnDOLL001 	't'A'AB9  s   7*I 
IIc                   U R                   (       d  gSSKJn  SU l         U R                  nU" U5        [        (       Gag  UcU  [
        R                  R                  U R                  S5         [
        R                  R                  U R                  5        g[        U[        R                  5      (       d   e[        SUR                  5      n[
        R                  R!                  U R                  [
        R                  R"                  R$                  UR&                  5        [
        R                  R!                  U R                  [
        R                  R"                  R(                  UR*                  5        [
        R                  R!                  U R                  [
        R                  R"                  R,                  UR.                  5        [
        R                  R                  U R                  [
        R                  R"                  R,                  5        UR0                   Hu  n[
        R                  R3                  U R                  U[
        R                  R"                  R$                  [
        R                  R"                  R(                  -  5        Mw      g[
        R4                  " U R6                  5        g! [         a     gf = f)zEnd the debug context.Fr   )r  rh   )rm   r   r  rp   rx   ry   r   r  r{   free_tool_idr   r  r  
MethodTyper   __self__r  r  r  r  r  r  r  r  rn   r  r  ro   )r    r  exc_valr  r  prevouterr3   s           r   __exit___DebugContext.__exit__  s    ||N""&t,|))$--;NN//>D ; "$(8(89999_dmm<00MMNN))55::
 00MMNN))3355
 00MMNN))//44
 ))$--9N9N9T9TU!00DNN33--99..//99: 1  LL)C " @ Cs   .)K 
KK)rm   rk   rl   rt   rs   ro   rp   rw   rq   rr   rv   r{   rn   ru   r$   NonerU   )r3   ztypes.CodeType | Noner$   r4   )r$   zlist[types.CodeType])r   r   r$   rK   )r3   r2   r$   r0   )r3   r2   rG   rF   r$   rC   )r3   r2   r$   types.FrameType | None)r   rC   r$   zlist[DebuggerState])T)r   rC   r   r:   r   rK   r$   r%   )r   rC   r$   r%   )   r  )r   rC   r   r:   r   r:   r$   r  )r   rC   r   rK   r$   r:   )r   rC   r   rK   r$   r  )r   rC   r$   r  )r   rC   r	  z
str | Noner$   r  )r   rC   r   rK   r$   z	list[Any])r   rC   r   rK   r$   rO   )r3   r2   r   r:   rG   r  r$   r  )r3   r2   r  r   rG   r  r$   r  )r3   r2   r   r:   r  BaseExceptionr$   r  )r3   r2   r$   r  )r3   r2   r  r:   r  r   r$   r  )r3   r2   r   r:   r$   r   )r3   r2   r   r:   r  r  r$   r   )rG   rF   r  r%   r   r   r$   zCallable[..., Any] | Noner#   )r  ztype[BaseException] | Noner  zBaseException | Noner  ztypes.TracebackType | Noner$   rK   )%r&   r'   r(   r)   r*   r|   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   r   r
  r  r  r  r  rj  r}  r  r  r  r  r  r  r  r  r  r-   r   r   r   rh   rh      sm   D7"!(, P P,%\)")+:)	)& GK]"],/]?C]	]"6 CD",/<?	 (,	@ >B
"
6:
	
 >B"6:	h:V	 RVp,"p,,/p,8Np,	p,f UY$"$,2$;Q$	$L"(""(,/"(<I"(	"(P,&*"*8;*EK*	*&"&,/&	&	"	,/	<I			 '$ '-0 '7: '	" 'L-^5,5 &5 +	5
 
5r   rh   c               #     #    [        5       n  U    U v   SSS5        g! , (       d  f       g= f! [         a    [        S5         gf = f7f)a  
Context manager for debugging Dynamo-generated bytecode.

Any Dynamo-generated code executed within this context will trigger
the interactive bytecode debugger.

Example:
    >>> # xdoctest: +SKIP
    >>> import torch
    >>>
    >>> @torch.compile
    >>> def my_fn(x):
    ...     return x + 1
    >>>
    >>> with torch._dynamo.bytecode_debugger.debug():
    ...     my_fn(torch.randn(3))
Nz
=== Debug session ended ===)rh   rC  r   )ctxs    r   debugr  W  s;     & /C/I SS /-./s>   A
/ / A

,/ A
/ AA
AA
c                     g)zProgrammatic breakpoint for user code.

Place this in code compiled by Dynamo. During tracing, Dynamo inserts a
BREAKPOINT_MARKER into the compiled bytecode. When the bytecode debugger
is active, execution pauses at this marker.
Nr   r   r   r   
breakpointr  r  s    r   )r$   z$Generator[_DebugContext, None, None]r  )#r*   
__future__r   r   ry   r  
contextlibr   dataclassesr   r   typingr   r   r	   collections.abcr
   r   typing_extensionsr   bytecode_transformationr   r   r   hasattrrx   r   r   r   r.   r0   rC   rh   r  r  r   r   r   <module>r     s   2 # 
 
  % ( + + 3& W W c<0  ( &' 
 9 	7 	7 	7 ,* ,* ,*^J JZ / /4r   