U
    9%e.                     @   s  d dl Z d dlZd dlZd dlmZ d dlmZmZ d dl	m
Z
 dd ZedZedZedZed	Zed
ZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZ edZ!edZ"edZ#edZ$edZ%G d d! d!Z&G d"d# d#Z'G d$d% d%e(Z)G d&d' d'e(Z*d(d) Z+e j,dd* d+krte+nej-Z.e) Z/d,d- Z0d.d/ Z1G d0d1 d1e(Z2G d2d3 d3e(Z3d4d5 Z4d6d7 Z5G d8d9 d9e(Z6dS ):    N)_decode_string_is_shutting_down)get_library_namec                 C   s   t | tjfi }t|S N)typectypesZ	StructureZPOINTER)nameZnewcls r	   S/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/llvmlite/binding/ffi.py_make_opaque_ref
   s    r   ZLLVMContextZ
LLVMModuleZ	LLVMValueZLLVMTypeZLLVMExecutionEngineZLLVMPassManagerBuilderZLLVMPassManagerZLLVMTargetDataZLLVMTargetLibraryInfoZ
LLVMTargetZLLVMTargetMachineZLLVMMemoryBufferLLVMAttributeListIteratorLLVMAttributeSetIteratorLLVMGlobalsIteratorLLVMFunctionsIteratorLLVMBlocksIteratorLLVMArgumentsIteratorLLVMInstructionsIteratorLLVMOperandsIteratorLLVMTypesIteratorZLLVMObjectCacheZLLVMObjectFileZLLVMSectionIteratorLLVMOrcLLJITRefLLVMOrcDylibTrackerRefc                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )	_LLVMLocka6  A Lock to guarantee thread-safety for the LLVM C-API.

    This class implements __enter__ and __exit__ for acquiring and releasing
    the lock as a context manager.

    Also, callbacks can be attached so that every time the lock is acquired
    and released the corresponding callbacks will be invoked.
    c                 C   s   t  | _g | _d S r   )	threadingRLock_lock_cblistselfr	   r	   r
   __init__4   s    
z_LLVMLock.__init__c                 C   s   | j ||f dS )zRegister callbacks that are invoked immediately after the lock is
        acquired (``acq_fn()``) and immediately before the lock is released
        (``rel_fn()``).
        N)r   appendr   acq_fnrel_fnr	   r	   r
   register:   s    z_LLVMLock.registerc                 C   s   | j ||f dS )z)Remove the registered callbacks.
        N)r   remover    r	   r	   r
   
unregisterA   s    z_LLVMLock.unregisterc                 C   s$   | j   | jD ]\}}|  qd S r   )r   acquirer   r    r	   r	   r
   	__enter__F   s    
z_LLVMLock.__enter__c                 G   s$   | j D ]\}}|  q| j  d S r   )r   r   release)r   exc_detailsr!   r"   r	   r	   r
   __exit__L   s    z_LLVMLock.__exit__N)	__name__
__module____qualname____doc__r   r#   r%   r'   r*   r	   r	   r	   r
   r   +   s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )_suppress_cleanup_errorsc                 C   s
   || _ d S r   )_context)r   contextr	   r	   r
   r   T   s    z!_suppress_cleanup_errors.__init__c                 C   s
   | j  S r   )r0   r'   r   r	   r	   r
   r'   W   s    z"_suppress_cleanup_errors.__enter__c                 C   s,   z| j |||W S  tk
r&   Y nX d S r   )r0   r*   PermissionError)r   exc_type	exc_value	tracebackr	   r	   r
   r*   Z   s    z!_suppress_cleanup_errors.__exit__N)r+   r,   r-   r   r'   r*   r	   r	   r	   r
   r/   S   s   r/   c                   @   sV   e Zd ZdZdddgZdd Zdd Zed	d
 Zdd Z	edd Z
edd ZdS )_lib_wrapperz{Wrap libllvmlite with a lock such that only one thread may access it at
    a time.

    This class duck-types a CDLL.
    _lib_handle_fntabr   c                 C   s   d | _ i | _t | _d S r   )r7   r8   r   r   r   r	   r	   r
   r   i   s    z_lib_wrapper.__init__c              
   C   sz   zDt ttdd t  }tt|| _| j	 }W 5 Q R X W n0 t
tfk
rt } zt
d|W 5 d }~X Y nX d S )N.r   z&Could not find/load shared object file)r/   _importlib_resources_pathr+   
rpartitionr   r   CDLLstrr7   ZLLVMPY_GetVersionInfoOSErrorAttributeError)r   Zlib_path_er	   r	   r
   	_load_libn   s    z_lib_wrapper._load_libc                 C   s   | j s|   | j S r   )r7   rB   r   r	   r	   r
   _lib}   s    z_lib_wrapper._libc                 C   sL   z| j | W S  tk
rF   t| j|}t| j|}|| j |< | Y S X d S r   )r8   KeyErrorgetattrrC   _lib_fn_wrapperr   )r   r   cfnwrappedr	   r	   r
   __getattr__   s    
z_lib_wrapper.__getattr__c                 C   s   | j jS )zgThe name of the library passed in the CDLL constructor.

        For duck-typing a ctypes.CDLL
        )rC   _namer   r	   r	   r
   rJ      s    z_lib_wrapper._namec                 C   s   | j jS )z]The system handle used to access the library.

        For duck-typing a ctypes.CDLL
        )rC   _handler   r	   r	   r
   rK      s    z_lib_wrapper._handleN)r+   r,   r-   r.   	__slots__r   rB   propertyrC   rI   rJ   rK   r	   r	   r	   r
   r6   a   s   



r6   c                   @   s\   e Zd ZdZddgZdd Zedd Zejdd Zed	d
 Z	e	jdd
 Z	dd Z
dS )rF   zWraps and duck-types a ctypes.CFUNCTYPE to provide
    automatic locking when the wrapped function is called.

    TODO: we can add methods to mark the function as threadsafe
          and remove the locking-step on call when marked.
    r   _cfnc                 C   s   || _ || _d S r   r   rN   )r   lockrG   r	   r	   r
   r      s    z_lib_fn_wrapper.__init__c                 C   s   | j jS r   rN   argtypesr   r	   r	   r
   rR      s    z_lib_fn_wrapper.argtypesc                 C   s   || j _d S r   rQ   )r   rR   r	   r	   r
   rR      s    c                 C   s   | j jS r   rN   restyper   r	   r	   r
   rT      s    z_lib_fn_wrapper.restypec                 C   s   || j _d S r   rS   )r   rT   r	   r	   r
   rT      s    c              
   O   s*   | j  | j||W  5 Q R  S Q R X d S r   rO   )r   argskwargsr	   r	   r
   __call__   s    z_lib_fn_wrapper.__call__N)r+   r,   r-   r.   rL   r   rM   rR   setterrT   rW   r	   r	   r	   r
   rF      s   



rF   c                 C   s   t t | | S )a  Replacement implementation of `import.resources.path` to avoid
    deprecation warning following code at importlib_resources/_legacy.py
    as suggested by https://importlib-resources.readthedocs.io/en/latest/using.html#migrating-from-legacy

    Notes on differences from importlib.resources implementation:

    The `_common.normalize_path(resource)` call is skipped because it is an
    internal API and it is unnecessary for the use here. What it does is
    ensuring `resource` is a str and that it does not contain path separators.
    )_impresZas_filefiles)packageresourcer	   r	   r
   _importlib_resources_path_repl   s    r]      )   	   c                 C   s   t j| | dS )z~Register callback functions for lock acquire and release.
    *acq_fn* and *rel_fn* are callables that take no arguments.
    N)libr   r#   r!   r"   r	   r	   r
   register_lock_callback   s    rc   c                 C   s   t j| | dS )zRemove the registered callback functions for lock acquire and release.
    The arguments are the same as used in `register_lock_callback()`.
    N)ra   r   r%   rb   r	   r	   r
   unregister_lock_callback   s    rd   c                   @   s   e Zd ZdZdS )_DeadPointerz:
    Dummy class to make error messages more helpful.
    N)r+   r,   r-   r.   r	   r	   r	   r
   re      s   re   c                   @   sp   e Zd ZdZe Zedd ZdddZdd	 Z	d
d Z
dd ZefddZdd Zdd ZeZedd ZdS )OutputStringz<
    Object for managing the char* output of LLVM APIs.
    c                 C   s   | t |t jdS )a%  Constructing from a pointer returned from the C-API.
        The pointer must be allocated with LLVMPY_CreateString.

        Note
        ----
        Because ctypes auto-converts *restype* of *c_char_p* into a python
        string, we must use *c_void_p* to obtain the raw pointer.
        )init)r   castc_char_p)clsptrr	   r	   r
   from_return   s    
zOutputString.from_returnTNc                 C   s0   |d k	r|nt d | _t | j| _|| _d S r   )r   ri   _ptrZbyref_as_parameter__owned)r   Zownedrg   r	   r	   r
   r      s    zOutputString.__init__c                 C   s*   | j d k	r&| jrt| j  d | _ | `d S r   )rm   ro   ra   ZLLVMPY_DisposeStringrn   r   r	   r	   r
   close  s
    
zOutputString.closec                 C   s   | S r   r	   r   r	   r	   r
   r'   	  s    zOutputString.__enter__c                 C   s   |    d S r   rp   r   r3   exc_valexc_tbr	   r	   r
   r*     s    zOutputString.__exit__c                 C   s   | s| j d k	r|    d S r   rq   r   r   r	   r	   r
   __del__  s    
zOutputString.__del__c                 C   s*   | j d krdS | j j}|d k	s"tt|S )Nz<dead OutputString>)rm   valueAssertionErrorr   )r   sr	   r	   r
   __str__  s
    
zOutputString.__str__c                 C   s
   t | jS r   boolrm   r   r	   r	   r
   __bool__  s    zOutputString.__bool__c                 C   s   | j jS )z:Get the raw bytes of content of the char pointer.
        )rm   rw   r   r	   r	   r
   bytes"  s    zOutputString.bytes)TN)r+   r,   r-   r.   re   rn   classmethodrl   r   rp   r'   r*   r   rv   rz   r}   __nonzero__rM   r~   r	   r	   r	   r
   rf      s   

rf   c                 C   s   | dk	rt t| S dS )z,To wrap string return-value from C-API.
    N)r=   rf   rl   rk   r	   r	   r
   
ret_string)  s    r   c                 C   s   | dk	rt | jS dS )z+To wrap bytes return-value from C-API.
    N)rf   rl   r~   r   r	   r	   r
   	ret_bytes0  s    r   c                   @   s   e Zd ZdZdZe ZdZdd Zdd Z	dd Z
d	d
 Zedd Zdd Zdd ZefddZdd Zdd ZeZdd ZdS )	ObjectRefzJ
    A wrapper around a ctypes pointer to a LLVM object ("resource").
    Fc                 C   s&   |d krt d|| _|| _t| _d S )NzNULL pointer)
ValueErrorrm   rn   ra   Z_capi)r   rk   r	   r	   r
   r   @  s
    zObjectRef.__init__c                 C   s(   z| js| js|   W 5 |    X dS )zI
        Close this object and do any required clean-up actions.
        N)detach_closedro   _disposer   r	   r	   r
   rp   G  s    zObjectRef.closec                 C   s   | j s| `d| _ d| _dS )zN
        Detach the underlying LLVM resource without disposing of it.
        TN)r   rn   rm   r   r	   r	   r
   r   Q  s    zObjectRef.detachc                 C   s   dS )z
        Dispose of the underlying LLVM resource.  Should be overriden
        by subclasses.  Automatically called by close(), __del__() and
        __exit__() (unless the resource has been detached).
        Nr	   r   r	   r	   r
   r   Z  s    zObjectRef._disposec                 C   s   | j S )zf
        Whether this object has been closed.  A closed object can't
        be used anymore.
        )r   r   r	   r	   r
   closeda  s    zObjectRef.closedc                 C   s(   t | dst| jr$td| jf | S )Nrp   z%s instance already closed)hasattrrx   r   RuntimeError	__class__r   r	   r	   r
   r'   i  s    zObjectRef.__enter__c                 C   s   |    d S r   rq   rr   r	   r	   r
   r*   o  s    zObjectRef.__exit__c                 C   s   | s| j d k	r|    d S r   rq   ru   r	   r	   r
   rv   r  s    
zObjectRef.__del__c                 C   s
   t | jS r   r{   r   r	   r	   r
   r}   w  s    zObjectRef.__bool__c                 C   s.   t |dsdS t| jd t|jd kS )Nrm   Fr   )r   r   Z	addressofrm   )r   otherr	   r	   r
   __eq__z  s
    
zObjectRef.__eq__c                 C   s   t t| jtjjS r   )hashr   rh   rm   Zc_void_prw   r   r	   r	   r
   __hash__  s    zObjectRef.__hash__N)r+   r,   r-   r.   r   re   rn   ro   r   rp   r   r   rM   r   r'   r*   r   rv   r}   r   r   r   r	   r	   r	   r
   r   7  s"   
	
r   )7sysr   r   importlib.resources	resourcesrY   Zllvmlite.binding.commonr   r   Zllvmlite.utilsr   r   ZLLVMContextRefZLLVMModuleRefZLLVMValueRefZLLVMTypeRefZLLVMExecutionEngineRefZLLVMPassManagerBuilderRefZLLVMPassManagerRefZLLVMTargetDataRefZLLVMTargetLibraryInfoRefZLLVMTargetRefZLLVMTargetMachineRefZLLVMMemoryBufferRefr   r   r   r   r   r   r   r   r   ZLLVMObjectCacheRefZLLVMObjectFileRefZLLVMSectionIteratorRefr   r   r   r/   objectr6   rF   r]   version_infopathr:   ra   rc   rd   re   rf   r   r   r   r	   r	   r	   r
   <module>   sb   (>">