o
    Y۷i                     @  s   d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	m
Z
mZ ddlmZmZmZ e
dZd%ddZdddd&ddZd'dd Zd(d#d$ZdS ))z7Utilities for constructing Python proxies of FFI types.    )annotationsN)MISSING)AnyCallableTypeTypeVarcast   )Object	TypeFieldTypeInfo_InputClsType	type_infor   clsType[_InputClsType]methods$dict[str, Callable[..., Any] | None]returnc                 C  sj  | j d u s	J d|j}|tfkrtf}t|j}|dd  |dd  d|d< | |d< | jD ]
}||||j	< q0|
 D ]'\}}|d urf|j|_||_|j d| |_d| d	|j d
|_|||< q?| jD ]/}|j	}|dkrud}||}	||j	krt|	tr|	jn|	}
||
_|j d| |
_|	||< qjt|j||}|j|_tj|dd|}ttt |S )NzType class is already created__dict____weakref__ 	__slots____tvm_ffi_type_info__.zMethod `z` of class ``__ffi_init____c_ffi_init__)updated)type_cls	__bases__objectr
   dictr   popfieldsas_propertynameitems
__module____name____qualname____doc__r   as_callable
isinstancestaticmethod__func__type	functoolswrapsr   r   r   )r   r   r   	cls_basesattrsfieldr%   method_implmethodfuncinnernew_clsr   r   P/home/ubuntu/vllm_env/lib/python3.10/site-packages/tvm_ffi/dataclasses/_utils.pytype_info_to_cls"   sB   






r;   F)class_kw_onlykw_only_from_sentinelr   r/   
type_fieldr   r<   boolr=   Nonec                C  s   ddl m}m } |j}t| |t}|tu r| }n#t||rnt|tttt	t
d fr1||d}ntd|j d| t||sCJ |j|_|jtu rU|rRd|_n||_||_d S )N   )Fieldr4   )defaultzCannot recognize field: z: T)r4   rB   r%   getattrr   r,   intfloatstrr?   r/   
ValueErrorkw_onlydataclass_field)r   r>   r<   r=   rB   r4   
field_namerhsr   r   r:   fill_dataclass_fieldW   s"   


rM   list[TypeField]c                 C  s:   g }| }|dur| t|j |j}|dus|  |S )zECollect all fields from the type hierarchy, from parents to children.N)extendreversedr#   parent_type_inforeverse)r   r#   cur_type_infor   r   r:   _get_all_fieldsw   s   rT   	_type_clsCallable[..., None]c              
   C  sB  t |}tdd |jD std|j dg }g }g }g }g }g }dti}	|D ]h}
|
jdus2J |
jdus9J |
j}|j }tu}|j	du }|j
ry||
j |rn|rW|n||
j ||
jdf ||	d|
j < q)|rr|n||
j q)|r||
j ||
jd	f ||	d|
j < q)d
g}|| |dd |D  |s|r|d || |dd |D  g }|D ]!\}}|r|d| d| d| d q|| d| d q|dd| d |g d dd| dg}|dd |D  |d d|}i }t||	| |d }|S )zGenerate an ``__init__`` that forwards to the FFI constructor.

    The generated initializer has a proper Python signature built from the
    reflected field list, supporting default values, keyword-only args, and ``__post_init__``.
    c                 s  s    | ]}|j d kV  qdS )r   N)r%   ).0mr   r   r:   	<genexpr>       zmethod_init.<locals>.<genexpr>z!Cannot find constructor method: `z.__ffi_init__`r   NT_default_factory_Fselfc                 s      | ]}| d V  qdS z=MISSINGNr   rW   r%   r   r   r:   rY      rZ   *c                 s  r]   r^   r   r_   r   r   r:   rY      rZ   zif z is MISSING: z = _default_factory_z()zself.__ffi_init__(z, ))ztry:z%    fn_post_init = self.__post_init__zexcept AttributeError:z    passzelse:z    fn_post_init()zdef __init__(z):c                 s  s    | ]}d | V  qdS )z    Nr   )rW   liner   r   r:   rY      rZ   z    ...
__init__)rT   anyr   rH   type_keyr   r%   rJ   default_factoryrI   initappendrO   joinexec)rU   r   r#   pos_no_defaultspos_with_defaultskw_no_defaultskw_with_defaultsfields_with_defaultsffi_arg_orderexec_globalsr4   rJ   rg   has_default
is_kw_onlyargs
body_linesrK   is_initsource_linessource	namespacerd   r   r   r:   method_init   sl   





r{   )r   r   r   r   r   r   r   r   )
r   r/   r>   r   r<   r?   r=   r?   r   r@   )r   r   r   rN   )rU   r/   r   r   r   rV   )r*   
__future__r   r0   dataclassesr   typingr   r   r   r   r   corer
   r   r   r   r;   rM   rT   r{   r   r   r   r:   <module>   s   
9
 