o
    i                    @  s|  U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddl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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$Z$ddl%Z$ddl&m'Z'm(Z( dd	l)m*Z*m+Z+ dd
l,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3m4Z4m5Z5mZ6m7Z7m8Z8 ddl9m:Z:m;Z;m<Z<m=Z= ddl>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZL ddlMmMZM ddlNmOZO ddl4mPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZW ddlXmYZY ddlZm[Z[m\Z\ ddl]m^Z^m_Z_ ddl`maZa ddlbmcZcmdZd ddlemfZfmgZgmhZh ddlimjZjmkZkmlZlmmZmmnZnmoZompZpmqZq ddl7mrZrmsZs ddltmuZumvZvmwZwmxZxmyZymzZzm{Z{m|Z|m}Z} ddl~mZmZmZ ddlmZmZmZ ddlmZ dd lmZ dd!lmZmZmZ dd"lmZmZ dd#lmZmZmZmZmZmZmZ dd$lmZ dd%lmZ dd&lmZmZmZmZmZmZ dd'lmZmZmZmZmZmZ dd(lmZ dd)lmZmZmZ dd*lmZmZ dd+lmZmZmZmZmZ erdd,lmZmZ dd-lmZ dd.lmZ eeZe$jàed/Ze$jàed0Ze$jàed1Ze$jàed2Zeɡ Zd3d4 eˡ D Zd5ed6< eej΃jZeejуjZd7d8 ed9< d:d8 ed;< d<Zee8jeef Zd=ed>< e	jddCdDZejG dEdF dFZejG dGdH dHZejG dIdJ dJZejG dKdL dLZG dMdN dNZe	jddPdQZejddUdVZejddWdXZejG dYdZ dZZG d[d\ d\eZG d]d^ d^eZG d_d` d`eZddddeZddidjZddodpZdqZ	r	q	dddydzZdd|d}ZdddZG dd deZejG dd dZG ddS dSedZG dd deZejdkr,dd ejD ZG dd deZG dd deZdS )a  
Core module responsible for converting Python bytecode into TorchDynamo's symbolic execution format.

This module implements the bytecode-level tracing system that allows TorchDynamo to analyze
and transform Python code. It converts Python bytecode instructions into a symbolic format
that tracks the flow of tensors and other values through the program.

Key components:
- InstructionTranslatorBase: Base class for converting bytecode to symbolic execution
- InstructionTranslator: Main translator for function bytecode
- InliningInstructionTranslator: Handles inlining of called functions
- SpeculationLog: Manages state for speculative execution and rollback

The symbolic conversion process handles:
- Control flow (loops, conditionals, etc.)
- Function inlining and call stack management
- Tracking of program values and side effects
- Graph breaks and resumption points
- Exception handling and stack frame management

This is a core part of TorchDynamo's tracing system that enables ahead-of-time
optimization of PyTorch programs.
    )annotationsN)StackSummary)AnyCallablecastNoReturnOptionalTYPE_CHECKINGUnion)	TypeAliasTypeIs)patch)ObservedExceptionTensorifyScalarRestartAnalysis)tracingTracingContext)	dump_file)
guard_bool)cache_method   )configexcgraph_break_hintsloggingtrace_rules	variables)get_indexofJUMP_OPNAMESlivevars_analysispropagate_line_nums)cleaned_instructionscreate_binary_slicecreate_call_functioncreate_copycreate_dup_topcreate_instructioncreate_jump_absolutecreate_rot_ncreate_swapget_code_keysInstructionis_generatoris_jump_absolute	unique_id)code_context)	PyCodegen)ArgsMismatchErrorBackendCompilerFailedcollapse_resume_framesformat_graph_break_messageget_stack_above_dynamoResumePrologueTracingErrorunimplemented_v2Unsupported)get_funcname)GuardBuilderinstall_guard)GraphCompileReasonOutputGraph)impl_CONTAINS_OP_fallback)DummyModuleExecutionRecorder)ContinueExecutionCache"IS_TRACING_RESUME_PROLOGUE_VARNAMEReenterWith)
AttrSourceDictGetItemSourceGlobalSourceGlobalWeakRefSourceLocalCellSourceLocalSourceSkipGuardSourceSource)is_builtin_constantis_forbidden)	_get_error_on_graph_breakcountersget_fake_valueget_instruction_source_311get_metrics_contextgraph_break_dup_warning_checkeristype
LazyStringproxy_args_kwargs)typestrValueMutationNewVariableTracker)FrameStateSizeEntryVariableBuilderwrap_fx_proxy)BuiltinVariable)ConstantVariable)ContextWrappingVariableGenericContextWrappingVariableWithExitFunctionVariable)ConstDictVariableSetVariable)BaseUserFunctionVariableLocalGeneratorFunctionVariableLocalGeneratorObjectVariableNestedUserFunctionVariableSkipFunctionVariableUserFunctionVariableUserMethodVariable)MAX_ITERATOR_LIMIT)LazyVariableTracker)BaseListVariableIteratorVariableListIteratorVariableListVariableSliceVariableTupleVariable)CellVariableExceptionVariableGetAttrVariableNullVariablePythonModuleVariableUnknownVariable)NNModuleVariable)supported_comparison_opsSymNodeVariableTensorVariable)SymbolicTorchFunctionStateTorchFunctionModeVariable)RemovableHandleVariableUserDefinedClassVariable!UserDefinedExceptionClassVariable"UserDefinedExceptionObjectVariableUserDefinedObjectVariable)	GeneratorSequence)FakeTensorMode)CompilePackagegraph_breaks
trace_calltrace_sourcetrace_bytecodec                 C  s   i | ]
\}}|t |jqS  )r\   call_function.0kvr   r   [/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/torch/_dynamo/symbolic_convert.py
<dictcomp>   s    r   dict[str, Any]compare_op_handlersc                 C  s   t | g t|i S N)handle_containsreversedtxargs_r   r   r   <lambda>   s    r   inc                 C  s   t | t| g t|i gi S r   )
handle_notr   r   r   r   r   r   r      s    znot inzihttps://github.com/pytorch/pytorch/issues/new?&labels=oncall%3A+pt2&projects=&template=pt2-bug-report.ymlr   ExceptionValsnamestrreturntypes.ModuleTypec                 C  s
   t | S )z
    Import the named module and cache the result. importlib.import_module()
    seems to do some filesystem checking to validate the name so not caching
    this can be slow.
    )	importlibimport_module)r   r   r   r   _import_module   s   
r   c                   @  sf   e Zd ZU ded< ded< ded< ded< dZd	ed
< dZded< dZded< dddZdddZdS )SpeculationEntryr   filenameintlinenoinstruction_pointerr*   instFbool_failedNzOptional[bool]error_on_graph_breakzOptional[GraphCompileReason]reasonr   Nonec                 C  s0   d| _ || _| jdur| jj}nd}tj|d)z\
        Start tracing of the current frame over again, and don't take this branch.
        TNz!Unknown fail_and_restart_analysis)restart_reason)r   r   r   r   SpeculationRestartAnalysis)selfr   r   r   r   r   fail_and_restart_analysis   s   

z*SpeculationEntry.fail_and_restart_analysisr   InstructionTranslatorBasec                 C  s$   | j r| jd us
J | j|_dS dS NTF)r   r   )r   r   r   r   r   failed   s
   zSpeculationEntry.failed)r   r   r   r   )r   r   r   r   )	__name__
__module____qualname____annotations__r   r   r   r   r   r   r   r   r   r      s   
 
r   c                   @  sP   e Zd ZU dZejedZded< dZ	ded< dd
dZ
dddZdddZdS )SpeculationLoga3  
    SpeculationLog replaces the prior copy_graphstate/restore_graphstate
    checkpointing.  Rather than saving/restoring state, we restart the
    dynamo conversion process over from the beginning -- but when we
    hit the start of the speculation that failed, we instead generate
    a graph break.
    default_factoryzlist[SpeculationEntry]entriesr   r   indexr   r   c                 C  s
   d| _ d S Nr   )r   r   r   r   r   restart     
zSpeculationLog.restartc                 C  s   | j   d| _d S r   )r   clearr   r   r   r   r   r        

zSpeculationLog.clearr   r   r   r   r   r*   r   c                 C  s  t | j| jkr| jt|||| | j| j }d}| jdkr<| j| jd  }d|j d|j d|jj d|j	 d	}|j	|krK|j|krK|j|ks{t
d	| j d
t | j d|j d|j d|jj d|j	 d| d| d|j d| d| d|  jd7  _|S )z
        Lookup or create a SpeculationEntry() that is shared across
        RestartAnalysis calls.  Args are used only for debug checks.
         r   r   zPrevious instruction: :(z @ z)
z"
SpeculationLog diverged at index z
 (log had z entries):
- Expected:  (z at ip=z)
- Actual: a  
There are two usual reasons why this may have occurred:
- When Dynamo analysis restarted, the second run took a different path than
  the first.  If this occurred, the previous instruction is the critical instruction that
  behaved differently.
- Speculation entries are only added under certain conditions (as seen in
  step()), e.g., there must exist operators in the graph; those conditions may
  have changed on restart.

If this divergence was intentional, clear the speculation log before restarting (do NOT
do this for graph breaks, you will infinite loop).

Otherwise, please submit a bug report, ideally including the contents of TORCH_LOGS=+dynamo
)lenr   r   appendr   r   r   r   opnamer   SpeculationLogDivergence)r   r   r   r   r   entryprev_entry_msg
prev_entryr   r   r   next  sX   



zSpeculationLog.nextNr   r   )
r   r   r   r   r   r   r   r*   r   r   )r   r   r   __doc__dataclassesfieldlistr   r   r   r   r   r   r   r   r   r   r     s   
 

r   c                   @  s,   e Zd ZU ejedZded< d	ddZdS )

LocalStater   zdict[str, FrameStateSizeEntry]automatic_dynamicr   r   c                 C  s   d dd | j D S )N
c                 s  s&    | ]\}}| d |   V  qdS ): N)renderr   r   r   r   	<genexpr>N  s    
z$LocalState.render.<locals>.<genexpr>)joinr   itemsr   r   r   r   r   M  s   
zLocalState.renderNr   r   )	r   r   r   r   r   dictr   r   r   r   r   r   r   r   G  s
   
 r   c                   @  s*   e Zd ZU ded< ded< dZded< dS )DistributedStater   
compile_pgr   local_stateNzOptional[list[LocalState]]
all_states)r   r   r   r   r   r   r   r   r   r   T  s   
 r   c                   @  sT   e Zd ZU e Zded< edddZedd
dZedddZ	edddZ
dS )TensorifyStatezset[str]force_specializationsr   r   r   r   c                 C     | j | d S r   )r   addclsr   r   r   r   
specializea  s   zTensorifyState.specializer   c                 C  s
   || j v S r   )r   r   r   r   r   should_specializee     
z TensorifyState.should_specializec                 C     | j   d S r   )r   r   r   r   r   r   r   i     zTensorifyState.clearc                 C  s   t | jdkS r   )r   r   r   r   r   r   emptym  r   zTensorifyState.emptyN)r   r   r   r   )r   r   r   r   r   r   r   )r   r   r   setr   r   classmethodr   r   r   r   r   r   r   r   r   [  s   
 r   Callable[..., None]c                   C  s
   t tS r   )torchdynamo_loggingget_step_loggerlogr   r   r   r   _step_loggerr  r   r   r   r   Generator[None, None, None]c                 c  sR    | j j}| j j}zg | j _d| j _d V  W || j _|| j _d S || j _|| j _w r   )speculation_logr   r   )r   r   r   r   r   r    save_and_restart_speculation_logw  s   	
r   c                 c  s2    z| j j}d| j _d V  W || j _d S || j _w NF)outputshould_exit)r   tmpr   r   r   (temporarely_allow_writes_to_output_graph  s   r  c                   @  sP   e Zd ZU ded< ded< ded< dZded< dddZdddZdddZdS )BlockStackEntryr*   r   targetr   stack_indexNzHOptional[Union[ContextWrappingVariable, GenericContextWrappingVariable]]with_contextr   r   c                 C  s
   | j d uS r   )r  r   r   r   r   can_restore  r   zBlockStackEntry.can_restorerB   c                 C  sN   | j d usJ | jr t| jdr | jjr t| j d t| jjS t| j d S )Ntarget_valuesr   )r  r  hasattrr	  rB   tupler   r   r   r   	resume_fn  s   
zBlockStackEntry.resume_fnr   r   is_graph_breakr   c                 C  s0   | j d usJ |r| j  s|s| j |S d S r   )r  exit_on_graph_breakexit)r   r   r  r   r   r   r    s   zBlockStackEntry.exitr   )r   rB   )r   r   r  r   r   r   )r   r   r   r   r  r  r  r  r   r   r   r   r    s   
 


r  c                   @     e Zd ZdS )r   Nr   r   r   r   r   r   r   r         r   c                   @  r  )ReturnValueOpNr  r   r   r   r   r    r  r  c                   @  s   e Zd ZdZdS )YieldValueOpzY
    Signal to the symbolic tracer to stop and return control flow to the
    caller
    N)r   r   r   r   r   r   r   r   r    s    r  fnCallable[..., object]Callable[..., Any]c                   s6   t t| jt|  t| d	 fdd}|S )
Nr   InstructionTranslatorr   r*   r   r   c                   s   |   | | i  d S r   )pushr   popnr   r   fn_varnargsr   r   impl  s   zstack_op.<locals>.impl)r   r  r   r*   r   r   )r   inspect	signature
parametersr\   	functoolswraps)r  r  r   r  r   stack_op  s
   r%  modobjectr   c                 C  s4   t jdk rdS t| tjsdS | jdd t jv S )N   
   F.r   )sysversion_info
isinstancetypes
ModuleTyper   splitstdlib_module_names)r&  r   r   r   	is_stdlib  s
   
r3  r   truth_fnCallable[[object], bool]r  c                 C  s   |t jus|r	dS t| jtsJ | j}| j| }|jdkr dS |d7 }d}| j| }|jdkr]t|jts8dS |j}|d7 }| j| }|jdvrKdS |d7 }|jdkrX|d7 }| j| }|jdkrddS | 	t
| d	S )
NFLOAD_ASSERTION_ERRORr   zassertion error
LOAD_CONST)CALL_FUNCTIONPRECALLCALLr9  RAISE_VARARGST)operatortruthr.  r   r   instructionsr   argvalr   r  r]   create)r   r4  r  current_instruction_pointerr   	error_msgr   r   r   &_detect_and_normalize_assert_statement  s4   








rC  Fr   code_optionsr   exc_info
user_stackOptional[StackSummary]r   c                   s@  |d u r
t jj }z|d j|d jf}W n ty'   | d | d f}Y nw d}tjr9t	 }d
t|}n	t	 | }t|}d
t|}d|d  d|d  d	| d
tjrh| d| d7 nt|7 t jjddd  fddd ttjrtst|rt d S td|d |d | d S )Nco_filenameco_firstlinenor   zGraph break in user code at r   r   r   z
Graph Break Reason: z
User code traceback:
zQ
========== most recent `torch.compile` tracing attempt started here ==========

a}  
NOTE: the most recent `torch.compile` tracing attempt might not be where you applied `torch.compile`! This is due to how graph breaks are implemented - the optimized code object returned by Dynamo will call another Dynamo-generated resume function and tracing is re-enabled by calling the resume function as a normal Python function, which Dynamo intercepts as a top-level frame.
artifactc                   S  s
   dddS )Ndynamo_graph_break_reasonstring)r   encodingr   r   r   r   r   r   R  s   z!log_graph_break.<locals>.<lambda>c                     s    d rt   S d S )Nr   r   )	traceback
format_excr   rE  user_stack_tracer   r   r   V  s    )metadata_fn
payload_fnzmGraph break (user stack suppressed due to duplicate graph break) in user code at %s:%s
Graph Break Reason: %s)torch_guardsr   extract_stackr   r   
IndexErrorr   verboser4   r   rO  format_listr2   r   _loggingtrace_structuredgraph_break_logisEnabledForr   DEBUGexplainrR   r   debug)rD  r   rE  rF  	frame_locstack_above_dynamo_formattedstack_above_dynamouser_stack_formattedr   rQ  r   log_graph_break!  sb   


rf  8Callable[[InstructionTranslatorBase, Instruction], None]c                   sF   dd g t jd	dd fddd fdd}|S )NData-dependent branchingzyDetected data-dependent branching (e.g. `if my_tensor.sum() > 0:`). Dynamo does not support tracing dynamic control flow.1Use `torch.cond` to express dynamic control flow.r   r   r   r   r*   valuerX   	extra_msgr   r   r   c           	        s,  t | jtd|  dd |  sJ |  r+d|   }t| t	|| 
| td | jj| tdt| | |  gdd}|   | | j|d	}r^| 
| |jd useJ | |j|d	}tjd
kr{| jtdg t|j|d d}|| | j|g| |  d S )Nattempted to jump with gb_typecontextexplanationhintsr   BSkipping frame because there is a graph break in a for/while loop
zgeneric_jump triggered compilezgeneric_jump r   r   
stack_popsFr)     TO_BOOLr   )r  )rf  rD  r3   should_compile_partial_graphmaybe_has_backedgeframe_summaryr   infor   	SkipFramer  ra  r   compile_subgraphr;   rV   popcreate_call_resume_atnext_instructionr  r,  r-  add_output_instructionsr%   r   copy_positions)	r   r   rj  rk  msgall_stack_locals_metadataif_nextif_jump	jump_inst)_explanation_gb_type_hintsr  r   r   jump_graph_break  sR   	






z&generic_jump.<locals>.jump_graph_breakc                   sN  |   }tjrt| r|   }| r?t| r | |S |  r+| || nt	dd| dg t
jdddd t|tr\| jjdtjgt||fi R   | | d S t|tr|j}t|tjsn|d	k}tjjj|}|st	d
t|dg t
jd | | d S | jjdtjgt|fi R  }t| |t|j| d}| jjdtjgt||fi R   | | d S | rt|t r|j!rt"|j!#t$j% | rr| &| | | d S d S t|tr|  r| || d S t|t'r| j(|j)}|rr| &| | | d S d S t|t*rz|+| d}	W n+ t,j-yW   t,.|  z|+| d}	W n t,j-yT   t,.|  d }	Y nw Y nw t|	t/r|	0| g i }t|t1rt|j2tt3fr|j2rr| &| | | d S d S t|tr|4 rr| &| | | d S d S t	dd|	 d| dg d d S drˈr| &| | | d S d S t|ts|5| rt6|7| rr| &| | | d S d S t|trNzt|jtjr
|4| j}
nt8|jd	k}
W n% t,j9y7 } z|  r2| ||d| dW  Y d }~S  d }~ww |
rLrE| &| | | d S d S t|t:j;rkdrirb| &| | | d S d S ddl!m<} |j!d ur||j!r|= rr| &| | | d S d S t	dd|  g t
jdd d S )Nz>Data-dependent assertion failed (cannot compile partial graph)zvalue: zuDynamo has determined when encountering a data-dependent assert failure that it should not compile the partial graph.zUse `torch._assert()` to raise a hard AssertionError when the check fails. This error will propagate back the user code that called the compiled function (i.e. Dynamo will not trace any exception handling).zRemove the assert statement.zMove the assert statement outside of any context managers in order to graph break with partial graph compilation (if fullgraph=False).rm  r   r   z#Assertion failed on symbolic shapesr   )example_value__bool____len__z3Data-dependent branching with non-constant __bool__zmethod: z
, result: z}Attempted to perform data-dependent branching on a user-defined object with a __bool__ method that did not return a constant.Tr   )rk  r   )is_constant_sourcerh  rl  ri  )>r  r    rewrite_assert_with_torch_assertrC  is_python_constantr   as_python_constantjumpry  r6   r   FUNDAMENTALr.  r{   r   create_proxyrU  _assert_asyncrU   rz   sym_numSymBoolfxexperimentalsymbolic_shapesexpect_truer   
USER_ERRORscalar_tensorr[   rO   nodera   sourcer:   
make_guardr9   SEQUENCE_LENGTHr  rx   get_submodule
module_keyr   var_getattrr   ObservedAttributeErrorhandle_observed_exceptionri   r   r]   rj  r   evaluate_exprhas_unpack_var_sequencer   unpack_var_sequencer   	UserErrorr   BackwardHookVariabler  get_real_value)r   r   rj  rB  sym_exprresultscalar_to_tensor_proxyscalar_to_tensorr&  xeval_resulter  )r  r  r  r4  r   r   inner  s\  




















	


"





zgeneric_jump.<locals>.inner)r   )
r   r   r   r*   rj  rX   rk  r   r   r   r   r   r   r*   r   r   )r   r  )r4  r  r  r   )r  r  r  r  r  r4  r   generic_jumpr  s   	6 Ar  r   YCallable[[Callable[..., None]], Callable[[InstructionTranslatorBase, Instruction], None]]c                   s   d fdd}|S )Ninner_fnr   r   rg  c                   s,   t d fdd}dfdd |S )Nr   r   r   r*   r   r   c              
     s  |   }|| r|jd usJ  | ||jS z| |W S  ty } z]| jr=|  tdd| j ddgtj|d t	|t
jrD |  sI t| jdt||jd |  rkd|   }t| t
|||  |d	 t|j|j|_W Y d }~nd }~ww || j d S )
Nz0Graph break under GenericContextWrappingVariablez!Active generic context managers: z]Attempted to graph break in an active context manager(s) that doesn't support graph breaking.zEMove the offending context manager(s) to outside the compiled region.)rn  ro  rp  rq  from_excT)rE  r   rF  rs  graph_break)	speculater   r   r7   active_generic_context_managersremove_from_statsr6   r   CAUSED_BY_EARLIER_GRAPH_BREAKr.  r   UncapturedHigherOrderOpErrorry  rf  rD  r   
real_stackrz  r{  r   r|  r}  add_to_statsr;   r  r   r   )r   r   speculationexcpr  handle_graph_breakr  r   r   wrapper  sT   



(z>break_graph_if_unsupported.<locals>.decorator.<locals>.wrapperr   r;   c                   s  t jdkr$t jdk r$|jdkr$ttjd |jttjd |j }nt|j|j}| jj	| | | d}t
| }g }| jD ]6}t|jtrU|| |j| q@|jd us\J t|jtsdJ |j| || |j| q@| j|  ~t jdkr|jdkr| jd ur| j nd}t|dkrt jdk sJ | jtd	|d
g |jd usJ t|jd}	|	d | | j|	 n|jd u sJ t|}
d |
_ | j|
g | j| | ! |  t" D ]}| #t$  q| j| %| j&|d d S )Nr)     r)     r:  r9  rt  r   r   rv  KW_NAMESr?  FrH  )'r,  r-  r   disstack_effectopmapargopcoder   r~  r/   block_stackr.  r  r}   extend_outputr  try_except_torch_function_moderD  r^   reconstruct_typetry_finallyr  get_instructionskw_namesr  r   r%   r"   r  r  copyexn_tab_entryr  ranger  rw   r  r  )r   r   r   r  r  cgcleanupbr  
call_insts	inst_copyr   r  r   r   r    sn   







zIbreak_graph_if_unsupported.<locals>.decorator.<locals>.handle_graph_breakr  )r   r   r   r*   r   r;   r   r   )r#  r$  )r  r  r  r  r   	decorator~  s   1Jz-break_graph_if_unsupported.<locals>.decorator)r  r   r   rg  r   )r  r  r   r  r   break_graph_if_unsupportedy  s    r  c                      s"   e Zd ZdZd fddZ  ZS )BytecodeDistpatchTableMetazTInstalls a `cls.dispatch_table` on every subclass to speed up calls to self.OPCODE()r   typer   r   basesr   dctr   r   c                   sP   t  ||| ddd  fd	d
tj D fddtdD _d S )Nr   r   r   r   r   r   c                 W  s6   t d|  d| d|  dd|  dgtjd d S )NzMissing bytecode handlerz with args z=Dynamo does not know how to handle the bytecode instruction ``.z%Do not trace code that produces the `z_` bytecode instruction (see https://docs.python.org/3/library/dis.html for bytecode semantics).rm  r6   r   SUPPORTABLE)r   r   r   r   r   _missing  s   


z5BytecodeDistpatchTableMeta.__init__.<locals>._missingc              
     s&   i | ]\}}|t |t |qS r   )getattrr#  partial)r   r   op)r  r   r   r   r     s    z7BytecodeDistpatchTableMeta.__init__.<locals>.<dictcomp>c                   s   g | ]}  |qS r   )getr   i)dispatch_tabler   r   
<listcomp>  s    z7BytecodeDistpatchTableMeta.__init__.<locals>.<listcomp>   )r   r   r   r   r   r   )super__init__r  r  r   r  r  )r   r   r  r  	__class__)r  r   r  r   r    s   
z#BytecodeDistpatchTableMeta.__init__)
r   r  r   r   r  r   r  r   r   r   )r   r   r   r   r  __classcell__r   r   r  r   r    s    r  c                   @  s   e Zd ZU dZejedZded< ejddZ	ded< d)ddZ
d*ddZd)ddZd+ddZd,ddZd*ddZd*ddZd+ddZd*dd Zd-d!d"Zd.d$d%Zd/d'd(ZeZdS )0ExceptionStackzU
    Exception stack that it is shared among all InstructionTranslator instances
    r   zlist[ExceptionVals]
_exc_stackN)defaultzOptional[ExceptionVals]_current_exceptionr   r   c                 C  s
   d | _ d S r   r  r   r   r   r   clear_current_exception/  r   z&ExceptionStack.clear_current_exceptionvalr   c                 C  s   |  | || _d S r   )._set_context_and_break_context_reference_cycler  r   r  r   r   r   set_current_exception2  r   z$ExceptionStack.set_current_exceptionc                 C  s&   | j d usJ | | j  |   d S r   )r  r   r  r   r   r   r   move_current_exception_to_stack6  s   z.ExceptionStack.move_current_exception_to_stackc                 C  s   | j d usJ | j S r   r   r   r   r   r   get_current_exception;  s   z$ExceptionStack.get_current_exceptionprev_idxr   c                 C  sT   |j  }rt|tur|S t| j| dkr(| j| }| ||d  || |S Nr   r   )__context__r  r]   r   r  _set_context_recursiveset_context)r   r  r  ctxprevr   r   r   r  ?  s   

z%ExceptionStack._set_context_recursivec                 C  s`   | }}d}	 |j }t|tu rd S ||u r|td  d S |}||u r'd S |r,|j }| }qr   )r
  r  r]   r  )r   r  oslow_oslow_update_togglero  r   r   r   _break_context_reference_cycleJ  s    z-ExceptionStack._break_context_reference_cyclec                 C  s$   |  |t| jd  | | d S )Nr   )r  r   r  r  r  r   r   r   r  e  s   z=ExceptionStack._set_context_and_break_context_reference_cyclec                 C  
   | j  S r   )r  r  r   r   r   r   r  l  r   zExceptionStack.popc                 C  r   r   )r  r   r  r   r   r   r   o     zExceptionStack.appendc                 C  s
   t | jS r   )r   r  r   r   r   r   r  r  r   zExceptionStack.__len__r   c                 C  s
   | j | S r   )r  )r   r   r   r   r   __getitem__u  r   zExceptionStack.__getitem__r   c                 C  s   d| j d| jS )Nzself._exc_stack=z - self._current_exception=)r  r  r   r   r   r   __str__x     zExceptionStack.__str__r   )r  r   r   r   )r   r   )r  r   r  r   r   r   )r   r   )r   r   r   r   r   )r   r   r   r   r   r   r   r  r   r  r  r  r  r  r  r  r  r  r   r  r  r  __repr__r   r   r   r   r    s"   
 











r  c                      s  e Zd ZU ded< ded< ded< ded< ded	< d
ed< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< d ed!< d"ed#< d$ed%< ded&< ded'< d(ed)< d*ed+< d,ed-< dd0d1Zdd2d3Zdd5d6Zdd7d8Zdd9d:Zdd;d<Z	ddAdBZ
ddFdGZddHdIZdddLdMZddNdOZddPdQZddRdSZejdTkrŐddVdWZnddXdWZeddYdZZdd\d]Zdd^d_Zdd`daZddddeZddgdhZddidjZddldmZddndoZddpdqZddrdsZddtduZ ddvdwZ!eZ"ddydzZ#dd{d|Z$dd}d~Z%e&j'dddZ(dddZ)dddZ*e+dddZ,dddZ-dddZ.dddZ/e/Z0dddZ1e+dddZ2dddZ3dddZ4e4Z5e4Z6e7e8j9dZ:e7e8j;dZ<e7e8j9dZ=e7e8j;dZ>dddZ?dddZ@dddZAdddZBdddZCdddZDdddZEdddZFdddZGdddZHdddZIdddZJdddZKdddZLdddZMdddZNdddZOdddÄZPdddńZQdddǄZRdddɄZSddd˄ZTddd̈́ZUdddτZVeWddэdddӄZXeWddэdddՄZYeWddэdddׄZZdddلZ[dddۄZ\ddd݄Z]ddd߄Z^dddZ_dddZ`dddZadddZbdddZcdddZddddZeeWddэdddZfdddZgdddZhdddZidddZjdddZkelfddd ZmdddZnenZodddZpdddZqeqZrdddZsdd	d
ZtdddZudddZvdddZwdddZxdddZydddZzeWddэdddZ{dddZ|dddZ}dddZ~ddd Zdd!d"Zdd#d$Zdd%d&Zdɐd)d*Zdʐd-d.Zdd/d0Zdd1d2Zdd3d4Zdd5d6Zdd7d8Zdd9d:Zdd;d<Zdd=d>ZeZdd?d@ZddAdBZddCdDZddEdFZddGdHZddIdJZddKdLZee8jZee8jZee8j9Zee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZeWddэee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jăZee8jăZee8jǃZee8jɃZee8j˃Zee8j̓Zee8jσZee8jуZee8jӃZԐddMdNZejdTkrddOdPZ֐ddQdRZאddSdTZؐddUdVZِdːd̐dXdYZeWddэddZd[Zېdd\d]Zܐdd^d_Ze4Ze4Ze7e8j;dZe7e8j;dZe7e8j9dZe7e8j9dZdd`daZddbdcZddddeZddfdgZddhdiZddjdkZddldmZddndoZddpdqZddrdsZddtduZddvdwZddxdyZeWddэddzd{Zdd|d}Zdd~dZdddZdddZdddZdddZ	Jdd͐ddZdΐddZdddZdϐddZedАddZejdѐddZdҐddZ 	J	JdӐdԇ fddZ  ZS (  r   r<   r   dict[str, VariableTracker]symbolic_localssymbolic_globalsr|   symbolic_torch_function_statez$Optional[dict[str, VariableTracker]]post_prune_cell_and_freevarslist[VariableTracker]stackOptional[int]r   r*   current_instructionzlist[BlockStackEntry]r  r   r   zOptional[ConstantVariable]r  r   accept_prefix_instlist[Instruction]prefix_instsinline_depthinconsistent_side_effectszOptional[SpeculationEntry]current_speculationz	list[Any]r  r  exn_vt_stackzOptional[ExecutionRecorder]exec_recorderz+Optional[Callable[[VariableTracker], bool]]strict_checks_fnstart_pointis_leaf_tracerz#Optional[InstructionTranslatorBase]parentz3list[tuple[VariableTracker, list[VariableTracker]]]debug_localsOptional[CompilePackage]packager   r   c                 C  s
   d| _ dS )z
        InstructionTranslator has encountered instructions which may cause
        dynamo to see a different version of history from eager
        See: https://github.com/pytorch/pytorch/issues/110765
        TN)r&  r   r   r   r   mark_inconsistent_side_effects  s   
z8InstructionTranslatorBase.mark_inconsistent_side_effectsc                 C  sv   | }|d ur9|j j}|jd usJ |j|jd  D ]}|jdv r" n|jtv r1|j}||k r1 dS q|j}|d usdS )N)RETURN_VALUERETURN_CONSTTF)r!  offsetr   r>  r   r   r?  r-  )r   cur_tx
cur_offsetr   jump_offsetr   r   r   rz    s   

z,InstructionTranslatorBase.maybe_has_backedge	list[str]c                 C  
   | j d S )Nco_cellvarsrD  r   r   r   r   cellvars  r   z"InstructionTranslatorBase.cellvarsc                 C  r9  )Nco_freevarsr;  r   r   r   r   freevars  r   z"InstructionTranslatorBase.freevarsc                 C  s"   t | ds|  |   | _| jS )N_cell_and_freevars)r
  r<  r>  r?  r   r   r   r   cell_and_freevars  s   
z+InstructionTranslatorBase.cell_and_freevarsc                   sF   fddj  D _tjj  fddj  D _ d S )Nc                   s"   i | ]\}}|   v r||qS r   r@  r   r   r   r   r     s
    z?InstructionTranslatorBase.prune_dead_locals.<locals>.<dictcomp>c                   s   i | ]\}}| v r||qS r   r   r   )readsr   r   r     s    )r  r   r  r   r>  r!  r   r   )rB  r   r   prune_dead_locals  s   

z+InstructionTranslatorBase.prune_dead_localsr  rX   r   kwargsc                 C  s   t |tsJ t |tsJ t |tsJ tdd t|| D s&J d }t|dr0|j	}t|dr8|j
}|rIt|rIt|rItd| | || || d S )Nc                 s  s    | ]}t |tV  qd S r   )r.  rX   r   r  r   r   r   r     s
    
z:InstructionTranslatorBase.call_function.<locals>.<genexpr>rj  r  z$Attempt to trace forbidden callable )r.  rX   r   r   all	itertoolschainvaluesr
  rj  r  callablerL   AssertionErrorr  r   )r   r  r   rD  r  r   r   r   r     s   

z'InstructionTranslatorBase.call_functionSequence[Any]r   r   c                 C  s    t |ts	t|}|| ||S )zD
        Redirect the call to the generator "call_function"
        )r.  rd   r   r   r  r   rD  r   r   r   inline_generator_function  s   
z3InstructionTranslatorBase.inline_generator_functionc                 C  s6   d| _ tjrt| r| |||S t| |||S )zF
        A call to some user defined function by inlining it.
        F)r,  r   "enable_faithful_generator_behaviorr+   get_coderN  InliningInstructionTranslatorinline_callrM  r   r   r   inline_user_function_return  s   z5InstructionTranslatorBase.inline_user_function_returnNr   c                 C  st   |d u r| j }| jdkrd| j dnd}t| jj|}|d u r"dnd| d}| jj d| d| jj | | S )Nr   z (inline depth: )r   r   r   z in )r   r%  r8   f_coderI  co_name)r   r   inline_depth_strfuncnamefuncname_strr   r   r   get_line_of_code_header
  s   $z1InstructionTranslatorBase.get_line_of_code_headerc                 C  s8   d|    d}t| jj| j }|d| 7 }|S )NzTRACE starts_line r   z    )rZ  	linecachegetlinerU  rI  r   rstrip)r   log_strliner   r   r   get_log_starts_line_log_str  s   z5InstructionTranslatorBase.get_log_starts_line_log_strc                 C  sJ   | j |krd S || _ t| jj|| jj | jr#tdt	| j
 d S d S )N%s)r   r   set_current_locrU  rI  rV  is_trace_source_log_enabledtrace_source_logra  rT   r`  )r   r   r   r   r   starts_line  s   
z%InstructionTranslatorBase.starts_linec              
   C  sv  t  | _| j}|du rdS | j|  | _}|d | _|jr#| |j | js@|  r@|  r@| 	 | _
| j
| r@| | dS | jrNtd|j|j| j | | z| j|j | | | jj W S  tyj     tjy } z| | W Y d}~dS d}~w ttfy   Y dS  ty   | js| js| jr | j
du rt d  t jddd Y nw | j
!| j dS )	z<Process exactly one instruction, return False we should exitNFr   zTRACE %s %s %sTzempty checkpointzstep triggered compilerE  )"rM   r   r   r>  r!  re  r  ry  is_non_empty_graphr  r'  r   step_graph_breakis_trace_bytecode_log_enabledtrace_bytecode_logra  r   r?  update_block_stackr  r  r   r  r   r   r   exception_handlerr  r  r7   	one_graphis_tracing_resume_prologuer   r   )r   ipr   r  r   r   r   step%  sb   




	

zInstructionTranslatorBase.stepr  r   c                 C  s   |j }|r+t| jdkr%|j| jd jur'|j| jd ju r)| j  d S d S d S d S | jrC|jdvrEt| jdks<J | j  d S d S d S )N   rH  )NOPJUMP_BACKWARDr   )r  r   r  r  r  r   )r   r   r   r   r   r   rk  e  s   	z,InstructionTranslatorBase.update_block_stackc                 C     d S r   r   r  r   r   r   rk       c                 C  s   | j d usJ | j| j  S r   )r   r>  r   r   r   r   r    s   z*InstructionTranslatorBase.next_instructioncontinue_instc              	   C  s   | j jrJ | jd usJ | jrJ | j j| dtd|  gd}| jr6tj	s)J | j 
| ||d d S t| }| j 
|d| g |d j D ]\}}| j 
t ||| ||g qN| j 
tdt|g| j d S )NTstep_unsupported)partial_convertr   rH  POP_TOP)r   output_instructionsr'  r  r~  r;   r{  r-  r   nested_graph_breaksr  r  r/   create_load_constcreate_binary_subscrlocals_namesr   r$   create_storer%   r&   r>  )r   rw  r  r  localidxr   r   r   rh    sH   

z*InstructionTranslatorBase.step_graph_breakc                 C  s
   t d S r   )r   current_framer   r   r   r   run_ctx_mgr  s   
z%InstructionTranslatorBase.run_ctx_mgrc                 C  s  |    t| jj zz<| j|  | j| _z|  r!	 |  sW n$ t	yF } z| j
rAtdt|j dt| |jd  d }~ww W nO tyP     tyW     ty } z t|dr}d|jv r}tj| jj| jjjdddd}||_  d }~w t	y } z
| jr| j |_ d }~ww W | j   t!| t"r| j#  | j$  n| j   t!| t"r| j#  | j$  w w W d    d S 1 sw   Y  d S )NzError while tracing through a Dynamo-generated resume function prologue. Errors are not allowed when tracing resume function prologues.
r   r  zData-dependentFT)print_outputinclude_strideinclude_device)%r  r   rU  rI  r   push_txr   r+  rp  	Exceptionrn  r5   r  r   r   with_traceback__traceback__r   r1   RuntimeErrorr
  r  rU  r  GraphModule
nn_modulesgraphprint_readablepartial_fx_graphr)  
get_recordexec_recordpop_txr.  r  r  mark_bytecode_tracing_stop)r   r  readable_graphr   r   r   run  sx   








"zInstructionTranslatorBase.runr  Optional[VariableTracker]c                 C  s4   |d u st |tsJ dt| | j| d S )Nz"push expects VariableTracker, got )r.  rX   rV   r  r   r  r   r   r   r  	  s   zInstructionTranslatorBase.pushvalsc                 C  s   |D ]}|  | qd S r   r  )r   r  r  r   r   r   	push_many  s   z#InstructionTranslatorBase.push_manyc                 C  r  r   )r  r  r   r   r   r   r    r   zInstructionTranslatorBase.popnc                   s   g t  fddt|D S )Nc                   s   g | ]}   qS r   r  )r   r   r   r   r   r        z2InstructionTranslatorBase.popn.<locals>.<listcomp>)r   r  )r   r  r   r   r   r    s   zInstructionTranslatorBase.popnc                 C  s   |j }| jr|| jv r| j|| j|  z| | j|   W nM tyn   |drZz|	dd}| | j|  W n. tyY   t
dd| d| ddgtjd Y nw t
d	d| d
| dg tjd Y nw |dr|| j| d S d S )Nr+  implicitz5Attempted to read undefined local variable (implicit)z
LOAD_FAST z5Could not find an implicit local variable with name ``z(This happens in dict/list comprehensionsrm  z*Attempted to read undefined local variablez+Could not find a local variable with name `__stack)r?  r)  f_localsadd_local_varr  r  unwrapKeyError
startswithreplacer6   r   r  r  )r   r   r   new_namer   r   r   	LOAD_FAST  s@   




z#InstructionTranslatorBase.LOAD_FASTc                 C  sl   |j |  v s	J | j|j  }| jj|}| | | jr2|j | jv r4| j	|j | j|j   d S d S d S r   )
r?  r@  r  r   side_effects	load_cellr  r)  r  r  )r   r   cellcontents_varr   r   r   
LOAD_DEREF<  s   
z$InstructionTranslatorBase.LOAD_DEREFc                 C  sP   |j }|  }|| || j|< |tkr&| }t|tu s!J || _d S d S r   )	r?  r  set_name_hintr  rA   r  r  r   rn  )r   r   r   	loaded_vtr  r   r   r   
STORE_FASTE  s   


z$InstructionTranslatorBase.STORE_FASTc                 C  s   | j |j= d S r   )r  r?  r  r   r   r   DELETE_FASTO     z%InstructionTranslatorBase.DELETE_FASTc                 C  sb   |j |  v s	J | j|j  }|  }| jj|| t|ts"J |j	d ur/|
|j	 d S d S r   )r?  r@  r  r  r   r  
store_cellr.  rr   
local_namer  )r   r   r  r  r   r   r   STORE_DEREFR  s   
z%InstructionTranslatorBase.STORE_DEREFr]   c                 C  sX   |j }|d u rtj|jdS | j| }|s$tj|jd| j|< | j| }|d us*J |S )Nrj  )r  r]   r@  r?  _constants_cache)r   r   r  r  r   r   r   _load_const^  s   

z%InstructionTranslatorBase._load_constc                 C  s   |  | | d S r   )r  r  r  r   r   r   r7  i  r  z$InstructionTranslatorBase.LOAD_CONSTc                 C  s   |j }| jr&|| jv r| j|| j|  n|| jv sJ | j| | jj|< || jvr0| |S || jv rK| jj	| j|  }| 
| jj	|| d S | j| }| 
t| |t| d S r   )r?  r)  	f_globalsadd_global_var
f_builtinsbuiltinsload_builtinr  r   r  r  load_globalrX   buildrE   )r   r   r   variablerj  r   r   r   _load_globall  s   




z&InstructionTranslatorBase._load_globalc                 C  s$   d}|  |}t|}t| ||S )Nztorch.nn.modules.module)import_sourcer   rX   r  )r   module_namemodule_sourcefglobals_valuer   r   r   nn_modules_globals_vt  s   
z/InstructionTranslatorBase.nn_modules_globals_vtc                 C  sj   |j d usJ tjdkrtjdk r|j d r| | | | tjdkr1|j d r3| | d S d S d S )Nr  rv  rq  )r  r,  r-  	PUSH_NULLr  r  r   r   r   LOAD_GLOBAL  s   

z%InstructionTranslatorBase.LOAD_GLOBALc                 C  sr   |   }|j}t|}|| jvrt | j|< | jj|| j| }t|t	r.t
d|dg d | jj||| d S )Nz%Storing Tensor hook handle in globalsThis is not supported.rm  )r  r?  rE   r  r'  r   r  track_global_existingr.  r~   r6   store_global)r   r   rj  r   r  r  r   r   r   STORE_GLOBAL  s    


z&InstructionTranslatorBase.STORE_GLOBALr  rE   c                 C  s   d|v rt jjj| }|dddddd}nt|}d|dd }| jdur3| j|| || jj|< | jj	}||vsI|| |u sIJ |||< | j
| t|S )	z-Create an alias to a module for use in guardstorch_package>r   <r+  _dot_	__import_N)rU  r0  package_importer_package_imported_modulesr  r   add_import_sourcer   import_sourcesglobal_scopeupdate_co_namesrE   )r   r  rj  aliasr  r   r   r   r    s    
z'InstructionTranslatorBase.import_sourcer   levelc                 C  sB   | d|d }t||k rtd|d }|r| d| S |S )z
        Copied from the Cpython implementation of __import__
        Resolve a relative module name to an absolute one.
        https://github.com/python/cpython/blob/5a094f0255eea1db58fb2cf14c200971e64ec36e/Lib/importlib/_bootstrap.py#L902
        r+  r   z2attempted relative import beyond top-level packager   )rsplitr   ImportError)r   r   r0  r  bitsbaser   r   r   resolve_name  s
   z&InstructionTranslatorBase.resolve_namec                 C  s   | j d}| j d}|dur%|dur#||jkr#tjd||jdd |S |dur,|jS tjddd | j d }d	| j vrD|d
d }|S )z
        Copied from the Cpython implementation of __import__
        https://github.com/python/cpython/blob/5a094f0255eea1db58fb2cf14c200971e64ec36e/Lib/importlib/_bootstrap.py#L1090
        __package____spec__Nz)__package__ != __spec__.parent (%r != %r)r)  )
stacklevelzYcan't resolve package from __spec__ or __package__, falling back on __name__ and __path__r   __path__r+  r   )r  r  r-  r   warning
rpartition)r   r0  specr   r   r   calc_package  s*   

z&InstructionTranslatorBase.calc_packagec           
      C  sH  |  d\}}| }| }|j}tj d| d| d| }|| jv r/| j| }t|}nLzt|||| jd}W n tyW   t	dd| d| d| dg t
jd	 Y nw |d
krg|  }| |||}|sv|dd
 }	| |	}n| |}| jr| j|| t|tjtfr| t||d d S t	dt|dg d	 d S )Nrq  r   )fromlistr  globalszImport failurezmodule_name: z, fromlist: z, level=z"Failure when attempting to import.rm  r   r+  r  zBad import resultz%Import result is not a Python module.)r  r  r?  r?   LOCAL_MOD_PREFIXr  rE   
__import__r  r6   r   r  r  r  	partitionr  r)  add_local_modrS   r/  r0  r>   r  rv   rV   )
r   r   r  r  r  recorded_namerj  r  pkgtop_level_module_namer   r   r   IMPORT_NAME  sR   






z%InstructionTranslatorBase.IMPORT_NAMEc                 C  s   |  | | | d S r   )DUP_TOP
_load_attrr  r   r   r   IMPORT_FROM      
z%InstructionTranslatorBase.IMPORT_FROMr?  c                 C  sh   || j vrtd| d| j | }t|r(t| jj}t||}t| ||S t	|s.J t
j|dS )Nzname 'z' is not definedr  )r  r7   rJ  rE   r   %name_of_builtins_dict_key_in_fglobalsrD   rX   r  rK   r]   r@  )r   r?  r  builtins_source
var_sourcer   r   r   load_builtin_from_argval&  s   


z2InstructionTranslatorBase.load_builtin_from_argvalc                 C  s   |  | |j d S r   )r  r  r?  r  r   r   r   r  6     z&InstructionTranslatorBase.load_builtinc                 C  sZ   | j d usJ | jd usJ |jd usJ t d| j | j  | j|j | _ | j | _d S )Nir_count)r   r+  r  rQ   	incrementindexofr  r   r   r   r  9  s   zInstructionTranslatorBase.jumpFTc                 C  .   |j d usJ | jt||j t| j d S r   r  r  r   r  r   r  r  r   r   r   
SETUP_LOOPK      z$InstructionTranslatorBase.SETUP_LOOPc                 C  r  r   r  r  r   r   r   SETUP_EXCEPTP  r  z&InstructionTranslatorBase.SETUP_EXCEPTc                 C  r   r   )r  r  r  r   r   r   	POP_BLOCKU  r  z#InstructionTranslatorBase.POP_BLOCKc                 C     |  | d S r   setup_or_before_withr  r   r   r   
SETUP_WITHX  r  z$InstructionTranslatorBase.SETUP_WITHc                 C  r  r   r  r  r   r   r   SETUP_FINALLY[  s    z'InstructionTranslatorBase.SETUP_FINALLYc                 C  s   |  d  d S r   r  r  r   r   r   BEGIN_FINALLY_  r  z'InstructionTranslatorBase.BEGIN_FINALLYc                 C  sH   |  d\}}|d u sJ | | | || td gd i  d S )Nrq  r)  )r  r  r   r]   r@  )r   r   r  r   r   r   r   WITH_CLEANUP_STARTb  s   
$z,InstructionTranslatorBase.WITH_CLEANUP_STARTc                 C  s   |  d | d  d S )Nrq  )r  r  r  r   r   r   WITH_CLEANUP_FINISHh  r  z-InstructionTranslatorBase.WITH_CLEANUP_FINISHc              
   C  s   |    }z|| }| | | | W d S  ttjfyP } z)t|tjr.t|  t	j
dkr@| | | td  | | W Y d }~d S d }~ww Nr  )r  realizenext_variabler  StopIterationr   ObservedUserStopIterationr.  r  r,  r-  r]   r@  r  )r   r   itr  r  r   r   r   FOR_ITERl  s   




z"InstructionTranslatorBase.FOR_ITERc                 C  s"   t |tjtfr|| g i }|S r   )r.  r   r\   r   r   r  r   r   r   _create_exception_type  s
   
z0InstructionTranslatorBase._create_exception_typer   c                 C  s   |  |}t| jrt|tjr|jtu rtt	
| g i }| j| | |r7t|j}|d| tdttdg tjd d S )Nraised exception zFailed to raise exceptionz.Attempted to raise a non-Exception type/value.rm  )r  r+   rU  r.  r   rs   exc_typer  r\   r  r   r(  r  _isinstance_exceptionr   get_dynamo_observed_exceptionr6   r   r   r  )r   r  observed_exception_typer   r   r   _raise_exception_variable  s"   




z3InstructionTranslatorBase._raise_exception_variablec                 C  s   |j dkr3t| jstd}tjt| |gd t| jsJ | jd }| |s,J || | d S |j dkrD| j	d }| | d S | 
 }| 
 }z| | W | j }| |}|| td| d S | j }| |}|| td| w )Nr   zNo active exception to reraiser   rH  r   	__cause__)r  r   r(  r]   r   raise_observed_exceptionr  r  r  r  r  r  r  call_setattr)r   r   r  r  from_vtcurr_exccauser   r   r   r;    s*   








z'InstructionTranslatorBase.RAISE_VARARGSc                 C  sD   | j d }t|tsJ |jtu rtdddg d d S | | d S )NrH  z CLEANUP_THROW with StopIterationr   zRReceived StopIteration when handling generator.throw/close. This is not supported.rm  )r  r.  rs   r  r  r6   RERAISEr   r   tosr   r   r   CLEANUP_THROW  s   


z'InstructionTranslatorBase.CLEANUP_THROWc                 C  sl   t jdkr#|  }|jr|  }| | d S | | | | d S |  }|  }|  }| | d S )Nr  )r,  r-  r  r?  r  r  )r   r   r  r   _exc_tbr   r   r   r!    s   

z!InstructionTranslatorBase.RERAISETypeIs[ExceptionVals]c                 C  s   t |tjttfS r   )r.  r   rs   r   r   r  r   r   r   r    s   z/InstructionTranslatorBase._isinstance_exceptionc                 C  s   t jdkr)t| jdksJ | jd }| jd }| |sJ t|j}td }n#t| jdks2J | jd }| jd }| |sCJ t|j}td }| ||||gi  d S )Nr     rH     irr  )	r,  r-  r   r  r  r\   r  r]   r   )r   r   r  r  typtbr   r   r   WITH_EXCEPT_START  s   







z+InstructionTranslatorBase.WITH_EXCEPT_STARTraised_exceptionr   c                   sp  d d fdd}t jdkrVjj}|rFtj|jkr*  tj|jks|jr7	t
jj 	j  | d S j  ttu rT|  tjr'j }|jjdkrd j  tjd	krj  ttu rtd
t d g tjd j }|jjdksgj }j  tj|jkr  tj|jkstddd d	}jt|d tj tjdkrjd }	t
   	| 	t
!|j" n	t
d  	t
d  	t
d  	t
   	| 	t
!|j" | d S j  ttu r6|  )NzDynamo found no exception handler at the top-level compiled function when encountering an exception. Exception will propagate outside the compiled region.r   r   c                    sZ   j  } t|  }t|sJ tdd|   d| j d g t	j
t	jd d S )NzObserved exceptionr  r   rT  rm  )r(  r  r   r  python_typer.  r6   python_type_namer   r   r  r  )r  
dynamo_excobserved_exn_gb_explanationr.  r   r   r   bubble_exception_to_interpreter  s   

zTInstructionTranslatorBase.exception_handler.<locals>.bubble_exception_to_interpreterr  EXCEPT_HANDLERr)  r   z#Observed exception (EXCEPT_HANDLER)z  This graph break is unexpected.rm  g    .Arq  rr  r   )#r,  r-  r!  r  r   r  depthr  lastir  r   r]   r4  r(  r  r  r   r  r  r  r   r   r  r6   r   r   
DYNAMO_BUGr  r  r*   r   r  rw   r\   r  )r   r.  r4  r  block_stack_entryexception_varexcept_handler_instold_exceptionr   r2  r   rl    s~   












z+InstructionTranslatorBase.exception_handlerc                 C  sL   |   }t| jdkrtd }n| jd }| | | | | j  d S )Nr   rH  )r  r   r(  r]   r  r  )r   r   r  prev_excr   r   r   PUSH_EXC_INFO  s   



z'InstructionTranslatorBase.PUSH_EXC_INFOc                 C  s   t jdkr|  }t| jsJ | j  d S t| jdks J | jd jjdkr-td| j  | 	d t| js>J | j  d S )Nr  r   rH  r5  zYBug in Dynamo tracing of exception handling.Top of the block stack is not EXCEPT_HANDLER.r)  )
r,  r-  r  r   r(  r  r   r   rK  r  )r   r   r   r   r   r   
POP_EXCEPT  s   


z$InstructionTranslatorBase.POP_EXCEPTc                 C  s:  t | jdks	J |  }tjdkr| jd }n| j }t|tttt	fs7t
dt|d| dg tjd tjdkrR| |sRt
dt|d	| dg tjd t|tr[|j}n|g}|D ]:}t|tt	tfs{t
d
t|d| dg tjd | |rt|j|jr dS t|tjrt|j|jr dS q`dS )Nrq  r  rH  z Exception with bad expected typez"`except ...` has unsupported type r+  rm  zCaught non-Exception valuezCExcept expects to receive an object of Exception type but received z#Exception with non-type expectationz!`except ...` expects a non-type: TF)r   r  r  r,  r-  r.  r\   rq   r   r   r6   r   r   r  r  r   
issubclassr  r  r   )r   expected_exc_typesexc_instanceexpected_typesexpected_typer   r   r   check_if_exc_matches  sp   

	





z.InstructionTranslatorBase.check_if_exc_matchesc                 C  s   |  t|   d S r   )r  r   r]   rE  r  r   r   r   CHECK_EXC_MATCH		  s   z)InstructionTranslatorBase.CHECK_EXC_MATCHc                 C  s   |   s| | d S d S r   )rE  r  r  r   r   r   JUMP_IF_NOT_EXC_MATCH	  s   z/InstructionTranslatorBase.JUMP_IF_NOT_EXC_MATCHc                 C  s:   |j dkr| | d S | t|j  | | di  d S )Nzexception matchrq  )r?  rF  r  r   r  r  r   r   r   
COMPARE_OP	  s   
"z$InstructionTranslatorBase.COMPARE_OPc                 C  s   |  tt|  gi  d S r   )r   r\   iterr  r  r   r   r   GET_ITER	     z"InstructionTranslatorBase.GET_ITERr   r  c                 C  s&   |  |j}|  }| ||i  d S r   r  r?  r  r   )r   r   r   r  r   r   r   r8  	  s   z'InstructionTranslatorBase.CALL_FUNCTIONc                 C  sD  |j dkrti }|  }n!|j dkr|  }|  }ntdd|j  d|j  g tjd tjdkr?|  }t|t	s?J |  }tjdkrXtjdk rX|  }t|t	sXJ t|t
si|| rit|| }t|trut| t|}t|t
rt|tstd	d
t| dt| dg tjd | }| ||j| d S )Nr   r   z%Variadic function call with bad flagszflags: zHAttempted to call a variadic function (CALL_FUNCTION_EX) with bad flags rm  rv  r  z0Variadic function call with bad args/kwargs typezargs type: z, kwargs type: z2Expected args to be a list and kwargs to be a dict)r?  ra   r  r6   r   r8  r,  r-  r.  ru   rl   has_force_unpack_var_sequencerq   force_unpack_var_sequencer   r\   call_custom_dictr   rV   r  keys_as_python_constantr   r   )r   r   
kwargsvarsargsvarsnullr  r   r   r   CALL_FUNCTION_EX	  sL   







z*InstructionTranslatorBase.CALL_FUNCTION_EXc                 C  s   |   }| |j}|   }t|tr| sJ | }|d t|  |t| d  }}tt	||}t|t|ksAJ | 
||| d S r   )r  r  r?  r.  rq   r  r  r   r   zipr   )r   r   argnamesr   r  kwargs_listrD  r   r   r   CALL_FUNCTION_KWR	  s   &z*InstructionTranslatorBase.CALL_FUNCTION_KWc                 C  sf   |  tj|dd |jd }| jd | }tjdk r'| tj||d d S | tj||d d S )Nrq  r  r   co_namesr  )	r8  r   r  r?  rD  r,  r-  r  LOAD_METHODr   r   r  r?  r   r   r   LOAD_METHOD_SUPER^	  s   

z+InstructionTranslatorBase.LOAD_METHOD_SUPERc                 C  sD   |  tj|dd |jd }| jd | }| tj||d d S )Nrq  r  r   rY  )r8  r   r  r?  rD  r  r[  r   r   r   LOAD_ATTR_SUPERg	  s   
z)InstructionTranslatorBase.LOAD_ATTR_SUPERc                 C  sn   |  | |  }tjdkr| | | | d S tjdkr+| | | | d S | | | d  d S )Nrv  r  )r  r  r,  r-  r  r  r   r   objr   r   r   rZ  m	  s   





z%InstructionTranslatorBase.LOAD_METHODc                 C  s:   |  |j}|  }|d u sJ |  }| ||i  d S r   rL  )r   r   r   dummyr  r   r   r   CALL_METHOD}	  s
   z%InstructionTranslatorBase.CALL_METHODc                 C  s4   |   }tt| |t|jgi }| | d S r   )r  r\   r  r   r]   r@  r?  r  )r   r   r_  r  r   r   r   r  	  s   z$InstructionTranslatorBase._load_attrc                 C  s0   t jdkr|jd r| | d S | | d S )Nr  rq  )r,  r-  r  rZ  r  r  r   r   r   	LOAD_ATTR	  s
   


z#InstructionTranslatorBase.LOAD_ATTRc              
   C  s   |   }|| r| |S | d\}}t|tr+t|ts+| jr+J d|j dzt	t
| |t|j|gi  W d S  tye } z|  sK tjddd |  |d W Y d }~nd }~ww || j d S )Nrq  zMutating module attribute z during export.zSTORE_ATTR triggered compileTrf  r  )r  r   store_attr_graph_breakr  r.  rx   r]   exportr?  r\   setattrr   r@  r7   ry  r   ra  r  r  r   r   )r   r   r  r  r_  r  r   r   r   
STORE_ATTR	  s0   

z$InstructionTranslatorBase.STORE_ATTRc                 C  s   t | jdd |  stdddg d | jj| td|  gdd	}t|}d |_	| j
|g | d | j
| | j|d
 d S )NzSTORE_ATTR-caused graph breakrr  z-Should not compile partial graph (STORE_ATTR)r   zDynamo has determined when encountering an unsupported STORE_ATTR instruction (i.e. `obj.attr = val`) that it should not compile the partial graph.rm  
store_attrrq  rt  F)rf  rD  ry  r6   r   r~  r;   r{  r  r  r  r  r  r  )r   r   r  r  r   r   r   rc  	  s,   

z0InstructionTranslatorBase.store_attr_graph_breakc                 C  s*   |   }tt| |t|jgi  d S r   )r  r\   delattrr   r]   r@  r?  r^  r   r   r   DELETE_ATTR	  s   z%InstructionTranslatorBase.DELETE_ATTRr  disable_current_frame_resumec                   s*  d| _ |jdkrtdgS |jdkrtd|jdgS t| jj}t| jt|d j	 }||d _
|td|dgtd|d| tddd	 g }| durb| jdusVt|t|kslJ t|D ]\}}|dkr{|r{qpt|j|jD ]6\\}	}
}tt|| j| }|t  || |g td||| ||	td
 q|jD ]:\}}
tt|| j| }|t  || |g td||| ||j
|j|  td
 qqpg }g }t|D ]]\}}|| | u r|}nj}t |r"|j!sJ |j!}t"d|j# }|| | u rt$j%|t&fddj' D }t(|j) t& fdd|D }t& fdd|D }|t ||| t g |D ]}|t ||j
|j|  | gtd qv|tdtdt|dgtdt|j
dd	 nt&|j' }t&|j)}t*j+dk rt|dksJ dj,j#dusJ tjt|j	 }t-.j/j0j,j#|j#t&dd j1D |||t&dd j1D t&|jt&|jt&|j	t&|}|| t23j/4ddd  }|dur/t56|t23|d< |j7r=j8|| d}nj8|t9:|j;| |}j<dur]j<=|j;d | q |rnddl>m?} ||d  |d j7r|@|d |d |d d	d n||A|d d	d |B  |B  t|||D ]\}}}|j7r|@|||dd q||A|dd q|tdt|dgtd |t t |d| gtd|dtd |g tCdtdddtdtddd |td ddtdg |D S )!a7  
        Codegen resume function(s) and call it.
        Assumes that the unsupported instruction has already been run.

        Expects the stack to be in the state:
            [
                frame N locals,
                frame N-1 stack + locals,
                ...,
                frame 1 stack + locals
            ], frame N stack (post-instruction)

        Args:
            - inst: the instruction of the current (deepest) frame to resume at
            - all_stack_locals_metadata: metadata returned from OutputGraph.compile_subgraph - contains
                metadata such as local names, NULL positions, stack length, etc.
            - disable_current_frame_resume: If True, disable tracing on the current frame's resume function.
                Used for implementing nested step_graph_break.
        Nr2  r3  r  r   
BUILD_LIST)r  rq  TSTORE_SUBSCR__resume_at_c                 3  s(    | ]}|v r|   vr|V  qd S r   rA  r   r   )r5  rB  r   r   r   W
  s    zBInstructionTranslatorBase.create_call_resume_at.<locals>.<genexpr>c                 3  s    | ]	}| vr|V  qd S r   r   rn  argnames_null_setr   r   r   ]
      c                 3  s    | ]	}| v r|V  qd S r   r   rn  ro  r   r   r   ^
  rq  rz  r  z&variables should not be NULL in < 3.12c                 s  s    | ]}|j jV  qd S r   )r  r4  r   r  r   r   r   r   
      c                 s      | ]}|  V  qd S r   )r  rr  r   r   r   r   
  rs  orig_graphmodulec                   S  ru  r   r   r   r   r   r   r   
      zAInstructionTranslatorBase.create_call_resume_at.<locals>.<lambda>r   r   )	skip_coderH  FDELETE_SUBSCRr)  LIST_EXTENDrT  )Er   r   r%   r?  r/   r   root_txr   r  stack_null_idxes	num_stackr  r#   r}  r~  r!   r   r-  	enumeraterU  stack_ctx_argsstack_ctx_idxes_origr   r^   append_outputr$   r  r(   locals_ctx_argsr  r  r  r,   r  r-   r4  r   r>  r  keysr   locals_null_keysr,  r-  r!  r@   lookuprU  r   r  r.   get_contextr  weakrefrefr=  install_global_unsafer/  FunctionTyper  r0  add_resume_function
eval_framerw  make_function_with_closureload_function_namer  r'   r  )r   r   r  rj  r  current_num_stacktxesr  metajr   j_origr  r   resume_namesresume_codesresume_instresume_nameall_argnamesrV  argnames_nullr  	stack_lennew_codeorig_graphmodule_maybepackage_namerw  r   coder   )rp  r5  rB  r   r  	  s  


















	



z/InstructionTranslatorBase.create_call_resume_atc                 C  sf   t jdkr| jj}|r| jr|j| jd jurdS tdd | jD o2| j o2| j o2| j	 o2| j
 S )Nr  rH  Fc                 s  rt  r   )r  rr  r   r   r   r     rs  zIInstructionTranslatorBase.should_compile_partial_graph.<locals>.<genexpr>)r,  r-  r!  r  r  r  rF  rm  r   rn  r  )r   r   r   r   r   ry    s    
z6InstructionTranslatorBase.should_compile_partial_graphr   c                 C  s(   |  d\}}}|| d||gi  d S )Nr)  __setitem__r  call_method)r   r   r  r_  keyr   r   r   rl    s   z&InstructionTranslatorBase.STORE_SUBSCRc                 C  s$   |  d\}}|| d|gi  d S )Nrq  __delitem__r  )r   r   r_  r  r   r   r   rx    s   z'InstructionTranslatorBase.DELETE_SUBSCRc                 C     |  |j}| t| d S r   )r  r?  r  rq   r   r   r   r   r   r   BUILD_TUPLE     z%InstructionTranslatorBase.BUILD_TUPLEc                 C  r  r   )r  r?  r  rp   r  r   r   r   BUILD_SLICE#  r  z%InstructionTranslatorBase.BUILD_SLICEc                 C  s$   |  |j}| t|t d d S Nmutation_type)r  r?  r  ro   rW   r  r   r   r   rk  '  s   z$InstructionTranslatorBase.BUILD_LISTc                 C  s>   t jrtdddg d | |j}t|t d}| | d S )Nzmissing BUILD_SET handlerr   z:Missing BUILD_SET bytecode handler (for testing purposes).rm  r  )r   +inject_BUILD_SET_unimplemented_TESTING_ONLYr6   r  r?  rb   rW   r  )r   r   r   new_setr   r   r   	BUILD_SET+  s   z#InstructionTranslatorBase.BUILD_SETr   r  c              
   C  sx   |  |j}g }|D ]%}z
|||  W q
 ty/   tdt|| dg tjd Y q
w | 	||t
 d d S )Nz-Failed to unpack object for BUILD_LIST_UNPACKzU cannot be unpacked into a list for the BUILD_LIST_UNPACK bytecode (`[*x, *y, ...]`).rm  r  )r  r?  extendrN  NotImplementedErrorr6   r   r   r  r  rW   )r   r   r   seqsr   seqr   r   r   BUILD_LIST_UNPACK7  s   
z+InstructionTranslatorBase.BUILD_LIST_UNPACKc                 C  s   | j |td d S )Nr   )r  rq   r  r   r   r   BUILD_TUPLE_UNPACKG  s   z,InstructionTranslatorBase.BUILD_TUPLE_UNPACKc                 C  sJ   |  |jd }tt|d d d |dd d }| t|t d d S )Nrq  r   r  )r  r?  r   rU  r  ra   rW   )r   r   r   dr   r   r   	BUILD_MAPL  s   "z#InstructionTranslatorBase.BUILD_MAPc                   s^     |j} fdd|D }i }|D ]}t|tsJ ||j q t|t d d S )Nc                   s    g | ]}t t |gi qS r   )r\   r   r   rE  r   r   r   r  T  s     z>InstructionTranslatorBase.BUILD_MAP_UNPACK.<locals>.<listcomp>r  )r  r?  r.  ra   updater   r  rW   )r   r   r   r  r  r   r   r   BUILD_MAP_UNPACKQ  s   z*InstructionTranslatorBase.BUILD_MAP_UNPACKc                 C  sn   |   }| |j}t|tsJ | sJ || }t|t|ks&J | t	t
t||t d d S r  )r  r  r?  r.  rq   r  rN  r   r  ra   r   rU  rW   )r   r   r  rI  r   r   r   BUILD_CONST_KEY_MAPb  s   
z-InstructionTranslatorBase.BUILD_CONST_KEY_MAPc                 C  sb   |  d\}}|jdksJ |jd usJ | j|j   }t|ts%J || d||fi  d S )Nrq  r   r  )r  r?  r  r  r  r.  ra   r  )r   r   r   r   r_  r   r   r   MAP_ADDr  s   z!InstructionTranslatorBase.MAP_ADDc                 C  b   |   }|jdksJ |jd usJ | j|j  }t|ts J | s&J || d|gi  d S )Nr   r   r  r?  r  r  r.  rb   
is_mutabler  r   r   r   r_  r   r   r   SET_ADDz     z!InstructionTranslatorBase.SET_ADDc                 C  r  Nr   r  r  r  r   r   r   
SET_UPDATE  r  z$InstructionTranslatorBase.SET_UPDATEc                 C  sn   |   }|jdksJ |jd usJ | j|j   }t|ts"J | s(J | jj	
| |j| d S r   )r  r?  r  r  r  r.  ro   r  r   r  mutationr   r   r  r   r   r   LIST_APPEND  s   z%InstructionTranslatorBase.LIST_APPENDc           	   
   C  s   |j }tjdk r|  }|  }tjdkr%t|jdsJ tj|jjd}d }d }d }d }tjdk rV|d urV|d@ r>|  }|d@ rF|  }|d@ rN|  }|d@ rV|  }| 	t
||| j|||| d S )	Nr  co_qualnamer  rv     r(  rq  r   )r  r,  r-  r  r
  rj  r]   r@  r  r  rf   r  )	r   r   flagsfn_namer  defaultsclosurer   
kwdefaultsr   r   r   MAKE_FUNCTION  s@   


z'InstructionTranslatorBase.MAKE_FUNCTIONc                   s     }t|tr|jt|jd}n=t|tr6t|jtr6t|j	 |j
  fddt|jD }n|rA|}ntdt|| dg tjd t||jkrotdd|j d	t| | d
g tjd t|D ]}| qsd S )N)idxesc                   s   g | ]	}t  | qS r   )r[   r  proxyr   r   r   r    s    z=InstructionTranslatorBase.UNPACK_SEQUENCE.<locals>.<listcomp>z+Failed to unpack object for UNPACK_SEQUENCEzV cannot be unpacked into a list for the UNPACK_SEQUENCE bytecode (i.e. `a, b, c = d`).rm  z9Length mismatch when unpacking object for UNPACK_SEQUENCEzexpected length: z
, actual: za unpacked to a list for the UNPACK_SEQUENCE bytecode (i.e. `a, b, c = d`) with unexpected length.)r  r.  r{   r  r  r?  rt   r_  r  as_proxyr   rM  rN  r6   r   r   r  r   r8  r   r  )r   r   r  r  r  r   r  r   UNPACK_SEQUENCE  s0   

z)InstructionTranslatorBase.UNPACK_SEQUENCEc           
      C  s   d|j   krdksJ  J |j d@ }|j d? }|  }|| rnt|| }t||| ks3J |d | }||t||  }|t|| d  }t|D ]}	| |	 qQ| t| t|D ]}	| |	 qdd S t	dt
|| dg tjd d S )Nr   i     r  z%Failed to unpack object for UNPACK_EXz; cannot be unpacked into a list for the UNPACK_EX bytecode.rm  )r?  r  rM  r   rN  r   r   r  rq   r6   r   r   r  )
r   r   prefixsuffixr  r  vals_prefix	vals_listvals_suffixitemr   r   r   	UNPACK_EX  s,   



z#InstructionTranslatorBase.UNPACK_EXc                 C  s    | j rtddddgd d S d S )Nz#Forced graph break on leaf functionr   z:Forced graph break for nested graph break testing purposeszGSet torch._dynamo.config.debug_force_graph_break_on_leaf_return = Falserm  )r,  r6   r  r   r   r   graph_break_on_leaf_function  s   
z6InstructionTranslatorBase.graph_break_on_leaf_functionc                 C  s   |j dkr| | d S d S )NGRAPH_BREAK_IF_LEAF)r?  r  r  r   r   r   rs    s   
zInstructionTranslatorBase.NOPc                 C     |    d S r   r  r  r   r   r   rz       z!InstructionTranslatorBase.POP_TOPc                 C  s(   |   }|   }| | | | d S r   r  r  r   r   ar  r   r   r   ROT_TWO  s   
z!InstructionTranslatorBase.ROT_TWOc                 C  s:   |   }|   }|   }| | | | | | d S r   r  )r   r   r  r  cr   r   r   	ROT_THREE  s   

z#InstructionTranslatorBase.ROT_THREEc                 C  sL   |   }|   }|   }|   }| | | | | | | | d S r   r  )r   r   r  r  r  r  r   r   r   ROT_FOUR  s   


z"InstructionTranslatorBase.ROT_FOURc                 C  s    |   }| | | | d S r   r  )r   r   r  r   r   r   r    s   
z!InstructionTranslatorBase.DUP_TOPc                 C  s<   |   }|   }| | | | | | | | d S r   r  r  r   r   r   DUP_TOP_TWO#  s   


z%InstructionTranslatorBase.DUP_TOP_TWOrj  flagc                 C  sX   |dkrt t| |gi S |dkrt t| |gi S |dkr*t t| |gi S |S )Nr   rq  r)  )r\   r   r   reprascii)r   rj  r  r   r   r   _convert_value+  s   z(InstructionTranslatorBase._convert_valuefmt_specr  c                 C  s   |   }t|tr#ddlm}m} |j||||jd}| | d S | 	||d@ }t
d|  d }| ttj||gi  d S )Nr   )LazySymNodeFormatStringrk   r  r)  z{:})r  r.  rz   torch._dynamo.variables.lazyr  rk   r@  r  r  r  r]   r  r   r\   r   format)r   r  r  rj  r  rk   fmt_varr   r   r   _format_value4  s   

z'InstructionTranslatorBase._format_valuec                 C  s>   |j }|d us	J |d@ dkr|  }ntd}| ||S )Nr(  r   )r  r  r]   r@  r  )r   r   r  r  r   r   r   FORMAT_VALUEH  s   

z&InstructionTranslatorBase.FORMAT_VALUEc              	   C  s   g }g }i }|j d usJ | |j D ]Z}t|tr%|d || qt|tjr`||j ||j	 t
| t
|j @ rYtdd| d| d|j dg tjd ||j qtdt|d	g tjd q| tjd
||| d S )Nz{}zBUILD_STRING key conflictzformat_string_parts: z
, kwargs: z, part.sym_kwargs: z1Failed to build format string due to key conflictrm  zBUILD_STRING type errorzLFormat string part type is not correct - expected constant or format string.r   )r  r  r.  r]   r   r   StringFormatVariableformat_stringr  sym_argsr   r  
sym_kwargsr6   r   r  r  r   r  r@  r   )r   r   format_string_partsr   rD  partr   r   r   BUILD_STRINGR  s<   

z&InstructionTranslatorBase.BUILD_STRINGc                 C  sF   |j dks|j dksJ |j dkrd}nd}td|d}| | d S )Nr   r   iszis notrH  r  )r?  r%   rH  )r   r   
new_argvalnew_instr   r   r   IS_OPs  s   
zInstructionTranslatorBase.IS_OPc                 C  s   |j dks|j dksJ | d\}}|j }z| || d|gi  W n. tjtfyR } zt|tr8|  | | 	t
| t||gi  W Y d }~nd }~ww |dkr^| | d S d S )Nr   r   rq  __contains__)r?  r  r  r  r   ObservedTypeErrorr7   r.  r  rS  rX   r  r=   	UNARY_NOT)r   r   leftrightr  r  r   r   r   CONTAINS_OP|  s.   

z%InstructionTranslatorBase.CONTAINS_OPc                 C  r  )Nr   r  )r  r?  r  r  r.  ro   r  r  r  r   r   r   ry    r  z%InstructionTranslatorBase.LIST_EXTENDc                 C  s"   |  tt| |  gi  d S r   )r  r\   r  r   r  r  r   r   r   LIST_TO_TUPLE  s   "z'InstructionTranslatorBase.LIST_TO_TUPLEc                 C  sr   | j d }| |sJ |jtu r7tt| tdgi }|	| td| |	| td| || j d< d S d S )NrH  zgenerator raised StopIterationr
  r  )
r  r  r  r  r   r\   r  r   r]   r  )r   r   r  new_valr   r   r   STOPITERATION_ERROR  s   


z-InstructionTranslatorBase.STOPITERATION_ERRORc                 C  sf   |   }|jdksJ |jd usJ | j|j   }t|ts"J | s(J || d|gi  d S r  )	r  r?  r  r  r  r.  ra   r  r  r  r   r   r   
DICT_MERGE  s   z$InstructionTranslatorBase.DICT_MERGEc                 C  r  r   r  r  r   r   r   	GEN_START  r  z#InstructionTranslatorBase.GEN_STARTc                 C  sH   | j d }| r| tt|  d S | || dg i  d S )NrH  r  )r  r  r  r]   r@  r   r  r  r"  r   r   r   GET_LEN  s   
z!InstructionTranslatorBase.GET_LENc                 C  sP   | j d }t|tsJ t|jtjjr| t	d d S | t	d d S NrH  TF)
r  r.  ra   r   collectionsabcMappingr  r]   r@  r"  r   r   r   MATCH_MAPPING  s
   
z'InstructionTranslatorBase.MATCH_MAPPINGc                 C  sd   | j d }| sJ | }t|tjjr(t|ttt	fs(| 
td d S | 
td d S r  )r  r  r  r.  r	  r
  r   r   bytes	bytearrayr  r]   r@  )r   r   r#  	tos_valuer   r   r   MATCH_SEQUENCE  s   

z(InstructionTranslatorBase.MATCH_SEQUENCEc                   s    j d } j d ttsJ tfdd|D r< t fdd|D  tjdk r: t	d d S d S  t	d  tjdk rS t	d	 d S d S )
NrH  rr  c                 3  s    | ]}| v V  qd S r   r   rn  )tos1r   r   r     rs  z7InstructionTranslatorBase.MATCH_KEYS.<locals>.<genexpr>c                   s   g | ]}  |qS r   )getitem_constrn  r   r  r   r   r        z8InstructionTranslatorBase.MATCH_KEYS.<locals>.<listcomp>r  TF)
r  r.  ra   rF  r  rq   r,  r-  r]   r@  r"  r   r  r   
MATCH_KEYS  s   



z$InstructionTranslatorBase.MATCH_KEYSc                 C  s   |  | d d S )NrK  )r  r  r  r   r   r   r6    r  z.InstructionTranslatorBase.LOAD_ASSERTION_ERRORc                 C  s   t ddddgtjd d S )Nz'LOAD_BUILD_CLASS bytecode not supportedr   zPDynamo does not support tracing classes that are defined in the compiled region.z5Move the class definition out of the compiled region.rm  r  r  r   r   r   LOAD_BUILD_CLASS  s   
z*InstructionTranslatorBase.LOAD_BUILD_CLASSc                 C  s,   |j dkr| | d| _d S | jrJ d S )Nr   F)r  append_prefix_instr"  r  r   r   r   RESUME  s   


z InstructionTranslatorBase.RESUMEc                 C  s   |j d usJ t|j  | |S r   )r  _binary_op_lookupr  r   r   r   	BINARY_OP&  s   z#InstructionTranslatorBase.BINARY_OPc                 C  ru  r   r   r  r   r   r   r9  *  rv  z!InstructionTranslatorBase.PRECALLc                 C  sV   | j d |j }t|tsJ |D ]	}t|tsJ q| jd u s"J tj|d| _d S )N	co_constsr  )rD  r  r.  r  r   r  r]   r@  )r   r   r  r   r   r   r   r  -  s   z"InstructionTranslatorBase.KW_NAMESc                 C  s   |  t  d S r   )r  ru   r  r   r   r   r  5  r  z#InstructionTranslatorBase.PUSH_NULLcall_kwc           	      C  sP  |rt jdks	J |  }t|tr| sJ | }n	| jr$| jjnd}|j	d us-J | 
|j	d }t jdkrM|d }t|d trGg n|d g}nt|d tr[|d }g }n	|d }|d g}|r||dt|   }|t| d  }tt||}t|t|ksJ n
||dd   }i }z| ||| W d | _d S d | _w )Nrv  r   rq  r   r   )r,  r-  r  r.  rq   r  r  r  rj  r  r  ru   r   r   rU  r   )	r   r   r  r  contentsr  r   rW  rD  r   r   r   _call8  s4   


zInstructionTranslatorBase._callc                 C  r  r   r  r  r   r   r   r:  b  r   zInstructionTranslatorBase.CALLc                 C  s&   |j d usJ | | j|j    d S r   )r  r  r  r  r   r   r   COPYf  s   zInstructionTranslatorBase.COPYc                 C  s<   |j d usJ | j|j   | jd | jd< | j|j  < d S NrH  )r  r  r  r   r   r   SWAPj  s   .zInstructionTranslatorBase.SWAPc                 C  ru  r   r   r  r   r   r   CACHEv  rv  zInstructionTranslatorBase.CACHEc                 C  r  r   r  r  r   r   r   BEFORE_WITHy  r  z%InstructionTranslatorBase.BEFORE_WITHc                 C  s4  |   }t|ttfstdd| d|  dg dd t|tr-| s-| j| t|ttfs6J t	||j
}tjdkrb|jrT| jrQ|jj
| jd j
urTd }n| jjd us\J | jjj
}n|j
}| | |rt| tsttjr| jt||t| j| n| jt||t| j | ||  d S )	NzUnsupported context managerz$Attempted SETUP_WITH/BEFORE_WITH on z%Dynamo does not know how to enter a `z` context manager.)z,Avoid using the unsupported context manager.aE  If the context manager seems like it should be supported (e.g. torch.set_grad_enabled), then it may be the case that it was created outside the compiled region, which Dynamo does not support. Supported context managers can cross graph break boundaries only if they are local non-closure variables, or are intermediate values.zFile an issue to PyTorch. Simple context managers can potentially be supported, but note that context managers can't be supported in generalrm  r  rH  )r  r.  r^   r_   r6   r0  supports_graph_breaksr  r   r`   r  r,  r-  r  r  r  r  r  r   r|  r  r   r  enter)r   r   r  r  r  r   r   r   r  |  sN   

z.InstructionTranslatorBase.setup_or_before_withc                 C  s   | j sJ | j| d S r   )r"  r$  r   r  r   r   r   r    s   
z,InstructionTranslatorBase.append_prefix_instc                 C  sL   t jdkr| jst| j|j tsJ | jj	 | j|j< d S | 
| d S r  )r,  r-  r"  r.  r  r?  ru   r   r  track_cell_newr  r  r   r   r   	MAKE_CELL  s
   
z#InstructionTranslatorBase.MAKE_CELLc                 C  r  r   r  r  r   r   r   COPY_FREE_VARS  r  z(InstructionTranslatorBase.COPY_FREE_VARSc                 C  r  r   r)  r  r   r   r   RETURN_GENERATOR  r  z*InstructionTranslatorBase.RETURN_GENERATORc                 C  s$   t jdkr|   d S | d d S )Nrv  rq  )r,  r-  r  r  r  r   r   r   END_FOR  s   
z!InstructionTranslatorBase.END_FORc                 C  sD   t | j|jd trtd|jd|j g tjd | | d S )Nz)LOAD_FAST_CHECK on uninitialized variablez/Attempted to load uninitialized local variable rm  )	rS   r  r  r?  ru   r6   r   r  r  r  r   r   r   LOAD_FAST_CHECK  s   
z)InstructionTranslatorBase.LOAD_FAST_CHECKc                 C  s6   |j | jvr| t  n| | t | j|j < d S r   )r?  r  r  ru   r  r  r   r   r   LOAD_FAST_AND_CLEAR  s   
z-InstructionTranslatorBase.LOAD_FAST_AND_CLEARc                 C  sH   |  tj|dd |jd usJ |jd@ r| | d S | | d S )Nrq  r  r   )r8  r   r  r  rZ  r  r  r   r   r   LOAD_SUPER_ATTR  s
   
z)InstructionTranslatorBase.LOAD_SUPER_ATTRc                 C  s   |j dkr| | d S |j dkr| | d S |j dkr+| t|  |  d S tdd|j  d|j  dg tj	d d S )	Nr)        z Missing CALL_INTRINSIC_1 handlerzCALL_INTRINSIC_1 operand: z,No handler implemented for CALL_INTRINSIC_1 z instruction.rm  )
r?  r  UNARY_POSITIVEr  rq   r  rN  r6   r   r  r  r   r   r   CALL_INTRINSIC_1  s   




z*InstructionTranslatorBase.CALL_INTRINSIC_1c                 C  s   |   }|    | | d S r   r  r"  r   r   r   END_SEND  s   z"InstructionTranslatorBase.END_SENDc                 C  s   | j |dd d S )NT)r  r  r  r   r   r   CALL_KW  s   z!InstructionTranslatorBase.CALL_KWc                 C  s   | j jdv sJ d S )N)POP_JUMP_IF_TRUEPOP_JUMP_IF_FALSEr  )r  r   r  r   r   r   rx    s   z!InstructionTranslatorBase.TO_BOOLc                 C  s|   |j }|d us	J |  }t|tsJ |  }|d@ r ||_n|d@ r(||_n|d@ r0||_n|d@ r7||_| | d S )Nr  r(  rq  r   )	r  r  r.  rf   r  r   r  r  r  )r   r   r  r  attrr   r   r   SET_FUNCTION_ATTRIBUTE  s   z0InstructionTranslatorBase.SET_FUNCTION_ATTRIBUTEc                 C  s   |  | |  |j d S r   )r  r  r  r?  r  r   r   r   CONVERT_VALUE.  rK  z'InstructionTranslatorBase.CONVERT_VALUEc                 C  s   |  tdd d S )Nr   r   )r  r]   r@  r  r   r   r   FORMAT_SIMPLE1  r  z'InstructionTranslatorBase.FORMAT_SIMPLEc                 C  s   |  |  d d S r   )r  r  r  r   r   r   FORMAT_WITH_SPEC4  r  z*InstructionTranslatorBase.FORMAT_WITH_SPECc                 C  s    | j  dkrdd | _dS dS )Nr   c                   S  s   dS NTr   r   r   r   r   r   :  rv  z>InstructionTranslatorBase.is_non_empty_graph.<locals>.<lambda>TF)r   count_callsrg  r   r   r   r   rg  7  s   
z,InstructionTranslatorBase.is_non_empty_graphadditional_stack_framesOptional[list[Any]]c                 C  s.   |d u rg }d t|  gtt| S )Nr   )r   rO  rZ  r{  r   r   )r   r?  r   r   r   format_frame_summary>  s   z.InstructionTranslatorBase.format_frame_summarytraceback.FrameSummaryc                 C  s(   t jt| jdd| jt| jddddS )NrI  	<unknown>rV  F)lookup_line)rO  FrameSummaryr  rU  r   r   r   r   r   r{  I  s   z'InstructionTranslatorBase.frame_summaryc                 C  s&   t | jdd}td}||d uS )NrI  rC  z.*torch/nn/modules.*)r  rU  recompilematch)r   r   nn_modules_patternr   r   r   is_co_filename_from_nn_modulesQ  s   
z8InstructionTranslatorBase.is_co_filename_from_nn_modulesr  c                 C  s,   | j |t|}tt|tj |S r   )	r   install_global_by_idr  r  r:   rF   r  r9   WEAKREF_ALIVE)r   r  rj  global_namer   r   r   store_global_weakref_by_idV  s
   z4InstructionTranslatorBase.store_global_weakref_by_idOptional[FakeTensorMode]c                 C  s
   | j jjS r   )r   tracing_context	fake_moder   r   r   r   rQ  ]  r   z#InstructionTranslatorBase.fake_modecheck_fn!Callable[[VariableTracker], bool]c                 c  s*    | j }|| _ z	dV  W || _ dS || _ w )zx
        Strict mode is enabled on a per-VariableTracker level depending on the return value of check_fn(node).
        N)r*  )r   rR  priorr   r   r   strict_translation_modea  s   z1InstructionTranslatorBase.strict_translation_moder   c                 C  sF   | j d usJ | j dksJ | j| jj| j| j d | j| j d  S r	  )r   r   r   rU  rI  r   r>  r   r   r   r   r  o  s   z#InstructionTranslatorBase.speculater>  r  r  r  rD  rU  types.CodeTyperd  r   r   distributed_stateOptional[DistributedState]r  Optional[tuple[types.CellType]]c                   s  t    || _|| _|| _|| _|| _|	| _d | _g | _	d| _
d | _td| _g | _g | _d| _d | _d| _g | _|| _|| _t| j| _|| _|| _|| _|| _|
| _|d uretjret|
||d| _ nd | _ i | _!i | _"|| _#d| _$d| _%d| _&d | _'d | _(d| _)d | _*g | _+|| _,t-j.dkrdd	l/m0}m1}m2}m3} |
j4||B |B |B @ r| 5t6d  || _7d| _8d gt9|
j: | _;t<=t>j?| _@tA=t>j?| _BtCD|
jE| d S )
Nr   rs  rH  T)r  r  rD  Fr(  r   )CO_ASYNC_GENERATORCO_COROUTINECO_GENERATORCO_ITERABLE_COROUTINE)Fr  r  r   rW  r   r  r  r  r  r  r   r+  r%   r!  r  r  r   r  r"  r$  r(  r>  r   r  r  r  r  rD  rU  r   replay_record_enabledr?   r)  nn_module_stack	num_callsrd  rm  r   rn  r'  r*  r,  r-  r.  r0  r,  r-  resume_executionrZ  r[  r\  r]  co_flagsr  r\   r%  r&  r   r  r  rj  r^  r   r_  ri  rd  rc  r[  	lazycacherI  )r   r   r>  r  r  r  rD  r  r  r  rU  rd  r%  r   r(  rW  r  r0  rZ  r[  r\  r]  r  r   r   r  y  sx   





z"InstructionTranslatorBase.__init__r   r   )r   r8  )r  rX   r   r  rD  r  r   r   )r  rX   r   rL  rD  r   r   r   r   )r   r   r   r   r   )r   r   r   r   r   r*   r   r   )r   r*   )rw  r*   r   r   r   r   )r  r  r   r   )r  r  r   r   r   rX   )r  r   r   r  )r   r*   r   r]   )r  r   r   rE   )r   r   r0  r   r  r   r   r   )r?  r   r   rX   )r  rX   r   rX   )r  rX   r   r   )r  rX   r   r'  )r.  r   r   r   r   r*   r  r   rj  r   r   r#  )r   r*   r   r  r   r   )rj  rX   r  r   r   rX   )r  rX   r  r   r   r   )F)r   r*   r  r   r   r   )r?  r@  r   r   )r   rB  )r  r   rj  r   r   r   r   rO  )rR  rS  r   r   )r   r   )NN)$r   r<   r>  r#  r  r   r  r   r  r   rD  r   r  r  r  r  r  r|   rU  rV  rd  r   r%  r   r   r   r(  r  rW  rX  r  rY  r0  r/  r   r   (  r   r   r   r   r1  rz  r<  r>  r@  rC  r   rN  rS  rZ  r`  re  rp  r,  r-  rk  propertyr  rh  r  r  r  r  r  r  r  r  r  r  r  LOAD_CLOSUREr  r7  r  r#  cached_propertyr  r  r  r   r  r  r  r  EAGER_IMPORT_NAMEr  r  r  r  JUMP_FORWARDJUMP_ABSOLUTEr  r<  not_r7  r=  r6  JUMP_IF_FALSE_OR_POPJUMP_IF_TRUE_OR_POPr   r  r  r  r  r	  r
  r  r  r  r  r;  r$  r!  r  r-  rl  r>  r?  rE  rF  rG  rH  rJ  r  r8  rT  rX  r\  r]  rZ  ra  r  rb  rf  rc  ri  r  ry  rl  rx  r  r  rk  r  ro   r  r  BUILD_TUPLE_UNPACK_WITH_CALLr  r  BUILD_MAP_UNPACK_WITH_CALLr  r  r  r  r  r  r  r  r  rs  rz  r  r  r  r  r  r  r  r  r  r  r  ry  r  r  r  DICT_UPDATEr  r  r  r  r  r6  r  r%  posr2  negUNARY_NEGATIVEr  invertUNARY_INVERTpowBINARY_POWERmulBINARY_MULTIPLYmatmulBINARY_MATRIX_MULTIPLYfloordivBINARY_FLOOR_DIVIDEtruedivBINARY_TRUE_DIVIDEr&  BINARY_MODULOBINARY_REMAINDERr   
BINARY_ADDsubBINARY_SUBTRACTgetitemBINARY_SUBSCRlshiftBINARY_LSHIFTrshiftBINARY_RSHIFTand_
BINARY_ANDor_	BINARY_ORxor
BINARY_XORipowINPLACE_POWERimulINPLACE_MULTIPLYimatmulINPLACE_MATRIX_MULTIPLY	ifloordivINPLACE_FLOOR_DIVIDEitruedivINPLACE_TRUE_DIVIDEimodINPLACE_MODULOINPLACE_REMAINDERiaddINPLACE_ADDisubINPLACE_SUBTRACTilshiftINPLACE_LSHIFTirshiftINPLACE_RSHIFTiandINPLACE_ANDixorINPLACE_XORior
INPLACE_ORr  r  r9  r  r  r  r:  r   r"  rt  JUMP_BACKWARD_NO_INTERRUPTPOP_JUMP_FORWARD_IF_TRUEPOP_JUMP_BACKWARD_IF_TRUEPOP_JUMP_FORWARD_IF_FALSEPOP_JUMP_BACKWARD_IF_FALSEr#  r$  r  r  r(  r*  r+  r,  r-  r.  r/  r3  r4  r5  rx  r9  r:  r;  r<  rg  rA  r{  rJ  rN  rQ  
contextlibcontextmanagerrU  r  r  r  r   r   r  r   r   ~  s   
 #


>)94#	

:
	
zQ2		  7		
'
	
!			































*@

$)	metaclassc                      s   e Zd Zed6ddZejd7ddZd8 fd"d#Zd9d$d%Z	d:d(d)Z
d;d*d+Zd9d,d-Zd<d0d1Zd<d2d3Zd<d4d5Z  ZS )=r  r   c                   C  s   t jS r   )tls
current_txr   r   r   r   r    s   z InstructionTranslator.current_txr   c                 c  s0    t tdd }| t_z	d V  W |t_d S |t_w )Nr  )r  r  r  )r   rT  r   r   r   set_current_tx  s   z$InstructionTranslator.set_current_txr>  r#  rU  rV  r  r   r  r  r  Optional[tuple[Any, ...]]torch_function_mode_stackrD  compiler_fnrm  r   rd  export_constraintsframe_stater   r   r(  r  rW  rX  r0  r/  r   c                   s  t  tjd|j d|d  d|d   t jdi dt||	| ||||||||dd|d	|d
|d|d|d|di di dd d|d|ddd|d|d|d| |   t| j	j
 |   |
| _|| _| jr|| js|J di | _t|  }t|dd }| D ]&\}}||vrd }|rt||i  }t|t|d|d}|| j|< q| j	j}|  D ].}||v r|| }t|ddd}t||}| }||| n| }||_|| j|< q|d usJ t|  |D ]5\}}t |}t|dd}z	t|j!|}W n t"y"   t#$ }Y nw |%|||}||_|| j|< qt&|| _'|rCt#j(| j| _W d    n1 sNw   Y  W d    d S W d    d S 1 sgw   Y  d S ) Nztorchdynamo start tracing  rI  r   rJ  r   )local_scoper  rU  r  r0  r>  r  r  r  r  rD  r  r  r  rU  rd  r%  r   r   r(  rW  r0  z4Export without one graph - something has gone wrong.dynamismT)is_inputr  )r  is_derefed_cell_contents)r  r   ))r   r   INFOrV  r  r  r<   _throw_if_in_functorchr   r   rP  r  rm  rd  r  r   r@  r.   r  r  r   	frozensetrk   r@  rH   r  r<  r'  r  r  rU  r>  rG   cell_contents
ValueErrorr   DeletedVariabletrack_cell_existingr|   r  realize_all)r   r>  rU  r  r  r  r  r  rD  r  rm  rd  r  r  r   r(  rW  r0  r@  r  r   rj  local_dynamismvarr  contents_sourcer  cell_varr  cell_sourcer  r   r   r    s   !
TzInstructionTranslator.__init__c                 C  s   t jd}t| jjd| jj}t jj	 }t jjj
jt jjj
jt jjj
jf}|d urS| |v rU||urW| j }d| d| d| d}tdd|g d	 d S d S d S d S )
Neagerr  zhIf you are reaching here, it means dynamo failed for one of the following reasons:
- Calling torch.func.zP(compiled_fn) function from eager mode is not supported. Ensure that torch.func.zp is also wrapped within a torch.compile function. For more information, see PyTorch issue #128711.
- torch.func.z2(fn) requires the function to be inlined by dynamoz%Unsupported functorch tracing attemptr   rm  )rU  _dynamolookup_backendr   getattr_staticr   r  _C
_functorchpeek_interpreter_stackTransformTypeVmapGradJvpr  r   lowerr6   )r   r  r  ciforbidden_keysr   r  r   r   r   r    s4   


	
z,InstructionTranslator._throw_if_in_functorchr  rJ   c                 C  s0   t |tr| j|j S t |tr| j|j S tr   )r.  rH   r  r  rE   r  rM  r  )r   r  r   r   r   get_example_value  s
   

z'InstructionTranslator.get_example_valuec                 C  s6   | j  D ]}t|trt| tjjr dS qdS r   )	r  rI  r.  r   r@  r  rU  nnModule)r   r   r   r   r   $symbolic_locals_contain_module_class  s   z:InstructionTranslator.symbolic_locals_contain_module_classc                 C  sL   t | jr | jd  }r"t|tr$t|| t d| jd< d S d S d S d S )NrH  r  )r   r  r.  re   rn   rN  rW   )r   r#  r   r   r   "replace_tos_if_return_is_generator  s   z8InstructionTranslator.replace_tos_if_return_is_generatorr   r*   c                 C  s4  |    | jd usJ | jd usJ t d| j| j  tjs?| j dkr?| j	s?| 
 s?| js?| js?| js?| js?tdd | _t tjd| jj d|j d td|j | jj| td|  gd	d
|jdkrndndd}t|dkszJ |d jrJ |jdkrtdntd|jd}| j |g t!)Nr  r   z#because no content in function callztorchdynamo done tracing r   rT  z%s triggered compilereturn_valueF)r  r2  r   rt  r3  r  )"r  r   r+  rQ   r  r   allow_empty_graphsr   r>  r&  r  rd  rm  r   rn  r   r}  r   r   r  rU  rV  r   r   ra  r~  r;   r{  r   r{  r%   r?  r  r  )r   r   r  return_instr   r   r   _return  sV   


zInstructionTranslator._returnc                 C  r  r   r  r  r   r   r   r2    r  z"InstructionTranslator.RETURN_VALUEc                 C  r  r   r  r  r   r   r   r3  	  r  z"InstructionTranslator.RETURN_CONST)r   r  re  )$r>  r#  rU  rV  r  r   r  r   r  r   r  r  r  r   rD  r   r  r   rm  r   rd  r   r  r   r  r   r   r   r(  r  rW  rX  r0  r/  r   r   r   )r  rJ   r   r   r   rd  )r   r   r   staticmethodr  r  r  r  r  r  r  r  r  r  r2  r3  r  r   r   r  r   r    s     
 




/r  r  c                 C  s<   g | ]\}}t td |v r|dd nd|dd  qS )INPLACEr)  NBINARY_)r  r  )r   r   r   r   r   r   r    s    $r  c                      s   e Zd ZU dZded< ded< ed>ddZed?ddZed@ddZ	dAddZ
dB fd d!ZedCd#d$ZdDd%d&ZdE fd(d)ZdF fd/d0ZdGd1d2ZdGd3d4ZdHd8d9ZdG fd:d;ZdG fd<d=Z  ZS )IrQ  z Trace and inline a called methodr  symbolic_resultr   r-  r   funcr   rD  r   c                 C  sP   t tdtd i | ||||}| W  d    S 1 s!w   Y  d S )NunimplementedrR  )r   r   rN   build_inline_tracerinline_call_)r   r-  r  r   rD  tracerr   r   r   rR    s   $z)InliningInstructionTranslator.inline_calltrace_rules.SkipResultc              
   C  sD  |   rtdt| dg d t| tr;t|  ddr;t|  dd }tdt|  d|   d	| d
dgd tj	| dd}|j
rddlm} tt| dd dra| jj|fv ratddS t| drj| jjnd}d| dg}d|  vr|d| ddg7 }tdd| d|   d|   d|j d| d |d |S )!NzInline attempt with __self__zAttempted to inline a function with the `__self__` attribute. Dynamo is expected to decompose method calls into function calls with a `self` argument.rm  _torchdynamo_disableF_torchdynamo_disable_msgz2Skip inlining `torch.compiler.disable()`d functionzSkip inlining function z= since it was wrapped with `torch.compiler.disable` (reason: rT  z(Remove the `torch.compiler.disable` callT)is_inlined_callr   )!produce_trampoline_autograd_applyr  _originz"allowlist in dynamo known functionr   zAvoid calling the function `r  r  z:Apply `@torch._dynamo.dont_skip_tracing` to the function `zw` to force tracing into the function. More graph breaks may occur as a result of attempting to trace into the function.z Please file an issue to PyTorch.z.Attempted to inline function marked as skippedz
qualname: z, name: z, filename: `z`, skip reason: z?Dynamo developers have intentionally marked that the function `z` should not be traced.)has_selfr6   r   r.  rh   r   r  get_functionr   check_verboseskippedtorch._dynamo.variables.miscr  r
  r  r  r  
SkipResultr   get_filenameget_namer   )r  r  r  r  fn_qualnamerq  r   r   r   check_inlineable#  sd   






	z.InliningInstructionTranslator.check_inlineablerX   r  c                   s  t |ttttfsJ |  d }jj}tj	s%|r%|j
 d  }r%|}|d u rOt |tr9tdd| dg d t|}|jdu sEJ tj	sO|rO||j
 < z	|||}W n. ty } z"tdjt|d|  d|  d	| j d
d |D |dd }~ww t| D ]}	t |	tstdd| d|	 dg tjd q jdv r|rt |d t j!stdd j d| d j dg d d}
t"j#j$j%&drdt'( '  }
t)j*dkrj+j,d# fdd}t-.d t/| t0.d! |
|j1 |r,t |d t2r,j3|d j4}t |t"j5j6r,t78|t9:|j;j<d"< t= r>t> |j?j@|}|S t |trFJ t |j?j@|}|S )$NzEAttempted to inline function marked as skipped (SkipFunctionVariable)z+Attempted to inline a SkipFunctionVariable zdAttempted to inline a function that was previously determined to be marked as intentionally skipped.rm  Fz;{reason}.
  func = {func}, args = {args}, kwargs = {kwargs}'z' r   c                 S  s   g | ]}|  qS r   )r/  )r   r  r   r   r   r    r  zEInliningInstructionTranslator.build_inline_tracer.<locals>.<listcomp>)r   r  r   rD  z:Encountered unconverted argument when attempting to inlinezfunc: z, arg: zWAn argument to an inlined function was not successfully converted to a VariableTracker.)r  __setattr__r   z2Unsupported __setitem__/__setattr__ inline attemptzcode name: z, args: zAttempted to inline z: where first argument (self) is not a user-defined object.r   bytecoder   r  r   r   c                    s6   j jjd} t }d j d|  d| S )N)r   zTRACE inlined call z from r   )rZ  	positionsr   rP   r]  rV  )headerr_  r  cur_instr-  parent_coder   r   get_trace_call_log_str  s
   zQInliningInstructionTranslator.build_inline_tracer.<locals>.get_trace_call_log_strra  zINLINING %s%s, %sru  r   )Ar.  rh   rf   rd   re   rP  r   rP  r   dont_skip_tracingpreviously_inlined_functionsr  rg   r6   rQ  r  r  	bind_args	TypeErrorr0   r  r   r   r  rJ  rG  rH  rI  rX   r   r8  rV  r   r   rU  r[  	_internal	log_stateis_artifact_enabledr  Bytecoder,  r-  r!  rU  trace_call_logra  rT   r   r   rx   r  r  r  r  r  r  r.   r  forward__code__r+   &InliningGeneratorInstructionTranslatorr  r  )r-  r  r   rD  r  tracing_ctxprevious_result
sub_localsr  r   r  r  moduler  r   r  r   r  a  s   	




"



z1InliningInstructionTranslator.build_inline_tracerc              
   C  s  | j }| j}t }|jr| |j}zez| |   W d    n1 s&w   Y  W nF tjyG } zd| d| }t	
|  d }~w tjye } zd| d| }t	
| t||d }~w tyr   t	
d|  w W | j|_n| j|_w | jjrtd S | jd usJ | j|ju r|j| j | j| jO  _t	
d| | jjj| tjst| tr| jrt |rt| tr| j!rt| tsJ g }t| jtr| jj"d u s| jg}tj#t$| |d d S | jS t |rt| tsJ | j% d u sJ t&| j't( dS | jS )	Nz!Observed exception DURING INLING z : zSKIPPED INLINING r   zFAILED INLINING %szDONE INLINING %sr  r  ))r-  rU  r  nullcontextr*  rU  r  r   r   r   ra  r}  r7   r  r   r   r  r]   r@  r  r  r  r  r&  rP  traced_coder   r   rO  r.  r  is_generator_from_ctx_managerr+   generator_exhaustedrj  r  r  r  rn   generated_itemsrW   )r   r-  r  
strict_ctxr  r  r   r   r   r   r    sz   






z*InliningInstructionTranslator.inline_call_r  rV  r  r  r  r  r|   funcvarrc   r   c                   s.  |  }|d }t|ts|j}|jj}	d }
|	r#|	j r#|	j  }
|
d u r6t }
t	|
 |	r6|
|	j < t
 jdi d|jdi d|d|d|d|d|d	|
d
 fddt D d d|jd|jd d|jd|jd|jd|j || _|| _|j| _d | _|j | _|j| _d S )N__builtins__r   r  r  r  r  r  r  r>  rD  c                   s   i | ]}|t  |qS r   )r  rn  r  r   r   r   S  r  z:InliningInstructionTranslator.__init__.<locals>.<dictcomp>rU  rd  r%  r   r   r(  rW  r0  r   )get_globalsr.  r   __dict__r   rP  previously_cleaned_instructionsr  r    r   r  r  r)   rd  r%  r   r(  rW  r0  r"  r-  r`  r  r_  r  rm  )r   r-  r  r  r  r  r"  r  r  r  r>  r  r$  r   r  *  sj   	


	

z&InliningInstructionTranslator.__init__rO  c                 C  s   | j jS r   )r-  rQ  r   r   r   r   rQ  c  s   z'InliningInstructionTranslator.fake_modec                 C  s   t | j S r   )r   r  r-  r{  r   r   r   r   r  g  r  z)InliningInstructionTranslator.run_ctx_mgrr   c                   s"   t jr| j s
dS t  S dS r   )r   r|  r-  ry  r  r   r  r   r   ry  j  s
   

z:InliningInstructionTranslator.should_compile_partial_graphr   r*   r  rj  r#  c                   s*   t jrt |||S tdddg d d S )NzGraph break in inlined functionr   z2Graph breaks in an inlined call are not supported.rm  )r   r|  r  r  r6   )r   r   r  rj  r  r   r   r  q  s   
z3InliningInstructionTranslator.create_call_resume_atc                 C  s   |   | _d | _tr   )r  r  r   r  r  r   r   r   r2    s   
z*InliningInstructionTranslator.RETURN_VALUEc                 C  s   |  || _d | _tr   )r  r  r   r  r  r   r   r   r3    s   z*InliningInstructionTranslator.RETURN_CONSTr   r   #tuple[Any, VariableTracker, Source]c           	      C  s   d| j v r4| j d ds4| j d }| |}d|v r#tjjj| }nt|}t| ||}t	||}n| j
d| j }t|}| j }t| ||}t||}t|rWt|}|||fS )Nr   namedtuple_r  ___unnamed_scope)r  r  r  rU  r0  r  r  r   rZ   rC   r   rK  rE   rD   r3  rI   )	r   r   r  r  r  fglobals_vtglobal_sourceglobals_nameglobals_sourcer   r   r   get_globals_source_and_value  s.   



z:InliningInstructionTranslator.get_globals_source_and_valuec                   s   |j }|| jvr| |S | jj| ju rt | d S | |\}}}| jj	||r9| 
| jj|| d S | j| }| 
t| || d S r   )r?  r  r  r   r  r  r  r/  r  has_pending_mutation_of_attrr  	load_attrrX   r  )r   r   r   r   r+  r,  rj  r  r   r   r    s   


z*InliningInstructionTranslator._load_globalc                   sn   | j j| ju rt | d S |  }t|tr!td|j	dg d |j	}| 
|\}}}| j j||| d S )Nz3Storing Tensor hook handle in globals (inline call)r  rm  )r   r  r  r  r  r  r.  r~   r6   r?  r/  r  rg  )r   r   rj  r   _fglobals_valuer+  r   r  r   r   r    s   
z*InliningInstructionTranslator.STORE_GLOBAL)
r-  r   r  r   r   r   rD  r   r   r   )r  r   r   r  )
r-  r   r  rX   r   r  rD  r   r   rQ  rf  )r-  r   r  rV  r  r  r  r  r  r|   r"  rc   r   r   rh  re  r   rg  rd  )r   r   r   r(  )r   r   r   r   r   r   rR  r  r  r  r  r  ri  rQ  r  ry  r  r2  r3  r/  r  r  r  r   r   r  r   rQ    s.   
 = 
G9



'rQ  c                      sl   e Zd ZU ded< d fdd	ZdddZdddZd fddZd fddZdddZ	dddZ
  ZS )r  r  r   r   r   rD  r   r   c                   s(   t  j|i | g | _d| _d| _d S r   )r  r  r   r  r  )r   r   rD  r  r   r   r    s   
z/InliningGeneratorInstructionTranslator.__init__r   r*   c                 C  s\   |   }| j| t| jtkrtdt | t	
d  tjs'| jr,|| _td S )NzqToo many yield values in generator. Maybe you are inlining an infinite generator. If not, please report a bug at )r  r   r   r   rj   r   InfiniteGeneratorErrorPT2_ISSUE_TRACKER_URLr  r]   r@  r   rO  r  r  r  )r   r   topr   r   r   YIELD_VALUE  s    z2InliningGeneratorInstructionTranslator.YIELD_VALUEc                 C  sB   | j d }t|ts|   tt| |gi }| | d S d S r!  )r  r.  rn   r  r\   rI  r   r  )r   r   r#  resr   r   r   GET_YIELD_FROM_ITER  s   

z:InliningGeneratorInstructionTranslator.GET_YIELD_FROM_ITERc                      d| _ t |S r=  )r  r  r2  r  r  r   r   r2       z3InliningGeneratorInstructionTranslator.RETURN_VALUEc                   r9  r=  )r  r  r3  r  r  r   r   r3    r:  z3InliningGeneratorInstructionTranslator.RETURN_CONSTc              
   C  s   t | jdks	J |  }| jd }t|tr|jd u s$tdddg d z|| }W n. tt	j
fyY } zt|t	j
rAt	|  |   | t|j W Y d }~d S d }~ww t| jtre| jdksgJ |  jd8  _| | | | d S )	Nrq  rH  Unreachable sub-generator coder   @Should only be encountered while implementing generator support.rm  r   r   )r   r  r  r.  r]   rj  r6   r  r  r   r  r  r  r@  r   r   r6  r   r   r  r#  exr   r   r   
YIELD_FROM  s2   

 


z1InliningGeneratorInstructionTranslator.YIELD_FROMc              
   C  s  t | jdks	J |  }| jd }t|ttfs&t|trvt|jtj	j
rvt|trl|jd u rlz|| }W n- ttjfyd } ztjdk rK|   | t|j | | W Y d }~d S d }~ww | | d S tdddg d d S tdd	t| d
t| dg d d S )Nrq  rH  r  r;  r   r<  rm  zSEND with bad typez
TOS type: z(Attempted to SEND with unsupported type r+  )r   r  r  r.  rm   re   r   rj  r	  r
  Iteratorr]   r  r  r   r  r,  r-  r  r@  r  r6   rV   r=  r   r   r   SEND'  s>   



z+InliningGeneratorInstructionTranslator.SEND)r   r   rD  r   r   r   rd  )r   r   r   r   r  r6  r8  r2  r3  r?  rA  r  r   r   r  r   r    s   
 


&r  )r   r   r   r   )r   r   )r   r   r   r   )r  r  r   r  )r&  r'  r   r   )r   r   r4  r5  r  r   r   r   )r   FN)
rD  r   r   r   rE  r   rF  rG  r   r   )r4  r5  r  r   r   rg  )r  r   r   r  )r   
__future__r   r	  collections.abcr  r  r   r  r#  r   r   rG  r[  r   r<  rF  r,  	threadingrO  r/  r  r   typingr   r   r   r   r   r	   r
   typing_extensionsr   r   unittest.mockr   rU  torch._loggingtorch._dynamo.excr   r   torch._guardsr   r   torch._logging.structuredr   %torch.fx.experimental.symbolic_shapesr   torch.utils._functoolsr   r   r   r   r   r   r   r   bytecode_analysisr   r   r   r   bytecode_transformationr    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   codegenr/   r0   r1   r2   r3   r4   r5   r6   r7   funcname_cacher8   guardsr9   r:   output_graphr;   r<   	polyfillsr=   replay_recordr>   r?   ra  r@   rA   rB   r  rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   utilsrM   rN   rO   rP   rQ   rR   rS   rT   rU   variables.baserV   rW   rX   variables.builderrY   rZ   r[   variables.builtinr\   variables.constantr]   variables.ctx_managerr^   r_   r`   variables.dictsra   rb   variables.functionsrc   rd   re   rf   rg   rh   ri   variables.iterrj   variables.lazyrk   variables.listsrl   rm   rn   ro   rp   rq   variables.miscrr   rs   rt   ru   rv   rw   variables.nn_modulerx   variables.tensorry   rz   r{   variables.torch_functionr|   r}   variables.user_definedr~   r   r   r   r   r   r   torch._subclasses.fake_tensorr   r0  r   	getLoggerr   r   r[  getArtifactLoggerr]  r  rd  rj  r  r  r   r   r   containsr   r   ro  r   r4  r   cacher   	dataclassr   r   r   r   r   r   r  r   r  r  rK  r   r  r  r  r%  r3  rC  r`  rf  r  r  r  r  r  r   r  r-  _nb_opsr  rQ  r  r   r   r   r   <module>   s@   $ @(
(
,$	  	
	C!


	B
Q  
	 

b                       	   C