o
    i$                     @   s   d dl Z d dlZd dlmZ d dlZd dlZejdkr)ej	ej
ejejejf Zn	ej	ej
ejf ZdejdedejfddZd	ed
ejdeeejf fddZG dd dejZG dd dZdS )    N)CodeType      instrslinenoreturnc                 C   sF   t  }| D ]}t|t jr| }||_|| q|| q|S N)bcBytecode
isinstanceInstrcopyr   append)r   r   
new_instrsinew_i r   M/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/internal/assembly.pyrelocate   s   r   opcodeargc                 C   sP   t jdkr$|  dkrd} d|f}| |fS |  dkr$t|ts$d|f}| |fS )N)r      LOAD_METHOD	LOAD_ATTRTF)sysversion_infoupperr   tuple)r   r   r   r   r   transform_instruction*   s   
r   c                	   @   sX   e Zd Zddededeje ddfddZddeeej	f deje de
jfd	d
ZdS )	BindOpArgNnamer   r   r   c                 C   s   || _ || _|| _d S r	   )r!   r   r   )selfr!   r   r   r   r   r   __init__8   s   
zBindOpArg.__init__	bind_argsc                 C   s*   t j| j|| j |d ur|dS | jdS Nr   )r
   r   r!   r   r   r"   r$   r   r   r   r   __call__=   s   *zBindOpArg.__call__r	   )__name__
__module____qualname__strtOptionalintr#   dictAnyr
   r   r(   r   r   r   r   r    6   s    ".r    c                	   @   sD  e Zd Z	d8deje deje deje ddfddZdedefd	d
Zdedeje fddZ	dedeje
j fddZdedeje
j fddZdedeje fddZejdkrvdedeje
j fddZdedeje
j fddZdedefddZdedejfddZdedeje
jeeejf fddZdedeje fdd Zdedejeje
jef  fd!d"Zdedefd#d$Zd9d%d&Z d'eddfd(d)Z!d:d*eje"eejf  deje de
j#fd+d,Z$d:d*eje"eejf  deje de%fd-d.Z&d/e
jdefd0d1Z'd9d2d3Z(dej)e
j fd4d5Z*defd6d7Z+dS );AssemblyNr!   filenamer   r   c                 C   sD   i | _ i | _d | _t | _|pd| j_|pt| j_|| _	i | _
d S )Nz
<assembly>)_labels_ref_labels_tbr
   r   _instrsr!   __file__r3   _lineno_bind_opargs)r"   r!   r3   r   r   r   r   r#   B   s   

zAssembly.__init__textc                 C   s   |  s
td| |S )Nzinvalid identifier %s)isidentifier
ValueErrorr"   r;   r   r   r   parse_identN   s   zAssembly.parse_identc                 C   s    zt |W S  ty   Y d S w r	   )r/   r=   r>   r   r   r   parse_numberT   s
   
zAssembly.parse_numberlinec                 C   sZ   | dsd S | |d d }|| jv rtd| | j|d p%t  }| j|< |S )N:zlabel %s already defined)endswithr?   r4   r=   r5   popr
   Label)r"   rA   label_identlabelr   r   r   parse_labelZ   s   

 zAssembly.parse_labelc                 C   sz   | dsd S | |dd  }z| j| W S  ty<   z| j| W  Y S  ty;   t  }| j|< | Y  Y S w w )N@   )
startswithr?   r4   KeyErrorr5   r
   rF   )r"   r;   rG   rH   r   r   r   parse_label_reff   s   
zAssembly.parse_label_refc                 C   s    | dsd S | |dd  S )N$rK   )rL   r?   r>   r   r   r   parse_string_refu   s   
zAssembly.parse_string_refr   c                 C   s   z|j dd^}}}W n
 ty   Y d S w |dkrd S | jd ur%td| |}|d u r2tdtj|t|d }| _|S )N   maxsplittryz,cannot start try block while another is openz%invalid label reference for try block)
push_lasti)splitr=   r6   rN   r
   TryBeginbool)r"   rA   head	label_reflastirH   tbr   r   r   parse_try_begin}   s   

zAssembly.parse_try_beginc                 C   s4   |dkrd S | j d u rtdt| j }d | _ |S )Ntriedz'cannot end try block while none is open)r6   r=   r
   TryEnd)r"   rA   endr   r   r   parse_try_end   s   
zAssembly.parse_try_endc                 C   s8   |  }tjdkr|dkr|S |tjvrtd| |S )N)r      r   zunknown opcode %s)r   r   r   disopmapr=   )r"   r;   r   r   r   r   parse_opcode   s   
zAssembly.parse_opcodec                 C   s*   t d}|j }t|d< t|||jS )NrK   asm)r   	_getframe	f_globalsr   r
   evalf_locals)r"   r;   frame_globalsr   r   r   
parse_expr   s   

zAssembly.parse_exprc                 C   s2   |st jS | |p| |p| |p| |S r	   )r
   UNSETrN   rP   r@   rm   r>   r   r   r   parse_opcode_arg   s   
zAssembly.parse_opcode_argc                 C   s$   | dr
|dsd S |dd S )N{}rK   rC   )rL   rD   r>   r   r   r   parse_bind_opcode_arg   s   zAssembly.parse_bind_opcode_argc                 C   sj   |j dd^}}d}|r#|\}| |}|d ur#t| ||| jdS tjt| || |d| jiS )NrK   rR    r&   r   )	rV   rr   r    re   r9   r
   r   r   ro   )r"   rA   r   argsr   bind_argr   r   r   parse_instruction   s   
zAssembly.parse_instructionc                 C   s`   t jdkr| |p| |p| |p| |}n
| |p#| |}|d u r.td| |S )Nr   zinvalid line %s)r   r   rI   r]   ra   rv   r=   )r"   rA   entryr   r   r   
parse_line   s   

zAssembly.parse_linec                 C   s   | j rtdd| j  d S )Nzundefined labels: %sz, )r5   r=   joinr"   r   r   r   	_validate   s   zAssembly._validaterf   c                 C   sd   dd |  D D ]"}|r|drq	| |}t|tr%|| jt| j< | j| q	| 	  d S )Nc                 s   s    | ]}|  V  qd S r	   )strip).0_r   r   r   	<genexpr>   s    z!Assembly.parse.<locals>.<genexpr>#)

splitlinesrL   rx   r   r    r:   lenr7   r   r{   )r"   rf   rA   rw   r   r   r   parse   s   

zAssembly.parser$   c                 C   sv   | j s|d urt| j|S | jS |d u rtdt| j}| j  D ]\}}|||d||< q#|d ur9t||S |S )Nzmissing bind argumentsr&   )r:   r   r7   r=   r
   r   items)r"   r$   r   r   r   r   r   r   r   bind   s   zAssembly.bindc                 C   s   | j ||d S r%   )r   to_coder'   r   r   r   compile  s   zAssembly.compilerH   c                    s   t  fdd| j D S )Nc                 3   s     | ]\}}| u r|V  qd S r	   r   )r}   identlrH   r   r   r   	  s    z(Assembly._label_ident.<locals>.<genexpr>)nextr4   r   )r"   rH   r   r   r   _label_ident  s   zAssembly._label_identc                 C   s   | j D ]W}t|tjrtd|jd|jd ur|jnd  qt|tr3td|jdd|j d qt|tjrDt| 	| d qt|tj
rZtd| 	|j d|j d	 qd S )
Nz    z<32rs   rp   rq   rB   ztry @z (lasti=))r7   r   r
   r   printr!   r   r    rF   r   rW   targetrU   )r"   rw   r   r   r   rc     s   
(
 zAssembly.disc                 C   
   t | jS r	   )iterr7   rz   r   r   r   __iter__     
zAssembly.__iter__c                 C   r   r	   )r   r7   rz   r   r   r   __len__  r   zAssembly.__len__)NNN)r   N)NN),r)   r*   r+   r-   r.   r,   r/   r#   r?   r@   r
   rF   rI   rN   rP   r   r   rW   r]   r_   ra   re   r1   rm   Unionro   rr   r   r    rv   
ParsedLinerx   r{   r   r0   r   r   r   r   r   rc   Iteratorr   r   r   r   r   r   r2   A   sB    

$$
0.
r2   )rc   r   typesr   typingr-   bytecoder
   r   r   r   rF   rW   r_   r   r   r/   r   r,   r1   r   r   r    r2   r   r   r   r   <module>   s   
"