U
    zh                    @   s  U 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Zd dlmZmZmZmZmZmZmZ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&mZ'm(Z(m)Z) ddl*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 dd	l9m9Z9 dd
l:m;Z; ddl&m<Z<m=Z=m>Z>m?Z? ddl@mAZA ddlBmCZCmDZD ddlEmFZFmGZG ddlHmIZImJZJ ddlKmLZLmMZM ddlNmOZOmPZPmQZQmRZRmSZSmTZT ddl(mUZUmVZV ddlWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^ ddl_m`Z`maZambZbmcZc ddldmeZemfZf ddlgmhZh ddlimjZj ddlkmlZlmmZmmnZn ddlompZpmqZq ddlrmsZsmtZtmuZumvZvmwZw ddlxmyZymzZzm{Z{m|Z|m}Z} ddl~mZmZmZmZmZmZ ddlmZ ddlmZmZmZ ddlmZmZmZ eeZejed Zejed!Zejed"Zejed#Ze Zd$d% e D Zeeef ed&< ehejjZehejjZd'd( ed)< d*d( ed+< ejG d,d- d-ZejG d.d/ d/Zedd0d1 ZejG d2d3 d3ZG d4d5 d5eZejd6ef d7d8d9Zd:ejegef ed;d<d=Zejegef ed>d?d@ZdAZdBdC ZG dDdE dEeZG dFd: d:edGZG dHdI dIeZejdJkrdKdL ejD ZG dMdN dNeZG dOdP dPeZdS )Q    N)	AnyCallablecastDictListOptionalSetTupleType)patch)tracingTracingContext   )configexcloggingtrace_rules	variables)get_indexofJUMP_OPNAMESlivevars_analysispropagate_line_nums)	cleaned_instructionscreate_call_functioncreate_instructioncreate_jump_absolutecreate_swapget_code_keysInstructionis_generator	unique_id)code_context)	PyCodegen)ArgsMismatchErrorBackendCompilerFailedunimplementedUnsupported)get_funcname)GuardBuilderinstall_guard)GraphCompileReasonOutputGraph)DummyModuleExecutionRecorder)ContinueExecutionCacheReenterWith)
AttrSourceGetItemSourceGlobalSourceGlobalWeakRefSourceLocalSourceSource)is_builtin_constantis_forbidden)countersget_fake_valueget_instruction_source_311graph_break_dup_warning_checkeristype
LazyStringproxy_args_kwargs)is_side_effect_safeMutableLocaltypestrVariableTracker)VariableBuilderwrap_fx_proxy)BuiltinVariable)ConstantVariable)ContextWrappingVariableGenericContextWrappingVariableWithExitFunctionVariable)ConstDictVariableSetVariable)BaseUserFunctionVariableNestedUserFunctionVariableSkipFunctionVariableUserFunctionVariableUserMethodVariable)BaseListVariableListIteratorVariableListVariableSliceVariableTupleVariable)ClosureVariableGetAttrVariableInlinedClosureVariableNullVariablePythonModuleVariableUnknownVariable)NNModuleVariable)supported_comparison_opsSymNodeVariableTensorVariable)RemovableHandleVariableUserDefinedClassVariableUserDefinedObjectVariableZgraph_breaksZ
trace_callZtrace_sourceZtrace_bytecodec                 C   s   i | ]\}}|t |jqS  )rE   call_function.0kvrc   rc   P/var/www/html/venv/lib/python3.8/site-packages/torch/_dynamo/symbolic_convert.py
<dictcomp>w   s     rj   compare_op_handlersc                 C   s   t | t|i S N)handle_containsreversedtxargs_rc   rc   ri   <lambda>|   s     rs   inc                 C   s   t | t| t|i gi S rl   )
handle_notrm   rn   ro   rc   rc   ri   rs      s     znot inc                   @   sJ   e Zd ZU eed< eed< eed< dZeed< dZe	e
 ed< dd	 ZdS )
SpeculationEntryfilenamelinenoinstruction_pointerFfailedNreasonc                 C   s.   d| _ | jdk	r| jj}nd}tj|ddS )z\
        Start tracing of the current frame over again, and don't take this branch.
        TNz!Unknown fail_and_restart_analysis)restart_reason)rz   r{   r   ZSpeculationRestartAnalysis)selfr|   rc   rc   ri   fail_and_restart_analysis   s
    

z*SpeculationEntry.fail_and_restart_analysis)__name__
__module____qualname__str__annotations__intrz   boolr{   r   r*   r~   rc   rc   rc   ri   rv      s   
rv   c                   @   sX   e Zd ZU dZejedZee	 e
d< dZee
d< dd Zdd	 Zeee	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_factoryentriesr   indexc                 C   s
   d| _ d S Nr   )r   r}   rc   rc   ri   restart   s    zSpeculationLog.restartc                 C   s   | j   d| _d S r   )r   clearr   r   rc   rc   ri   r      s    
zSpeculationLog.clear)rw   rx   returnc                 C   s   t | j| jkr$| jt||| | j| j }|  jd7  _|j|kr\|j|kr\|j|kstt	
d| j dt | j d|j d|j d|j d| d| d| d|S )	z
        Lookup or create a SpeculationEntry() that is shared across
        RestartAnalysis calls.  Args are used only for debug checks.
        r   z'
            SpecuationLog diverged at z of z:
            - Run1: :z (ip=z)
            - Run2: z6)
            Please submit a bug report.
            )lenr   r   appendrv   ry   rw   rx   AssertionErrortextwrapdedent)r}   rw   rx   ry   entryrc   rc   ri   next   s>    zSpeculationLog.nextN)r   r   r   __doc__dataclassesfieldlistr   r   rv   r   r   r   r   r   r   r   rc   rc   rc   ri   r      s   
r   c                   C   s
   t tS rl   )torchdynamo_loggingZget_step_loggerlogrc   rc   rc   ri   _step_logger   s    r   c                   @   sV   e Zd ZU eed< eed< dZee ed< dZee	 ed< dd Z
dd	 Zd
d ZdS )BlockStackEntryinsttargetNstack_indexwith_contextc                 C   s
   | j d k	S rl   )r   r   rc   rc   ri   can_restore   s    zBlockStackEntry.can_restorec                 C   s>   | j d k	st| jr0| jjr0t| j t| jjS t| j S d S rl   )r   r   r   target_valuesr/   tupler   rc   rc   ri   	resume_fn   s    zBlockStackEntry.resume_fnc                 C   s   | j d k	st| j |S rl   )r   r   exit)r}   rp   rc   rc   ri   r      s    zBlockStackEntry.exit)r   r   r   r   r   r   r   r   r   rG   r   r   r   rc   rc   rc   ri   r      s   
r   c                   @   s   e Zd ZdS )ReturnValueOpN)r   r   r   rc   rc   rc   ri   r      s   r   .)fnc                    s<   t t| jt|  t| dtd fdd}|S )NInstructionTranslatorBaser}   r   c                    s   |   | | i  d S rl   )pushrd   popnr   Zfn_varnargsrc   ri   impl   s    zstack_op.<locals>.impl)r   inspect	signature
parametersrE   	functoolswrapsr   )r   r   rc   r   ri   stack_op   s
    r   r   )r}   truth_fnr   c                 C   s   |t jk	s|rdS t| jts"t| j}| j| }tjdk rV|j	dksP|j
dkrddS n|j	dkrddS |d7 }d}| j| }|j	dkrt|j
tsdS |j
}|d7 }| j| }|j	d	krdS |d7 }|j	d
kr|d7 }| j| }|j	dkrdS | t| dS )NF)   	   LOAD_GLOBALr   LOAD_ASSERTION_ERRORr   zassertion error
LOAD_CONST)CALL_FUNCTIONPRECALLCALLr   RAISE_VARARGST)operatortruth
isinstancery   r   r   instructionssysversion_infoopnameargvalr   r   rF   create)r}   r   r   Zcurrent_instruction_pointerr   	error_msgrc   rc   ri   &_detect_and_normalize_assert_statement   s:    









r   )r   r   c                    s*   dfdd	 dt d fdd}|S )	N c                    s   |   std |  r:d|   }t| t|| | t	d | j
j| tdt| | |  gd |   | | j} r| | | |j}| j
t|j|d dg| |  d S )N"should_compile_partial_graph=FalseBSkipping frame because there is a graph break in a for/while loop
zgeneric_jump triggered compilezgeneric_jump r{   r   )r   )should_compile_partial_graphr%   maybe_has_backedgeframe_summaryr   infor   	SkipFramer   debugoutputcompile_subgraphr*   rA   popcreate_call_resume_atnext_instructionr   add_output_instructionsr   r   )r}   r   value	extra_msgmsgZif_nextZif_jumpr   rc   ri   jump_graph_break6  s0    



 
z&generic_jump.<locals>.jump_graph_breakr   r   c              
      s  |   }tjr8t| r8|   }| rPt| rD| |S  | || t|t	r| j
jdtjft||fi   | | d S t|tr|j}t|tjs|dk}tjjj|}|std | | d S | j
jdtjft|fi  }t| |t|j| d}| j
jdtjft||fi   | | d S | rn| rr`| | | | nt|t	r|  r | || nxt|tr| j
|j}|rr| | | | n6t|t r|!| d}	t|	t"r|!| d}	t|	t#rp|	$| g i }t|t%rft|j&tt'frf|j&rnrZ| | | | ntd n$drr| | | | ntt|t	s|(| rt)|*| rr| | | | n*t|trvz|+| j
}
W nP t,j-k
rN } z.|  r< | ||d	| d
 W Y S  W 5 d }~X Y nX |
rrj| | | | nt|t.j/rdrr| | | | nbddl0m1} |j0d k	r||j0r|2 rr| | | | nt,j-t,j3j4dddd S )Nrd   r   zKAssertion failed on symbolic shapes. Did you make sure eager mode succeeds?)Zexample_value__bool____len__z@generic_jump on UserDefined with __bool__ returning non-constantT
)r   r   )is_constant_sourcezDynamic control flow is not supported at the moment. Please use functorch.experimental.control_flow.cond to explicitly capture the control flow.Zcond_operands)Z	case_name)5r   r   Z rewrite_assert_with_torch_assertr   is_python_constantr   as_python_constantjumpr   r_   r   Zcreate_proxytorchZ_assert_asyncr>   r^   sym_numZSymBoolfxZexperimentalZsymbolic_shapesZexpect_truer%   Zscalar_tensorrD   r9   noder   r   r\   get_submodule
module_keyrb   Zvar_getattrrW   rP   rd   rF   r   r   has_unpack_var_sequencer   unpack_var_sequenceZevaluate_exprr   Z	UserErrorr   ZBackwardHookVariablesourcer   Zget_real_valueZUserErrorTypeZDYNAMIC_CONTROL_FLOW)r}   r   r   r   Zsym_exprresultZscalar_to_tensor_proxyZscalar_to_tensormodxZeval_resulter   r   r   r   rc   ri   innerU  s    





 






 









zgeneric_jump.<locals>.inner)r   )r   )r   r   r   rc   r   ri   generic_jump5  s     r   Fc                    s    fdd}|S )Nc                    s:   t dtd fdd}dttdfdd |S )Nr   r   c           	         s  |   }|jr*|jd k	st | ||jS z| |W S  tk
rv } z| jdkrf|  td t|t	j
rt |  s~ |j}z|d j|d jf}W n* tk
r   | j}|d |d f}Y nX ttjr
ts
t|r
dt|}tjd|dd	 ntjd|  |  rFd|   }t| t	 |||  |!d t"|j#||_W 5 d }~X Y nX |$  d S )Nr   z0Graph break under GenericContextWrappingVariableco_filenameco_firstlinenor   z"Graph break: from user code at:
%sTexc_info<Unsupported break in user code at %s:%s (details suppressed)r   graph_break)r   )%	speculaterz   r{   r   r&   generic_context_manager_depthremove_from_statsr%   r   r   ZUncapturedHigherOrderOpErrorr   Z
real_stackrw   rx   
IndexErrorcode_optionsgraph_break_logisEnabledForr   DEBUGexplainr;   addjoin	tracebackformat_listr   r   r   r   r   r   add_to_statsr*   r   r~   )	r}   r   speculationZexcpZ
user_stackZ	frame_locr  Zuser_stack_formattedr   handle_graph_breakinner_fnrc   ri   wrapper  s`    


	 


 z>break_graph_if_unsupported.<locals>.decorator.<locals>.wrapper)r}   r   r{   c           
         s  | j j| |d t| }g }| jD ]6}|jd k	s4t|j| || 	|j
| q"| j |  ~tjdkr|jdkr| jd k	r| j nd}t|dkr| j td|dg | j t|jd n,|jd kstt|}d |_| j |g | j | tjdkrVtjd	k rV|jdkrVttjd
 |jttjd |j }nt|j|j}|  |  t D ]}	| t   q|| j | !| j" d S )Nr   r      r   rc   r   KW_NAMESr   Fr      r   )#r   r   r"   block_stackr   r   reconstruct_typeextend_outputr   Z
try_exceptr  r   get_instructionsr   r   r   kw_namesr   r   r   r   argr   copyexn_tab_entrydisstack_effectopmapopcoder   ranger   r[   r   r   )
r}   r   r{   cgcleanupbr  Z	inst_copyr!  rr   r   rc   ri   r  1  sZ    


 
zIbreak_graph_if_unsupported.<locals>.decorator.<locals>.handle_graph_break)r   r   r   r*   )r  r  r   r  ri   	decorator  s    E9z-break_graph_if_unsupported.<locals>.decoratorrc   )r   r(  rc   r   ri   break_graph_if_unsupported  s     r)  c                       s    e Zd ZdZ fddZ  ZS )BytecodeDistpatchTableMetazTInstalls a `cls.dispatch_table` on every subclass to speed up calls to self.OPCODE()c                    sN   t  ||| dd   fddtj D fddtdD _d S )Nc                 W   s   t d|   d S )Nz	missing: r%   )r   rq   rc   rc   ri   _missingu  s    z5BytecodeDistpatchTableMeta.__init__.<locals>._missingc              
      s&   i | ]\}}|t |t |qS rc   )getattrr   partial)rf   r   op)r,  clsrc   ri   rj   x  s    z7BytecodeDistpatchTableMeta.__init__.<locals>.<dictcomp>c                    s   g | ]}  |qS rc   )getrf   i)dispatch_tablerc   ri   
<listcomp>|  s     z7BytecodeDistpatchTableMeta.__init__.<locals>.<listcomp>   )super__init__r   r"  itemsr$  r4  )r0  namebasesdct	__class__)r,  r0  r4  ri   r8  r  s    z#BytecodeDistpatchTableMeta.__init__)r   r   r   r   r8  __classcell__rc   rc   r=  ri   r*  o  s   r*  c                       s  e Zd ZU eed< eeef ed< eeef ed< ee ed< e	e
 ed< eed< ee ed< e
ed< e	e ed	< eed
< ee ed< e
ed< eed< e	e ed< ee ed< ee ed< e	e ed< e	eegef  ed< dd Zdd Zdd Zdd Zeee eeef dddZdd Zd8d!d"Zd#d$ Zd%d& Zd'd( Zejd)kr\d*d+ Znd,d+ Ze d-d. Z!d/d0 Z"d1d2 Z#d3d4 Z$e	e d5d6d7Z%ee d8d9d:Z&ed;d<d=Z'e
ee d>d?d@Z(dAdB Z)dCdD Z*dEdF Z+dGdH Z,e+Z-dIdJ Z.dKdL Z/dMdN Z0dOdP Z1dQdR Z2dSdT Z3dUdV Z4dWdX Z5dYdZ Z6d[d\ Z7d]d^ Z8d_d` Z9dadb Z:e:Z;e:Z<e=e>j?dcZ@e=e>jAdcZBe=e>j?ddZCe=e>jAddZDdedf ZEdgdh ZFdidj ZGdkdl ZHdmdn ZIdodp ZJdqdr ZKdsdt ZLdudv ZMdwdx ZNdydz ZOd{d| ZPd}d~ ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYeZdddd Z[eZdddd Z\eZdddd Z]dd Z^dd Z_dd Z`dd Zadd Zbdd Zcdd Zddd Zedd Zfdd Zged;ddZheZdddd Zidd Zjdd Zkdd Zldd Zmdd ZneofddZpdd ZqeqZrdd Zsdd ZtetZuddÄ Zvddń ZwddǄ ZxddɄ Zydd˄ Zzdd̈́ Z{ddτ Z|ddф Z}ddӄ Z~ddՄ Zddׄ Zddل Zddۄ Zdd݄ Zdd߄ Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZeZdd Zdd Zdd Zdd Zdd Zdd Zee>jZee>jZee>j?Zee>jZee>jZee>jZee>jZee>jZee>jZee>jZee>jZee>jZee>jZeZddee>jZee>jZee>jZee>jZee>jZee>jZee>jZee>jZee>jZee>jZee>jZee>jZee>jZee>jŃZee>jǃZee>jɃZee>j˃Zee>j̓Zee>jσZee>jуZdd Zejd)krdd Zdd ZՐd d Z֐dd ZeZdddd Zؐdd Zِdd	 Ze:Ze:Ze=e>jAdcZe=e>jAdcZe=e>j?dcZe=e>j?dcZd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd9d&d'Zd(d) Zd*d+ Ze d,d- Zd.d/ Zejeegef d0d1d2Zed;d3d4Zeee eeef eeef eeef eeef eeef eeef ejee
ed5 fd6d7Z  ZS (:  r   r   symbolic_localssymbolic_globalsstackry   current_instructionr  rx   r  accept_prefix_instprefix_instsinline_depthinconsistent_side_effectscurrent_speculationr4  exn_vt_stackexec_recorderstrict_checks_fnc                 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)rG  r   rc   rc   ri   mark_inconsistent_side_effects  s    z8InstructionTranslatorBase.mark_inconsistent_side_effectsc                 C   s^   | j j}| jd k	st| j| jd  D ]2}|jdkr: dS |jtkr&|j}||k r& dS q&dS )N)RETURN_VALUERETURN_CONSTFT)rC  offsetry   r   r   r   r   r   )r}   Z
cur_offsetr   Zjump_offsetrc   rc   ri   r     s    

z,InstructionTranslatorBase.maybe_has_backedgec                 C   sT   t | dsNt| jd pg t| jd p(g  | _t| trN|  j| j 7  _| jS )N_cell_and_freevarsco_cellvarsco_freevars)hasattrr   r  rP  r   InliningInstructionTranslatorparentcell_and_freevarsr   rc   rc   ri   rV    s    

z+InstructionTranslatorBase.cell_and_freevarsc                    sJ   t | j| j  t|  B   fdd| j D | _| jj	|  d S )Nc                    s   i | ]\}}| kr||qS rc   rc   re   readsrc   ri   rj     s      z?InstructionTranslatorBase.prune_dead_locals.<locals>.<dictcomp>)
r   r   rC  setrV  r@  r9  r   side_effectsZprune_dead_object_newr   rc   rW  ri   prune_dead_locals  s    
z+InstructionTranslatorBase.prune_dead_locals)r   rq   kwargsc                 C   s   t |tstt |tstt |ts*ttdd t|| D sLtd }t	|dr`|j
}t	|drp|j}|rt|rt|rtd| | || || d S )Nc                 s   s   | ]}t |tV  qd S rl   )r   rB   rf   r   rc   rc   ri   	<genexpr>  s   z:InstructionTranslatorBase.call_function.<locals>.<genexpr>r   r   z$Attempt to trace forbidden callable )r   rB   r   r   dictall	itertoolschainvaluesrS  r   r   callabler7   r   rd   )r}   r   rq   r\  r  rc   rc   ri   rd     s    

z'InstructionTranslatorBase.call_functionc                 C   s   t | |||S )zF
        A call to some user defined function by inlining it.
        )rT  inline_call)r}   r   rq   r\  rc   rc   ri   inline_user_function_return  s    z5InstructionTranslatorBase.inline_user_function_returnNc                 C   st   |d kr| j }| jdkr&d| j dnd}t| jj|}|d krDdn
d| d}| jj d| d| jj | | S )Nr   z (inline depth: )r    (r   z in )rx   rF  r'   f_coder   co_name)r}   rx   Zinline_depth_strfuncnameZfuncname_strrc   rc   ri   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    )rl  	linecachegetlineri  r   rx   rstrip)r}   Zlog_strlinerc   rc   ri   get_log_starts_line_log_str  s    z5InstructionTranslatorBase.get_log_starts_line_log_strc                 C   sL   | j |krd S || _ t| jj|| jj ttj	rHt
dt| j d S )N%s)rx   r   Zset_current_locri  r   rj  trace_source_logr  r   r  r   r=   rq  )r}   rx   rc   rc   ri   starts_line  s    
  z%InstructionTranslatorBase.starts_linec                 C   s8  | j }|dkrdS | j|  | _}|d | _ |jr>| |j | jsp|  rp|  rp|  | _| jj	rp| 
|S ttjrtd|j|j| j | | z| j|j | | | jj W S  tjk
r   |   Y dS  tk
r   Y dS  tk
r(   | jdkrtd  tjddd Y nX | j  dS )	z<Process exactly one instruction, return False we should exitNFr   zTRACE %s %s %sTzempty checkpointzstep triggered compiler   )ry   r   rC  rt  rB  r   is_non_empty_graphr   rH  rz   step_graph_breaktrace_bytecode_logr  r   r  r   r   r   update_block_stackr4  r#  r   Zshould_exitr   ObservedExceptionexception_handlerr   r&   r   r~   )r}   ipr   rc   rc   ri   step	  sL    


   

zInstructionTranslatorBase.stepr  c                 C   sx   |j }|rHt| jdkrt|j| jd jk	rt|j| jd jkrt| j  n,| jrt|jdkrtt| jdksjt| j  d S )N   r   )NOPJUMP_BACKWARDr   )r  r   r  r   r   r   r   )r}   r   r   rc   rc   ri   rx  6  s    	z,InstructionTranslatorBase.update_block_stackc                 C   s   d S rl   rc   r   rc   rc   ri   rx  _  s    c                 C   s   | j | j S rl   )r   ry   r   rc   rc   ri   r   b  s    z*InstructionTranslatorBase.next_instructionc                 C   sT   | j jrt| jd k	st| j j| dtd|  gd | j t|g| j	  d S )NTZstep_unsupported)Zpartial_convertr{   )
r   Zoutput_instructionsr   rH  r   r*   r   r   r   r   )r}   Zcontinue_instrc   rc   ri   rv  f  s    z*InstructionTranslatorBase.step_graph_breakc                 C   s
   t d S rl   )r   current_framer   rc   rc   ri   run_ctx_mgrs  s    z%InstructionTranslatorBase.run_ctx_mgrc                 C   s   |    zjz| j|  |  r$qW nJ tk
r<    Y n6 t	k
rp } z| j
r^| j
 |_ W 5 d }~X Y nX W 5 | j  t| tr| j  X W 5 Q R X d S rl   )r  r   Zpop_txr   InstructionTranslatorr&  Zpush_txr|  r$   	ExceptionrJ  Z
get_recordZexec_record)r}   r   rc   rc   ri   runy  s    


zInstructionTranslatorBase.run)valc                 C   s4   |d ks$t |ts$tdt| | j| d S )Nz"push expects VariableTracker, got )r   rB   r   rA   rB  r   )r}   r  rc   rc   ri   r     s    
 zInstructionTranslatorBase.push)valsc                 C   s   |D ]}|  | qd S rl   r   )r}   r  r  rc   rc   ri   	push_many  s    z#InstructionTranslatorBase.push_manyr   c                 C   s
   | j  S rl   )rB  r   r   rc   rc   ri   r     s    zInstructionTranslatorBase.pop)nr   c                    s   t  fddt|D S )Nc                    s   g | ]}   qS rc   r   )rf   rr   r   rc   ri   r5    s     z2InstructionTranslatorBase.popn.<locals>.<listcomp>)rn   r$  )r}   r  rc   r   ri   r     s    zInstructionTranslatorBase.popnc                 C   s   |j }| jr*|| jkr*| j|| j|  z| | j|   W nb tk
r   |drz| | j|	dd  W q tk
r   t
d Y qX nt
d Y nX |dr| j| d S )N.Zimplicitzundefined LOAD_FAST (implicit)zundefined LOAD_FASTZ___stack)r   rJ  f_localsadd_local_varr   r@  unwrapKeyError
startswithreplacer%   r   )r}   r   r:  rc   rc   ri   	LOAD_FAST  s    

z#InstructionTranslatorBase.LOAD_FASTc                 C   sn   |j |  kst| jr<|j | jkr<| j|j | j|j   |j | jkrXtd|j   | | j|j   d S )Nzundefined LOAD_DEREF )	r   rV  r   rJ  r  r  r@  r%   r   r   rc   rc   ri   
LOAD_DEREF  s    z$InstructionTranslatorBase.LOAD_DEREFc                 C   s&   |   }|j}|| || j|< d S rl   )r   r   Zset_name_hintr@  )r}   r   Z	loaded_vtr:  rc   rc   ri   
STORE_FAST  s    
z$InstructionTranslatorBase.STORE_FASTc                 C   s   | j |j= d S rl   )r@  r   r   rc   rc   ri   DELETE_FAST  s    z%InstructionTranslatorBase.DELETE_FASTc                 C   s   |  t|jd d S N)r:  )r   rV   r   r   rc   rc   ri   LOAD_CLOSURE  s    z&InstructionTranslatorBase.LOAD_CLOSUREc                 C   sF   |j }|d krtj|jdS | j| }|sBtj|jd | j|< }|S )Nr   )r  rF   r   r   _constants_cache)r}   r   r3  r  rc   rc   ri   _load_const  s    
z%InstructionTranslatorBase._load_constc                 C   s   |  | | d S rl   )r   r  r   rc   rc   ri   r     s    z$InstructionTranslatorBase.LOAD_CONSTc                 C   s   t jdkr|jd r| | |j}| jrj|| jkrJ| j|| j|  n || jksXt	| j| | jj
|< || jkr| jj| j|  }| | jj|| d S z| j| }W n tk
r   | | Y S X t|}| t| || d S Nr  r}  )r   r   r  	PUSH_NULLr   rJ  	f_globalsZadd_global_var
f_builtinsr   builtinsrA  r   rZ  r   load_globalr  load_builtinr2   rC   )r}   r   r:  variabler   r   rc   rc   ri   r     s&    




z%InstructionTranslatorBase.LOAD_GLOBALc                 C   sj   |   }|j}t|}|| jkr,t | j|< | jj|| j| }t|t	rTt
d | jj||| d S Nz Storing handles in globals - NYI)r   r   r2   rA  objectr   rZ  Ztrack_global_existingr   r`   r%   Zstore_global)r}   r   r   r:  r   r  rc   rc   ri   STORE_GLOBAL  s    
 
z&InstructionTranslatorBase.STORE_GLOBALc                 C   s   d|kr4t jjj| }|dddddd}nt|}d|dd }| jj}||ksp|| |kspt	|||< | j
| t|S )z-Create an alias to a module for use in guardstorch_package>rr   <r  Z_dot_Z	__import_)r   packagepackage_importer_package_imported_modulesr  	importlibimport_moduler   global_scoper   Zupdate_co_namesr2   )r}   module_namer   aliasr  rc   rc   ri   import_source  s    
z'InstructionTranslatorBase.import_sourcec                 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:  r  levelbitsbaserc   rc   ri   resolve_name  s
    z&InstructionTranslatorBase.resolve_namec                 C   s   | j d}| j d}|dk	rJ|dk	rF||jkrFtjd||jdd |S |dk	rX|jS tjddd | j d }d	| j kr|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  r1  rU  r   warning
rpartition)r}   r  specrc   rc   ri   calc_package  s*    

z&InstructionTranslatorBase.calc_packagec           
      C   s(  |  d\}}| }| }|j}tj d| d| d| }|| jkr^| j| }t|}nzzt|||| jd}W n tk
r   t	d Y nX |dkr| 
 }| |||}|s|dd }	| |	}n
| |}| jr| j|| t|tjtfr| t||d nt	dt|  d S )	Nr}  rr   )fromlistr  globalsz#import a module that does not existr   r  r   zIMPORT_NAME )r   r   r   r-   ZLOCAL_MOD_PREFIXr  r2   
__import__r  r%   r  r  	partitionr  rJ  Zadd_local_modr<   types
ModuleTyper,   r   rZ   rA   )
r}   r   r  r  r  Zrecorded_namer   r   pkgZtop_level_module_namerc   rc   ri   IMPORT_NAME<  s<    




z%InstructionTranslatorBase.IMPORT_NAMEc                 C   s   |  | | | d S rl   )DUP_TOP
_load_attrr   rc   rc   ri   IMPORT_FROMk  s    
z%InstructionTranslatorBase.IMPORT_FROMc                 C   sz   || j krtd| d| j | }t|rXt| jj}t||}| t| || nt	|sdt
| tj|d d S )Nzname 'z' is not definedr  )r  	NameErrorrd  r2   r   Z%name_of_builtins_dict_key_in_fglobalsr1   r   rC   r6   r   rF   r   )r}   r   r  Zbuiltins_sourceZ
var_sourcerc   rc   ri   load_builtin_from_argvalo  s    


z2InstructionTranslatorBase.load_builtin_from_argvalc                 C   s   |  |j d S rl   )r  r   r   rc   rc   ri   r  ~  s    z&InstructionTranslatorBase.load_builtinc                 C   s   | j |j | _d S rl   )indexofr   ry   r   rc   rc   ri   r     s    zInstructionTranslatorBase.jumpFTc                 C   s   | j t||j d S rl   r  r   r   r   r   rc   rc   ri   
SETUP_LOOP  s    z$InstructionTranslatorBase.SETUP_LOOPc                 C   s   | j t||j d S rl   r  r   rc   rc   ri   SETUP_EXCEPT  s    z&InstructionTranslatorBase.SETUP_EXCEPTc                 C   s   | j   d S rl   )r  r   r   rc   rc   ri   	POP_BLOCK  s    z#InstructionTranslatorBase.POP_BLOCKc                 C   s   |  | d S rl   setup_or_before_withr   rc   rc   ri   
SETUP_WITH  s    z$InstructionTranslatorBase.SETUP_WITHc                 C   s   | j t||j d S rl   r  r   rc   rc   ri   SETUP_FINALLY  s    z'InstructionTranslatorBase.SETUP_FINALLYc                 C   s   |  d  d S rl   r   r   rc   rc   ri   BEGIN_FINALLY  s    z'InstructionTranslatorBase.BEGIN_FINALLYc                 C   sH   |  d\}}|d kst| | | || td gd i  d S )Nr}  r   )r   r   r   rd   rF   r   )r}   r   r   r   rc   rc   ri   WITH_CLEANUP_START  s    
z,InstructionTranslatorBase.WITH_CLEANUP_STARTc                 C   s   |  d | d  d S Nr}  )r   r   r   rc   rc   ri   WITH_CLEANUP_FINISH  s    
z-InstructionTranslatorBase.WITH_CLEANUP_FINISHc                 C   s*   | j | j }| t| | | dS )z|
        pushes the address of the next instruction onto the stack and increments
        bytecode counter by delta
        N)r  r   r   rF   r   r   )r}   r   addrrc   rc   ri   CALL_FINALLY  s    z&InstructionTranslatorBase.CALL_FINALLYc                 C   s"   |   }t|tr| | _n d S rl   )r   r   rF   r   ry   r}   r   tosrc   rc   ri   END_FINALLY  s    
z%InstructionTranslatorBase.END_FINALLYc                 C   s,   |j }|r|  }|  }|r(| | d S rl   )r   r   r   )r}   r   Zpreserve_tosr  rr   rc   rc   ri   POP_FINALLY  s    z%InstructionTranslatorBase.POP_FINALLYc              	   C   s|   |    }z"|| }| | | | W nH ttjfk
rv   tjdkrh| | | t	
d  | | Y nX d S Nr  )r   realizenext_variabler   StopIterationr   UserStopIterationr   r   rF   r   r   )r}   r   itr  rc   rc   ri   FOR_ITER  s    



z"InstructionTranslatorBase.FOR_ITERc                 C   s   |j dkrtd n|j dkr|  }t|tr:|jtksFt|tjrLt	j
t|tjrf|| g i }| j| t|tjrt	d| tdt	  ntd d S )Nr   zre-raiser   zraised exception zraise zraise ... from ...)r  r%   r   r   rE   r   r  r   ZStopIterationVariabler   r  rd   rI  r   ExceptionVariablery  r}   r   r  rc   rc   ri   r     s$    



z'InstructionTranslatorBase.RAISE_VARARGSc                 C   s"  t jdkr| jj}|r|t| j|jkr0|   q|jrRt	d | 
t| jj t| js`t| 
| jd  | | n$| j  t| tkrtdtjnzt| jrt| jst| jd }| j }|jjdkr| d t| jdkrt	d | j }q|jjd	kr,t	d
|j  tddd d}| jt|d  t| jdkr| jd }| 
t  | 
| | 
t|j  n0| 
td  | 
td  | 
td  | 
t  | 
| | 
t|j  | | n&| j  t| tkrtdtjd S )Nr  z#lasti=True while exception handlingr   zObserved exceptionEXCEPT_HANDLERr   r   z-exception is raised when block stack is emptyr  zvexception is raised when top of the block stack is not exception handler (e.g. try .. with .. except). Current TOS is g    .Ar}  r~  )!r   r   rC  r  r   rB  depthr   lastir%   r   r   rF   rO  rI  r   r   r   typer  r&   r   ry  r  r   r   r   r   r   r   r[   rE   exc_type)r}   r  Zexception_varZblock_stack_entryZexcept_handler_instZold_exceptionrc   rc   ri   rz    sd    











z+InstructionTranslatorBase.exception_handlerc                 C   s4   |   }t| jst| | jd  | | d S Nr   )r   r   rI  r   r   r  rc   rc   ri   PUSH_EXC_INFOW  s    z'InstructionTranslatorBase.PUSH_EXC_INFOc                 C   s   t jdkr<|  }t|tjs"tt| js0t| j  nXt| j	dksNt| j	d j
jdkrhtd| j	  | d t| jst| j  d S )Nr  r   r   r  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   rI  r  r   r   r   r  rc   rc   ri   
POP_EXCEPT]  s    


z$InstructionTranslatorBase.POP_EXCEPTc                 C   s   t | jdkst|  }| jd }t|ttfs@td|  tj	dkrdt|t
jsdtd|  t|trv|j}n|g}|D ]\}t|tstd|  t|t
jrt|j|jr dS t|t
jrt|j|jr dS qdS )	Nr}  r   z+except has an unsupported types of objects r  zCexcept expects to recieve an object of exception type but received z*except has an unsupported types of object TF)r   rB  r   r   r   rE   rU   r%   r   r   r   r  r9  
issubclassr  r   )r}   Zexpected_exc_typesZexc_instanceZexpected_typesexpected_typerc   rc   ri   check_if_exc_matchest  s@    



  z.InstructionTranslatorBase.check_if_exc_matchesc                 C   s   |  t|   d S rl   )r   r   rF   r  r   rc   rc   ri   CHECK_EXC_MATCH  s    z)InstructionTranslatorBase.CHECK_EXC_MATCHc                 C   s   |   s| | d S rl   )r  r   r   rc   rc   ri   JUMP_IF_NOT_EXC_MATCH  s    z/InstructionTranslatorBase.JUMP_IF_NOT_EXC_MATCHc                 C   s8   |j dkr| | n| t|j  | | di  d S )Nzexception matchr}  )r   r  r   rk   r   r   rc   rc   ri   
COMPARE_OP  s    
z$InstructionTranslatorBase.COMPARE_OPc                 C   s   |  tt|  gi  d S rl   )rd   rE   iterr   r   rc   rc   ri   GET_ITER  s    z"InstructionTranslatorBase.GET_ITERr   r   c                 C   s&   |  |j}|  }| ||i  d S rl   )r   r   r   rd   )r}   r   rq   r   rc   rc   ri   r     s    z'InstructionTranslatorBase.CALL_FUNCTIONc                 C   s  |j dkrti }|  }n$|j dkr8|  }|  }ntd |  }tjdkrh|  }t|tshtt|t	rt|j
tr|jdkrt|ttfrt|g}t|ts|| rt|| }t|trt|tstdt| dt|  | }| ||j| d S )Nr   r   CALL_FUNCTION_EXr  viewznon-static call  )r   rJ   r   r%   r   r   r   rY   r   rW   objr_   r:  rF   rU   rQ   r   r   rA   Zkeys_as_python_constantrd   r9  )r}   r   Z
kwargsvarsZargsvarsr   nullrc   rc   ri   r    sD    





	
  z*InstructionTranslatorBase.CALL_FUNCTION_EXc                 C   s   |   }| |j}|   }t|tr.| s2t| }|d t|  |t| d   }}t	t
||}t|t|kst| ||| d S rl   )r   r   r   r   rU   r   r   r   r   r_  ziprd   )r}   r   argnamesrq   r   kwargs_listr\  rc   rc   ri   CALL_FUNCTION_KW  s    &z*InstructionTranslatorBase.CALL_FUNCTION_KWc                 C   sd   |  tj|dd |jd }| jd | }tjdk rL| tj||d n| tj||d d S )Nr}  r  r   co_namesr  )	r   r   r  r   r  r   r   r  LOAD_METHODr}   r   r  r   rc   rc   ri   LOAD_METHOD_SUPER  s    

z+InstructionTranslatorBase.LOAD_METHOD_SUPERc                 C   sD   |  tj|dd |jd }| jd | }| tj||d d S )Nr}  r  r   r  )r   r   r  r   r  r  r  rc   rc   ri   LOAD_ATTR_SUPER  s    
z)InstructionTranslatorBase.LOAD_ATTR_SUPERc                 C   sJ   |  | |  }tjdkr2| | | | n| | | d  d S )Nr  )r  r   r   r   r  r   r}   r   r  rc   rc   ri   r    s    



z%InstructionTranslatorBase.LOAD_METHODc                 C   s:   |  |j}|  }|d ks t|  }| ||i  d S rl   )r   r   r   r   rd   )r}   r   rq   dummyr   rc   rc   ri   CALL_METHOD  s
    z%InstructionTranslatorBase.CALL_METHODc                 C   s4   |   }tt| |t|jgi }| | d S rl   )r   rE   r-  rd   rF   r   r   r   )r}   r   r  r   rc   rc   ri   r    s      z$InstructionTranslatorBase._load_attrc                 C   s0   t jdkr"|jd r"| | d S | | d S )Nr  r}  )r   r   r  r  r  r   rc   rc   ri   	LOAD_ATTR  s
    


z#InstructionTranslatorBase.LOAD_ATTRc              
   C   s   |   }|jr| |S | d\}}t|trRt|tsR| jrRtd|j	 dz&t
t| |t|j	|gi  W d S  tk
r } z.|  s tjddd |  |d W 5 d }~X Y nX |  d S )Nr}  zMutating module attribute z during export.zSTORE_ATTR triggered compileTr   r   )r   rz   store_attr_graph_breakr   r   r\   rF   exportr   r   rE   setattrrd   r   r&   r   r   r   r  r  r~   )r}   r   r  r  r  r   rc   rc   ri   
STORE_ATTR  s.    
  z$InstructionTranslatorBase.STORE_ATTRc                 C   sb   |   std | jj| td|  gd | jt|g | d | j| 	| j
 d S )Nr   
store_attrr   r}  )r   r%   r   r   r*   r   r   r  r   r   r   r   rc   rc   ri   r  5  s     

z0InstructionTranslatorBase.store_attr_graph_breakc                 C   s*   |   }tt| |t|jgi  d S rl   )r   rE   delattrrd   rF   r   r   r	  rc   rc   ri   DELETE_ATTRA  s      z%InstructionTranslatorBase.DELETE_ATTRc                 C   s   t dt|  d S )Nz1create_call_resume_at not overridden by subclass r   r  r}   rO  rc   rc   ri   r   G  s    z/InstructionTranslatorBase.create_call_resume_atc                 C   s   t dt|  d S )Nz8should_compile_partial_graph not overridden by subclass r  r   rc   rc   ri   r   L  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   rc   rc   ri   STORE_SUBSCRQ  s    z&InstructionTranslatorBase.STORE_SUBSCRc                 C   s$   |  d\}}|| d|gi  d S )Nr}  __delitem__r  )r}   r   r  r  rc   rc   ri   DELETE_SUBSCRV  s    z'InstructionTranslatorBase.DELETE_SUBSCRc                 C   s   |  |j}| t| d S rl   )r   r   r   rU   r}   r   r9  rc   rc   ri   BUILD_TUPLEZ  s    z%InstructionTranslatorBase.BUILD_TUPLEc                 C   s   |  |j}| t| d S rl   )r   r   r   rT   r  rc   rc   ri   BUILD_SLICE^  s    z%InstructionTranslatorBase.BUILD_SLICEc                 C   s$   |  |j}| t|t d d S Nmutable_local)r   r   r   rS   r@   r  rc   rc   ri   
BUILD_LISTb  s    z$InstructionTranslatorBase.BUILD_LISTc                 C   s6   t jrtd | |j}t|t d}| | d S )Nzmissing: BUILD_SETr!  )r   Z+inject_BUILD_SET_unimplemented_TESTING_ONLYr%   r   r   rK   r@   r   )r}   r   r9  Znew_setrc   rc   ri   	BUILD_SETf  s
    z#InstructionTranslatorBase.BUILD_SETc              	   C   sl   |  |j}t }|D ]<}z|||  W q tk
rP   td|  Y qX q| ||t d d S )NzBUILD_LIST_UNPACK r!  )	r   r   r   extendr   NotImplementedErrorr%   r   r@   )r}   r   r0  Zseqsr9  seqrc   rc   ri   BUILD_LIST_UNPACKm  s    z+InstructionTranslatorBase.BUILD_LIST_UNPACKc                 C   s   | j |td d S )N)r0  )r(  rU   r   rc   rc   ri   BUILD_TUPLE_UNPACKw  s    z,InstructionTranslatorBase.BUILD_TUPLE_UNPACKc                 C   sJ   |  |jd }tt|d d d |dd d }| t|t d d S )Nr}  r   r!  )r   r   r_  r   r   rJ   r@   )r}   r   r9  drc   rc   ri   	BUILD_MAP|  s    "z#InstructionTranslatorBase.BUILD_MAPc                    s`     |j} fdd|D }t }|D ]}t|ts:t||j q( t|t	 d d S )Nc                    s    g | ]}t t |gi qS rc   )rE   r_  rd   r]  r   rc   ri   r5    s     z>InstructionTranslatorBase.BUILD_MAP_UNPACK.<locals>.<listcomp>r!  )
r   r   r_  r   rJ   r   updater9  r   r@   )r}   r   r9  r   r   rc   r   ri   BUILD_MAP_UNPACK  s    z*InstructionTranslatorBase.BUILD_MAP_UNPACKc                 C   sn   |   }| |j}t|ts"t| s.t|| }t|t|ksLt| 	t
tt||t d d S r   )r   r   r   r   rU   r   r   r   r   r   rJ   r_  r   r@   )r}   r   keysrc  rc   rc   ri   BUILD_CONST_KEY_MAP  s    
z-InstructionTranslatorBase.BUILD_CONST_KEY_MAPc                 C   sT   |  d\}}|jdkst| j|j   }t|ts<t|| d||fi  d S )Nr}  r   r  )	r   r   r   rB  r  r  r   rJ   r  )r}   r   rg   rh   r  rc   rc   ri   MAP_ADD  s
    z!InstructionTranslatorBase.MAP_ADDc                 C   sN   |   }|jdkst| j|j  }t|ts2t|js<t|| d|gi S )Nr   r  	r   r   r   rB  r  r   rK   r"  r  r}   r   rh   r  rc   rc   ri   SET_ADD  s    
z!InstructionTranslatorBase.SET_ADDc                 C   sR   |   }|jdkst| j|j  }t|ts2t|js<t|| d|gi  d S Nr   r,  r1  r2  rc   rc   ri   
SET_UPDATE  s    
z$InstructionTranslatorBase.SET_UPDATEc                 C   s^   |   }|jdkst| j|j   }t|ts6t|js@t| j	j
| |j| d S r   )r   r   r   rB  r  r  r   rS   r"  r   rZ  Zmutationr9  r   r2  rc   rc   ri   LIST_APPEND  s    
z%InstructionTranslatorBase.LIST_APPENDc           
      C   s   |j }t| j}tjdk r"|  }|  }tjdkrTt|jdsDtt	j
|jjd}d }d }d }d }	|d@ rt|  }|d@ r|  }|d@ r|  }	|d@ r|  }| t||| j||	||| d d S )	Nr  co_qualnamer        r}  r   )Zclosure_scope)r  r   rB  r   r   r   rS  r   r   rF   r   r7  r   rM   r  )
r}   r   flagsZ	old_stackfn_namecodedefaultsclosureannotations
kwdefaultsrc   rc   ri   MAKE_FUNCTION  s@    


z'InstructionTranslatorBase.MAKE_FUNCTIONc                    s     }t|tr(|jt|jd}nht|trlt|jtrlt|j	 |j
  fddt|jD }n$|r|}ntd|  t||jkrtd t|D ]}| qd S )N)Zidxesc                    s   g | ]}t  | qS rc   )rD   r2  proxyr}   rc   ri   r5    s     z=InstructionTranslatorBase.UNPACK_SEQUENCE.<locals>.<listcomp>zUNPACK_SEQUENCE zUNPACK_SEQUENCE length mismatch)r   r   r_   r   r$  r   rW   r  r-  Zas_proxyr:  r   r%   r   rn   r   )r}   r   r'  r  r3  rc   rB  ri   UNPACK_SEQUENCE  s    

z)InstructionTranslatorBase.UNPACK_SEQUENCEc           
      C   s   d|j   krdksn t|j d@ }|j d? }|  }|| rt|| }t||| ksdt|d | }||t||  }|t|| d  }t|D ]}	| |	 q| t	| t|D ]}	| |	 qnt
d|  d S )Nr   i     r8  z
UNPACK_EX )r   r   r   r   r   r   r   rn   r   rU   r%   )
r}   r   prefixsuffixr'  r  Zvals_prefixZ	vals_listZvals_suffixitemrc   rc   ri   	UNPACK_EX  s     


z#InstructionTranslatorBase.UNPACK_EXc                 C   s   d S rl   rc   r   rc   rc   ri   r    s    zInstructionTranslatorBase.NOPc                 C   s   |    d S rl   r  r   rc   rc   ri   POP_TOP  s    z!InstructionTranslatorBase.POP_TOPc                 C   s(   |   }|   }| | | | d S rl   r   r   r}   r   ar'  rc   rc   ri   ROT_TWO  s    
z!InstructionTranslatorBase.ROT_TWOc                 C   s:   |   }|   }|   }| | | | | | d S rl   rK  )r}   r   rM  r'  crc   rc   ri   	ROT_THREE  s    

z#InstructionTranslatorBase.ROT_THREEc                 C   sL   |   }|   }|   }|   }| | | | | | | | d S rl   rK  )r}   r   rM  r'  rO  r*  rc   rc   ri   ROT_FOUR   s    


z"InstructionTranslatorBase.ROT_FOURc                 C   s    |   }| | | | d S rl   rK  )r}   r   rM  rc   rc   ri   r  *  s    
z!InstructionTranslatorBase.DUP_TOPc                 C   s<   |   }|   }| | | | | | | | d S rl   rK  rL  rc   rc   ri   DUP_TOP_TWO/  s    


z%InstructionTranslatorBase.DUP_TOP_TWOc                 C   s   |j }|d@ dkr|  }n
td}|  }t|trHtt|j}|d@ dkrjtt	| |gi }nB|d@ dkrtt
	| |gi }n |d@ dkrtt	| |gi }td|  d }| 	ttj||gi  d S )Nr9  r   r   r   r}  z{:})r  r   rF   r   r   r^   r   r   rE   rd   reprasciir   format)r}   r   r:  fmt_specr   Zfmt_varrc   rc   ri   FORMAT_VALUE7  s    


z&InstructionTranslatorBase.FORMAT_VALUEc                 C   s   g }g }i }|  |jD ]}t|tr<|d || qt|tjr||j ||j	 t
| t
|j @ rtd| d|j  ||j qtd|  q| tjd||| d S )Nz{}zBUILD_STRING key conflict z & zBUILD_STRING r   )r   r  r   rF   r   r   ZStringFormatVariableformat_stringr%  Zsym_argsrY  r.  Z
sym_kwargsr%   r,  r   r   r	  )r}   r   Zformat_string_partsrq   r\  partrc   rc   ri   BUILD_STRINGL  s.    

  z&InstructionTranslatorBase.BUILD_STRINGc                 C   sF   |j dks|j dkst|j dkr(d}nd}td|d}| | d S )Nr   r   iszis notr  r  )r   r   r   r  )r}   r   Z
new_argvalZnew_instrc   rc   ri   IS_OPd  s    
zInstructionTranslatorBase.IS_OPc                 C   sZ   |j dks|j dkst| d\}}|j }| || d|gi  |dkrV| | d S )Nr   r   r}  __contains__)r   r   r   r   r  	UNARY_NOT)r}   r   leftrightr/  rc   rc   ri   CONTAINS_OPm  s    z%InstructionTranslatorBase.CONTAINS_OPc                 C   sR   |   }|jdkst| j|j  }t|ts2t|js<t|| d|gi  d S )Nr   r%  )	r   r   r   rB  r  r   rS   r"  r  r2  rc   rc   ri   LIST_EXTENDu  s    
z%InstructionTranslatorBase.LIST_EXTENDc                 C   s"   |  tt| |  gi  d S rl   )r   rE   r   rd   r   r   rc   rc   ri   LIST_TO_TUPLE}  s    z'InstructionTranslatorBase.LIST_TO_TUPLEc                 C   sV   |   }|jdkst| j|j   }t|ts6t|js@t|	| d|gi  d S r4  )
r   r   r   rB  r  r  r   rJ   r"  r  r2  rc   rc   ri   
DICT_MERGE  s    
z$InstructionTranslatorBase.DICT_MERGEc                 C   s   |    d S rl   r  r   rc   rc   ri   	GEN_START  s    z#InstructionTranslatorBase.GEN_STARTc                 C   sF   | j d }| r,| tt|  n| || dg i  d S )Nr   r   )rB  r   r   rF   r   r   r   r  r  rc   rc   ri   GET_LEN  s    
z!InstructionTranslatorBase.GET_LENc                 C   sN   | j d }t|tstt|jtjjr:| t	
d n| t	
d d S Nr   TF)rB  r   rJ   r   r9  collectionsabcMappingr   rF   r   r  rc   rc   ri   MATCH_MAPPING  s
    
z'InstructionTranslatorBase.MATCH_MAPPINGc                 C   sb   | j d }| st| }t|tjjrNt|tt	t
fsN| td n| td d S rh  )rB  r   r   r   r   ri  rj  Sequencer   bytes	bytearrayr   rF   r   )r}   r   r  Z	tos_valuerc   rc   ri   MATCH_SEQUENCE  s    
 z(InstructionTranslatorBase.MATCH_SEQUENCEc                    s   | j d }| j d  t ts"tt fdd|D rp| t fdd|D  tjdk r| t	
d n*| t	
d  tjdk r| t	
d	 d S )
Nr   r~  c                 3   s   | ]}| kV  qd S rl   rc   rf   rg   Ztos1rc   ri   r^    s     z7InstructionTranslatorBase.MATCH_KEYS.<locals>.<genexpr>c                    s   g | ]}  |qS rc   )Zgetitem_constrq  rr  rc   ri   r5    s     z8InstructionTranslatorBase.MATCH_KEYS.<locals>.<listcomp>r  TF)rB  r   rJ   r   r`  r   rU   r   r   rF   r   r  rc   rr  ri   
MATCH_KEYS  s    



z$InstructionTranslatorBase.MATCH_KEYSc                 C   s   |  d d S )Nr   )r  r   rc   rc   ri   r     s    z.InstructionTranslatorBase.LOAD_ASSERTION_ERRORc                 C   s*   |j dkr| | d| _n
| jr&td S )Nr   F)r  append_prefix_instrD  r   r   rc   rc   ri   RESUME  s    

z InstructionTranslatorBase.RESUMEc                 C   s   t |j | |S rl   )_binary_op_lookupr  r   rc   rc   ri   	BINARY_OP  s    z#InstructionTranslatorBase.BINARY_OPc                 C   s   d S rl   rc   r   rc   rc   ri   r     s    z!InstructionTranslatorBase.PRECALLc                 C   sV   | j d |j }t|tst|D ]}t|ts"tq"| jd ksDttj|d| _d S )N	co_constsr  )	r  r  r   r   r   r   r  rF   r   )r}   r   r  r:  rc   rc   ri   r    s    z"InstructionTranslatorBase.KW_NAMESc                 C   s   |  t  d S rl   )r   rY   r   rc   rc   ri   r    s    z#InstructionTranslatorBase.PUSH_NULLc                 C   s   |  |jd }t|d tr,|d }g }n|d }|d g}| jrL| jjnd}|r||dt|   }|t| d  }tt||}t|t|kst	n||dd   }i }| 
||| d | _d S )Nr}  r   r   rc   )r   r  r   rY   r  r   r   r_  r   r   rd   )r}   r   contentsr   rq   r  r  r\  rc   rc   ri   r     s     
zInstructionTranslatorBase.CALLc                 C   s   |  | j|j   d S rl   )r   rB  r  r   rc   rc   ri   COPY  s    zInstructionTranslatorBase.COPYc                 C   s.   | j |j  | j d  | j d< | j |j < d S r  )rB  r  r   rc   rc   ri   SWAP  s    zInstructionTranslatorBase.SWAPc                 C   s   d S rl   rc   r   rc   rc   ri   CACHE  s    zInstructionTranslatorBase.CACHEc                 C   s   |  | d S rl   r  r   rc   rc   ri   BEFORE_WITH  s    z%InstructionTranslatorBase.BEFORE_WITHc                 C   s   |   }t|ts&t|j d|  t|tr>|  jd7  _t||j}t	j
dkr|jrz| jrt|jj| jd jk	rzd }q| jjj}n|j}|rt| tr| jt||t| j| n| jt|| | | | ||  d S )Nr  r   r  r   )r   r   rG   r%   r   rH   r   rI   r   r   r   r  r  r   r  r   r   r   rB  r   Zenter)r}   r   ctxr   r   rc   rc   ri   r  "  s4    




z.InstructionTranslatorBase.setup_or_before_withc                 C   s   | j s
t| j| d S rl   )rD  r   rE  r   r   rc   rc   ri   rt  I  s    
z,InstructionTranslatorBase.append_prefix_instc                 C   sJ   t jdkr<| js<t| j|j ts&t| jj	
 | j|j< n
| | d S r  )r   r   rD  r   r@  r   rY   r   r   rZ  Ztrack_cell_newrt  r   rc   rc   ri   	MAKE_CELLM  s    
z#InstructionTranslatorBase.MAKE_CELLc                 C   s   |  | d S rl   rt  r   rc   rc   ri   COPY_FREE_VARSX  s    z(InstructionTranslatorBase.COPY_FREE_VARSc                 C   s   |  | d S rl   r  r   rc   rc   ri   RETURN_GENERATOR[  s    z*InstructionTranslatorBase.RETURN_GENERATORc                 C   s   |  d d S r  )r   r   rc   rc   ri   END_FORb  s    z!InstructionTranslatorBase.END_FORc                 C   s(   t | j|j trtd | | d S )Nz)LOAD_FAST_CHECK on uninitialized variable)r   r@  r   rY   r%   r  r   rc   rc   ri   LOAD_FAST_CHECKe  s    z)InstructionTranslatorBase.LOAD_FAST_CHECKc                 C   s6   |j | jkr| t  n
| | t | j|j < d S rl   )r   r@  r   rY   r  r   rc   rc   ri   LOAD_FAST_AND_CLEARj  s    
z-InstructionTranslatorBase.LOAD_FAST_AND_CLEARc                 C   s8   |  tj|dd |jd@ r*| | n
| | d S )Nr}  r  r   )r   r   r  r  r  r  r   rc   rc   ri   LOAD_SUPER_ATTRq  s    
z)InstructionTranslatorBase.LOAD_SUPER_ATTRc                 C   sN   |j dkr| | n4|j dkr:| t|  |  ntd|j   d S )N      z!missing CALL_INTRINSIC_1 operand )r   UNARY_POSITIVEr   rU   r   r   r%   r   rc   rc   ri   CALL_INTRINSIC_1x  s
    

z*InstructionTranslatorBase.CALL_INTRINSIC_1c                 C   s   | j d= d S )Nr~  )rB  r   rc   rc   ri   END_SEND  s    z"InstructionTranslatorBase.END_SENDc                 C   s    | j  dkrdd | _dS dS )Nr   c                   S   s   dS )NTrc   rc   rc   rc   ri   rs         z>InstructionTranslatorBase.is_non_empty_graph.<locals>.<lambda>TF)r   count_callsru  r   rc   rc   ri   ru    s    
z,InstructionTranslatorBase.is_non_empty_graphc                 C   s.   |d krg }d t|  gtt| S )Nr   )r	  r
  r  r   r   rn   )r}   Zadditional_stack_framesrc   rc   ri   format_frame_summary  s    z.InstructionTranslatorBase.format_frame_summaryc                 C   s(   t jt| jdd| jt| jddddS )Nr   z	<unknown>rj  F)lookup_line)r
  FrameSummaryr-  ri  rx   r   rc   rc   ri   r     s    z'InstructionTranslatorBase.frame_summaryc                 C   s,   | j |t|}tt|tj |S rl   )	r   install_global_by_idweakrefrefr)   r3   Z
make_guardr(   ZWEAKREF_ALIVE)r}   rF  r   global_namerc   rc   ri   store_global_weakref_by_id  s
    z4InstructionTranslatorBase.store_global_weakref_by_idc                 C   s
   | j jjS rl   )r   tracing_context	fake_moder   rc   rc   ri   r    s    z#InstructionTranslatorBase.fake_modec                 C   s(   | j  D ]\}}||kr
|  S q
d S rl   )r@  r9  )r}   Ztensor_variabler  r   rc   rc   ri   find_symbolic_locals_name  s    
z3InstructionTranslatorBase.find_symbolic_locals_name)check_fnc                 c   s$   | j }|| _ z
dV  W 5 || _ X dS )zx
        Strict mode is enabled on a per-VariableTracker level depending on the return value of check_fn(node).
        N)rK  )r}   r  priorrc   rc   ri   strict_translation_mode  s
    
z1InstructionTranslatorBase.strict_translation_modec                 C   s   | j | jj| j| jS rl   )speculation_logr   ri  r   rx   ry   r   rc   rc   ri   r     s
      z#InstructionTranslatorBase.speculater   r   r  r  r  r  r@  rA  ri  r  rF  r  c                    s@  t    || _|| _|| _|| _g | _d| _td| _	g | _
d| _d| _d | _d| _g | _g | _|| _t| j| _|| _|| _|| _|| _|	| _tjrt|	|d| _nd | _i | _|
| _d | _d | _ t!j"dkrddl#m$}m%}m&}m'} |	j(||B |B |B @ r| )t*d  || _+d	| _,d gt-|	j. | _/t01|	j2| d S )
Nr   r  r   T)r<  r  )r   
   r   )CO_ASYNC_GENERATORCO_COROUTINECO_GENERATORCO_ITERABLE_COROUTINEF)3r7  r8  r  r   r@  rA  rB  ry   r   rC  r  r   rx   r  rD  rE  rI  r   r   r  r  r  r  r  ri  r   Zreplay_record_enabledr-   rJ  nn_module_stackr  rH  rK  r   r   resume_executionr  r  r  r  co_flagsr   rE   rF  rG  r   rx  r  rm  	lazycacher   )r}   r   r   r  r  r  r  r@  rA  ri  r  rF  r  r  r  r  r  r=  rc   ri   r8    sZ    

 
z"InstructionTranslatorBase.__init__)N)N)r   r   r   r+   r   r   r   rB   r   r   r   r   r   rF   r   rv   r   r-   r   rL  r   rV  r[  rd   rf  rl  rq  rt  r|  r   r   rx  propertyr   rv  r  r  r   r  r   r   r  r  r  r  STORE_DEREFr  r  r   r   r  r  r  r  r  r  r  r  r   JUMP_FORWARDJUMP_ABSOLUTEr   r   not_POP_JUMP_IF_FALSEr   POP_JUMP_IF_TRUEJUMP_IF_FALSE_OR_POPJUMP_IF_TRUE_OR_POPr  r  r  r  r  r  r  r  r  r  r  r  r   rz  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$  rS   r(  r)  BUILD_TUPLE_UNPACK_WITH_CALLr+  r-  BUILD_MAP_UNPACK_WITH_CALLr/  r0  r3  r5  r6  rA  rD  rI  r  rJ  rN  rP  rQ  r  rR  rX  r[  r]  rb  rc  rd  re  ZDICT_UPDATErf  rg  rl  rp  rs  r   r   posr  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_MODULOZ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_MODULOZINPLACE_REMAINDERiaddINPLACE_ADDisubINPLACE_SUBTRACTilshiftINPLACE_LSHIFTirshiftINPLACE_RSHIFTiandINPLACE_ANDixorINPLACE_XORior
INPLACE_ORru  rw  r   r  r  r   rz  r{  r  ZJUMP_BACKWARD_NO_INTERRUPTZPOP_JUMP_FORWARD_IF_TRUEZPOP_JUMP_BACKWARD_IF_TRUEZPOP_JUMP_FORWARD_IF_FALSEZPOP_JUMP_BACKWARD_IF_FALSEr|  r}  r  rt  r  r  r  r  r  r  r  r  r  ru  r  r   r  r  r  
contextlibcontextmanagerr  r   r  CodeTyper   r8  r?  rc   rc   r=  ri   r     s  



+
)

	/
		 `+

(
	

	&
	































'
	 





)	metaclassc                       s   e Zd ZU ee ed< ed dddZej	dd Z
ee ee ed fdd	Zd
d ZedddZ fddZdd Zdd Zdd Zdd Zdd Zdd Zdd Z  ZS )r  mutated_closure_cell_contentsr  c                   C   s   t jS rl   )tls
current_txrc   rc   rc   ri   r  	  s    z InstructionTranslator.current_txc                 c   s*   t tdd }| t_z
d V  W 5 |t_X d S )Nr  )r-  r  r  )r}   r  rc   rc   ri   set_current_tx	  s
    
z$InstructionTranslator.set_current_tx)r   r  r  c                    s^  t  tjd|j d|d  d|d   t jt||| |	|
|||d	||||i i ||	d|d |   t| j	j
 |   || _|	| _|| _| jr| jstd	t|d
 fdd|  D }| t|  fddD | _g | _|	rtj| j| _t | _| jd D ]"}|kr"t| | j|< q"W 5 Q R X W 5 Q R X d S )Nztorchdynamo start tracing r  r   r   r   )Zlocal_scoper  ri  r   r  z4Export without one graph - something has gone wrong.co_varnamesc                    s   g | ]}| kr|qS rc   rc   r]  )varsrc   ri   r5  _	  s      z2InstructionTranslator.__init__.<locals>.<listcomp>c              	      s6   i | ].}|kr|t jj| t|| kd dqS ))Zcell_or_freevarr  )r   LazyVariableTrackerr   r4   rq  )cells_and_freevars_setr  rc   ri   rj   c	  s    z2InstructionTranslator.__init__.<locals>.<dictcomp>rR  )r   r   INFOrj  r7  r8  r+   _throw_if_in_functorchr   r   r  r  	one_graphr  r  r   r   rV  r%  rY  r@  Zdebug_localsr   r  Zrealize_allr_  _freevars_idsr  id)r}   r   ri  r  r  r  r  compiler_fnr  r  Zexport_constraintsr  Zframe_stater  Zcells_and_freevarsr:  r=  )r  r  r  ri   r8  #	  sl    
	
z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 k	r| |kr||k	r| j }d| d}t| d S )Neagerr  ztorch.func.z2(fn) requires the function to be inlined by dynamo)r   Z_dynamoZlookup_backendr   getattr_staticr   r  Z_CZ
_functorchZpeek_interpreter_stackZTransformTypeZVmapZGradZJvpr  r:  lowerr%   )r}   r  r  ciZforbidden_keysr:  r   rc   rc   ri   r  y	  s      


z,InstructionTranslator._throw_if_in_functorchr  c                 C   s4   t |tr| j|j S t |tr,| j|j S td S rl   )r   r4   r  Z
local_namer2   r  r  r  )r}   r   rc   rc   ri   get_example_value	  s
    

z'InstructionTranslator.get_example_valuec                    s   t    d S rl   )r7  r  r   r=  rc   ri   r  	  s    zInstructionTranslator.runc                 C   sD   z
|j }W n tk
r    Y dS X t|| j|kr:dS | j| S )z@Match a cell in this method to one in a function we are inliningN)cell_contents
ValueErrorr  r  r1  r@  )r}   r:  cellr   rc   rc   ri   match_nested_cell	  s    
z'InstructionTranslator.match_nested_cellc                 C   sX   t jdkr2| jj}|r2| jr.|j| jd jk	r2dS tdd | jD oV| j oV| jdkS )Nr  r   Fc                 s   s   | ]}|  V  qd S rl   )r   rf   r'  rc   rc   ri   r^  	  s     zEInstructionTranslator.should_compile_partial_graph.<locals>.<genexpr>r   )	r   r   rC  r  r  r   r`  r  r   )r}   r   rc   rc   ri   r   	  s    
z2InstructionTranslator.should_compile_partial_graphc                    s  d _ |jdkrtdgS |jdkr4td|jdgS tj|tfddj D }tfdd|D }tfdd|D }t	j
dk rt|d	kstd
t g }tjD ]x\}}tt|rtt|}|jd krdnt|j}	|||	f |   ttj| d   td qg }
|D ]l}ttj|  }r@tt|}|jd krvdnt|j}	|
||	f |   td|d q@g }t	j
dkrZtjD ]"\}}tt|r|| qd	}ttjD ]Z\}}tt|rtd|d | D ]} td|d q&    |d7 }qtjt| }|t| }td|j }t !j"j#|jtdd j$D |||tdd j$D t|t|
t|}t%&j"'ddd  }|d k	rt()|t%&|d< |j*r8j+,||  -||d| n.j+,|t./|j0|   1|d|   fdd|D   t2|d  td  3 S )NrM  rN  r  c                 3   s&   | ]}| kr|  kr|V  qd S rl   )rV  rq  )rX  r}   rc   ri   r^  	  s    z>InstructionTranslator.create_call_resume_at.<locals>.<genexpr>c                 3   s$   | ]}t t j| s|V  qd S rl   r  __instancecheck__rY   r@  rq  r   rc   ri   r^  	  s   c                 3   s$   | ]}t t j| r|V  qd S rl   r  rq  r   rc   ri   r^  	  s   r  r   z&variables should not be NULL in < 3.12rc   r   rJ  r  r  r}  r{  )r  Z__resume_at_c                 s   s   | ]}|j jV  qd S rl   )r   rO  r  rc   rc   ri   r^  	
  s     c                 s   s   | ]}|  V  qd S rl   )r   r  rc   rc   ri   r^  
  s     orig_graphmodulec                   S   s   d S rl   rc   rc   rc   rc   ri   rs   
  r  z=InstructionTranslator.create_call_resume_at.<locals>.<lambda>Tc                    s   g | ]}  |qS rc   )Zcreate_loadrq  )r%  rc   ri   r5  (
  s     z?InstructionTranslator.create_call_resume_at.<locals>.<listcomp>F)4ry   r   r   r   r   r   r   r@  r.  r   r   r   r   r"   	enumeraterB  r  r  rG   r   r   r   r  r  r   Zappend_outputrY   rn   r$  Zpop_nullr    rO  r.   lookupri  rx   r  r!   get_contextr1  r  r  rR  r   Zinstall_global_unsafeZmake_function_with_closurer  FunctionTyper  Zload_function_namer   r  )r}   r   Zall_argnamesr  Zargnames_nullZstack_ctx_varsr3  varr~  r   Zargnames_ctx_varsr:  Z
null_idxesZnull_cntjZ	stack_lenr   Znew_codeZorig_graphmodule_mayberc   )r%  rX  r}   ri   r   	  s    





 

 
 z+InstructionTranslator.create_call_resume_atc                 C   s6   | j  D ]&}t|tr
t| tjjr
 dS q
dS )NTF)	r@  rc  r   ra   r  r   r   nnModule)r}   rh   rc   rc   ri   $symbolic_locals_contain_module_class-
  s     z:InstructionTranslator.symbolic_locals_contain_module_classc                 C   s   | j  dkr,| js,|  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	d
 |jdkrtdntd|jd}| j |g td S )Nr   z#because no content in function callztorchdynamo done tracing rh  rg  z%s triggered compileZreturn_valueF)r   r   rM  rN  r  )r   r  rG  r  r  r   r   ry   r   r   r  ri  rj  r   r   r   r   r*   r   r   r   r   r   )r}   r   Zreturn_instrc   rc   ri   _return5
  s:    
  
zInstructionTranslator._returnc                 C   s   |  | d S rl   r  r   rc   rc   ri   rM  Q
  s    z"InstructionTranslator.RETURN_VALUEc                 C   s   |  | d S rl   r  r   rc   rc   ri   rN  T
  s    z"InstructionTranslator.RETURN_CONST)r   r   r   r   r   r   staticmethodr  r  r  r  r   r   r   r8  r  r5   r  r  r  r   r   r  r  rM  rN  r?  rc   rc   r=  ri   r  	  s&   



Vr  r  c                 C   s<   g | ]4\}}t td |kr$|dd nd|dd  qS )ZINPLACEr   NZBINARY_)r-  r  )rf   r   rr   rc   rc   ri   r5  Y
  s
   $r5  c                       s   e Zd ZU dZee ed< edd Ze	dd Z
e	eee ddd	Zeejeeef eeef eeef ed
 fddZedd Zdd Zdd Z fddZdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Z  fd#d$Z! fd%d&Z"  Z#S )'rT  z Trace and inline a called methodsymbolic_resultc              
   C   s<   t tdtd i | ||||W  5 Q R  S Q R X d S )Nr%   re  )r   r_  r8   inline_call_)r0  rU  funcrq   r\  rc   rc   ri   re  g
  s    z)InliningInstructionTranslator.inline_callc              
   C   s   |   rtd tj| dd}|jrddlm} tt| dd dr\| j	j
|fkr\tdd	S t| drn| j	jnd
}td| d|   d|   d|j d	 t| trt|  ddrtd|    n|S d S )Nzinline with __self__T)Zis_inlined_callr   )!produce_trampoline_autograd_applyr   _originFz"allowlist in dynamo known functionr   z'inline in skipfiles: z | r  z, 'Z_torchdynamo_disablez.call torch._dynamo.disable() wrapped function )Zhas_selfr%   r   Zcheck_verboseskippedZtorch._dynamo.variables.miscr  rS  r-  r   r  Z
SkipResultr   get_nameget_filenamer{   r   rO   r   r  Zget_function)r  r   r  Zfn_qualnamerc   rc   ri   check_inlineablel
  s2     &  z.InliningInstructionTranslator.check_inlineable)r  rq   c                    s  t |trtd t |ttfs$tt|}|jdks<tz|	| ||\}}W nf t
k
r } zHtdjt|d|  d|  d| j dd |D |d	W 5 d }~X Y nX t| | D ]}t |tstd
|  q|   jdkr.|rt |d tjtjfs.td j  d}	tjjjdrXdt    }	t!j"dkr| j#| j$| j%j&j'd fdd}
t()dt*|
 t+)d |	|j, |rt |d t-r| j./|d j0}t |tj1j2rt34|t56|j7j8d< t9 r$t:|  || j;||}nt|  || j;||}t<= }| j>rT|?| j>}z| |@  W 5 Q R X W n tAjBk
r } z.d  d| }| jCD|jC t+)|  W 5 d }~X Y nz tAjEk
r } z(d  d| }t+)| tF||W 5 d }~X Y n2 tGk
r8 } zt+)d   W 5 d }~X Y nX |jHd k	sJt|I| | |jJ| jJkrr| j;K|j; |  jL|jLO  _Lt+)d  t9 rt |t:st|jHM d ksttN|jOtP dS |jHS d S )Nz#inline with functions in skip filesFz;{reason}.
  func = {func}, args = {args}, kwargs = {kwargs}r  z' r   c                 S   s   g | ]}|  qS rc   )Zpython_type)rf   r  rc   rc   ri   r5  
  s     z>InliningInstructionTranslator.inline_call_.<locals>.<listcomp>)r{   r  rq   r\  zunconverted arg )r  __setattr__r   zinline r   bytecoder   r  )rx   c                     s&   t  } d j d d|  S )NzTRACE inlined call z from r   )r:   ro  rj  )rp  r<  Zcur_instheaderZparent_coderc   ri   get_trace_call_log_str
  s    zJInliningInstructionTranslator.inline_call_.<locals>.get_trace_call_log_strrr  zINLINING %s%s, %sr	  z!Observed exception DURING INLING z : zSKIPPED INLINING z: zFAILED INLINING %szDONE INLINING %sr!  )Qr   rN   r%   rO   rM   r   rT  r  r  Z	bind_args	TypeErrorr#   rV  r   r  r  get_coder   ra  rb  rc  rB   rj  r   ZCustomizedDictVariablerb   r   _logging	_internalZ	log_stateZis_artifact_enabledr   Bytecoder   r   rC  ri  rl  Z	positionsrx   trace_call_logr   r=   r   r{   r\   r   r   r   r   ZGraphModuler  r  r!   r  forward__code__r   &InliningGeneratorInstructionTranslatorrA  r  nullcontextrK  r  r  r   ry  rI  r%  r   r&   r  r  Zexport_freevarsr  r,  rG  r   rR   generated_itemsr@   )rU  r  rq   r\  r   Z
sub_localsclosure_cellsr   rh   rG  r$  moduleZtracerZ
strict_ctxr   rc   r"  ri   r  
  s    

"	


          


z*InliningInstructionTranslator.inline_call_)rU  r<  r@  rA  r0  funcvarc           
         s   |  }|d }t|ts |j}t }	t|	 t j|ji |||||	 fddt	 D  |j
|jd |jd || _d | _|| _|j | _d S )N__builtins__c                    s   i | ]}|t  |qS rc   )r-  rq  r<  rc   ri   rj     s      z:InliningInstructionTranslator.__init__.<locals>.<dictcomp>r   )r   r  r  r  r@  rA  r   r  ri  r  rF  r  )Zget_globalsr   r_  __dict__r   r   r7  r8  r   r   r  rF  r  rU  r  r0  r  r  )
r}   rU  r<  r@  rA  r0  r2  r  r  r   r=  r4  ri   r8    s0    	
z&InliningInstructionTranslator.__init__c                 C   s   | j jS rl   )rU  r  r   rc   rc   ri   r  %  s    z'InliningInstructionTranslator.fake_modec                 C   s   t | j S rl   )r   r  rU  r   r   rc   rc   ri   r  )  s    z)InliningInstructionTranslator.run_ctx_mgrc                 C   s   |j | jkr`| j|j  }|  }t|trN| j s<td || jjj	|j
< q| jj|| nx| j	|j }t|tjr| jj| j	|j  |   n@|d k	r|j
 | jjjkr| jjj|j
  tjtd d S )NzSHigherOrderOperator: Mutating a variable not in the current scope (ClosureVariable)z#write to __closure__ while inlining)r   r0  r   r   rV   r   Zis_root_tracerr%   root_txr@  r:  rZ  Z
store_cellr1  r   NewCellVariabler   r  r  r   ZUnspecializeRestartAnalysis)r}   r   r  r  Z
maybe_cellrc   rc   ri   r  ,  s<    


 
z)InliningInstructionTranslator.STORE_DEREFc                    s   |j | jkrP| j|j  }t|tr:| | jjj|j  q| | jj	
| n>| j|j d }t|tjr| | jj	
| nt | d S rl   )r   r0  r   rV   r   r   r6  r@  r:  rZ  Z	load_cellr1  r   r7  r7  r  )r}   r   r  Zmaybe_sym_localr=  rc   ri   r  S  s    
z(InliningInstructionTranslator.LOAD_DEREFc                 C   sH   |j |  kst|j | jkr2| | j|j   n| t|j d d S r  )r   rV  r   r0  r   rX   r   rc   rc   ri   r  a  s    z*InliningInstructionTranslator.LOAD_CLOSUREc                 C   s   t |jstd d S )NzOHigherOrderOperator: Mutating a variable not in the current scope (replace_all))r?   r"  r%   )r}   Zoldvarrc   rc   ri   check_replace_is_safeh  s    
z3InliningInstructionTranslator.check_replace_is_safec                 C   s   dS )NFrc   r   rc   rc   ri   r   n  s    z:InliningInstructionTranslator.should_compile_partial_graphc                 C   s   t d d S )Nzcant resume while inliningr+  r  rc   rc   ri   r   q  s    z3InliningInstructionTranslator.create_call_resume_atc                 C   s   |   | _d | _td S rl   )r   r  ry   r   r   rc   rc   ri   rM  t  s    
z*InliningInstructionTranslator.RETURN_VALUEc                 C   s   |  || _d | _td S rl   )r  r  ry   r   r   rc   rc   ri   rN  y  s    z*InliningInstructionTranslator.RETURN_CONSTc           	      C   s   d| j krZ| j d }| |}d|kr6tjjj| }n
t|}t| ||}t	||}n6| j
d| j }t|}| j }t| ||}t||}|||fS )Nr   r  Z___unnamed_scope)r  r  r   r  r  r  r  r  rC   r0   r   r  r2   r1   )	r}   r:  r  Zmodule_sourcefglobals_valuefglobals_vtglobal_sourceZglobals_nameZglobals_sourcerc   rc   ri   get_globals_source_and_value~  s"    



 
z:InliningInstructionTranslator.get_globals_source_and_valuec                    s   | j j| jkrt | ntjdkr:|jd r:| | |j	}| 
|\}}}| j j||rx| | j j|| nBz| j| }W n tk
r   | | Y S X | t| || d S r  )r   r  r  r7  r   r   r   r  r  r   r<  rZ  Zhas_pending_mutation_of_attrr   Z	load_attrr  r  rC   )r}   r   r:  rr   r:  r;  r   r=  rc   ri   r     s    


z)InliningInstructionTranslator.LOAD_GLOBALc                    sr   | j | jj krt | nR|  }t|tr6td |j}| 	|\}}}| j
j||}| j
j||| d S r  )r  rU  r7  r  r   r   r`   r%   r   r<  r   rZ  Ztrack_object_existingr  )r}   r   r   r:  r9  r:  rr   r=  rc   ri   r    s    
 z*InliningInstructionTranslator.STORE_GLOBAL)$r   r   r   r   r   r_   r   classmethodre  r  r  rB   r   r  r   r  r  r   r   rL   r8  r  r  r  r  r  r  r8  r   r   rM  rN  r<  r   r  r?  rc   rc   r=  ri   rT  b
  s>   


 x


"
'rT  c                       sP   e Zd ZU ee ed<  fddZedddZdd Z	d	d
 Z
dd Z  ZS )r-  r/  c                    s   t  j|| g | _d S rl   )r7  r8  r/  )r}   rq   r\  r=  rc   ri   r8    s    z/InliningGeneratorInstructionTranslator.__init__)r   c                 C   s$   | j |   | td  d S rl   )r/  r   r   r   rF   r   r   rc   rc   ri   YIELD_VALUE  s    z2InliningGeneratorInstructionTranslator.YIELD_VALUEc                 C   s>   | j d }t|ts:|   tt| |gi }| | d S r  )rB  r   rR   r   rE   r  rd   r   )r}   r   r  resrc   rc   ri   GET_YIELD_FROM_ITER  s
    

z:InliningGeneratorInstructionTranslator.GET_YIELD_FROM_ITERc              
   C   s   t | jdkst|  }| jd }t|tr8|jd ks@td z|| }W nB t	t
jfk
r } z|   | t|j W 5 d }~X Y n>X | | | | t| jtr| jdkst|  jd8  _d S )Nr}  r   Unreachable sub-generator coder   r   )r   rB  r   r   r   rF   r   r%   r  r  r   r  r   r   r>  ry   r   r}   r   r  r  exrc   rc   ri   
YIELD_FROM  s"    
$


z1InliningGeneratorInstructionTranslator.YIELD_FROMc              
   C   s   t | jdkst|  }| jd }t|tsHt|trt|jtj	j
rt|tr|jd krz|| }W nV ttjfk
r } z2tjdk r|   | t|j | | W 5 d }~X Y qX | | qtd ntdt|  d S )Nr}  r   r  rA  zSEND )r   rB  r   r   r   rR   rb   r   ri  rj  IteratorrF   r  r  r   r  r   r   r   r   r   r%   rA   rB  rc   rc   ri   SEND  s&    



z+InliningGeneratorInstructionTranslator.SEND)r   r   r   r   rB   r   r8  r   r>  r@  rD  rF  r?  rc   rc   r=  ri   r-    s   
r-  )ri  collections.abcr  r  r   r   r   r  r   ra  rm  r   r   r   r   	threadingr
  r  typingr  r   r   r   r   r   r   r   r	   r
   Zunittest.mockr   r   Ztorch._loggingZtorch._guardsr   r   r   r   r   r   r   r   Zbytecode_analysisr   r   r   r   Zbytecode_transformationr   r   r   r   r   r   r   r   r    r!   Zcodegenr"   r#   r$   r%   r&   Zfuncname_cacher'   Zguardsr(   r)   Zoutput_graphr*   r+   Zreplay_recordr,   r-   r  r.   r/   r   r0   r1   r2   r3   r4   r5   r6   r7   utilsr8   r9   r:   r;   r<   r=   r>   Zvariables.baser?   r@   rA   rB   Zvariables.builderrC   rD   Zvariables.builtinrE   Zvariables.constantrF   Zvariables.ctx_managerrG   rH   rI   Zvariables.dictsrJ   rK   Zvariables.functionsrL   rM   rN   rO   rP   Zvariables.listsrQ   rR   rS   rT   rU   Zvariables.miscrV   rW   rX   rY   rZ   r[   Zvariables.nn_moduler\   Zvariables.tensorr]   r^   r_   Zvariables.user_definedr`   ra   rb   	getLoggerr   r   r'  ZgetArtifactLoggerr  r*  rs  rw  localr  r9  rk   r   r   containsrd   rm   r  ru   	dataclassrv   r   	lru_cacher   r   r  r   r  r   r   r   r   r  r)  r  r*  r   r  r   Z_nb_opsrv  rT  r-  rc   rc   rc   ri   <module>   s    ,, $	 
+
F 3 
             !  G	  V