o
    7f                      @  st  U d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
mZ ddlmZ ddlm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mZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, dd	l-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 dd
l9m:Z: ddl;m<Z<m=Z= ddl>m?Z?m@Z@mAZA ddlBmCZC ddlDmEZE ddlFmGZGmHZH ddlImJZJmKZKmLZLmMZMmNZN ddlOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z` ddlambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZkmlZlmmZmmnZnmoZompZpmqZqmrZr ddlsmtZtmuZu ddlvmwZw ddlxmyZy ddlzm{Z{m|Z|m}Z}m~Z~ ddlmZ ddlmZ ddlmZmZmZmZmZ ddlmZmZ ddlmZ ddlmZmZ ddlmZmZmZ ddlmZmZmZ ddlmZmZmZ dd lmZmZ h d!Zd"ed#< G d$d% d%e<e` e=d& ZG d'd( d(eZeeef ZG d)d* d*Zd8d.d/Zd9d2d3Zd:d6d7Zd&S );a  Builder class used to transform a mypy AST to the IR form.

The IRBuilder class maintains transformation state and provides access
to various helpers used to implement the transform.

The top-level transform control logic is in mypyc.irbuild.main.

mypyc.irbuild.visitor.IRBuilderVisitor is used to dispatch based on mypy
AST node type to code that actually does the bulk of the work. For
example, expressions are transformed in mypyc.irbuild.expression and
functions are transformed in mypyc.irbuild.function.
    )annotations)contextmanager)AnyCallableFinalIteratorSequenceUnion)overload)Graph)map_instance_to_supertype)	ARG_NAMEDARG_POSGDEFLDEFArgKindCallExpr	Decorator
ExpressionFuncDef	IndexExprIntExprLvalue
MemberExprMypyFileNameExprOpExprOverloadedFuncDefRefExprStarExpr	Statement
SymbolNode	TupleExpr	TypeAliasTypeInfo	UnaryExprVar)AnyTypeDeletedTypeInstance
ProperType	TupleTypeTypeTypedDictType	TypeOfAnyUninhabitedType	UnionTypeget_proper_type)split_target)ExpressionVisitorStatementVisitor)BITMAP_BITS	SELF_NAMETEMP_ATTR_NAME)catch_errors)Errors)ClassIRNonExtClassInfo)INVALID_FUNC_DEFFuncDeclFuncIRFuncSignature
RuntimeArg)NAMESPACE_MODULEAssign
BasicBlockBranchComparisonOpGetAttr
InitStaticIntegerIntOp
LoadStaticOpRaiseStandardErrorRegisterSetAttrTupleGetUnreachableValue)	RInstanceRTupleRTypeRUnionbitmap_rprimitivec_pyssize_t_rprimitivedict_rprimitiveint_rprimitiveis_float_rprimitiveis_list_rprimitiveis_none_rprimitiveis_object_rprimitive	is_taggedis_tuple_rprimitivenone_rprimitiveobject_rprimitivestr_rprimitive)FuncInfoImplicitClass)LowLevelIRBuilder)Mapper)BaseNonlocalControlGeneratorNonlocalControlLoopNonlocalControlNonlocalControl)PreBuildVisitor)RegisterImplInfo)AssignmentTargetAssignmentTargetAttrAssignmentTargetIndexAssignmentTargetRegisterAssignmentTargetTuple)bytes_from_stris_constant)CompilerOptions)dict_get_item_opdict_set_item_op)iter_opnext_oppy_setattr_op)list_get_item_unsafe_oplist_pop_lastto_list)check_unpack_count_opget_module_dict_op	import_op)CFunctionDescriptionfunction_ops>   !===>=+-<><=r   int_borrow_friendly_opc                   @     e Zd ZdS )	IRVisitorN__name__
__module____qualname__ r   r   N/home/ertert/spirit/venv/lib/python3.10/site-packages/mypyc/irbuild/builder.pyr          r   Nc                   @  r   )UnsupportedExceptionNr   r   r   r   r   r      r   r   c                   @  s&  e Zd ZdtddZduddZedddvd"d#Zedwd%d#Zdddxd(d#Zdyd)d*Zdzd-d.Zd{d1d2Z	d|d4d5Z
d|d6d7Zd}d9d:Zd~d?d@ZddBdCZddDdEZddFdGZddIdJZddMdNZddPdQZdddVdWZddXdYZddZd[Zdd\d]Zdd^d_ZddbdcZddddeZddfdgZ	h	hdddodpZddsdtZddvdwZ	h	hddd}d~ZdddZ dddZ!dddZ"dddZ#dddZ$dddZ%dddZ&dddZ'dddZ(dddZ)dddZ*dddZ+dddZ,dddZ-dyddZ.dyddZ/dyddZ0dddZ1dddZ2dddZ3	hddhddddĄZ4	hddddȄZ5ddd˄Z6	̐ddd͜dddфZ7	ddddԄZ8dddׄZ9dddۄZ:dddބZ;dddZ<dddZ=dddZ>dyddZ?dddZ@dddZAdddZBdddZCdddZDdddZEdddZFdddZGdd dZHdddZIdddZJdddZKddd	ZLdddZMdddZNdddZOdddZPdddZQdddZRddd ZSdd"d#ZTdd'd(ZUddd,d-ZVdd/d0ZWeX	)	hddd6d7ZYeZfdd<d=Z[dÐdAdBZ\ddĐdDdEZ]	ddŐdGdHZ^dƐdJdKZ_dǐdLdMZ`dȐdOdPZadɐdQdRZb	ddʐdUdVZcddWdXZddːdZd[Zed̐d\d]Zfdd^d_Zgd͐d`daZhddbdcZidydddeZjdΐdgdhZkdϐdjdkZldϐdldmZmdϐdndoZndАdrdsZodhS (  	IRBuildercurrent_modulestrtypesdict[Expression, Type]graphr   errorsr9   mapperrf   pbvrk   visitorr   optionsrt   singledispatch_impls%dict[FuncDef, list[RegisterImplInfo]]returnNonec
           
      C  s  t ||||| _| jg| _i g| _g g| _g | _g | _dg| _|| _|| _	|| _
|| _g | _g | _t | _g | _g | _t | _|| _d| _d| _|j| _|j| _|j| _|j | _|j| _|j| _|	| _|| _ t!t"dd| _#| j#g| _$g | _%|| _&i | _'d| _(d S )NTr    F))re   builderbuilders	symtablesruntime_argsfunction_name_stackclass_ir_stackblock_reachable_stackr   r   r   r   	ret_types	functionssetfunction_namesclassesfinal_namescallable_class_namesr   lambda_countertemp_counterfree_variablesprop_settersencapsulating_funcsnested_funcskeysnested_fitemsfuncs_to_decoratorsfdefs_to_decoratorsmodule_import_groupsr   r   rc   r<   fn_infofn_infosnonlocal_controlr   imports
can_borrow)
selfr   r   r   r   r   r   r   r   r   r   r   r   __init__   sD   


zIRBuilder.__init__module_namemodule_pathc                 C  s   || _ || _| j|| dS )zuSet the name and path of the current module.

        This must be called before transforming any AST nodes.
        N)r   r   r   
set_module)r   r   r   r   r   r   r      s   zIRBuilder.set_moduleFr   noder   r   boolrQ   c                C     d S Nr   )r   r   r   r   r   r   accept      zIRBuilder.acceptr    c                 C  r   r   r   )r   r   r   r   r   r      r   Statement | ExpressionValue | Nonec             	   C  s   |  |j] t|trH| j}|| _z|| j}| || ||j}W n t	y5   t
| |}Y nw || _|s?|   |W  d   S z|| j W n	 t	yY   Y nw 	 W d   dS 1 sfw   Y  dS )a  Transform an expression or a statement.

        If can_borrow is true, prefer to generate a borrowed reference.
        Borrowed references are faster since they don't require reference count
        manipulation, but they are only safe to use in specific contexts.
        N)r8   line
isinstancer   r   r   r   coerce	node_typer   rM   flush_keep_alives)r   r   r   old_can_borrowresr   r   r   r      s,   
$c                 C     | j   d S r   )r   r   r   r   r   r   r        zIRBuilder.flush_keep_alivesoprK   c                 C     | j |S r   )r   add)r   r   r   r   r   r        zIRBuilder.addtargetrC   c                 C     | j | d S r   )r   goto)r   r   r   r   r   r        zIRBuilder.gotoblockc                 C  r   r   )r   activate_blockr   r   r   r   r   r     r   zIRBuilder.activate_blockc                 C  r   r   )r   goto_and_activater   r   r   r   r     r   zIRBuilder.goto_and_activaterM   c                 C  
   | j  S r   )r   r   r   r   r   r   r         
zIRBuilder.selfobjattrr   intc                 C     | j |||S r   )r   py_get_attr)r   r   r   r   r   r   r   r   #  r   zIRBuilder.py_get_attrvaluec                 C  r   r   )r   load_strr   r   r   r   r   r   &  r   zIRBuilder.load_strc                 C  s   | j t|S )zLoad bytes object from a string literal.

        The literal characters of BytesExpr (the characters inside b'')
        are stored in BytesExpr.value, whose type is 'str' not 'bytes'.
        Thus we perform a special conversion here.
        )r   
load_bytesrr   r   r   r   r   load_bytes_from_str_literal)  s   z%IRBuilder.load_bytes_from_str_literalc                 C  r   r   )r   load_intr   r   r   r   r   2  r   zIRBuilder.load_intfloatc                 C  r   r   )r   
load_floatr   r   r   r   r   5  r   zIRBuilder.load_floatlregexpr_opc                 C  r   r   )r   unary_op)r   r   r   r   r   r   r   r   8  r   zIRBuilder.unary_oprregc                 C     | j ||||S r   )r   	binary_opr   r   r   r   r   r   r   r   r   ;     zIRBuilder.binary_opsrctarget_typerT   forcec                 C  s   | j j||||| jdS )Nr   )r   r   r   )r   r   r   r   r   r   r   r   r   >  s   zIRBuilder.coercec                 C  r   r   )r   none_objectr   r   r   r   r  A  r   zIRBuilder.none_objectc                 C  r   r   )r   noner   r   r   r   r  D  r   zIRBuilder.nonec                 C  r   r   )r   truer   r   r   r   r  G  r   zIRBuilder.truec                 C  r   r   )r   falser   r   r   r   r  J  r   zIRBuilder.falsevalueslist[Value]c                 C     | j ||S r   )r   new_list_opr   r  r   r   r   r   r  M  r   zIRBuilder.new_list_opc                 C  r  r   )r   
new_set_opr	  r   r   r   r
  P  r   zIRBuilder.new_set_opc                 C  r   r   )r   translate_is_opr   r   r   r   r  S  r   zIRBuilder.translate_is_opNfunction
arg_values	arg_kindslist[ArgKind] | None	arg_namesSequence[str | None] | Nonec                 C     | j |||||S r   )r   py_call)r   r  r  r   r  r  r   r   r   r  V  s   zIRBuilder.py_callr  r  c                 C  s   | j ||| d S r   )r   add_bool_branch)r   r   r  r  r   r   r   r  `     zIRBuilder.add_bool_branchfullnamec                 C  r   r   )r   load_native_type_object)r   r  r   r   r   r  c  r   z!IRBuilder.load_native_type_objectbasenameresult_typeRType | Nonelist[str | None] | Nonec              
   C  s   | j |||||||| jS r   )r   gen_method_callr   )r   r  r  r  r  r   r  r  r   r   r   r  f  s   
zIRBuilder.gen_method_callc                 C  r   r   )r   load_module)r   r  r   r   r   r  t  r   zIRBuilder.load_moduledescr   argsc                 C  r   r   )r   call_c)r   r  r   r   r   r   r   r!  w  r   zIRBuilder.call_ctypelhsrhsc                 C  r  r   )r   int_op)r   r"  r#  r$  r   r   r   r   r   r%  z  r  zIRBuilder.int_opc                 C  r   r   )r   compare_taggedr   r#  r$  r   r   r   r   r   r&  }  r   zIRBuilder.compare_taggedc                 C  r   r   )r   compare_tuplesr'  r   r   r   r(    r   zIRBuilder.compare_tuplesvalc                 C  r  r   )r   builtin_len)r   r)  r   r   r   r   r*    r   zIRBuilder.builtin_lenitemsc                 C  r  r   )r   	new_tuple)r   r+  r   r   r   r   r,    r   zIRBuilder.new_tuplenon_extr;   keyc                 C  s$   |  |}| t|j||g| d S r   )r   r!  rv   dict)r   r-  r.  r)  r   key_unicoder   r   r   add_to_non_ext_dict  s   
zIRBuilder.add_to_non_ext_dictidc                 C  sj   d | j |< t t }}| |||| | | | t| |g|}| t||t	d | 
| d S )N)	namespace)r   rC   check_if_module_loadedr   r!  r   r   r   rG   rA   r   )r   r2  r   needs_importoutr   r   r   r   
gen_import  s   

zIRBuilder.gen_importr5  r6  c                 C  s0   |  |}| ||  d|}| ||| dS )an  Generate code that checks if the module `id` has been loaded yet.

        Arguments:
            id: name of module to check if imported
            line: line number that the import occurs on
            needs_import: the BasicBlock that is run if the module has not been loaded yet
            out: the BasicBlock that is run if the module has already been loadedzis notN)r  r  r  r  )r   r2  r   r5  r6  
first_load
comparisonr   r   r   r4    s   

z IRBuilder.check_if_module_loadedmodulec                 C  s&   |  tg |}|  t|| |g|S r   )r!  r~   ru   r   )r   r:  r   mod_dictr   r   r   
get_module  s   zIRBuilder.get_modulec                 C  s&   |  || | ||}| |||S )zLook up an attribute of a module without storing it in the local namespace.

        For example, get_module_attr('typing', 'TypedDict', line) results in
        the value of 'typing.TypedDict'.

        Import the module if needed.
        )r7  r<  r   )r   r:  r   r   
module_objr   r   r   get_module_attr  s   zIRBuilder.get_module_attrget_valCallable[[], Value]c              	   C  sd   t  t  }}| t|||tj | | | t|| | |j| | | | | dS )z:If target is NULL, assign value produced by get_val to it.N)	rC   r   rD   IS_ERRORr   rB   r   r"  r   )r   r   r?  r   error_block
body_blockr   r   r   assign_if_null  s   

zIRBuilder.assign_if_nullindexc           	   	   C  s   t  t  }}| t| jjd|t   td|td @ > ttj|}| 	t
|tdtt
j}| 	t|||tj | | | 	t|| | |j| | | | | d S )N   r   )rC   r%  rV   r   r   r5   rH   rI   ANDr   rE   EQrD   BOOLr   rB   r   r"  r   )	r   r   r?  rE  r   rB  rC  obr   r   r   assign_if_bitmap_unset  s   

z IRBuilder.assign_if_bitmap_unsetc                 C  s4   t | jd st| jd r|   d S |   d S NrF  )r\   r   r]   add_implicit_returnadd_implicit_unreachabler   r   r   r   maybe_add_implicit_return  s   z#IRBuilder.maybe_add_implicit_returnc                 C  sN   | j jd }|js%| | j  | jd d}| jd | || jj	j
 d S d S rN  )r   blocks
terminatedr   r  r   r   
gen_returnr   fitemr   )r   r   retvalr   r   r   rO    s
   zIRBuilder.add_implicit_returnc                 C  s&   | j jd }|js| t  d S d S rN  )r   rR  rS  r   rP   r   r   r   r   rP    s   z"IRBuilder.add_implicit_unreachablelvalueslist[Lvalue]c                 C  s^   |D ]*}t |tr,t |jtr,t |jjtr,|jj|j j}t |tr,|js,| 	d| qd S )Nz;Only class variables defined as ClassVar can be assigned to)
r   r   exprr   r   r$   r  r&   is_classvarerror)r   rW  r   lvaluevarr   r   r   disallow_class_assignments  s   
z$IRBuilder.disallow_class_assignmentsc                 C  s   t | jdkS N   )lenr   r   r   r   r   non_function_scope  s   zIRBuilder.non_function_scopeFuncInfo | Nonec                 C  s   |   rd S | jd S r_  )rb  r   r   r   r   r   top_level_fn_info  s   
zIRBuilder.top_level_fn_info)type_overrider\  r   
rvalue_reg
class_name
str | Nonere  c                C  s   t |tsJ t |jtsJ |jjd u rO|d u r|j}n| d|j }|d us-J d| ||p6| ||j}| j	
||jf | t||| j d S d S )N.zFull name not set for variable)r   r   r   r&   final_valuer  r   r   r   r   appendr"  r   rG   r   )r   r\  rf  rg  re  r  coercedr   r   r   init_final_static  s   zIRBuilder.init_final_statictyp
error_namec                 C  s>   t | j|}|d usJ |\}}| jj||||d| ddS )Nzvalue for final name "z" was not set)r   	error_msg)r2   r   r   load_static_checked)r   r  rn  r   ro  
split_namer:  r  r   r   r   load_final_static  s   
zIRBuilder.load_final_static*int | str | bytes | float | complex | boolc                 C  s   t |tr|r|  S |  S t |tr| j|S t |tr%| j|S t |t	r0| j
|S t |tr;| j|S t |trF| j|S J d)zQLoad value of a final name, class-level attribute, or constant folded expression.FzUnsupported literal value)r   r   r  r  r   r   r   r   r   r   r   bytesr   complexload_complex)r   r)  r   r   r   load_literal_value#  s   





zIRBuilder.load_literal_valuerF  )for_readry  rm   c                C  s  |dkr|j }t|tr|j}t|tr|j}|d u r%|js J t|j}|s5t|tr5|j	r5| 
d| |jtkrr|| jd vrmt|trSt|jtsS| |j}n| |}| jjrg| j||| jjddS | ||S | |S |jtkr|  }| |j}t||S J |jt|tr| |j}| |j}	t||	S t|t r| !|}
| j|j"|
d}t#||j|
dS t|t$rd }g }t%|j&D ]\}}| '|}|(| t|t)r|d ur| 
d| |}qt*||S t|t)r| '|j"S J d| )NrF  z2Cannot assign to the first argument of classmethodF)reassignr   z%Two starred expressions in assignmentUnsupported lvalue: %r)+r   r   r   r   r   funcis_special_formr&   r  is_clsr[  kindr   r   r"  r(   type_to_rtyper   r   is_generatoradd_var_to_env_classgenerator_classadd_local_reglookupr   load_globals_dictr   ro   r   r   r  rE  r   is_native_attr_refrY  rn   r"   	enumerater+  get_assignment_targetrk  r   rq   )r   r\  r   ry  symbolreg_typeglobals_dictr  r  rE  r   r   star_idxrW  idxitemtargr   r   r   r  7  sd   



















zIRBuilder.get_assignment_targetValue | AssignmentTargetc                 C  s   t |tr|S t |tr|jS t |tr-| |jd|jg|j|}|d ur'|S J |jjt |t	rZt |j
jtrQ|j
jjjrQ|oC|j}| t|j
|j||dS | |j
|j|S J d| )N__getitem__F)borrowr{  )r   rQ   rp   registerro   r  r  rE  r"  rn   r   rR   class_iris_ext_classr   r   rF   r   r   )r   r   r   r   regr  r   r   r   read  s"   




zIRBuilder.readRegister | AssignmentTargetc           
   	   C  s  t |tr| t|| ||j| d S t |tr-| ||j|}| t|j| d S t |trgt |j	t
rN| ||j|}| t|j|j|| d S | |j}| j|}| t|j||g| d S t |tr| |jd|j|gd |}|d usJ |jjd S t |trt |jtr|jd u r|jj}t|t|jksJ tt|D ]}| t|||}	| |j| |	| qd S t |jst!|jr|jd u r| "||| d S | #||| d S J d)N__setitem__FzUnsupported assignment target)$r   rM   r   rB   coerce_rvaluer"  rp   r  rn   obj_typerR   rN   r   r   r   r   boxr!  ry   ro   r  r  rE  rq   rS   r  r   ra  r+  rangerO   assignr[   r_   process_sequence_assignment!process_iterator_tuple_assignment)
r   r   rf  r   r.  	boxed_regtarget_reg2rtypesi
item_valuer   r   r   r    sB   
 




zIRBuilder.assignrvaluertypec                 C  sN   t |r t|jr |j }|dkrd}| dd| d | | |||S )N	short_intr   z1Incompatible value representations in assignment z(expression has type "z", variable has type "float"))rZ   r^   r"  
short_namer[  r   )r   r  r  r   typenamer   r   r   r    s   

zIRBuilder.coerce_rvaluerq   c                 C  s   t t|jt}| jt||g| g }tt|jD ]-}|j| }| j|}t	|j
r7| t||g|}	n| j|d|g|j
|}	||	 qt|j|D ]\}
}| |
|| qOdS )zOProcess assignment like 'x, y = s', where s is a variable-length list or tuple.r  N)rH   ra  r+  rW   r   r!  r}   r  r   r[   r"  rz   r  rk  zipr  )r   r   r  r   expected_lenr  r  r  rE  r  r\  r   r   r   r   r    s   

z%IRBuilder.process_sequence_assignmentlitemritemc                 C  sj   t  t  }}| t|||tj | | | ttjd| | t  | | | ||| d S )Nnot enough values to unpack)	rC   r   rD   rA  r   rL   VALUE_ERRORrP   r  )r   r  r  r   rB  ok_blockr   r   r   (process_iterator_tuple_assignment_helper  s   

z2IRBuilder.process_iterator_tuple_assignment_helperc                 C  s  |  t|g|}|jd ur|jnt|j}|jd | D ]=}|  t|g|}t t }}	| t|||	tj	 | 
| | ttjd| | t  | 
|	 | ||| q|jd ur|j|d d  }
|  t|g|}| ||}tt|
}| ||d|}t t }}	| t||	|tj | 
| | ttjd| | t  | 
|	 t|
D ]}|  t|g|}| ||| q| |j|j || d S |  t|g|}t t }}	| t||	|tj	 | 
| | ttjd| | t  | 
|	 d S )Nr  rG  r   ztoo many values to unpack)r!  rw   r  ra  r+  rx   rC   r   rD   rA  r   rL   r  rP   r  r|   r*  rH   r   rJ  reversedr{   )r   r   rf  r   iterator	split_idxr  r  rB  r  post_star_vals	iter_listiter_list_lenpost_star_len	conditionextrar   r   r   r    s\   





z+IRBuilder.process_iterator_tuple_assignmentcontinue_blockbreak_blockc                 C  s   | j t| j d || d S rN  )r   rk  ri   )r   r  r  r   r   r   push_loop_stack5  s   zIRBuilder.push_loop_stackc                 C  r   r   )r   popr   r   r   r   pop_loop_stack:  r   zIRBuilder.pop_loop_stackc                 C  s6   t  | j }|  jd7  _| t||| jj}|S )IMoves a given Value instance into the generator class' environment class.rG  )r7   r   r  r&   r   r  )r   r"  r  r   r   r   r   make_spill_target=  s   zIRBuilder.make_spill_targetc                 C  s   |  |j}| ||d |S )r  rF  )r  r"  r  )r   r   r   r   r   r   spillD  s   zIRBuilder.spillc                 C  s   | j jr	| |S |S )aE  
        Moves a given Value instance into the environment class for generator functions. For
        non-generator functions, leaves the Value instance as it is.

        Returns an AssignmentTarget associated with the Value for generator functions and the
        original Value itself for non-generator functions.
        )r   r  r  r   r   r   r   maybe_spillK  s   
zIRBuilder.maybe_spillc                 C  s<   | j jr	| |S t|tr|S t|j}| ||d |S )a=  
        Moves a given Value instance into the environment class for generator functions. For
        non-generator functions, allocate a temporary Register.

        Returns an AssignmentTarget associated with the Value for generator functions and an
        assignable Register for non-generator functions.
        rF  )r   r  r  r   rM   r"  r  )r   r   r  r   r   r   maybe_spill_assignableW  s   


z IRBuilder.maybe_spill_assignablee
int | Nonec                 C  s>   t |tr|jS t |tr|jdkrt |jtr|jj S d S )Nr   )r   r   r   r%   r   rY  )r   r  r   r   r   extract_intj  s
   
 
zIRBuilder.extract_intrY  c                 C  s   |  | j| S r   )get_sequence_type_from_typer   r   rY  r   r   r   get_sequence_typer  r   zIRBuilder.get_sequence_typer,   c                   s^   t |}t|trt fdd|jD S t|tsJ ||jjdkr't	S  
|jd S )Nc                   s   g | ]}  |qS r   )r  .0r  r   r   r   
<listcomp>y  s    z9IRBuilder.get_sequence_type_from_type.<locals>.<listcomp>zbuiltins.strr   )r1   r   r0   rU   make_simplified_unionr+  r)   r"  r  rb   r  r   )r   r   r   r   r   r  u  s   
z%IRBuilder.get_sequence_type_from_typelist[Instance]c                 C  s   t | j| }t|trdd |jD }n|g}g }|D ]2}t|tr2|j}tdd |jj	D }nt|t
s;J |tdd |jj	D }|t|| q|S )zpFind dict type of a dict-like expression.

        This is useful for dict subclasses like SymbolTable.
        c                 S  s   g | ]}t |qS r   )r1   r  r   r   r   r    s    z0IRBuilder.get_dict_base_type.<locals>.<listcomp>c                 s      | ]
}|j d kr|V  qdS )ztyping.MappingNr  r  r  r   r   r   	<genexpr>      z/IRBuilder.get_dict_base_type.<locals>.<genexpr>c                 s  r  )zbuiltins.dictNr  r  r   r   r   r    r  )r1   r   r   r0   r+  r-   fallbacknextr"  mror)   rk  r   )r   rY  r   r   
dict_typest	dict_baser   r   r   get_dict_base_type  s   

zIRBuilder.get_dict_base_typec                   sF     |}t|dkr |d jd S  fdd|D }t|S )NrG  r   c                      g | ]
}  |jd  qS )r   r  r   r  r  r   r   r   r        z/IRBuilder.get_dict_key_type.<locals>.<listcomp>r  ra  r  r   rU   r  r   rY  dict_base_typesr  r   r   r   get_dict_key_type  
   

zIRBuilder.get_dict_key_typec                   sF     |}t|dkr |d jd S  fdd|D }t|S )NrG  r   c                   r  )rG  r  r  r   r   r   r    r  z1IRBuilder.get_dict_value_type.<locals>.<listcomp>r  r  r   r   r   get_dict_value_type  r  zIRBuilder.get_dict_value_typec                 C  s    |  |}| |}t||gS r   )r  r  rS   )r   rY  key_type
value_typer   r   r   get_dict_item_type  s   

zIRBuilder.get_dict_item_typec                 C  s   || j vrttj}nt| j | }| j| j  j}|	d|g g |d }ddl
m} t|trAt }|jD ]}|||}q7|S |	d|g g |d S )z<Return the item type given by 'expr' in an iterable context.__iter__r   )
join_types__next__)r   r'   r.   
from_errorr1   r   r   type_checkerexpr_checkercheck_method_call_by_name	mypy.joinr  r   r+   r/   r+  )r   rY  iterableechkr  r  joinedr  r   r   r   _analyze_iterable_item_type  s   


z%IRBuilder._analyze_iterable_item_typec                 C  s   || j jv S )z*Is the given module one compiled by mypyc?)r   	group_map)r   r:  r   r   r   is_native_module  s   zIRBuilder.is_native_moduler   c                 C  s6   |j d u rdS d|j jv r| |j jdd S dS )NFri  r   T)r   r  r  
rpartitionr  r   r   r   is_native_ref_expr  s
   
zIRBuilder.is_native_ref_exprc                 C  s   |  |o	|jtkS r   )r  r  r   r  r   r   r   is_native_module_ref_expr  r  z#IRBuilder.is_native_module_ref_exprr$   c                 C  s   |j p
|jp
|jduS )z:Is a type something other than just a class we've created?N)is_named_tuple
is_newtypetypeddict_typer   rn  r   r   r   is_synthetic_type  s   zIRBuilder.is_synthetic_typer   tuple[str, Var, bool] | Nonec                 C  s   d}t |jtrIt |jjtrI|jj|j}|rHt |jtrH|jjjd j	j
}|jjp/|dk}|rH|j}|jjj
 d|j }| |jjj}n| |rdt |jtrd|jjrd|j}|jj
}| |}|durm|||fS dS )a  Check if `expr` is a final attribute.

        This needs to be done differently for class and module attributes to
        correctly determine fully qualified name. Return a tuple that consists of
        the qualified name, the corresponding Var node, and a flag indicating whether
        the final name was defined in a compiled module. Return None if `expr` does not
        refer to a final attribute.
        Nr   z	enum.Enumri  )r   rY  r   r   r$   getr  r&   basesr"  r  is_finalinfor  r   is_module_member_exprr  )r   rY  	final_varsymexpr_fullnamer  r  nativer   r   r   get_final_ref  s&   	


zIRBuilder.get_final_refr  r&   r
  c                 C  s6   |j dur| |j S |r| || j|||S dS )az  Emit code for loading value of a final name (if possible).

        Args:
            final_var: Var corresponding to the final name
            fullname: its qualified name
            name: shorter name to show in errors
            native: whether the name was defined in a compiled module
            typ: its type
            line: line number where loading occurs
        N)rj  rx  rs  r   r  )r   r  r  r  r
  rn  r   r   r   r   emit_load_final  s
   
zIRBuilder.emit_load_finalc                 C  s   t |jtot |jjtS r   )r   rY  r   r   r   r  r   r   r   r    s   zIRBuilder.is_module_member_exprr   calleec           
      C  s  |j r(|jtgt| kr(t|}t|g }| j|||j	| 
|}|r(|S |j}t|tr3|j}t|trG|j| jvrG|j| jv rG|j}|d urq|j rq|| jjv rqtdd |jD rq| jj| }| j|||j|j|j	S | |}	| j|	||j	|j|jdS )Nc                 s  s    | ]	}|t tfv V  qd S r   )r   r   )r  r  r   r   r   r  *  s    z3IRBuilder.call_refexpr_with_args.<locals>.<genexpr>)r  r  )r  r  r   ra  get_call_target_fullnamer   r  r   matching_call_cr   r   r   r   r   implr   r|  r   r   r   func_to_declallcallr  r   r  )
r   rY  r  r  r  call_c_ops_candidatesr   callee_nodedeclr  r   r   r   call_refexpr_with_args
  s8   

z IRBuilder.call_refexpr_with_argsr   c                   s2   j  j  fdd fdd jS )Nc                          jS r   )r   leftr   rY  r   r   r   <lambda>9      z-IRBuilder.shortcircuit_expr.<locals>.<lambda>c                     r  r   )r   rightr   r  r   r   r  :  r  )r   shortcircuit_helperr   r   r   r  r   r  r   shortcircuit_expr5  s   zIRBuilder.shortcircuit_exprargRefExpr | TupleExprlist[ClassIR] | Nonec                 C  s   t |trt |jtr| |r| jj|j}|r|gS dS g }|jD ]}t |tt	fr?| 
|}|du r9 dS || q$ dS |S )zFlatten classes in isinstance(obj, (A, (B, C))).

        If at least one item is not a reference to a native class, return None.
        N)r   r   r   r$   r  r   
type_to_irr  r+  r"   flatten_classesextend)r   r   irr   r  	item_partr   r   r   r$  @  s   


zIRBuilder.flatten_classesr   r   FuncInfo | strc                 C  s   t |tr
t|d}t| j| j| j| j| _| j	| j
| j | j| j | ji  | jg  || _| j| j | jt |jrM| jt  n| jt  | t  d S )Nr  )r   r   rc   re   r   r   r   r   r   r   r   r   r   rk  r   r   r   r   r   r`   r  r   rh   rg   r   rC   )r   r   r   r   r   enterW  s    

zIRBuilder.enterJtuple[list[Register], list[RuntimeArg], list[BasicBlock], RType, FuncInfo]c                 C  sf   | j  }| j  | j }| j }| j }| j  | j d | _| jd | _|j	||j
||fS rN  )r   r  r   r   r   r   r   r   r   r   rR  )r   r   r   ret_typer   r   r   r   leavej  s   





zIRBuilder.leaver  r:   r,  	self_typeIterator[None]c                 c  s:   |  | | j| | j| || jd< |du rt|}| t| z>dV  W |  \}}}}}t	||}	| j
 }| j
 }t||j| j|	}
t|
||}||j|< |j|j|< | j| dS |  \}}}}}t	||}	| j
 }| j
 }t||j| j|	}
t|
||}||j|< |j|j|< | j| w )a5  Generate IR for a method.

        If the method takes arguments, you should immediately afterwards call
        add_argument() for each non-self argument (self is created implicitly).

        Args:
            class_ir: Add method to this class
            name: Short name of the method
            ret_type: Return type of the method
            fn_info: Optionally, additional information about the method
            self_type: If not None, override default type of the implicit 'self'
                argument (by default, derive type from class_ir)
        rF  N)r*  r   rk  r   r   rR   add_argumentr6   r-  r?   r  r=   r  r   r>   methodsr  method_declsr   )r   r  r  r,  r   r.  arg_regsr   rR  sigr  r&  r   r   r   enter_methodu  s8   









zIRBuilder.enter_methodr]  	str | Varr  r   c                 C  s@   t |tr	t|}| j||dd}| jd t|j|| |S )zDeclare an argument in the current function.

        You should use this instead of directly calling add_local() in new code.
        Tis_argrF  )r   r   r&   	add_localr   rk  r@   r  )r   r]  rn  r  r  r   r   r   r0    s
   
zIRBuilder.add_argumentr  r!   SymbolTargetc                 C  s   | j d | S rN  r   )r   r  r   r   r   r    r   zIRBuilder.lookupr8  c                 C  sN   t |tsJ t|t|j||jd}t|| jd |< |r%| jj	
| |S )zAdd register that represents a symbol to the symbol table.

        Args:
            is_arg: is this a function argument
        )r8  r   rF  )r   r!   rM   remangle_redefinition_namer  r   rp   r   r   r   rk  )r   r  rn  r8  r  r   r   r   r9    s   zIRBuilder.add_localrp   c                 C  s.   |  ||| | jd | }t|tsJ |S )zALike add_local, but return an assignment target instead of value.rF  )r9  r   r   rp   )r   r  rn  r8  r   r   r   r   r    s   zIRBuilder.add_local_regclsc                 C  s   | j ttt|ddS )zLow-level function that adds a 'self' argument.

        This is only useful if using enter() instead of enter_method().
        Tr7  )r  r&   r6   rR   )r   r=  r   r   r   add_self_to_env  s   zIRBuilder.add_self_to_envc                 C  s   || j d |< |S rN  r;  )r   r  r   r   r   r   
add_target  s   zIRBuilder.add_targetType | Nonec                 C  r   r   )r   r  r  r   r   r   r    r   zIRBuilder.type_to_rtypec                 C  s0   t |trtS || jvrtS | j| }| |S r   )r   r   rY   r   ra   r  )r   r   	mypy_typer   r   r   r     s   



zIRBuilder.node_typeFuncInfo | ImplicitClassrz  c                 C  sd   || j jj|j< t|j|j}|r,| | || j jj	}| 
t|j|j|| j jj	 | ||S r   )r   	env_class
attributesr  rn   curr_env_regr  r  rU  r   r   rN   r?  )r   r]  r  r  rz  attr_targetr  r   r   r   r    s   zIRBuilder.add_var_to_env_classc                 C  s0   |j sJ dd|j jv o|j jdd dkS )NRefExpr not resolvedri  r   builtins)r   r  splitr  r   r   r   is_builtin_ref_expr  s   "zIRBuilder.is_builtin_ref_exprr   c                 C  sr   |  |r|jsJ d| |jj|jS | |r1t|jtr1| |js1|js+J | 	|jS | 
|j|jS )zLoads a Python-level global.

        This takes a NameExpr and uses its name as a key to retrieve the corresponding PyObject *
        from the _globals dictionary in the C-generated code.
        rG  )rJ  r   load_module_attr_by_fullnamer  r   r  r   r$   r   r  load_global_strr  r  r   r   r   load_global  s   



zIRBuilder.load_globalc                 C  s$   |   }| |}| t||g|S r   )r  r   r!  ru   )r   r  r   _globalsr  r   r   r   rL    s   
zIRBuilder.load_global_strc                 C  s   |  ttd| jS )Nglobals)r   rJ   rX   r   r   r   r   r   r  
  r  zIRBuilder.load_globals_dictc                 C  s(   | d\}}}| |}| |||S Nri  )r  r  r   )r   r  r   r:  _r  r  r   r   r   rK    s   
z&IRBuilder.load_module_attr_by_fullnamec                 C  s<   |  |j}t|to|jjo|j|jo|j|j S )zIIs expr a direct reference to a native (struct) attribute of an instance?)	r   rY  r   rR   r  r  has_attrr  
get_method)r   rY  	obj_rtyper   r   r   r    s   
zIRBuilder.is_native_attr_refc                 C  s   d| j d< dS )zMark statements in the innermost block being processed as unreachable.

        This should be called after a statement that unconditionally leaves the
        block, such as 'break' or 'return'.
        FrF  N)r   r   r   r   r   mark_block_unreachable  s   z IRBuilder.mark_block_unreachabler   c                 C  s   t | j|S r   )r8   r   )r   r   r   r   r   r8   %  r   zIRBuilder.catch_errorsmsgc                 C     | j || j| d S r   )r   warningr   r   rV  r   r   r   r   rX  (     zIRBuilder.warningc                 C  rW  r   )r   r[  r   rY  r   r   r   r[  +  rZ  zIRBuilder.errorc                 C  rW  r   )r   noter   rY  r   r   r   r[  .  rZ  zIRBuilder.notefunc_irr>   c                 C  sN   |j |jf}|| jv r| d|d  d| d S | j| | j| d S )NzDuplicate definition of "rG  z" not supported by mypyc)rg  r  r   r[  r   r   rk  )r   r\  r   r  r   r   r   add_function1  s   
zIRBuilder.add_function)r   r   r   r   r   r   r   r9   r   rf   r   rk   r   r   r   rt   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   rQ   )r   r    r   r   )r   r   r   r   r   r   )r   r   )r   rK   r   rQ   )r   rC   r   r   )r   rC   r   r   )r   rM   )r   rQ   r   r   r   r   r   rQ   )r   r   r   rQ   )r   r   r   rQ   )r   r   r   rQ   )r   rQ   r   r   r   r   r   rQ   )
r   rQ   r   rQ   r   r   r   r   r   rQ   )F)
r   rQ   r   rT   r   r   r   r   r   rQ   r   rQ   )r  r  r   r   r   rQ   )NN)r  rQ   r  r  r   r   r  r  r  r  r   rQ   )r   rQ   r  rC   r  rC   r   r   )r  r   r   rQ   )r  rQ   r  r   r  r  r  r  r   r   r  r  r  r  r   rQ   )r  r   r   rQ   )r  r   r   r  r   r   r   rQ   )r"  rT   r#  rQ   r$  rQ   r   r   r   r   r   rQ   )
r#  rQ   r$  rQ   r   r   r   r   r   rQ   )r)  rQ   r   r   r   rQ   )r+  r  r   r   r   rQ   )
r-  r;   r.  r   r)  rQ   r   r   r   r   )r2  r   r   r   r   r   )
r2  r   r   r   r5  rC   r6  rC   r   r   )r:  r   r   r   r   rQ   )r:  r   r   r   r   r   r   rQ   )r   rM   r?  r@  r   r   r   r   )
r   rM   r?  r@  rE  r   r   r   r   r   )rW  rX  r   r   r   r   )r   r   )r   rc  r   )
r\  r   rf  rQ   rg  rh  re  r  r   r   )
r  r   rn  rT   r   r   ro  rh  r   rQ   )r)  rt  r   rQ   )rF  )r\  r   r   r   ry  r   r   rm   )rF  F)r   r  r   r   r   r   r   rQ   )r   r  rf  rQ   r   r   r   r   )r  rQ   r  rT   r   r   r   rQ   )r   rq   r  rQ   r   r   r   r   )r  rm   r  rQ   r   r   r   r   )r   rq   rf  rQ   r   r   r   r   )r  rC   r  rC   r   r   )r"  rT   r   rm   )r   rQ   r   rm   )r   rQ   r   r  )r   rQ   r   r  )r  r   r   r  )rY  r   r   rT   )r   r,   r   rT   )rY  r   r   r  )rY  r   r   r,   )r:  r   r   r   )rY  r   r   r   )rn  r$   r   r   )rY  r   r   r  )r  r&   r  r   r  r   r
  r   rn  r,   r   r   r   r   )rY  r   r   r   )rY  r   r  r   r  r  r   rQ   )rY  r   r   rQ   )r   r!  r   r"  )r   )r   r(  r   r   )r   r+  )r   N)r  r:   r  r   r,  rT   r   r(  r.  r  r   r/  )r]  r6  rn  rT   r  r   r   rM   )r  r!   r   r:  )r  r!   rn  rT   r8  r   r   rM   )r  r!   rn  rT   r8  r   r   rp   )r=  r:   r   rp   )r  r!   r   r:  r   r:  )rn  r@  r   rT   )r   r   r   rT   )
r]  r!   r  rT   r  rB  rz  r   r   rm   )rY  r   r   rQ   )r  r   r   r   r   rQ   )r  r   r   r   r   rQ   )r   r   r   r   )rV  r   r   r   r   r   )r\  r>   r   r   r   r   )pr   r   r   r   r   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r
  r  r  r  r  r  r  r!  r%  r&  r(  r*  r,  r1  r7  r4  r<  r>  rD  rM  rQ  rO  rP  r^  rb  rd  rm  rs  rx  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r$  r*  r-  r   r5  r   r0  r  r9  r  r>  r?  r  r   r  rJ  rM  rL  r  rK  r  rU  r8   rX  r[  r[  r]  r   r   r   r   r      s    J		

		J#G+)	

	r   r   r   r   c                   s   j jd}jD ]=  jrF jd fdd}tts%J j}|j	j
s7j| jj q	j|| jj |d7 }q	dS )	zGenerate blocks for arguments that have default values.

    If the passed value is an error value, then assign the default
    value to the argument.
    r   r   rQ   c                    s    j d usJ t j r j S jjs3jd  jj } j	| j
f tj
| jS  jj} j
jjjj| < tjjj|  jS rP  )initializerrs   r   r   	is_nestedr  variabler  r   rk  r"  r   rJ   r   callable_classr&  rD  rF   self_regr   r)  r   r   rU  r   r   r   get_defaultF  s   
z%gen_arg_defaults.<locals>.get_defaultrG  Nr^  )r   rU  	argumentsr_  r  ra  r   rp   r  r"  error_overlaprD  r   rM  )r   nbre  r  r   rd  r   gen_arg_defaults:  s    
ri  r  r   c                 C  s   |  ddS )aI  Remangle names produced by mypy when allow-redefinition is used and a name
    is used with multiple types within a single block.

    We only need to do this for locals, because the name is used as the name of the register;
    for globals, the name itself is stored in a register for the purpose of doing dict
    lookups.
    '	__redef__)replacer)  r   r   r   r<  e  s   r<  refr   c                 C  s0   t | jtrt| jj}t |tr|jjS | jS r   )r   r   r#   r1   r   r)   r"  r  )rm  r   r   r   r   r  p  s
   
r  )r   r   r   r   )r  r   r   r   )rm  r   r   r   )__doc__
__future__r   
contextlibr   typingr   r   r   r   r   r	   typing_extensionsr
   
mypy.buildr   mypy.maptyper   
mypy.nodesr   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&   
mypy.typesr'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   	mypy.utilr2   mypy.visitorr3   r4   mypyc.commonr5   r6   r7   mypyc.crashr8   mypyc.errorsr9   mypyc.ir.class_irr:   r;   mypyc.ir.func_irr<   r=   r>   r?   r@   mypyc.ir.opsrA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   mypyc.ir.rtypesrR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   mypyc.irbuild.contextrc   rd   mypyc.irbuild.ll_builderre   mypyc.irbuild.mapperrf   mypyc.irbuild.nonlocalcontrolrg   rh   ri   rj   mypyc.irbuild.prebuildvisitorrk   mypyc.irbuild.preparerl   mypyc.irbuild.targetsrm   rn   ro   rp   rq   mypyc.irbuild.utilrr   rs   mypyc.optionsrt   mypyc.primitives.dict_opsru   rv   mypyc.primitives.generic_opsrw   rx   ry   mypyc.primitives.list_opsrz   r{   r|   mypyc.primitives.misc_opsr}   r~   r   mypyc.primitives.registryr   r   r   __annotations__r   	Exceptionr   r:  r   ri  r<  r  r   r   r   r   <module>   sb     p4LL         
-
+