
    9j                    :   d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddlmZmZmZ erddlmZmZ ddlmZ d	d
lmZmZmZ  eed      Z G d d      Z e       ZddlmZ e	 G d d             Ze	 G d d             Z G d d      Z edd       Z!ddZ"y)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                  4    e Zd ZU dZdZdZded<   ddZd	dZy)
_BreakpointMarkerzSentinel 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                z    | j                   $t        dt        j                  |             | _         | j                   S )Nr   )r   r   object__new__)clss    _/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/_dynamo/bytecode_debugger.pyr   z_BreakpointMarker.__new__<   s.    ==  !4fnnS6IJCM}}    c                     y)Nz<BREAKPOINT>r   selfs    r   __repr__z_BreakpointMarker.__repr__A   s    r   returnr   )r!   str)	__name__
__module____qualname____doc__	__slots__r   __annotations__r   r   r   r   r   r   r   1   s#     I*.I'.
r   r   )NULL_STACK_VALUEc                  j    e Zd ZU dZded<   ded<   ded<   ded	<   d
ed<   d
ed<    ee      Zded<   y)CodeInfozFPer-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]breakpointsN)r#   r$   r%   r&   r(   r   setr:   r   r   r   r+   r+   M   s8    P
##**##!#6K6r   r+   c                  "   e Zd ZU dZded<   ded<   dZded<   d	Zded
<   dZded<   dZded<   d	Z	ded<    e
e      Zded<   dZded<   dZded<   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y)'DebuggerStatezPer-frame debugging state.r+   	code_infotypes.FrameTypeframer4   current_offsetr   current_stack_depthFboolfirst_instruction_seenT	step_mode
step_countr7   dict[str, Any]user_localssr"   last_commandNz
int | None
list_indexc                .    | j                   j                  S N)r>   r-   r   s    r   r-   zDebuggerState.codem   s    ~~"""r   c                .    | j                   j                  S rN   )r>   r/   r   s    r   r/   zDebuggerState.instructionsq       ~~***r   c                .    | j                   j                  S rN   )r>   r1   r   s    r   r1   zDebuggerState.offset_to_instu   s    ~~,,,r   c                .    | j                   j                  S rN   )r>   r3   r   s    r   r3   zDebuggerState.offset_to_indexy   s    ~~---r   c                .    | j                   j                  S rN   )r>   r5   r   s    r   r5   zDebuggerState.index_width}       ~~)))r   c                .    | j                   j                  S rN   )r>   r6   r   s    r   r6   zDebuggerState.offset_width   rP   r   c                .    | j                   j                  S rN   )r>   r:   r   s    r   r:   zDebuggerState.breakpoints   rT   r   )r!   r,   )r!   r.   )r!   r0   )r!   r2   )r!   r4   )r!   r9   )r#   r$   r%   r&   r(   rB   rC   rE   rF   rG   r   dictrI   rK   rL   propertyr-   r/   r1   r3   r5   r6   r:   r   r   r   r=   r=   Z   s    $NC  #(D(ItJ"'#K  L# 
  # # + + - - . . * * + + * *r   r=   c                     e Zd ZdZd!dZd"d#dZd$dZed%d       Zd&dZ		 	 	 	 	 	 d'dZ
d(d	Zd)d
Z	 d*	 	 	 	 	 	 	 d+dZd,dZ	 d-	 	 	 	 	 	 	 d.dZd/dZd*d0dZd1dZd"d2dZd1dZd!dZ	 d*	 	 	 	 	 d3dZ	 d*	 	 	 	 	 d4dZd1dZ	 d"	 	 	 	 	 	 	 d5dZ	 d"	 	 	 	 	 	 	 d6dZ	 	 	 	 	 	 	 	 d7dZd8dZ	 	 	 	 	 	 	 	 d9dZ	 	 	 	 	 	 d:dZ	 	 	 	 	 	 	 	 d;dZ	 	 	 	 	 	 	 	 d<dZ d=dZ!	 	 	 	 	 	 	 	 d>d Z"y)?_DebugContextz:Internal debug context that manages the debugging session.c                   i | _         i | _        d| _        t               | _        d | _        d | _        d | _        d| _        d | _	        d| _
        d| _        d| _        d| _        t        r t        j                   j"                  | _        y y )NFr   T)
_code_info_frame_states_activer;   _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__z_DebugContext.__init__   s    :<CE365599=:>(-6: !#'+$NN66DM r   Nc                    | j                   sg S |8t        t        | j                   j                                     }|j
                  S | j                   j	                  |      }|g S |j
                  S )aD  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.
        )r\   nextreversedvaluesgetr/   )r   r-   infos      r   get_instructionsz_DebugContext.get_instructions   sk     I<!7!7!9:;D
     ??&&t,D|	   r   c                H    t        | j                  j                               S )z<Get all code objects that have been tracked by the debugger.)listr\   keysr   s    r   get_tracked_codesz_DebugContext.get_tracked_codes   s    DOO((*++r   c                H    | j                   dk(  xr | j                  t        u S )N
LOAD_CONST)opnameargvalBREAKPOINT_MARKER)insts    r   is_programmatic_breakpointz(_DebugContext.is_programmatic_breakpoint   s     {{l*Ot{{>O/OOr   c                   || j                   vr8t        j                  |      D cg c]  }t        |       }}i }i }t	        |      D ]P  \  }}|j
                  t        |      }t        |j
                  |j
                  |z   d      D ]  }|||<   |||<    R |rt        |      dz
  nd}	t        d |D        d      }
t	        |      D ch c]  \  }}| j                  |      r| }}}t        ||||t        dt        t        |	                  t        dt        t        |
                  |      | j                   |<   | j                   |   S c c}w c c}}w )z)Get or create CodeInfo for a code object.   r   r   c              3  N   K   | ]  }|j                   |j                     y wrN   )offset).0r~   s     r   	<genexpr>z9_DebugContext._get_or_create_code_info.<locals>.<genexpr>   s     Q9PQs   %%)default)r-   r/   r1   r3   r5   r6   r:   )r\   disrt   r   	enumerater   r   rangelenmaxr   r+   r"   )r   r-   ir/   r1   r3   r~   	inst_sizeoff	max_index
max_offsetprogrammatic_breakpointss               r   _get_or_create_code_infoz&_DebugContext._get_or_create_code_info   so   t& =@<P<PQU<VWq/2WLW 68N.0O$\2 14;;* 0 6I$T[[$++	2I1M 1.2s+/0,11 2>L)A-1IQQJ  )62At2248 2$ 2 %-)- /3s9~#67 CJ$894%DOOD! t$$M X.2s   EEc                    || j                   vr+| j                  |      }t        ||      | j                   |<   | j                   |   S )z&Get or create per-frame DebuggerState.)r>   r@   )r]   r   r=   )r   r-   r@   r>   s       r   _get_or_create_frame_statez(_DebugContext._get_or_create_frame_state   sK     ***55d;I(5	QV(WDu%!!%((r   c                n    t        j                         }||j                  |u r|S |j                  }|y)z:Walk the stack to find the frame executing the given code.N)rj   	_getframef_codef_back)r   r-   fs      r   _find_frame_for_codez"_DebugContext._find_frame_for_code   s8    $'MMOmxx4A m r   c                    g }|j                   j                  }|=| j                  j                  |      }||j	                  |       |j                  }|=|j                          |j	                  |       |S )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.
        )r@   r   r]   rr   appendreverse)r   state	ancestorsr   ancestor_states        r   _build_tracked_frame_stackz(_DebugContext._build_tracked_frame_stack   sy     *,	$)KK$6$6m!//33A6N)  0A	 m
 	r   c           	        |j                   j                  |      }|j                  |j                  }}|
d|| ddS |j                  j                  |d      }|r||j
                  k(  rdnd}|j                  j                  |d      |j                  v rdnd}	|j                  d|j                   nd	}
| |	 d|| dd
|| dd|j                   |
 	S )z"Format an instruction for display.z    [dz]: <unknown>rA   z>>>z   *   [z]: )
r1   rr   r5   r6   r3   rB   r:   argr|   r{   )r   r   r   mark_currentr~   iwowindexmarker	bp_markerarg_strs              r   _format_instructionz!_DebugContext._format_instruction  s     ##''/""E$6$6B<62$a.55%%))&"5&6U5I5I+Iu((,,VR8E<M<MMCSV 	 (,xx';Adkk]#)AeRD6]"VRD6N#dkk]SZR[\\r   c                X    |j                   |j                  }}ddd| dddd| ddS )z0Format the header line for instruction listings.z     #>r   r   r   ])r5   r6   )r   r   r   r   s       r   _format_headerz_DebugContext._format_header  sA    ""E$6$6Bs1RD &kHQrd F#3155r   c                   |j                   j                  |j                  d      }t        d||z
        }t	        t        |j                        ||z   dz         }t        d| d|j                   d       t        | j                  |             t        ||      D ]C  }|j                  |   }|j                  t        | j                  ||j                               E t                y)z/Print instructions around the current position.r   r   z
Instruction  at offset :N)r3   rr   rB   r   minr   r/   printr   r   r   r   )	r   r   beforeaftercurrent_idxstartendr   r~   s	            r   _print_contextz_DebugContext._print_context"  s     ++//0D0DaHA{V+,#e(();+>+BC{m;u7K7K6LANOd!!%()uc" 	DA%%a(D{{&d..udkkBC	D 	r   c                <   |j                   }|sw|j                  dk\  rh|j                  j                  |j                        }|A	 t	        j
                  |j                  |j                        }|dk  rt        d||z         }|S |S # t        t        f$ r Y |S w xY w)aq  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   )rC   rB   r1   rr   r   stack_effectopcoder   r   
ValueError	TypeError)r   r   is_current_framedepthr~   effects         r   _safe_stack_depthz_DebugContext._safe_stack_depth2  s     ))E$8$8A$=''++E,@,@AD --dkk488DFz #Auv~ 6 u #I. s   >B BBc           	        ddl m} | j                  ||      }	  ||j                  |      }t        d       |st        d       t                yt        |      D ]3  \  }}|t        u rd}	nd	t        |      d
}	t        d| d|	 d|       5 t                y# t        $ r}t        d| d       Y d}~yd}~ww xY w)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   r@   	Exceptionr   r   r)   id)
r   r   r   r   r   stacker   valueaddrs
             r   _print_stackz_DebugContext._print_stackF  s    Q&&u.>?	5ekk5IE 	%&+ 	 &e, 35,, D5	!}-DA3bay123 	  	3A3a89	s   B 	B>%B99B>c                    t        d       |j                  j                  }|st        d       t                y|j                         D ]  \  }}t        d| d|        t                y)zPrint local variables.z
Locals:  (none)   = N)r   r@   f_localsitems)r   r   locals_dictnamer   s        r   _print_localsz_DebugContext._print_locals\  sc    kkk*** 	  +002 /e4&E9-./r   c                2   t        d       |j                  j                  j                         D ][  \  }}|r||vr|j	                  d      r|j                  d      r0t        |t        j                        rKt        d| d|       ] t                y)zPrint global variables.z	
Globals:__r   r   N)	r   r@   	f_globalsr   
startswithendswith
isinstancetypes
ModuleType)r   r   patternr   r   s        r   _print_globalsz_DebugContext._print_globalsg  s    l ;;00668 	+KD%7$.t$t)<%!1!12BtfCy)*	+ 	r   c                   t        dt        |j                         d       t        | j                  |             |j                  D ]6  }|j                  t        | j                  ||j                  d             8 t                y)zPrint the full disassembly.z
Disassembly (z instructions):NFr   )r   r   r/   r   r   r   )r   r   r~   s      r   _disassemblez_DebugContext._disassemblet  sy    E$6$6 78HId!!%()&& 	XD{{&d..udkkPU.VW	X 	r   c                <   t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d	       t        d
       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t                t        d       t        d       t                y)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_helpz_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                |    ddl m} | j                  ||      }	  ||j                  |      S # t        $ r g cY S w xY w)z7Get the current stack for use in expression evaluation.r   r   )r   r   r   r@   r   )r   r   r   r   r   s        r   _get_stack_for_evalz!_DebugContext._get_stack_for_eval  sE     	R&&u.>?	4U[[%HH 	I	s   - ;;c                    t        |j                  j                        }|j                  |j                         | j                  ||      |d<   |S )zNBuild locals dict for expression evaluation, including user-defined variables.	__stack__)rW   r@   r   updaterI   r   )r   r   r   eval_localss       r   _build_eval_localsz _DebugContext._build_eval_locals  sJ     5;;//05,,-#'#;#;ECS#TK r   c                x   | j                  |      }t        |      dz
  }||   }| j                  |       	 	 t        d      j	                         }|s|j                  }n||_	        |j                  d      }|d   j                         }t        |      dkD  r|d   nd}|d	v r/d|_        d| _        |r	 t        |      }	|	dz
  |_        yd|_        y|dv r@|j"                  | _        |r	 t        |      }	|	dz
  | _        nd| _        d|_        d| _        y|dv rd|_        d| _        d| _        y|dv r |j"                  | _        d|_        d| _        y|dv rcd}	|r	 t        |      }	||	z
  }
|
dk  rd}
t        d       |
}||   }t        d|j,                  j.                          | j                  |       n|dv rqd}	|r	 t        |      }	t        |      dz
  }||	z   }
|
|kD  r|}
t        d       |
}||   }t        d|j,                  j.                          | j                  |       n|dv rt1        |      D ]  \  }}||k(  rdnd}|j2                  j5                  |j6                  d      }|j8                  j5                  |j6                        }|r|j:                  nd}t        d| d| d|j,                  j.                   d| d| d        n|dv r3| j<                   | _        | j<                  rd nd!}t        d"| d#       n|d$v rd%}d}d}|d#k(  rd|_        nw|rud&|v r`|j                  d&d      }	 t        |d   j	                               }t        |d   j	                               }||k  r|}||z   }n|}|dz   }n	 t        |      }||z   }|V|j>                  9|j2                  j5                  |j6                  d      }tA        d||d)z  z
        }n|j>                  }||z   }|J tC        t        |jD                        |      }|t        |jD                        k\  rt        d*       nt        | jG                  |             tI        ||      D ]C  }|jD                  |   }|jJ                  t        | jM                  ||jJ                               E t                ||_        n|d+k(  r| jO                  |       n|d,k(  r| jQ                  |       n|d-k(  r| jS                  ||r|nd       n|d.k(  r||d   u }| jU                  ||/       n|d0k(  r|rl	 t        |      }t        |jD                        }|dk  s||k\  rt        d1| d2|dz
   d       n)|jV                  jY                  |       t        d3|        nt        d4       |jV                  st        d5       nyt[        |jV                        D ]a  }|t        |jD                        k  s|jD                  |   }|jJ                  8t        d| jM                  ||jJ                  d6              c t                nw|d7k(  r|ro	 t        |      }t        |jD                        }|dk  s||k\  rt        d1| d2|dz
   d       nF||jV                  v r*|jV                  j]                  |       t        d8|        nt        d9|        n|d:k(  r]|rO	 ||d   u }|j"                  j^                  }| ja                  ||/      }tc        |||      }t        | d;|       nt        d>       n|d?v r| jg                          np|d@v rt        dA       d| _        t        ||d   u }|j"                  j^                  }| ja                  ||/      }	 tc        |||      }|t        ti        |             # t
        t        f$ r t        d       d| _        t        dw xY w# t         $ r t        d
|        Y w xY w# t         $ r t        d
|        Y w xY w# t         $ r t        d
|        Y w xY w# t         $ r t        d
|        Y 0w xY w# t         $ r t        d'|        Y Nw xY w# t         $ r t        d(|        Y lw xY w# t         $ r t        d1|        Y w xY w# t         $ r t        d1|        Y w xY w# td        $ r} t        d<| d=|         Y d} ~ =d} ~ ww xY w# tj        $ r 	 tm        |jo                               }!|jq                         D "#ci c]  \  }"}#|"ts        |#       nc c}#}"w }$}"}#tu        |||       |D ]S  }%|%|!v}&|%|jv                  v }'ts        ||%         |$j5                  |%      k7  }(|&s|'s|(s<|%dBk7  sB||%   |jv                  |%<   U n:# td        $ r.} t        dCty        |       jz                   dD|         Y d} ~ nd} ~ ww xY wY >td        $ r/} t        dCty        |       jz                   dD|         Y d} ~ pd} ~ ww xY w)Ez$Interactive prompt during debugging.r   Tz(bdb) z
Exiting debugger.N)maxsplitr   r   )rJ   stepzInvalid count: )nro   F)ccontcontinue)rr!   )uupzOldest tracked framez> )r   downzNewest tracked frame)btwwherer   r   rA   	<unknown>r   r   r   z instruction z (r   )vverboseenableddisabledzVerbose mode .)lrv      ,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   rh   rK   splitlowerrF   rg   r4   rG   r   r@   rd   re   rc   rb   r-   co_namer   r3   rr   rB   r1   r{   rf   rL   r   r   r/   r   r   r   r   r   r   r   r   r:   addsorteddiscardr   r   evalr   r   reprSyntaxErrorr;   rw   r   r   execrI   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_promptz!_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	&.	y( )I01&
(4
:??22345##J///&{3 EAr$%OSF,,001B1BBGC,,001B1BCD.2t{{HVHBqcBGGOO+<M#bQYPZZ[\ ++$(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#. U)66q9;;2!$":"::t{{"STU 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(F &H'#j.E.E*FF'1'>'>x'H#';;#:$)*,T-E-EjRVR]R]lq-E-r,s(t%&	& 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%O41aaAh%O%O
%OS-=#. OC%(%;F*-1G1G*GK*,[-=*>*..QTBU*UK &+"%"4>I#>N
 6 6s ;O % >T!W%5%5$6b<==>  :Da!1!1 2"QC899:s  _ 6_2 ,` `. a Aa* b :A)b& Bc %Ac! !#d	 )_/2```+*`+.a	a	a'&a'*bbb#"b#&c ?c cc!	d*dd		h9,g?eAg*g0gh9	g<$g72h97g<<h9h9
$h44h9c                   || j                  |      }|J | j                  ||      }|j                  }|dk\  r|j                  j	                  |      }||j
                  j	                  |d      }|dz   }|j
                  j	                  |d      }	|	|k7  }
	 t        j                  |j                  |j                  |
      }|xj                  |z  c_
        |j                  dk  r(t        d|j                   d| d|j                         	 ||_        d|_        | j                   rd	| _        d
|_        d|_        d
| _        | j(                  s|| j(                  u re| j*                  dkD  r| xj*                  dz  c_        nd| _        d
|_        d|_        d
| _        t,        rt.        j0                  j3                          |j4                  sud
|_        | j&                  sd	|_        |j"                  r*t7        d|j8                   d       | j;                          n%| j<                  rt7        d|j8                   d       | j<                  ru|j                  j	                  |      }|rX|j
                  j	                  |d      }|j                  d|j>                   nd}t7        d| d|j                   | d
       |j                  j	                  |      }|j
                  j	                  |d      }	|	|j@                  v }d	}| jB                  .|| jB                  u r ||j                  dv rd| _!        d
| _        d
}|j$                  dkD  r"|xj$                  dz  c_        |s|rd|_        ny|j"                  xs |xs |}|r\|r.|| jE                  |      rt7        d       n)t7        d|	        n|rt7        d|j8                          | jG                  |       yy# t        t        f$ r Y w xY w)z<Common instruction handling logic for both tracing backends.Nr   rA   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   rB   r1   rr   r3   r   r   r   r   rC   RuntimeErrorr{   r   r   rL   rc   rF   rG   rg   rd   re   ri   rj   r   restart_eventsrE   r   r#  r   rf   r|   r:   rb   r   rG  )r   r-   r   r@   r   previous_offset	prev_inst
prev_indexexpected_next_indexcurrent_indexdid_jumpr   r~   r5  r   hit_breakpointhit_return_targetshould_stops                     r   _handle_instructionz!_DebugContext._handle_instruction  s    =--d3E$$$//e<
  ..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" *u8K8K/K!#  A% &*#"&#$ )-&"--/ +++/E())"'>t||nDQR  ">t||nDQR ==''++F3D++//;/3xx/CAdkk]+	#bgY?tL##''/ --11&"=&%*;*;; """.5D<S<S3SDKK3S$S*.'*.'$(! a!!2#$ ooLL;L#(G(G(M9::=/JK"-dll^<=$$U+ Q #I. s   A8O0 0PPc                   | j                   ryt        d|j                   d|d       | j                  Z|| j                  u s|J|| j                  j                  u r2d| _        d| _        t        rt        j                  j                          | j                  Z|| j                  u s|J|| j                  j                  u r2d| _
        d| _        t        rt        j                  j                          || j                  j                  |d       yt        | j                  j                               D ]1  \  }}|j                  |u s| j                  j                  |d        y y)zCommon return handling logic.Nz
=== z returned: rJ  T)rh   r   r#  rb   r   rc   ri   rj   r   rO  rd   r]   poprv   r   r-   )r   r-   retvalr@   r   rJ   s         r   _handle_returnz_DebugContext._handle_returnM  s@    >>t||nKz>?
 "".T,,,$$*A*A*H*H"H&*D#&*D#"--/*T((($$*=*=*D*D"D"&D&*D#"--/ ""5$/ T//5578 166T>&&**1d3r   c                   | j                   ry| j                  |      }|y| j                  j                  |      }|y| j                  -|| j                  u s|| j                  j
                  u rd| _        | j                  4|| j                  u s|| j                  j
                  u rd| _        d| _        ||_        |j                  j                  |      }|r|j                  nd}|j                  j                  |d      }t        d| d| d       t        dt        |      j                   d| d       | j                  |       y)	z Common exception handling logic.NTr  rA   z%
=== Exception raised at instruction r  rJ  z=== )rh   r   r]   rr   rb   r   rd   rg   rB   r1   r{   r3   r   r+  r#   rG  )	r   r-   r   	exceptionr@   r   r~   r6  rT  s	            r   _handle_exceptionz_DebugContext._handle_exceptions  sF    >>))$/=""&&u-= "".T,,,8O8O8V8V0V&*D# *T(((DD4G4G4N4N,N"&D%)D"%##''/"&4;;K--11&"=6}oRzQUVWT)_--.b4@A  'r   c                j   || j                   v ry| j                   j                  |       t        rrt        j                  j                  | j                  |t        j                  j                  j                  t        j                  j                  j                  z         | j                  |       y)z5Called by C++ before executing Dynamo-generated code.N)r_   r$  ri   rj   r   set_local_eventsrl   eventsINSTRUCTION	PY_RETURNr   )r   r-   s     r   _dynamo_code_callbackz#_DebugContext._dynamo_code_callback  s    4&&&% NN++%%11CNN4I4I4S4SS 	%%d+r   c                (    | j                  ||       y)z/Callback for PY_RETURN events (sys.monitoring).N)r]  )r   r-   instruction_offsetr\  s       r   _monitoring_return_callbackz)_DebugContext._monitoring_return_callback  s     	D&)r   c                Z    | j                  ||       t        j                  j                  S )z1Callback for INSTRUCTION events (sys.monitoring).)rY  rj   r   DISABLE)r   r-   r   s      r    _monitoring_instruction_callbackz._DebugContext._monitoring_instruction_callback  s$     	  v.~~%%%r   c                H    || j                   vry| j                  |||       y)z+Callback for RAISE events (sys.monitoring).N)r_   r`  )r   r-   r   r_  s       r   _monitoring_raise_callbackz(_DebugContext._monitoring_raise_callback  s*    
 t***tVY7r   c                   |j                   }|| j                  vr| j                  S |dk(  rd|_        | j                  S |dk(  r+|j                  }| j                  |||       | j                  S |dk(  r| j                  |||       | j                  S |dk(  r1|j                  }|\  }}}| j                  |||       | j                  S | j                  S )z Trace function for sys.settrace.callTr   r!   r_  )r   r_   _settrace_callbackf_trace_opcodesf_lastirY  r]  r`  )	r   r@   eventr   r-   r   exc_type	exc_valueexc_tbs	            r   rq  z _DebugContext._settrace_callback  s     || t******F?$(E!***h]]F$$T659***hc51***k!]]F*-'Hi""4;***&&&r   c                   ddl m}m} d| _         |       | _        | j
                  j                          | j                  j                          | j                  j                          t        r}	 t        j                  j                  | j                  d       t        j                  j                  | j                  t        j                  j                   j"                  | j$                         t        j                  j                  | j                  t        j                  j                   j&                  | j(                         t        j                  j                  | j                  t        j                  j                   j*                  | j,                         t        j                  j/                  | j                  t        j                  j                   j*                         n8t        j0                         | _        t        j4                  | j6                          || j8                         | S # t        $ r Y w xY w)zStart the debug context.r   )get_bytecode_debugger_callbackset_bytecode_debugger_callbackTbytecode_debugger)r   ry  rz  r^   ra   r\   clearr]   r_   ri   rj   r   use_tool_idrl   r   register_callbackrc  rd  rl  re  ri  RAISErn  
set_eventsgettracer`   settracerq  rf  )r   ry  rz  s      r   	__enter__z_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   2*H: :	IIc                   | j                   syddlm} d| _         | j                  } ||       t        r^|Ut
        j                  j                  | j                  d       	 t
        j                  j                  | j                         yt        |t        j                        sJ t        d|j                        }t
        j                  j!                  | j                  t
        j                  j"                  j$                  |j&                         t
        j                  j!                  | j                  t
        j                  j"                  j(                  |j*                         t
        j                  j!                  | j                  t
        j                  j"                  j,                  |j.                         t
        j                  j                  | j                  t
        j                  j"                  j,                         |j0                  D ]t  }t
        j                  j3                  | j                  |t
        j                  j"                  j$                  t
        j                  j"                  j(                  z         v yt        j4                  | j6                         y# t        $ r Y yw xY w)zEnd the debug context.Fr   )rz  rZ   )r^   r   rz  ra   ri   rj   r   r  rl   free_tool_idr   r   r   
MethodTyper   __self__r~  rc  rd  rl  re  ri  r  rn  r_   rb  r  r`   )r   ru  exc_valrw  rz  prevouterr-   s           r   __exit__z_DebugContext.__exit__  s    ||N""&t,|))$--;NN//>D ; "$(8(8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0 DNN33--99..//99:  LL)C " @ Cs   #)J4 4	K ?K r!   NonerN   )r-   ztypes.CodeType | Noner!   r.   )r!   zlist[types.CodeType])r~   r   r!   rD   )r-   r,   r!   r+   )r-   r,   r@   r?   r!   r=   )r-   r,   r!   types.FrameType | None)r   r=   r!   zlist[DebuggerState])T)r   r=   r   r4   r   rD   r!   r"   )r   r=   r!   r"   )   r  )r   r=   r   r4   r   r4   r!   r  )r   r=   r   rD   r!   r4   )r   r=   r   rD   r!   r  )r   r=   r!   r  )r   r=   r   z
str | Noner!   r  )r   r=   r   rD   r!   z	list[Any])r   r=   r   rD   r!   rH   )r-   r,   r   r4   r@   r  r!   r  )r-   r,   r\  r   r@   r  r!   r  )r-   r,   r   r4   r_  BaseExceptionr!   r  )r-   r,   r!   r  )r-   r,   rh  r4   r\  r   r!   r  )r-   r,   r   r4   r!   r   )r-   r,   r   r4   r_  r  r!   r   )r@   r?   rt  r"   r   r   r!   zCallable[..., Any] | Noner    )ru  ztype[BaseException] | Noner  zBaseException | Nonerw  ztypes.TracebackType | Noner!   rD   )#r#   r$   r%   r&   rm   rt   rx   staticmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rG  rY  r]  r`  rf  ri  rl  rn  rq  r  r  r   r   r   rZ   rZ      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   rZ   c               #     K   t               } 	 | 5  |  ddd       y# 1 sw Y   yxY w# t        $ r t        d       Y yw xY ww)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 ===)rZ   r   r   )ctxs    r   debugr  W  sG     & /C/ 	I	 	 	 /-./s=   A* * A'* A* AA AAc                      y)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   rj   r   
contextlibr   dataclassesr   r   typingr   r   r	   collections.abcr
   r   typing_extensionsr   bytecode_transformationr   r   r   hasattrri   r   r}   r   r)   r+   r=   rZ   r  r  r   r   r   <module>r     s   2 # 
 
  % ( + + 3& W W c<0  ( &' 
 9 	7 	7 	7 ,* ,* ,*^J JZ / /4r   