o
    4ήc'                  
   @   s  d dl Z d dlZd dl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!G dd dZ"G d d! d!e#Z$G d"d# d#e#Z%e Z&d$'e()d$d d% Z*zej+,e*e&Z-e .e/e-0 Z1W n e2y Z3 zd&e& d'e3 Z4e2e4dZ3[3ww e$e1Z1d(d) Z5d*d+ Z6G d,d- d-e#Z7G d.d/ d/e#Z8d0d1 Z9d2d3 Z:G d4d5 d5e#Z;dS )6    N)_decode_string_is_shutting_down)get_library_namec                 C   s   t | tjfi }t|S N)typectypes	StructurePOINTER)namenewcls r   ;/tmp/pip-target-vg8gfxp4/lib/python/llvmlite/binding/ffi.py_make_opaque_ref	   s   
r   LLVMContext
LLVMModule	LLVMValueLLVMTypeLLVMExecutionEngineLLVMPassManagerBuilderLLVMPassManagerLLVMTargetDataLLVMTargetLibraryInfo
LLVMTargetLLVMTargetMachineLLVMMemoryBufferLLVMAttributeListIteratorLLVMAttributeSetIteratorLLVMGlobalsIteratorLLVMFunctionsIteratorLLVMBlocksIteratorLLVMArgumentsIteratorLLVMInstructionsIteratorLLVMOperandsIteratorLLVMTypesIteratorLLVMObjectCacheLLVMObjectFileLLVMSectionIteratorc                   @   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__1   s   

z_LLVMLock.__init__c                 C      | 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   register7   s   z_LLVMLock.registerc                 C   r/   )z)Remove the registered callbacks.
        N)r+   remover1   r   r   r   
unregister>   s   z_LLVMLock.unregisterc                 C   s$   | j   | jD ]\}}|  qd S r   )r*   acquirer+   r1   r   r   r   	__enter__C   s   
z_LLVMLock.__enter__c                 G   s$   | j D ]\}}|  q| j  d S r   )r+   r*   release)r-   exc_detailsr2   r3   r   r   r   __exit__I   s   z_LLVMLock.__exit__N)	__name__
__module____qualname____doc__r.   r4   r6   r8   r;   r   r   r   r   r'   (   s    r'   c                   @   s@   e Zd ZdZg dZ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_fntabr*   c                 C   s   || _ i | _t | _d S r   )rA   rB   r'   r*   )r-   libr   r   r   r.   X   s   z_lib_wrapper.__init__c                 C   sF   z| j | W S  ty"   t| j|}t| j|}|| j |< | Y S w r   )rB   KeyErrorgetattrrA   _lib_fn_wrapperr*   )r-   r
   cfnwrappedr   r   r   __getattr__]   s   
z_lib_wrapper.__getattr__c                 C      | j jS )zgThe name of the library passed in the CDLL constructor.

        For duck-typing a ctypes.CDLL
        )rA   _namer,   r   r   r   rK   g      z_lib_wrapper._namec                 C   rJ   )z]The system handle used to access the library.

        For duck-typing a ctypes.CDLL
        )rA   _handler,   r   r   r   rM   o   rL   z_lib_wrapper._handleN)
r<   r=   r>   r?   	__slots__r.   rI   propertyrK   rM   r   r   r   r   r@   P   s    

r@   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*   rP   )r-   lockrG   r   r   r   r.      s   
z_lib_fn_wrapper.__init__c                 C   rJ   r   rP   argtypesr,   r   r   r   rT         z_lib_fn_wrapper.argtypesc                 C      || j _d S r   rS   )r-   rT   r   r   r   rT         c                 C   rJ   r   rP   restyper,   r   r   r   rY      rU   z_lib_fn_wrapper.restypec                 C   rV   r   rX   )r-   rY   r   r   r   rY      rW   c                 O   s:   | j  | j|i |W  d    S 1 sw   Y  d S r   rQ   )r-   argskwargsr   r   r   __call__   s   $z_lib_fn_wrapper.__call__N)r<   r=   r>   r?   rN   r.   rO   rT   setterrY   r\   r   r   r   r   rF   x   s    



rF   .z(Could not find/load shared object file: z
 Error was: c                 C      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)rC   r*   r4   r2   r3   r   r   r   register_lock_callback      rb   c                 C   r`   )zRemove the registered callback functions for lock acquire and release.
    The arguments are the same as used in `register_lock_callback()`.
    N)rC   r*   r6   ra   r   r   r   unregister_lock_callback   rc   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 ur|nt d | _t | j| _|| _d S r   )r   ri   _ptrbyref_as_parameter__owned)r-   ownedrg   r   r   r   r.      s   
zOutputString.__init__c                 C   s.   | j d ur| jrt| j  d | _ | `d S d S r   )rm   rp   rC   LLVMPY_DisposeStringro   r,   r   r   r   close   s   
zOutputString.closec                 C   s   | S r   r   r,   r   r   r   r8      s   zOutputString.__enter__c                 C      |    d S r   rs   r-   exc_typeexc_valexc_tbr   r   r   r;         zOutputString.__exit__c                 C   $   | s| j d ur|    d S d S d S r   ru   r-   r   r   r   r   __del__   s
   
zOutputString.__del__c                 C   s*   | j d u rdS | j j}|d usJ t|S )Nz<dead OutputString>)rm   valuer   )r-   sr   r   r   __str__   s
   
zOutputString.__str__c                 C   
   t | jS r   boolrm   r,   r   r   r   __bool__      
zOutputString.__bool__c                 C   rJ   )z:Get the raw bytes of content of the char pointer.
        )rm   r~   r,   r   r   r   bytes   s   zOutputString.bytes)TN)r<   r=   r>   r?   re   ro   classmethodrl   r.   rs   r8   r;   r   r}   r   r   __nonzero__rO   r   r   r   r   r   rf      s    

rf   c                 C   s   | durt t| S dS )z,To wrap string return-value from C-API.
    N)strrf   rl   rk   r   r   r   
ret_string   s   r   c                 C   s   | dur
t | jS dS )z+To wrap bytes return-value from C-API.
    N)rf   rl   r   r   r   r   r   	ret_bytes  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 u rt d|| _|| _t| _d S )NzNULL pointer)
ValueErrorrm   ro   rC   _capi)r-   rk   r   r   r   r.     s
   
zObjectRef.__init__c                 C   sJ   z| j s| js|   W |   dS W |   dS W |   dS |   w )zI
        Close this object and do any required clean-up actions.
        N)_closedrp   _disposedetachr,   r   r   r   rs     s   
zObjectRef.closec                 C   s   | j s| `d| _ d| _dS dS )zN
        Detach the underlying LLVM resource without disposing of it.
        TN)r   ro   rm   r,   r   r   r   r   '  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   0  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   closed7  s   zObjectRef.closedc                 C   s(   t | dsJ | jrtd| jf | S )Nrs   z%s instance already closed)hasattrr   RuntimeError	__class__r,   r   r   r   r8   ?  s   zObjectRef.__enter__c                 C   rt   r   ru   rv   r   r   r   r;   E  rz   zObjectRef.__exit__c                 C   r{   r   ru   r|   r   r   r   r}   H  s
   
zObjectRef.__del__c                 C   r   r   r   r,   r   r   r   r   M  r   zObjectRef.__bool__c                 C   s.   t |dsdS t| jd t|jd kS )Nrm   Fr   )r   r   	addressofrm   )r-   otherr   r   r   __eq__P  s
   
zObjectRef.__eq__c                 C   s   t t| jtjjS r   )hashr   rh   rm   c_void_pr~   r,   r   r   r   __hash__Y  s   zObjectRef.__hash__N)r<   r=   r>   r?   r   re   ro   rp   r.   rs   r   r   rO   r   r8   r;   r   r}   r   r   r   r   r   r   r   r   r     s$    
	
r   )<r   r(   importlib.resources	importlibllvmlite.binding.commonr   r   llvmlite.utilsr   r   LLVMContextRefLLVMModuleRefLLVMValueRefLLVMTypeRefLLVMExecutionEngineRefLLVMPassManagerBuilderRefLLVMPassManagerRefLLVMTargetDataRefLLVMTargetLibraryInfoRefLLVMTargetRefLLVMTargetMachineRefLLVMMemoryBufferRefr   r   r   r   r   r    r!   r"   r#   LLVMObjectCacheRefLLVMObjectFileRefLLVMSectionIteratorRefr'   objectr@   rF   	_lib_namejoinr<   splitpkgname	resourcespath_lib_handleCDLLr   r8   rC   OSErroremsgrb   rd   re   rf   r   r   r   r   r   r   r   <module>   sj    ((">