U
    9%ei                    @   s  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mZmZ d dlmZ d dlZd dlZd dl m!Z!m"Z"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/m0Z0m1Z1 dd
l2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z; ddl'm<Z<m=Z=m>Z>m?Z? ddl@mAZA ddlBmCZCmDZDmEZE ddlFmGZGmHZH ddlImJZJmKZK ddlLmMZMmNZNmOZOmPZPmQZQ ddlRmSZSmTZTmUZUmVZVmWZWmXZXmYZY ddlZm[Z[m\Z\m]Z]m^Z^ ddl_m`Z`maZa ddlbmcZc ddldmeZemfZf ddlgmhZhmiZimjZj ddlkmlZl ddlmmnZnmoZompZpmqZq ddlrmsZsmtZtmuZumvZvmwZwmxZx ddlymzZzm{Z{m|Z|m}Z}m~Z~mZ ddlmZ ddlmZmZmZmZ ddlmZ ddlmZmZ e
eZejed Zejed!Zejed"Zedd#d$ ZejG d%d& d&ZG d'd( d(eZejd)ef d*d+d,Zd-ejegef ed.d/d0Zejegef ed1d2d3Zd4Zd5d6 ZG d7d- d-e!e ZG d8d9 d9eZG d:d; d;eZG d<d= d=eZdS )>    N)Sized)	AnyCallableDictList
NamedTupleOptionalSetTupleType)patch)CheckpointabletracingTracingContext   )allowed_functionsconfigexcloggingside_effects	skipfiles	variables)
is_allowedis_builtin_constant)get_indexofJUMP_OPNAMESlivevars_analysis)cleaned_instructionscreate_call_functioncreate_instructioncreate_jump_absoluteInstructionis_generator	unique_id)	PyCodegen)ArgsMismatchErrorBackendCompilerFailedunimplementedUnsupported)GuardBuilder)GraphCompileReasonOutputGraphOutputGraphState)DummyModuleExecutionRecorder)ContinueExecutionCacheReenterWith)
AttrSourceGetItemSourceGlobalSourceGlobalWeakRefSourceLocalSource)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EnumVariable)ContextWrappingVariableGenericContextWrappingVariableWithExitFunctionVariable)ConstDictVariable)BaseUserFunctionVariableNestedUserFunctionVariableUserFunctionVariableUserMethodVariable)BaseListVariableListIteratorVariableListVariableSetVariableSliceVariableTupleVariable)ClosureVariableGetAttrVariableInlinedClosureVariableNullVariablePythonModuleVariableUnknownVariable)NNModuleVariable)supported_const_comparison_opssupported_tensor_comparison_opsSymNodeVariableTensorVariable)TorchVariable)UserDefinedObjectVariableUserDefinedVariableZgraph_breaksZ
trace_callZtrace_sourcec                   C   s
   t tS N)torchdynamo_loggingZget_step_loggerlog re   re   ]/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torch/_dynamo/symbolic_convert.py_step_loggert   s    rg   c                   @   sJ   e Zd ZU eed< dZee ed< dZe	ed< dd Z
dd Zd	d
 ZdS )BlockStackEntrytargetNstack_indexwith_contextc                 C   s
   | j d k	S rb   )rk   selfre   re   rf   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 rb   )rj   AssertionErrorrk   Ztarget_valuesr0   tuplerl   re   re   rf   	resume_fn   s    zBlockStackEntry.resume_fnc                 C   s   | j |S rb   )rk   exit)rm   Ztxre   re   rf   rr      s    zBlockStackEntry.exit)__name__
__module____qualname__r!   __annotations__rj   r   intrk   rF   rn   rq   rr   re   re   re   rf   rh   y   s   
rh   c                   @   sz   e Zd ZU eed< eeef ed< ee ed< ee	 ed< e
e ed< eed< e
e ed< eed< d e
e d	d
dZdS )InstructionTranslatorGraphStateoutputsymbolic_localsstackblock_stackinstruction_pointercurrent_instructionnext_instructionlineno)otherreturnc                 C   sh   | j D ]\}|dkr.| jj|j| dd  S t| |}t||}||kr| d| d|   S qd S )Nry   .)prefixz mismatch: z != )_fieldsry   diffgetattr)rm   r   ksvovre   re   rf   r      s    


z$InstructionTranslatorGraphState.diffN)rs   rt   ru   r,   rv   r   strr@   r   rh   r   rw   r!   r   re   re   re   rf   rx      s   
rx   .)fnc                    s<   t t| jt|  t| dtd fdd}|S )NInstructionTranslatorBaserm   instc                    s   |   | | i  d S rb   )pushcall_functionpopnr   Zfn_varnargsre   rf   impl   s    zstack_op.<locals>.impl)leninspect	signature
parametersrC   	functoolswrapsr!   )r   r   re   r   rf   stack_op   s
    r   r   )rm   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_GLOBALro   LOAD_ASSERTION_ERRORr   zassertion error
LOAD_CONST)CALL_FUNCTIONPRECALLr   RAISE_VARARGST)operatortruth
isinstancer}   rw   ro   instructionssysversion_infoopnameargvalr   r   rD   )rm   r   r   Zcurrent_instruction_pointerr   	error_msgre   re   rf   &_detect_and_normalize_assert_statement   s:    









r   )r   r   c                    s   dt d fdd}|S )Nr   r   c                    s  |   }| jj|j tjrt|  r|   }| jj|j | rht|	 rh| 
| d S t|tr| jjdtjft||fi   | 
| d S | jjdtjft|fi  }t| |fdt|j| it|g}| jjdtjft||fi   | 
| d S | rH|	 r o8| | | 
| nt|tr|  r|  rd|   }t| t|| | td | jj | t!dt"| |  gd |    | #| j$} o| | | #|j%}| j&t'|j(|d dg| |  nt|t)r^| j*|j+}	|	r oN| | | 
| nt|t,rL|-| d	}
|
 r|
	 d kr|-| d
}
t|
t.r&| / }|
0| g i }t|t1rt|j2tt3fr| jj|j |j2r$ o| | | 
| n| 4| t5d n$dr o>| | | 
| nt|ts|6| rt7|8| r o| | | 
| nNt|t9r|:| j}|r o| | | 
| nt;tj<j=dd S )Nr   Zexample_valueBSkipping frame because there is a graph break in a for/while loop
zgeneric_jump triggered compilezgeneric_jump reasonr   )ri   __bool____len__z@generic_jump on UserDefined with __bool__ returning non-constantTzDynamic control flow is not supported at the moment. Please use functorch.experimental.control_flow.cond to explicitly capture the control flow)>popry   guardsupdater   Z rewrite_assert_with_torch_assertr   is_python_constantboolas_python_constantjumpr   r^   Zcreate_proxytorchZ_assert_asyncr<   Zscalar_tensorrB   r7   noder@   	propagater   should_compile_partial_graphhas_backedgeframe_summaryrd   infor   	SkipFramedebugcompile_subgraphr*   r?   create_call_resume_atr   ri   add_output_instructionsr   r   rZ   Zget_submoduleZ
module_keyr`   Zvar_getattrrM   copy_graphstater   rD   valuerw   restore_graphstater'   has_unpack_var_sequencer   unpack_var_sequencer]   Zevaluate_exprZ	UserErrorZUserErrorTypeZDYNAMIC_CONTROL_FLOW)rm   r   r   r   Zscalar_to_tensor_proxyZscalar_to_tensormsgZif_nextZif_jumpmodxstateresultZeval_resultr   r   re   rf   inner   s    



 









 
 


zgeneric_jump.<locals>.inner)r!   )r   r   r   re   r   rf   generic_jump   s     r   Fc                    s    fdd}|S )Nc                    s$   t  dtd fdd}|S )Nr   r   c              
      s  |   }d }z$t| jj| j| jj  | |W S  tk
rh } z|  rz| 	 rzd| 
  }t| t||t| jdkr|  | j }| | |jd }t|tsttd|  | 	 sԂ tjddd |j}dt|}|d j|d jf}	t t!j"r:t#s:t$%|	r:td	|| |  |&d
 t'|j(|}W 5 d }~X Y nX | | | j)j*| |d t+| }
g }| j,D ],}| j)-|j./|
|0 1|
j2| qt3j4dkr.|j5dkr.| j6d k	r| j6j7nd}t|dkr| j)-t8d|dg | j)-t9|j:d n.|j;d ks>tt<<|}d |_=| j)-|g | j)-| t3j4dkr|j5dkrt>?t>j@d |j:t>?t>j@d |j: }nt>?|jA|j:}| B|  tCD ]}| DtE  q| j)-| F| jG d S )Nr   r   zGraph break under z,break_graph_if_unsupported triggered compileTexc_info z%Graph break: %s from user code at:
%sgraph_breakr   r      CALLre   KW_NAMESr   Fr   )Hr   r   set_current_locf_codeco_filenamer   co_namer(   r   r   r   rd   r   r   r   r   states_before_blockremove_from_statsr   r   r{   r   rG   ro   r'   r   Z
real_stackjoin	tracebackformat_listfilenamegraph_break_logisEnabledForr   DEBUGexplainr9   addadd_to_statsr*   r   ry   r   r$   r|   r   rk   Zreconstructrq   Z
try_exceptcode_optionsr   r   r   kw_namesr   r   r   argri   copyexn_tab_entrydisstack_effectopmapopcoder   ranger   rY   r   r   )rm   r   r   r   Zexcpr   ctxZ
user_stackZuser_stack_formattedZ	frame_loccgcleanupbr   Z	inst_copyr   _)inner_fnr   re   rf   wrapper  s      










 
z>break_graph_if_unsupported.<locals>.decorator.<locals>.wrapper)r   r   r!   )r   r   r   )r   rf   	decorator  s    cz-break_graph_if_unsupported.<locals>.decoratorre   )r   r  re   r   rf   break_graph_if_unsupported~  s    gr  c                       sl  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 ed< e
ed	< e	e ed
< eed< ee ed< e
ed< e	eeef  ed< eeedef eedf eeef f  ed< dd Zdd Zdd Zeee eeef dddZeedddZeedddZdd  Zd	d"d#Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Ze	e d.d/d0Z ee d1d2d3Z!ed4d5d6Z"e
ee d7d8d9Z#d:d; Z$d<d= Z%d>d? Z&d@dA Z'e&Z(dBdC Z)dDdE Z*dFdG Z+dHdI Z,dJdK Z-dLdM Z.dNdO Z/dPdQ Z0dRdS Z1dTdU Z2dVdW Z3dXdY Z4e4Z5e4Z6e7e8j9dZZ:e7e8j;dZZ<e7e8j9d[Z=e7e8j;d[Z>d\d] Z?d^d_ Z@d`da ZAdbdc ZBddde ZCdfdg ZDdhdi ZEdjdk ZFdldm ZGdndo ZHdpdq ZIdrds ZJdtdu ZKeLdvdwdxdy ZMeLdvdwdzd{ ZNeLdvdwd|d} ZOd~d ZPdd ZQdd ZRdd ZSdd ZTdd ZUed4ddZVeLddwdd ZWdd ZXdd ZYdd ZZdd Z[e\fddZ]dd Z^e^Z_dd Z`dd ZaeaZbdd Zcdd Zddd Zedd Zfdd Zgdd Zhdd Zidd Zjdd Zkdd Zldd Zmdd Zndd Zodd Zpdd Zqdd Zrdd Zsdd ZtddĄ ZuddƄ ZvddȄ ZwewZxddʄ Zydd̄ Zzdd΄ Z{ddЄ Z|dd҄ Z}ddԄ Z~ee8jZee8jZee8j9Zee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZeLdvdwee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZee8jZddք Zdd؄ Zddڄ Zdd܄ Zddބ ZeLdvdwdd Zdd Zdd Ze4Ze4Ze7e8j;dZZe7e8j;dZZe7e8j9dZZe7e8j9dZZdd Zdd Zdd Zdd Zdd Zdd Zdd Zed4ddZedddZdd Z֐d
ddZdd Zdd Zeڐd d Zېdd Zejސdd Zeee eeef eeef eeef eeef eeef eeef ejee
d fddZ  ZS (  r   ry   rz   symbolic_globalsr{   r}   r~   r   r|   r   r   accept_prefix_instprefix_instsinline_depth
checkpoint.random_callsc                 C   sN   | j j}| jd k	st| j| jd  D ]"}|jtkr&|j}||k r& dS q&dS NTF)r~   offsetr}   ro   r   r   r   r   )rm   Z
cur_offsetr   Zjump_offsetre   re   rf   r     s    
z&InstructionTranslatorBase.has_backedgec                 C   s6   t | ds0t| jd pg t| jd p(g  | _| jS )N_cell_and_freevarsco_cellvarsco_freevars)hasattrrp   r   r  rl   re   re   rf   cell_and_freevars  s    
z+InstructionTranslatorBase.cell_and_freevarsc                    sP   t | j| j  t|  B  t fdd| j D | _| j	j
|  d S )Nc                    s    g | ]\}}| kr||fqS re   re   ).0r   vreadsre   rf   
<listcomp>  s      z?InstructionTranslatorBase.prune_dead_locals.<locals>.<listcomp>)r   r   r~   setr  collectionsOrderedDictrz   itemsry   r   Zprune_dead_object_newrl   re   r  rf   prune_dead_locals  s    z+InstructionTranslatorBase.prune_dead_locals)r   args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	|dr|jrtd| | || || d S )Nc                 s   s   | ]}t |tV  qd S rb   )r   r@   r  r   re   re   rf   	<genexpr>"  s   z:InstructionTranslatorBase.call_function.<locals>.<genexpr>r   r   _dynamo_forbiddenz$Attempt to trace forbidden callable )r   r@   ro   listdictall	itertoolschainvaluesr  r   r   callabler  r   r   )rm   r   r  r  r   re   re   rf   r     s*    

z'InstructionTranslatorBase.call_functionoldvarnewvarc                    s   t dfddt dfddt  | jjj d  fdd| jD | _| j D ] \}}t j| d| j|< qdd S )	Nr  c                    s   | j j kr S | S rb   mutable_localr)  )r(  r'  re   rf   repl5  s    z?InstructionTranslatorBase.update_locals_and_stack.<locals>.replc                    s    j | jkS rb   )r+  recursively_containsr)  )r'  re   rf   skip:  s    z?InstructionTranslatorBase.update_locals_and_stack.<locals>.skipZskip_fnc                    s   g | ]}t j| d qS )r/  )r@   applyr  )cacher,  r.  re   rf   r  ?  s    zEInstructionTranslatorBase.update_locals_and_stack.<locals>.<listcomp>)r@   r   ry   r   r0  r{   rz   r  )rm   r'  r(  r   r   re   )r1  r(  r'  r,  r.  rf   update_locals_and_stack4  s       z1InstructionTranslatorBase.update_locals_and_stackc                 C   sV   t |jtjr | jj||}n&t |jtjjs4t	|j
tj d}| || |S )Nr*  )r   r+  r   ZMutableSideEffectsry   Zmutationr   baser>   ro   cloner2  )rm   r'  r(  re   re   rf   replace_allG  s    z%InstructionTranslatorBase.replace_allc                 C   sT   |   }z&t| |||}| jj|j |W S  tk
rN   | |  Y nX dS )zF
        A call to some user defined function by inlining it.
        N)r   InliningInstructionTranslatorinline_callry   r   r   	Exceptionr   )rm   r   r  r  r   r   re   re   rf   inline_user_function_returnP  s    
z5InstructionTranslatorBase.inline_user_function_returnNc                 C   sJ   |d kr| j }| jdkr&d| j dnd}| jj d| jj d| | S )Nr   z (inline depth: )r    :)r   r  r   r   r   )rm   r   Zinline_depth_strre   re   rf   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 
z    )r=  	linecachegetliner   r   r   rstrip)rm   Zlog_strlinere   re   rf   get_log_starts_line_log_stre  s    z5InstructionTranslatorBase.get_log_starts_line_log_strc                 C   s   t dt| j d S )N%s)trace_source_logr   r;   rC  rl   re   re   rf   log_starts_linek  s    z)InstructionTranslatorBase.log_starts_linec                 C   sf  t | jtst| j| j }|| _|  jd7  _| jt| jk rP| j| j | _nd| _d| _|jr~| j	|jkr~|j| _	| 
  t| jdkr|  r||  f| _td|j|j| j tjdkrl|j}| jr|r| jd j|jksl|s"| jrl|jdkrlt| jdkst| j  nJt| jdkrR| jd j|jkrR| j  n| jt|jt| j zRt| |jstd	|j  t| jj | j	| jj! t"| |j| |jd
kW S  t#k
r   | $ rtd  tjddd Y nX | j%j&rt| jdk	st| j\}}| '| | j%j(| dt)d| * gd | j%+t,|g| j  dS )z<Process exactly one instruction, return False we should exitr   Nr   zTRACE %s %s %sr   r   NOPz	missing: RETURN_VALUEzempty checkpointzstep triggered compileTr   Zstep_unsupported)Zpartial_convertr   )-r   r}   rw   ro   r   r~   r   r   starts_liner   rF  r{   r   r   r  rd   r   r   r   r   r   r   r|   ri   r   appendrh   r  r'   r   r   r   r   r   r   r(   empty_checkpointry   Zoutput_instructionsr   r   r*   r   r   r    )rm   r   entryZcontinue_instr   re   re   rf   stepn  sz      



zInstructionTranslatorBase.stepc                 C   s
   t d S rb   )r   current_framerl   re   re   rf   run_ctx_mgr  s    z%InstructionTranslatorBase.run_ctx_mgrc                 C   s   |    z|z,| j|  | jd k	r6| jjs6| 	 r6qW nJ t
k
rN    Y n6 tk
r } ztjrp| j |_ W 5 d }~X Y nX W 5 | j  t| tr| j  X W 5 Q R X d S rb   )rP  ry   Zpop_txr   InstructionTranslatorr   Zpush_txr}   Zshould_exitrN  r&   r8  r   replay_record_enabledexec_recorderZ
get_recordZexec_record)rm   ere   re   rf   run  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   r@   ro   r?   r{   rK  )rm   rV  re   re   rf   r     s    
 zInstructionTranslatorBase.push)valsc                 C   s   |D ]}|  | qd S rb   r   )rm   rW  rV  re   re   rf   	push_many  s    z#InstructionTranslatorBase.push_many)r   c                 C   s
   | j  S rb   )r{   r   rl   re   re   rf   r     s    zInstructionTranslatorBase.pop)nr   c                    s*   |dkst tt fddt|D S )Nr   c                    s   g | ]}   qS re   r   )r  r   rl   re   rf   r    s     z2InstructionTranslatorBase.popn.<locals>.<listcomp>)ro   r  reversedr   )rm   rY  re   rl   rf   r     s    zInstructionTranslatorBase.popnc                 C   s   |j }|| jkr*tjr*| j|| j|  |drJ|| jkrJ|dd}|| 	 ksZt
|| jkrltd | | j|  |dr| j| d S )Nr   Zimplicitzundefined LOAD_FASTZ___stack)r   f_localsr   rR  rS  add_local_var
startswithrz   replacer  ro   r'   r   r   )rm   r   namere   re   rf   	LOAD_FAST  s    

z#InstructionTranslatorBase.LOAD_FASTc                 C   sn   |j |  kst|j | jkr<tjr<| j|j | j|j   |j | jkrXt	d|j   | 
| j|j   d S )Nzundefined LOAD_DEREF )r   r  ro   r\  r   rR  rS  r]  rz   r'   r   r   re   re   rf   
LOAD_DEREF  s    z$InstructionTranslatorBase.LOAD_DEREFc                 C   s   |   | j|j< d S rb   )r   rz   r   r   re   re   rf   
STORE_FAST  s    z$InstructionTranslatorBase.STORE_FASTc                 C   s   | j |j= d S rb   )rz   r   r   re   re   rf   DELETE_FAST  s    z%InstructionTranslatorBase.DELETE_FASTc                 C   s   |  t|jd d S N)r`  )r   rT   r   r   re   re   rf   LOAD_CLOSURE  s    z&InstructionTranslatorBase.LOAD_CLOSUREc                 C   s8   t |jtr"|js"| tg  n| t|jd d S )Nr   )r   r   rp   r   rS   rD   r   re   re   rf   r     s    z$InstructionTranslatorBase.LOAD_CONSTc                 C   sx   | j j| jkrt|}n\d| jkr:t| | jd |}n:dt| j }|| j jkrf| j || j tt||}|S )Nrs   Z___unnamed_scope_)	ry   global_scope	f_globalsr3   r1   import_sourceidinstall_globalr2   )rm   r`  sourceZmangled_namere   re   rf   get_global_source$  s    

 z+InstructionTranslatorBase.get_global_sourcec                 C   s  t jdkr|jd r| | |j}tjrj|| jkrJ| j	|| j|  n || j
ksXt| j
| | jj|< |jdkr|td || jkr| jj| j|  }| | jj|| d S z| j| }W n tk
r   | | Y S X | |}| t| || d S )Nr      ro   assert with non-string message)r   r   r   	PUSH_NULLr   r   rR  ri  rS  Zadd_global_var
f_builtinsro   builtinsr'   r  ry   r   r   load_globalKeyErrorload_builtinrn  rA   )rm   r   r`  variabler   rm  re   re   rf   r   3  s*    






z%InstructionTranslatorBase.LOAD_GLOBALc                 C   sZ   |   }|j}| |}|| jkr.t | j|< | jj|| j| }| jj||| d S rb   )	r   r   rn  r  objectry   r   Ztrack_global_existingZstore_global)rm   r   r   r`  rm  rw  re   re   rf   STORE_GLOBALQ  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 guardsZtorch_package>r   <r   Z_dot_Z	__import_)r   packageZpackage_importerZ_package_imported_modulesr_  	importlibimport_modulery   rh  ro   Zupdate_co_namesr3   )rm   module_namer   aliasri  re   re   rf   rj  \  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)rm   r`  r|  levelbitsr3  re   re   rf   resolve_namen  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__rs   __path__r   r   )ri  getparentrd   warning
rpartition)rm   r|  specre   re   rf   calc_packagez  s*    

z&InstructionTranslatorBase.calc_packagec           
      C   s"  |  d\}}| }| }|j}tj d| d| d| }|| jkr^| j| }t|}nXt|||| jd}|dkr|  }| 	|||}|s|
dd }	| |	}n
| |}tjr| j|| t|r| t||d n8t|tjtfr| t||d ntdt|  d S )Nro  r   )fromlistr  globalsr   r   )rm  zIMPORT_NAME )r   r   r   r.   ZLOCAL_MOD_PREFIXri  r3   
__import__r  r  	partitionrj  r   rR  rS  Zadd_local_modr   r   r_   r:   types
ModuleTyper-   rX   r'   r?   )
rm   r   r  r  r  Zrecorded_namer   rm  pkgZtop_level_module_namere   re   rf   IMPORT_NAME  s:    



z%InstructionTranslatorBase.IMPORT_NAMEc                 C   s   |  | | | d S rb   )DUP_TOP	LOAD_ATTRr   re   re   rf   IMPORT_FROM  s    
z%InstructionTranslatorBase.IMPORT_FROMc                 C   sn   |j | jkrtd|j  d| j|j  }t|rN| t| t|j | nt|sZt| t	|d d S )Nzname 'z' is not definedrg  )
r   rr  	NameErrorr%  r   rA   r3   r   ro   rD   )rm   r   rV  re   re   rf   rv    s    z&InstructionTranslatorBase.load_builtinc                 C   s   | j |j | _d S rb   )indexofri   r}   r   re   re   rf   r     s    zInstructionTranslatorBase.jumpFTc                 C   s   | j t|j d S rb   r|   rK  rh   ri   r   re   re   rf   
SETUP_LOOP  s    z$InstructionTranslatorBase.SETUP_LOOPc                 C   s   | j t|j d S rb   r  r   re   re   rf   SETUP_EXCEPT  s    z&InstructionTranslatorBase.SETUP_EXCEPTc                 C   s   | j   d S rb   )r|   r   r   re   re   rf   	POP_BLOCK  s    z#InstructionTranslatorBase.POP_BLOCKc                 C   s   |  | d S rb   setup_or_before_withr   re   re   rf   
SETUP_WITH  s    z$InstructionTranslatorBase.SETUP_WITHc                 C   s   | j t|j d S rb   r  r   re   re   rf   SETUP_FINALLY  s    z'InstructionTranslatorBase.SETUP_FINALLYc                 C   s   |  d  d S rb   r   r   re   re   rf   BEGIN_FINALLY  s    z'InstructionTranslatorBase.BEGIN_FINALLYc                 C   sF   |  d\}}|d kst| | | || td gd i  d S )Nro  r   )r   ro   r   r   rD   )rm   r   rr   r   re   re   rf   WITH_CLEANUP_START  s    
z,InstructionTranslatorBase.WITH_CLEANUP_STARTc                 C   s   |  d | d  d S )Nro  )r   r   r   re   re   rf   WITH_CLEANUP_FINISH  s    
z-InstructionTranslatorBase.WITH_CLEANUP_FINISHc                 C   s   |   }|d kstd S rb   )r   ro   rm   r   tosre   re   rf   END_FINALLY  s    z%InstructionTranslatorBase.END_FINALLYc                 C   s4   |j }|r|  }|  d ks"t|r0| | d S rb   )r   r   ro   r   )rm   r   Zpreserve_tosr  re   re   rf   POP_FINALLY  s    z%InstructionTranslatorBase.POP_FINALLYc                 C   s   |   }t|trt| jj|j z0| \}}| || | | | | W q t	k
rp   | 
| Y qX ntdt|  d S )Nz	FOR_ITER )r   r   rO   ry   r   r   next_variablesr5  r   StopIterationr   r'   r?   )rm   r   itrV  	next_iterre   re   rf   FOR_ITER	  s    

z"InstructionTranslatorBase.FOR_ITERc              	   C   sB  |  d\}}|| }|| }t||g}|j}ttt	 t
	 }t|tttttttfrt|tr|jd kr|t
kr| tt
| t |jf| n| r| r||kr| t|| | | f| n\|dkr| || d|gi  |dkr>| | n$| t|| f|| ||gi  d S )Nro  )innot in__contains__r  )r   as_specializedr@   r   r   r   r"  r#  r\   r  r[   r   r^   r]   rZ   rN   ra   rJ   rI   rD   r   r   rx  r   r   call_method	UNARY_NOTrC   r   )rm   r   leftrightoptionsopZsupported_anyre   re   rf   
COMPARE_OP  s~    

 

  z$InstructionTranslatorBase.COMPARE_OPc                 C   s   |  tt|  gi  d S rb   )r   rC   iterr   r   re   re   rf   GET_ITERT  s    z"InstructionTranslatorBase.GET_ITERr   r   c                 C   s&   |  |j}|  }| ||i  d S rb   )r   r   r   r   )rm   r   r  r   re   re   rf   r   W  s    z'InstructionTranslatorBase.CALL_FUNCTIONc                 C   s,  |j dkrti t}|  }n$|j dkr:|  }|  }ntd |  }tjdkrj|  }t|tsjt	| j
j|j | j
j|j t|trt|jtr|jdkrt|ttfrt|g}t|ts|| rt|| }t|trt|tstdt| dt|  | ||j|j d S )Nr   r   CALL_FUNCTION_EXr   viewznon-static call r;  )r   rI   r   r   r'   r   r   r   rW   ro   ry   r   r   rU   objr^   r`  rD   rS   rN   r   r   r?   r   r  )rm   r   Z
kwargsvarsZargsvarsr   nullre   re   rf   r  ]  sF    






	
  z*InstructionTranslatorBase.CALL_FUNCTION_EXc                 C   s   |   }| |j}|   }t|ts*t|j}|d t|  |t| d   }}tt	||}t|t|ksxt| 
||| d S rb   )r   r   r   r   rD   ro   r   r   r   zipr   )rm   r   argnamesr  r   kwargs_listr  re   re   rf   CALL_FUNCTION_KW  s    &z*InstructionTranslatorBase.CALL_FUNCTION_KWc                 C   sJ   |  | |  }tjdkr2| | | | n| | | d  d S )Nr   )r  r   r   r   rq  r   rm   r   r  re   re   rf   LOAD_METHOD  s    



z%InstructionTranslatorBase.LOAD_METHODc                 C   s:   |  |j}|  }|d ks t|  }| ||i  d S rb   )r   r   r   ro   r   )rm   r   r  dummyr   re   re   rf   CALL_METHOD  s
    z%InstructionTranslatorBase.CALL_METHODc                 C   s2   |   }tt| |t|jgi }| | d S rb   )r   rC   r   r   rD   r   r   )rm   r   r  r   re   re   rf   r    s      z#InstructionTranslatorBase.LOAD_ATTRc              
   C   s  |   }| d\}}t|tr8| jr8td|j dz0| jj	t
t| |t|j|gi j W d S  tk
r } z8|  s tjddd |  |d | | W 5 d }~X Y nX | jj| td|  gd	 | jt|g | d | j| | j d S )
Nro  zMutating module attribute z during export.zSTORE_ATTR triggered compileTr   r   Z
store_attrr   )r   r   r   rZ   exportro   r   ry   r   r   rC   setattrr   rD   r(   r   rd   r   r   r   r   r   r*   r   r   r   r   r   )rm   r   ZpriorrV  r  rT  re   re   rf   
STORE_ATTR  s@    
  
 

z$InstructionTranslatorBase.STORE_ATTRc                 C   s4   |   }| jjtt| |t|jgi j d S rb   )	r   ry   r   r   rC   delattrr   rD   r   r  re   re   rf   DELETE_ATTR  s      z%InstructionTranslatorBase.DELETE_ATTRc                 C   s   t dt|  d S )Nz1create_call_resume_at not overridden by subclass ro   typerm   r
  re   re   rf   r     s    z/InstructionTranslatorBase.create_call_resume_atc                 C   s   t dt|  d S )Nz8should_compile_partial_graph not overridden by subclass r  rl   re   re   rf   r     s    z6InstructionTranslatorBase.should_compile_partial_graphr   c                 C   s8   |  d\}}}|| d||gi }| jj|j d S )Nr   __setitem__)r   r  ry   r   r   )rm   r   rV  r  keyr   re   re   rf   STORE_SUBSCR  s    z&InstructionTranslatorBase.STORE_SUBSCRc                 C   s,   |  |j}t|}| t|f| d S rb   )r   r   r@   r   r   rS   rm   r   r  r  re   re   rf   BUILD_TUPLE  s    
z%InstructionTranslatorBase.BUILD_TUPLEc                    s:     |j}t|} t fdd|D f| d S )Nc                    s   g | ]}|  qS re   )r  r  rl   re   rf   r    s     z9InstructionTranslatorBase.BUILD_SLICE.<locals>.<listcomp>)r   r   r@   r   r   rR   r  re   rl   rf   BUILD_SLICE  s    
z%InstructionTranslatorBase.BUILD_SLICEc                 C   s6   |  |j}t|}| t|fdt i| d S Nr+  )r   r   r@   r   r   rP   r>   r  re   re   rf   
BUILD_LIST  s    
z$InstructionTranslatorBase.BUILD_LISTc                 C   sJ   t jrtd | |j}t|}t| |fdt i|}| 	| d S )Nzmissing: BUILD_SETr+  )
r   Z+inject_BUILD_SET_unimplemented_TESTING_ONLYr'   r   r   r@   r   rQ   r>   r   )rm   r   r  r  Znew_setre   re   rf   	BUILD_SET  s    
z#InstructionTranslatorBase.BUILD_SETc              	   C   s~   |  |j}t|}t }|D ]<}z|||  W q  tk
rZ   td|  Y q X q | 	||fdt
 i| d S )NzBUILD_LIST_UNPACK r+  )r   r   r@   r   r  extendr   NotImplementedErrorr'   r   r>   )rm   r   clsZseqsr  r  seqre   re   rf   BUILD_LIST_UNPACK  s    
z+InstructionTranslatorBase.BUILD_LIST_UNPACKc                 C   s   | j |td d S )N)r  )r  rS   r   re   re   rf   BUILD_TUPLE_UNPACK  s    z,InstructionTranslatorBase.BUILD_TUPLE_UNPACKc                 C   s   |  |jd }t|}t }t|d d d |dd d D ]>\}}t|ttt	fsnt|t
rj|jd k	snt||t|< q>t|t|d kst| t|tfdt i| d S )Nro  r   r+  )r   r   r@   r   r   r  r   rD   rE   rC   r^   Zspecialized_valuero   rI   get_keyr   r   r>   )rm   r   r  r  r   r   r  re   re   rf   	BUILD_MAP  s    
&z#InstructionTranslatorBase.BUILD_MAPc                    sp     |j} fdd|D }t }|D ]}t|ts:t||j q( t|tfdt	 it
| d S )Nc                    s    g | ]}t t |gi qS re   )rC   r   r   r  rl   re   rf   r  '  s     z>InstructionTranslatorBase.BUILD_MAP_UNPACK.<locals>.<listcomp>r+  )r   r   r   r   rI   ro   r   r  r   r>   r@   r   )rm   r   r  r   r   re   rl   rf   BUILD_MAP_UNPACK$  s     z*InstructionTranslatorBase.BUILD_MAP_UNPACKc                 C   s   |   }| |j}t|g| }t|ts2t|j}t	|t
sFtt|t|ksZt| ttt||tfdt i| d S r  )r   r   r   r@   r   r   rD   ro   r   r:   rp   r   r   rI   r   r  r>   )rm   r   keysr$  r  re   re   rf   BUILD_CONST_KEY_MAP7  s"    z-InstructionTranslatorBase.BUILD_CONST_KEY_MAPc              
   C   s   |  d\}}|jdkst| j|j  }t|ts8t|jsBtt|j	}|||
 < | |t||jft|||g d S )Nro  r   )r   r   ro   r{   r   r   rI   r+  r   r  r   r5  Zuser_clsr@   r   )rm   r   r   r  r  r  re   re   rf   MAP_ADDH  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   ro   r{   r   r   rQ   r+  r  rm   r   r  r  re   re   rf   SET_ADDY  s    
z!InstructionTranslatorBase.SET_ADDc              
   C   s   |   }|jdkst| j|j  }t|ts2t|js<t|j}|jsN|jrn|j	|j}|jrn|
|j | |t|j|g f|ddt||g d S )Nr   F)r-  Zregen_guards)r   r   ro   r{   r   r   rP   r+  r-  unionr   r5  r  r@   r   )rm   r   r  r  Znew_rec_containsre   re   rf   LIST_APPENDa  s*    

z%InstructionTranslatorBase.LIST_APPENDc              
   C   s   |j }t| j}tjdk r"|  }|  }tjdkrRt|jdsDtt	|jj
d}d }d }d }d }	|d@ rr|  }|d@ r|  }|d@ r|  }	|d@ r|  }t|t| jd  }
| t||| j||	||fd| i|
 d S )	Nr   co_qualnamerg        ro  r   Zclosure_scope)r   r  r{   r   r   r   r  r   ro   rD   r  r@   r   r   r   rK   ri  )rm   r   flagsZ	old_stackfn_namecodedefaultsclosureannotations
kwdefaultsr  re   re   rf   MAKE_FUNCTIONy  sH    


	z'InstructionTranslatorBase.MAKE_FUNCTIONc                    s     }t|ttfr2jj|j |}n| rPt|t	rP|}n~t|t
rp|jt|jd}n^t|trt|jt
rt|j |jt  fddt|jD }ntd|  t||jkstt|D ]}| qd S )N)Zidxesc                    s   g | ]}t | f qS re   )rB   )r  ir  proxyrm   re   rf   r    s     z=InstructionTranslatorBase.UNPACK_SEQUENCE.<locals>.<listcomp>zUNPACK_SEQUENCE )r   r   rN   rQ   ry   r   r   r   r   rD   r^   r   r   rU   r  r   Zas_proxyr`  r@   r   r'   r   ro   r[  r   )rm   r   r  rV  r  re   r  rf   UNPACK_SEQUENCE  s     

z)InstructionTranslatorBase.UNPACK_SEQUENCEc                 C   s  d|j   krdksn t|j d@ }|j d? }|  }t|}|| rt|| }t||| ksnt|d | }||t||  }|t|| d  }	t	|	D ]}
| 
|
| q| 
t|f| t	|D ]}
| 
|
| qntd|  d S )Nr   i     r  z
UNPACK_EX )r   ro   r   r@   r   r   r  r   r   r[  r   add_optionsrS   r'   )rm   r   r   suffixr  r  rW  Zvals_prefixZ	vals_listZvals_suffixitemre   re   rf   	UNPACK_EX  s"    



z#InstructionTranslatorBase.UNPACK_EXc                 C   s   d S rb   re   r   re   re   rf   rG    s    zInstructionTranslatorBase.NOPc                 C   s   |    d S rb   rZ  r   re   re   rf   POP_TOP  s    z!InstructionTranslatorBase.POP_TOPc                 C   s(   |   }|   }| | | | d S rb   r   r   rm   r   ar   re   re   rf   ROT_TWO  s    
z!InstructionTranslatorBase.ROT_TWOc                 C   s:   |   }|   }|   }| | | | | | d S rb   r   )rm   r   r  r   cre   re   rf   	ROT_THREE  s    

z#InstructionTranslatorBase.ROT_THREEc                 C   sL   |   }|   }|   }|   }| | | | | | | | d S rb   r   )rm   r   r  r   r  dre   re   rf   ROT_FOUR  s    


z"InstructionTranslatorBase.ROT_FOURc                 C   s    |   }| | | | d S rb   r   )rm   r   r  re   re   rf   r    s    
z!InstructionTranslatorBase.DUP_TOPc                 C   s<   |   }|   }| | | | | | | | d S rb   r   r  re   re   rf   DUP_TOP_TWO  s    


z%InstructionTranslatorBase.DUP_TOP_TWOc                 C   s   |j }|d@ dkr|  }ntd}|  }t|trDtt|j}|d@ dkrft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 )Nr  r   r   r   ro  z{:})r   r   rD   r   r]   r   Zsym_numrC   r   reprasciir   r  format)rm   r   r  fmt_specr   Zfmt_varre   re   rf   FORMAT_VALUE  s&    

z&InstructionTranslatorBase.FORMAT_VALUEc                 C   sH   d}t |jD ]$}|  }t|ts(t|j| }q| t|d d S )Nr   rg  )r   r   r   r   rD   ro   r   r   )rm   r   r   r   Zstr_varre   re   rf   BUILD_STRING  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   ro   r   r  )rm   r   Z
new_argvalZnew_instre   re   rf   IS_OP  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   ro  r  )r   ro   r   r   r  r  )rm   r   r  r  r  re   re   rf   CONTAINS_OP  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   ro   r{   r   r   rP   r+  r  r  re   re   rf   LIST_EXTEND$  s    
z%InstructionTranslatorBase.LIST_EXTENDc                 C   s"   |  tt| |  gi  d S rb   )r   rC   rp   r   r   r   re   re   rf   LIST_TO_TUPLE,  s    z'InstructionTranslatorBase.LIST_TO_TUPLEc                 C   sR   |   }|jdkst| j|j  }t|ts2t|js<t|| d|gi  d S )Nr   r   )	r   r   ro   r{   r   r   rI   r+  r  r  re   re   rf   
DICT_MERGE/  s    
z$InstructionTranslatorBase.DICT_MERGEc                 C   s   |    d S rb   rZ  r   re   re   rf   	GEN_START9  s    z#InstructionTranslatorBase.GEN_STARTc                 C   sD   | j d }| r*| tt|  n| || dg i  d S )Nr   r   )r{   r   r   rD   r   r   r  r  re   re   rf   GET_LEN<  s    
z!InstructionTranslatorBase.GET_LENc                 C   sJ   | j d }t|tstt|jtjjr8| t	d n| t	d d S Nr   TF)
r{   r   rI   ro   r  r  abcMappingr   rD   r  re   re   rf   MATCH_MAPPINGC  s
    
z'InstructionTranslatorBase.MATCH_MAPPINGc                 C   s^   | j d }| st| }t|tjjrLt|tt	t
fsL| td n| td d S r  )r{   r   ro   r   r   r  r  Sequencer   bytes	bytearrayr   rD   )rm   r   r  Z	tos_valuere   re   rf   MATCH_SEQUENCEK  s    
 z(InstructionTranslatorBase.MATCH_SEQUENCEc                    s   | j d }| st| }| j d }t|ts6t|j t fdd|D r| 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   rH  c                 3   s   | ]}| kV  qd S rb   re   r  r  Z	match_objre   rf   r  ]  s     z7InstructionTranslatorBase.MATCH_KEYS.<locals>.<genexpr>c                    s   g | ]} | qS re   re   r   r!  re   rf   r  ^  s     z8InstructionTranslatorBase.MATCH_KEYS.<locals>.<listcomp>r   TF)r{   r   ro   r   r   rI   r  r!  r   rS   r   r   rD   )rm   r   r  r  Ztos1re   r!  rf   
MATCH_KEYSV  s    



z$InstructionTranslatorBase.MATCH_KEYSc                 C   s   t d d S )Nrp  r'   r   re   re   rf   r   f  s    z.InstructionTranslatorBase.LOAD_ASSERTION_ERRORc                 C   s*   |j dkr| | d| _n
| jr&td S )Nr   F)r   append_prefix_instr  ro   r   re   re   rf   RESUME  s    

z InstructionTranslatorBase.RESUMEc                 C   sd   t jdkrXtj|j d dd  }|drFt| d|dd   |S t| d| |S td d S )	Nr   r   r   ZINPLACEZINPLACE_r  ZBINARY_zBINARY_OP requires Python 3.11+)r   r   r   Z_nb_opsr   r^  r   r'   )rm   r   r   re   re   rf   	BINARY_OP  s    

z#InstructionTranslatorBase.BINARY_OPc                 C   s   d S rb   re   r   re   re   rf   r     s    z!InstructionTranslatorBase.PRECALLc                 C   sT   | j d |j }t|tst|D ]}t|ts"tq"| jd ksDtt|d| _d S )N	co_constsrg  )r   r   r   rp   ro   r   r   rD   )rm   r   r   r`  re   re   rf   r     s    z"InstructionTranslatorBase.KW_NAMESc                 C   s   |  t  d S rb   )r   rW   r   re   re   rf   rq    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 )Nro  r   r   re   )r   r   r   rW   r   r   r   r   r  ro   r   )rm   r   contentsr   r  r   r  r  re   re   rf   r     s     
zInstructionTranslatorBase.CALLc                 C   s   |  | j|j   d S rb   )r   r{   r   r   re   re   rf   COPY  s    zInstructionTranslatorBase.COPYc                 C   s.   | j |j  | j d  | j d< | j |j < d S Nr   )r{   r   r   re   re   rf   SWAP  s    zInstructionTranslatorBase.SWAPc                 C   s   d S rb   re   r   re   re   rf   CACHE  s    zInstructionTranslatorBase.CACHEc                 C   s   |  | d S rb   r  r   re   re   rf   BEFORE_WITH  s    z%InstructionTranslatorBase.BEFORE_WITHc                 C   s   |   }|  }t|ts.t|j d|  t|trD| j| | j	j
|j
 t||jft|}tjdkr| js~t| jjst| jjj}n|j}t| tr| jt|t| j| n| jt| | | | ||  d S )Nr;  r   )r   r   r   rF   r'   r   rG   r   rK  ry   r   r   rH   ri   r@   r   r   r   r   ro   r   rQ  r|   rh   r   r{   r   Zenter)rm   r   r   r   rr   ri   re   re   rf   r    s.    





z.InstructionTranslatorBase.setup_or_before_withc                 C   s   | j s
t| j| d S rb   )r  ro   r  rK  r   re   re   rf   r$    s    
z,InstructionTranslatorBase.append_prefix_instc                 C   s   |  | d S rb   r$  r   re   re   rf   	MAKE_CELL  s    z#InstructionTranslatorBase.MAKE_CELLc                 C   s   |  | d S rb   r.  r   re   re   rf   COPY_FREE_VARS  s    z(InstructionTranslatorBase.COPY_FREE_VARSc                 C   s   |  | d S rb   r.  r   re   re   rf   RETURN_GENERATOR  s    z*InstructionTranslatorBase.RETURN_GENERATORc              	   C   s8   t | j t| jt| jt| j| j	| j
| j| jS )z>Create a checkpoint of the current state by copying everything)rx   ry   r   r  r  rz   r  r{   r|   r}   r~   r   r   rl   re   re   rf   r     s    
z)InstructionTranslatorBase.copy_graphstate)r   c                 C   s2   |\}| _ | _| _| _| _| _| _| j| dS )z6Restore a checkpoint created by self.copy_graphstate()N)	rz   r{   r|   r}   r~   r   r   ry   r   )rm   r   Zoutput_statere   re   rf   r     s    z,InstructionTranslatorBase.restore_graphstatec                 C   s`   | j d krdS | j d d }| j d dd  }||}|D ] }t|tr:t|dkr: dS q:dS )NTr   r   F)r  r   r   r   )rm   Zoutput_graphstateZ
graphstater   r  re   re   rf   rL     s    

z*InstructionTranslatorBase.empty_checkpointc                 C   s.   |d krg }d t|  gtt| S )Nr   )r   r   r   r   r  r[  )rm   Zadditional_stack_framesre   re   rf   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>r   F)lookup_line)r   FrameSummaryr   r   r   rl   re   re   rf   r   5  s    z'InstructionTranslatorBase.frame_summaryc                 C   s>   | j jt|tj || j jkr:| j |t	
| d S rb   )ry   r   r   r4   Z
make_guardr)   ZWEAKREF_ALIVErh  rl  weakrefref)rm   r`  r   re   re   rf   store_dict_key=  s
    z(InstructionTranslatorBase.store_dict_keyc                 C   s   | j S rb   )
_fake_moderl   re   re   rf   	fake_modeD  s    z#InstructionTranslatorBase.fake_modec                 C   s(   | j  D ]\}}||kr
|  S q
d S rb   )rz   r  )rm   Ztensor_variabler  r   re   re   rf   find_symbolic_locals_nameH  s    
z3InstructionTranslatorBase.find_symbolic_locals_namec                 c   s   d| _ z
d V  W 5 d| _ X d S r	  )strict_checks_enabledrl   re   re   rf   strict_translation_modeN  s    
z1InstructionTranslatorBase.strict_translation_modery   r   r\  ri  rr  r   rz   r  r   r  r  c                    s0  t    || _|| _|| _g | _d| _td| _d | _	g | _
g | _|d | _d | _d| _g | _|| _t| j| _|| _|| _|| _|| _|	| _t|	|d| _i | _|
| _|jj| _d | _g | _ d| _!t"j#dkrdd	l$m%}m&}m'}m(} |	j)||B |B |B @ r| *t+d  || _,t-.|	j/| | 0  d S )
Nr   rG  co_firstlinenoT)r  r   F)r   
   r   )CO_ASYNC_GENERATORCO_COROUTINECO_GENERATORCO_ITERABLE_COROUTINE)1super__init__ry   rz   r  r{   r}   r   r~   r   r|   r   r   r   r  r  r   r   r  r\  ri  rr  r   r   r.   rS  nn_module_stackr  tracing_contextr9  r8  r  r  r;  r   r   resume_executionr@  rA  rB  rC  co_flagsr   rC   r  r?  	lazycacher   rF  )rm   ry   r   r\  ri  rr  r   rz   r  r   r  r  r@  rA  rB  rC  	__class__re   rf   rE  V  sL    



z"InstructionTranslatorBase.__init__)N)N)rs   rt   ru   r+   rv   r   r   r@   r   r   rw   r!   rh   rD   r   r
   rx   r   rx  r   r  r  r   r2  r5  r9  r=  rC  rF  rN  rP  rU  r   rX  r   r   ra  rb  rc  rd  STORE_DEREFrf  r   rn  r   ry  rj  r  r  r  r  rv  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  r  r   r  r  r  r  r  r  r  r   r   r  r  r  r  r  rP   r  r  BUILD_TUPLE_UNPACK_WITH_CALLr  r  BUILD_MAP_UNPACK_WITH_CALLr  r  r  r  r  r  r  rG  r  r  r  r  r  r  r  r  r  r  r  r  r  ZDICT_UPDATEr  r  r  r  r"  r   r   posUNARY_POSITIVE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_ORr%  r&  r   r   rq  r   r)  r+  ZJUMP_BACKWARDZ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  r$  r/  r0  r1  r   r   rL  r2  r   r7  propertyr9  r:  
contextlibcontextmanagerr<  r   r  CodeTyperE  __classcell__re   re   rK  rf   r     s  
$

	Y
.=

'
$

(
	































	
!		





c                       sn   e Zd ZU ee ed< ee ee d fddZdd Z	 fddZ
d	d
 Zdd Zdd Zdd Z  ZS )rQ  mutated_closure_cell_contents)r   r  c                    s<  t  tjd|j d|d  d|d   t jt|||	|
|||d	||||t t ||	dd t	j
j |_|	_|_jrjstd	t|d
 fdd D }| t| t fddD _  t _jd D ]"}|kr
t| j|< q
W 5 Q R X d S )Nztorchdynamo start tracing r;  r   r<  r>  )Zlocal_scoperh  r   r   r=  z4Export without one graph - something has gone wrong.co_varnamesc                    s   g | ]}| kr|qS re   re   r  )varsre   rf   r    s      z2InstructionTranslator.__init__.<locals>.<listcomp>c                 3   s8   | ]0}|kr|t t|| kd | fV  qdS ))Zcell_or_freevarN)rA   r5   r  r   )cells_and_freevars_setr\  rm   re   rf   r    s   z1InstructionTranslator.__init__.<locals>.<genexpr>r  )rg   r   INFOr   rD  rE  r+   r  r  r   ry   rG  	one_graphr  r  ro   r  r  r  r  rz   init_local_index_guards_hackr   _freevars_idsr   rk  )rm   r   r   r\  ri  rr  r   Zcompiler_fnr  r  Zexport_constraintsr  Zframe_stateZcells_and_freevarsr`  rK  )r  r\  rm   r  rf   rE    s`    


zInstructionTranslator.__init__c                 C   sN   | j  D ]>}t|tttfr
t|d }dd |D }| jj	
| q
d S )Nr   c                 S   s*   g | ]"}|j tjtjtjtjfkr|qS re   )Z	create_fnr)   ZLIST_LENGTHZ	DICT_KEYSZ
ODICT_KEYSZTUPLE_ITERATOR_LEN)r  guardre   re   rf   r    s   zFInstructionTranslator.init_local_index_guards_hack.<locals>.<listcomp>)rz   r$  r   rO   rN   rI   r@   r   ry   r   r   )rm   rV  Zlocal_guardsZindex_guardsre   re   rf   r    s     z2InstructionTranslator.init_local_index_guards_hackc                    s   t    d S rb   )rD  rU  rl   rK  re   rf   rU    s    zInstructionTranslator.runc                 C   s(   |j }t|| j|krdS | j| S )z@Match a cell in this method to one in a function we are inliningN)cell_contentsrk  r  r  rz   )rm   r`  cellr   re   re   rf   match_nested_cell  s    z'InstructionTranslator.match_nested_cellc                 C   s   t dd | jD o| j S )Nc                 s   s   | ]}|  V  qd S rb   )rn   r  r   re   re   rf   r  %  s     zEInstructionTranslator.should_compile_partial_graph.<locals>.<genexpr>)r!  r|   r  rl   re   re   rf   r   $  s    z2InstructionTranslator.should_compile_partial_graphc                    s  d _ |jdkrtdgS tj|tfddj D }t g }t	j
dkrtjD ]\}}t|trd|| qdd}ttjD ]R\}}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|}|jrr |
|d| n.j |
t!"|j#|
   $|
d|   fdd|D   t%|	d  td  & S )NrI  c                 3   s&   | ]}| kr|  kr|V  qd S rb   )r  r  )r  rm   re   rf   r  .  s    z>InstructionTranslator.create_call_resume_at.<locals>.<genexpr>r   r   ro  r+  )r   r   Z__resume_at_c                 s   s   | ]}|j jV  qd S rb   )ri   r
  r  re   re   rf   r  U  s     c                 s   s   | ]}|  V  qd S rb   )rq   r  re   re   rf   r  X  s     Tc                    s   g | ]}  |qS re   )Zcreate_loadr  )r   re   rf   r  d  s     z?InstructionTranslator.create_call_resume_at.<locals>.<listcomp>F)'r}   r   r   r   r   rp   rz   r  r$   r   r   	enumerater{   r   rW   rK  r[  r   Zappend_outputZextend_outputZpop_nullr   r#   r
  r/   lookupr   r   r|   r  Zmake_function_with_closurery   rl  r  FunctionTyperi  Zload_function_namer   get_instructions)rm   r   r  Z
null_idxesr  varZnull_cntjZ	stack_lenr   r`  Znew_codere   )r   r  rm   rf   r   '  sX    





 z+InstructionTranslator.create_call_resume_atc                 C   s~   | j  dkr| jstdd | _t tjd| j	j
 d td | j j| td|  gddd	 | j td
g d S )Nr   z#because no content in function callztorchdynamo done tracing z (RETURN_VALUE)zRETURN_VALUE triggered compileZreturn_valueF)r   r   rI  )ry   Zcount_callsr  r   r   r}   rg   r   r  r   r   rd   r   r   r*   r   r   r   r   re   re   rf   rI  i  s"    

  z"InstructionTranslator.RETURN_VALUE)rs   rt   ru   r	   r   rv   r   r!   rE  r  rU  r  r   r   rI  r  re   re   rK  rf   rQ    s   

O$BrQ  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eed fddZdd Zdd Zd d! Z  Z S )"r6  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'   r7  )r   r   r6   inline_call_)r  r  funcr  r  re   re   rf   r7    s    z)InliningInstructionTranslator.inline_callc                 C   s  |   rtd |  dkr$td z(t|  tjkrJtd|    W n tk
r`   Y nX t	| 
 rt| 
 sddlm}m}m} t| jdr| jj|||fkrd S td| jj d	|   d
| 
   t| trt|  ddrtd|    d S )Nzinline with __self__Zpatched_initzPatched init cannot be inlined.zinlining disallowed: r   )!produce_trampoline_autograd_applyproduce_trampoline_autograd_bwdproduce_trampoline_autograd_fwd_originzinline in skipfiles: z  | r;  Z_torchdynamo_disableFz.call torch._dynamo.disable() wrapped function )Zhas_selfr'   get_namerk  Zget_functionr   Z_disallowed_function_idsr  r   checkget_filenameZis_torch_inline_allowedZtorch._dynamo.variables.miscr  r  r  r  r   r  ru   r   rL   r   getattr_static)r  r  r  r  re   re   rf   check_inlineable  s@       z.InliningInstructionTranslator.check_inlineable)r  r  c                    s  t |ttfst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rtd
 j  d}tjjjdrdt   }tjdkrb| j| j| j j!j"d fdd}	t#$dt%|	 t&$d | t' rt(|  || j)||}
nt|  || j)||}
t*+ }| j,r|
- }z| |
.  W 5 Q R X W nz t/j0k
r" } z(d  d| }t&$| t1||W 5 d }~X Y n2 t2k
rR } zt&$d   W 5 d }~X Y nX |
j3d k	sdt|4| |
 |
j5| j5kr| j)6|
j) t&$d  t' rt |
t(st|
j37 d kstt8|
j9fdt: it;|
j3S |
j3S d S )Nz;{reason}.
  func = {func}, args = {args}, kwargs = {kwargs}'z' r<  c                 S   s   g | ]}|  qS re   )Zpython_type)r  r   re   re   rf   r    s     z>InliningInstructionTranslator.inline_call_.<locals>.<listcomp>)r   r  r  r  zunconverted arg )r  __setattr__zinline r   Zoutput_coder>  r   )r   c                     s&   t  } d j d d|  S )NzTRACE inlined call z from r>  )r8   rA  r   )rB  r  Zcur_instheaderZparent_codere   rf   get_trace_call_log_str  s    zJInliningInstructionTranslator.inline_call_.<locals>.get_trace_call_log_strrD  zINLINING %s%szSKIPPED INLINING z: zFAILED INLINING %szDONE INLINING %sr+  )<r   rL   rK   ro   r6  r  Z	bind_args	TypeErrorr%   r  r   r  r  get_coder>  r"  r#  r$  r@   r'   r   r   _logging	_internalZ	log_stateZis_artifact_enabledr   Bytecoder   r   r~   r   r=  Z	positionsr   trace_call_logr   r;   rd   r"   &InliningGeneratorInstructionTranslatorr  r  nullcontextr;  r<  rU  r   r   r(   r8  r  Zexport_freevarsri  r   r   rO   generated_itemsr>   r   )r  r  r  r  Z
sub_localsclosure_cellsrT  r  r  r  ZtracerZ
strict_ctxr   re   r  rf   r    s    
"	


          


z*InliningInstructionTranslator.inline_call_)r  r  rz   r  r  funcvarc           	         s   |  }|d }t|ts |j}t j|ji ||||t  fddt D  |j	|j
d d || _d | _|| _|j | _d S )N__builtins__c                    s   i | ]}|t  |qS re   )r   r  r  re   rf   
<dictcomp>	  s      z:InliningInstructionTranslator.__init__.<locals>.<dictcomp>r   )ry   r\  ri  rr  rz   r  r   r   r   r  r  )Zget_globalsr   r   __dict__rD  rE  ry   r   dirr  r  r  r  r  rF  r   )	rm   r  r  rz   r  r  r  ri  rr  rK  r  rf   rE  
	  s*    	
z&InliningInstructionTranslator.__init__c                 C   s   | j jS rb   )r  r9  rl   re   re   rf   r9  )	  s    z'InliningInstructionTranslator.fake_modec                 C   s   t | j S rb   )r   rO  r  r   rl   re   re   rf   rP  -	  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|| nz| j	|j }t|tjr| jj| j	|j  |   nB|d k	r|j
 | jjjkr| jjj|j
  t td d S )NzSHigherOrderOperator: Mutating a variable not in the current scope (ClosureVariable)z#write to __closure__ while inlining)r   r  r   r   rT   ry   Zis_root_tracerr'   root_txrz   r`  r   Z
store_cellr  r   NewCellVariablerm  r  r   r   ZRestartAnalysis)rm   r   r  rV  Z
maybe_cellre   re   rf   rM  0	  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 rb   )r   r  r   rT   r   ry   r  rz   r`  r   Z	load_cellr  r   r  rD  rb  )rm   r   r  Zmaybe_sym_localrK  re   rf   rb  W	  s    
z(InliningInstructionTranslator.LOAD_DEREFc                 C   sH   |j |  kst|j | jkr2| | j|j   n| t|j d d S re  )r   r  ro   r  r   rV   r   re   re   rf   rf  e	  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'   )rm   r'  re   re   rf   check_replace_is_safel	  s    
z3InliningInstructionTranslator.check_replace_is_safer&  c                    s>   |  | t ||}| }t|dr:|j}||| q|S )Nr  )r  rD  r5  r  r  r2  )rm   r'  r(  Z
translatorrK  re   rf   r5  r	  s    

z)InliningInstructionTranslator.replace_allc                 C   s   dS )NFre   rl   re   re   rf   r   |	  s    z:InliningInstructionTranslator.should_compile_partial_graphc                 C   s   t d d S )Nzcant resume while inliningr#  r  re   re   rf   r   	  s    z3InliningInstructionTranslator.create_call_resume_atc                 C   s   |   | _d | _d S rb   )r   r  r}   r   re   re   rf   rI  	  s    
z*InliningInstructionTranslator.RETURN_VALUE)!rs   rt   ru   __doc__r   r^   rv   classmethodr7  staticmethodr  r@   r   r  r   r  r  r   r   rJ   rE  r  r9  rP  rM  rb  rf  r  r5  r   r   rI  r  re   re   rK  rf   r6  {  s8   


* [



'
r6  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 rb   )rD  rE  r  )rm   r  r  rK  re   rf   rE  	  s    z/InliningGeneratorInstructionTranslator.__init__)r   c                 C   s"   | j |   | td  d S rb   )r  rK  r   r   rD   r   re   re   rf   YIELD_VALUE	  s    z2InliningGeneratorInstructionTranslator.YIELD_VALUEc                 C   sD   | j d }t|ts:|   tt| |gi }| | | |S r*  )	r{   r   rO   r   rC   r  r   r   
YIELD_FROM)rm   r   r  resre   re   rf   GET_YIELD_FROM_ITER	  s    


z:InliningGeneratorInstructionTranslator.GET_YIELD_FROM_ITERc                 C   s   | j d }t|tr*|jd kr*|   d S t|tr| jj|j zB|	 \}}| 
|| | | | | |   | | W q tk
r   Y d S X q tdt|  q d S )Nr   zYIELD_FROM )r{   r   rD   r   r   rO   ry   r   r   r  r5  r   r  r  r'   r?   )rm   r   r  rV  r  re   re   rf   r  	  s     




z1InliningGeneratorInstructionTranslator.YIELD_FROMc                 C   s|   t | jdkst|  }| jd }t|trft|tr\|jd kr\| | | j	|j
 | _qxtd ntdt|  d S )Nro  r   zUnreachable sub-generator codezSEND )r   r{   ro   r   r   rO   rD   r   r   r  ri   r}   r'   r?   )rm   r   rV  r  re   re   rf   SEND	  s    



z+InliningGeneratorInstructionTranslator.SEND)rs   rt   ru   r   r@   rv   rE  r!   r  r  r  r  r  re   re   rK  rf   r  	  s   
r  )r  r  r   dataclassesr   r   r}  r   r"  r?  r   r   r   r   r  typingr5  collections.abcr   r   r   r   r   r   r   r	   r
   r   Zunittest.mockr   r   Ztorch._loggingZtorch._guardsr   r   r   r   r   r   r   rc   r   r   r   r   r   Zbytecode_analysisr   r   r   Zbytecode_transformationr   r   r   r    r!   r"   r#   Zcodegenr$   r%   r&   r'   r(   r   r)   Zoutput_graphr*   r+   r,   Zreplay_recordr-   r.   rH  r/   r0   rm  r1   r2   r3   r4   r5   utilsr6   r7   r8   r9   r:   r;   r<   Zvariables.baser=   r>   r?   r@   Zvariables.builderrA   rB   Zvariables.builtinrC   Zvariables.constantrD   rE   Zvariables.ctx_managerrF   rG   rH   Zvariables.dictsrI   Zvariables.functionsrJ   rK   rL   rM   Zvariables.listsrN   rO   rP   rQ   rR   rS   Zvariables.miscrT   rU   rV   rW   rX   rY   Zvariables.nn_modulerZ   Zvariables.tensorr[   r\   r]   r^   Zvariables.torchr_   Zvariables.user_definedr`   ra   	getLoggerrs   rd   r  ZgetArtifactLoggerr   r  rE  	lru_cacherg   	dataclassrh   rx   rx  r   r   r   r   r   r  r   rQ  r6  r  re   re   re   rf   <module>   s   ,$	$	$	  

F 	k           E Y  