o
    i                     @   s  d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dlZd dlmZ d dl	m
Z
 edZe jZded	eee ee f fd
dZe
 ded	ee fddZded	ee fddZdedeeeeeeedf f df f d	efddZedkZG dd dejZdS )    N)Any)Iterator)Optional)Union)AttrDict)cachedobjreturnc                 C   s<   zt | d}t|tr|fW S |W S  ty   g  Y S w )N	__slots__)object__getattribute__
isinstancestrAttributeError)r   slots r   K/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/internal/safety.py_maybe_slots   s   
r   _typec                 C   s   dd t | dD S )Nc                 S   s   h | ]}t |D ]}|qqS r   )r   ).0cls_r   r   r   	<setcomp>   s    z_slots.<locals>.<setcomp>__mro__r   r   )r   r   r   r   _slots   s   r   c                 C   s   t t| S )zGet the object's slots.)r   typer   r   r   r   	get_slots!   s   r   types.c                 C   s   t t| |S N)
issubclassr   )r   r   r   r   r   _isinstance&   s   r"   )      c                       s   e Zd ZdZdededee fddZdedef fdd	Zdedef fd
dZ	dedef fddZ
def fddZdeeeef  f fddZdd ZeZededee fddZ  ZS )SafeObjectProxyaF  Object proxy to make sure we don't call unsafe code.

    Access to the wrapped object is denied to prevent any potential
    side-effects. Arbitrary objects are essentially converted into attribute
    dictionaries. Callable objects are made uncallable to prevent accidental
    calls that can also trigger side-effects.
    argskwargsr	   c                 O   s   t d)NzCannot call safe object)RuntimeError)selfr&   r'   r   r   r   __call__8   s   zSafeObjectProxy.__call__namec                    s0   |dkrt s
tdtt| jS tt| |S N__wrapped__zAccess denied)IS_312_OR_NEWERr   superr%   r-   r   r)   r+   	__class__r   r   r   ;   s
   z SafeObjectProxy.__getattribute__c                    s:   |dkrt r
tdtt| jS t| tt| |S r,   )r.   r   r/   r%   r-   r   safe__getattr__r0   r1   r   r   r4   C   s
   zSafeObjectProxy.__getattr__itemc                    s   t | tt| |S r    )r   r3   r/   r%   __getitem__)r)   r5   r1   r   r   r6   K   s   zSafeObjectProxy.__getitem__c                    s    t  fddtt  D S )Nc                 3   s    | ]
}t  |V  qd S r    r   r3   )r   r   r)   r   r   	<genexpr>O   s    z+SafeObjectProxy.__iter__.<locals>.<genexpr>)iterr/   r%   __iter__r8   r1   r8   r   r;   N   s    zSafeObjectProxy.__iter__c                    s     fddt t d D S )Nc                 3   s0    | ]\}}t  |t  |fV  qd S r    r7   )r   kvr8   r   r   r9   R   s     
z(SafeObjectProxy.items.<locals>.<genexpr>items)r/   r%   r4   r8   r1   r8   r   r>   Q   s   
zSafeObjectProxy.itemsc                 C   s
   t | S r    )r   __repr__r8   r   r   r   __str__W   s   
zSafeObjectProxy.__str__r   c                    s   t  }t t rz
 jdkr W S W n ty   Y nw |tttttt	t
hv r* S z| tt dW S  ty>   Y nw t }|rR| t fdd|D S |  S )z!Turn an object into a safe proxy.builtins__dict__c                    s   i | ]	}|t  |qS r   r   )r   r<   r   r   r   
<dictcomp>u   s    z(SafeObjectProxy.safe.<locals>.<dictcomp>)r   r"   
__module__r   r   intfloatboolNoneTypebytescomplexr   r   r   r   )r   r   r   r   r   r   r   r3   \   s(   

zSafeObjectProxy.safe)__name__rD   __qualname____doc__r   r   r*   r   r   r4   r6   r;   r   tupler>   r@   r?   classmethodr3   __classcell__r   r   r1   r   r%   /   s     r%   )systypingr   r   r   r   wraptddtrace.internal.utils.attrdictr   ddtrace.internal.utils.cacher   r   rH   version_infoPYrN   r   listr   setr   r   rG   r"   r.   ObjectProxyr%   r   r   r   r   <module>   s"    "
6