o
    i<                     @   s  d dl mZ d dlZd dlmZ d dlZd dlmZ d dlZ	d dl
mZ d dlmZ ejdk rG dd	 d	eeZG d
d deZG dd deZG dd deZG dd dZG dd deZG dd deZG dd deZejZdZdededee fddZdedeeef d eeeef  defd!d"Zej d# Z!ej d$ Z"ej d% Z#ej d& Z$ej d' Z%d(ed)edeed*f fd+d,Z&ded-ed.e'd/e'deeef f
d0d1Z(dS dS )2    )ABCN)Enum)CodeType)HookType)CoverageLines)   
   c                   @   s*   e Zd ZdZdZededd fddZdS )JumpDirection   opcodereturnc                 C   s   dt j| v r
| jS | jS )NBACKWARD)disopnamer   FORWARD)clsr    r   c/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/internal/coverage/instrumentation_py3_9.pyfrom_opcode   s   zJumpDirection.from_opcodeN)__name__
__module____qualname__r   r   classmethodintr   r   r   r   r   r	      s
    r	   c                   @   s"   e Zd ZdededdfddZdS )Jumpstartargr   Nc                 C   s   || _ |  || _d S N)r   r   selfr   r   r   r   r   __init__   s   
zJump.__init__)r   r   r   r   r!   r   r   r   r   r      s    r   c                       s4   e Zd ZeejZdededdf fddZ  Z	S )AJumpr   r   r   Nc                    s   t  || | j| _d S r   )superr!   r   endr   	__class__r   r   r!   #   s   zAJump.__init__)
r   r   r   setr   hasjabs__opcodes__r   r!   __classcell__r   r   r%   r   r"       s    
"r"   c                       s8   e Zd ZeejZdedededdf fddZ	  Z
S )RJumpr   r   	directionr   Nc                    s.   t  || || _|| j| j  d | _d S )N   )r#   r!   r,   r   r$   )r    r   r   r,   r%   r   r   r!   *   s   zRJump.__init__)r   r   r   r'   r   hasjrelr)   r   r	   r!   r*   r   r   r%   r   r+   '   s    
&r+   c                   @   s*   e Zd ZdZdedededdfddZdS )	Instructionoffsetr   r   targetsr1   r   r   r   Nc                 C   s   || _ || _|| _g | _d S r   r0   )r    r1   r   r   r   r   r   r!   2   s   
zInstruction.__init__)r   r   r   	__slots__r   r!   r   r   r   r   r/   /   s    r/   c                   @   s4   e Zd ZdededdfddZedefddZdS )	Branchr   r$   r   Nc                 C   s   || _ || _d S r   r   r$   )r    r   r$   r   r   r   r!   9   s   
zBranch.__init__c                 C   s   t r   )NotImplementedErrorr    r   r   r   r   =   s   z
Branch.arg)r   r   r   r/   r!   propertyr   r   r   r   r   r   r4   8   s    r4   c                   @      e Zd ZedefddZdS )RBranchr   c                 C   s   t | jj| jj d d? S )Nr-   r
   )absr$   r1   r   r7   r   r   r   r   B   s   zRBranch.argNr   r   r   r8   r   r   r   r   r   r   r:   A       r:   c                   @   r9   )ABranchr   c                 C   s   | j jd? S )Nr
   )r$   r1   r7   r   r   r   r   G   s   zABranch.argNr<   r   r   r   r   r>   F   r=   r>   r   r   r   r   c                 C   sF   t d| |d@ g}|dL }|r!|dt tt|d@  |dL }|s|S )Nr         r   )r/   insert	NO_OFFSETEXTENDED_ARG)r   r   instructionsr   r   r   instr_with_argN   s   rE   codetrap_mapext_arg_offsetsc                 C   sr  | j dkr| j S t }| j }tt|}t|d\}}d}|d d>  }	}
tdt|dD ]}|| }||d  }|	|7 }	||7 }|
|7 }
|dkrJq-|dkrY|d || q-|d ur|d ur|	|kr|
|d> 7 }
|	|d> 7 }	t|d\}}|d ur|d ur|	|kse|dkr|
dkr|d |d |
d8 }
|
dks||
 || ||dd> }
|	|
7 }	q-t	|S )N    )NNr   r
   r-   r?   )
	co_lnotab	bytearrayitersortednextrangelenappendgetbytes)rF   rG   rH   new_datadataext_arg_offset_iterext_arg_offsetext_arg_sizecurrent_orig_offsetcurrent_new_offsetaccumulated_new_offsetiorig_offset_delta
line_deltar   r   r   update_location_dataV   sJ   






r_   
LOAD_CONSTCALL_FUNCTIONPOP_TOPIMPORT_NAMEIMPORT_FROM
trap_index	arg_index.c                 C   s2   g t t| t t|tttdtttdR S )Nr
   r   )rE   r`   r/   rB   CALLrb   )re   rf   r   r   r   	trap_call   s   

rh   hookpathpackagec           6      C   sz  ||}}g }t | j}t|}|| t }	i }
i }i }i }tt| }d}d}d}d }d }ztt	| j
}g }	 t|\}}||v r|| }t|t|}t|||< || d }| jdkrst|t| jd krs|df}||||f |d ||< |	| t|\}}t|d> }|t||| |tu r|| q<|}|}tjg ||ddd}|  |tkr| j| }| j| }|dkrd	|d	d | d  n|}|d
 d |d
 d ||fff|d
< |tkr!| d	| j|  }|d
 d |d
 d |d
 d d tt |d
 d d |g ff|d
< |tjv r/t||||< n|tjv r@t||t|||< |tu rK|| n|  q= t yY   Y nw dd |! D } t	|D ]\}!}"|!d> }#|"j"| v rz|#|
|"j"< |#|"_"qgg }$|! D ];}%|
|%j# }&|
|%j$ }'|%|%j$||'d?  }(t&|%trt'||&d?  |(nt(||&d?  |(})|(j)|) |$|) qd}*g }+|*rjd}*|$D ]})|)j#},|)j*d> }-|-d@ |,_*|-dL }-d}.|,j"d? }!|-rA|!r||!d  j+tu r|!d8 }!|-d@ ||! _*n8t|!d> t|-d@ }/|,|!|/ |.d7 }.|,j)r:|,j)D ]}0|0j$|,ur)t-d|/|0_$q|/j)|,j) |,j)  |-dL }-|-s|.re|+|/|.f t	||!d d  |!d D ]
\}1}"|1d> |"_"qXd}*q|*st. }2|D ]}"|2|"j+ |2|"j* qot	| jD ]\}}3t&|3t/rt0|3|||\||< }4|	1|4 qdd |+D }5| j2t3|2t|| j4d t5| ||5d|	fS )Nr   Tz<module>r
   ) bigF)signed.r   r-   c                 S   s"   h | ]}|j |jfD ]}|q
qS r   r5   ).0j_r   r   r   	<setcomp>  s   " z'instrument_all_lines.<locals>.<setcomp>r?   r@   zInvalid targetc                 S   s   g | ]	\}}|j |fqS r   )r1   )rp   instrsr   r   r   
<listcomp>n  s    z(instrument_all_lines.<locals>.<listcomp>   )co_code	co_constsco_stacksizerJ   )6listry   rP   rQ   r   dictr   findlinestartsrL   	enumeraterx   rN   rh   extendco_nameaddr/   rC   r   
from_bytesclearrc   co_namesjoinsplitrd   tupler"   r)   r+   r	   r   StopIterationvaluesr1   r   r$   rR   
isinstancer:   r>   r2   r   r   rA   
ValueErrorrK   r   instrument_all_linesupdatereplacerS   rz   r_   )6rF   ri   rj   rk   	trap_functrap_argrD   
new_constsre   
seen_lines
offset_mapjumpstrapsline_mapline_startscurrent_argprevious_argprevious_previous_argcurrent_import_namecurrent_import_package	code_iterextoriginal_offsetr   linetrap_instructionspackage_deprr   r   r1   import_depthimport_from_namejump_targetsindexrt   
new_offsetbranchesjump	new_startnew_endtarget_instrbranchprocess_branchesexts
jump_instrnew_argc	ext_instrtargetinstr_indexnew_codenested_codenested_linesrH   r   r   r   r      s  



 



(


	

,
K









".

r   ))abcr   r   enumr   systypesr   typingt#ddtrace.internal.bytecode_injectionr   /ddtrace.internal.test_visibility.coverage_linesr   version_infor   r	   r   r"   r+   r/   r4   r:   r>   rC   rB   r{   rE   r|   r   rS   r_   opmapr`   rg   rb   rc   rd   rh   strr   r   r   r   r   <module>   s<    
		.
A



* 