B
     \G                 @   s   d dl mZmZmZ d dlmZ d dlZd dlZd dlZ	d dl
mZmZmZmZmZmZmZ d dl
mZmZmZ d dl
mZ d dl
mZ dd	lmZmZmZ d d
lmZ d dlmZ d dl m!Z! dd Z"G dd deeZ#e$dkre%  dS )    )absolute_importprint_functiondivision)OrderedDictN)float32float64int16int32booleandeferred_typeoptional)njittypeoferrors)unittest_support)jitclass   )TestCaseMemoryLeakMixintag)_box)MemInfo)LoweringErrorc             C   s   t | }t|}|  |S )N)r   Zbox_get_meminfoptrr   acquire)ZboxptrZmi r   :lib/python3.7/site-packages/numba/tests/test_jitclasses.py_get_meminfo   s    
r   c               @   s  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Ze	ddd Z
e	ddd Zdd Ze	ddd Zdd Zdd Zdd Zdd Zdd Zd d! Ze	dd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Ze	dd,d- Zeejd.k d/d0d1 Zd2d3 Zd4d5 Z d6d7 Z!d8S )9TestJitClassc             C   s   t |G dd dt}|jj}t|j }t|j }| |d d | |d d | |d t	 | |d t
 d S )Nc               @   s   e Zd Zdd ZdS )z&TestJitClass._check_spec.<locals>.Testc             S   s   d S )Nr   )selfr   r   r   __init__!   s    z/TestJitClass._check_spec.<locals>.Test.__init__N)__name__
__module____qualname__r    r   r   r   r   Test   s   r$   r   xr   y)r   object
class_typeinstance_typelistZstructkeysvaluesassertEqualr	   r   )r   specr$   Zclstynamesr,   r   r   r   _check_spec   s    zTestJitClass._check_specc             C   s$   t  }t|d< t|d< | | d S )Nr%   r&   )r   r	   r   r0   )r   r.   r   r   r   test_ordereddict_spec,   s    z"TestJitClass.test_ordereddict_specc             C   s   dt fdtfg}| | d S )Nr%   r&   )r	   r   r0   )r   r.   r   r   r   test_list_spec2   s    
zTestJitClass.test_list_specc          	   C   s   dt fdtd d  fg}dtfdtd d  fg}G dd dt}| t}t|| W d Q R X | dt|j	 | t}t|| W d Q R X | 
t|j	d d S )Nr%   r&   r   c               @   s   e Zd Zdd ZdS )z+TestJitClass.test_spec_errors.<locals>.Testc             S   s   d S )Nr   )r   r   r   r   r    =   s    z4TestJitClass.test_spec_errors.<locals>.Test.__init__N)r!   r"   r#   r    r   r   r   r   r$   ;   s   r$   z*spec values should be Numba type instancesz"spec keys should be strings, got 1)intr   r	   r'   assertRaises	TypeErrorr   assertInstr	exceptionr-   )r   Zspec1Zspec2r$   raisesr   r   r   test_spec_errors7   s    zTestJitClass.test_spec_errorsc             C   sB   t  }t|d< t|d< td d  |d< t|G dd dt}|S )Nr%   r&   arrc               @   s   e Zd Zdd Zdd ZdS )z9TestJitClass._make_Float2AndArray.<locals>.Float2AndArrayc             S   s   || _ || _|| _d S )N)r%   r&   r;   )r   r%   r&   r;   r   r   r   r    R   s    zBTestJitClass._make_Float2AndArray.<locals>.Float2AndArray.__init__c             S   s    |  j |7  _ |  j|7  _|S )N)r%   r&   )r   valr   r   r   addW   s    z=TestJitClass._make_Float2AndArray.<locals>.Float2AndArray.addN)r!   r"   r#   r    r=   r   r   r   r   Float2AndArrayO   s   r>   )r   r   r   r'   )r   r.   r>   r   r   r   _make_Float2AndArrayI   s    z!TestJitClass._make_Float2AndArrayc             C   s2   t  }t|d< t|d< t|G dd dt}|S )Nr%   r&   c               @   s   e Zd Zdd ZdS )z+TestJitClass._make_Vector2.<locals>.Vector2c             S   s   || _ || _d S )N)r%   r&   )r   r%   r&   r   r   r   r    f   s    z4TestJitClass._make_Vector2.<locals>.Vector2.__init__N)r!   r"   r#   r    r   r   r   r   Vector2c   s   r@   )r   r	   r   r'   )r   r.   r@   r   r   r   _make_Vector2^   s    zTestJitClass._make_Vector2Z	importantc                sv   |    |  tdd t fdd}tjdtjd}||\}}}| |d | |d | || d S )	Nc             S   s   | j | j S )N)r%   r&   )objr   r   r   barq   s    z*TestJitClass.test_jit_class_1.<locals>.barc                s4    dd| }| d dd}|||jfS )Nr      {         )r=   r;   )arB   vec)r>   r@   rC   r   r   foou   s    

z*TestJitClass.test_jit_class_1.<locals>.foo
   )dtype      )r?   rA   r   npZonesr   r-   assertPreciseEqual)r   rJ   ZinprH   bcr   )r>   r@   rC   r   test_jit_class_1l   s    zTestJitClass.test_jit_class_1c             C   s  |   }tdd }tdd }tjdtjd}|dd|}t|}| |jd | |jt	
| | |jj|j ||}t|}| |jd	 | |jd	 | |jt	
| | |j|j ~~| |jd ||\}	}
}| |	d | |
d | || | |jd | |jd | |j| | |d
d
 | |jd | |jd d|_d|_tjdtjd |_}| |jd | |jd | |j| d S )Nc             S   s   | S )Nr   )rB   r   r   r   identity   s    z>TestJitClass.test_jitclass_usage_from_python.<locals>.identityc             S   s   | j | j| jfS )N)r%   r&   r;   )rB   r   r   r   retrieve_attributes   s    zITestJitClass.test_jitclass_usage_from_python.<locals>.retrieve_attributesrK   )rL   r   rD   rG   rE   |   }   iM  i     )r?   r   rO   aranger   r   r-   refcountdatar   box_get_dataptrZ_numba_type_r(   ZassertIsr%   r&   r;   r=   )r   r>   rT   rU   r;   rB   Zobj_meminfootherZother_meminfoZout_xZout_yZout_arrZnewarrr   r   r   test_jitclass_usage_from_python   sD    
z,TestJitClass.test_jitclass_usage_from_pythonc             C   sJ   t  }t|d< t|G dd dt}| |dj | |dj d S )Nr<   c               @   s   e Zd Zdd ZdS )z2TestJitClass.test_jitclass_datalayout.<locals>.Fooc             S   s
   || _ d S )N)r<   )r   r<   r   r   r   r       s    z;TestJitClass.test_jitclass_datalayout.<locals>.Foo.__init__N)r!   r"   r#   r    r   r   r   r   Foo   s   r_   TF)r   r
   r   r'   Z
assertTruer<   ZassertFalse)r   r.   r_   r   r   r   test_jitclass_datalayout   s    z%TestJitClass.test_jitclass_datalayoutc       	         s  t  }t }t|d< t||d< tdd  t|G  fdddt}||jj	 |dd }| 
|jd | |j |d|}t|}t|}| 
|jd	 | 
|jj|j | 
|jd	 | 
|jd
 | }| 
||j | |j ||dd  | |j | 
|jjd | |jj ||dd  | |jj | 
|jjjd | 
|jd	 ~~| 
|jd
 d S )Nr[   nextc             S   s   | j S )N)r[   )Znoder   r   r   get_data   s    z1TestJitClass.test_deferred_type.<locals>.get_datac                   s(   e Zd Zdd Z fddZdd ZdS )z3TestJitClass.test_deferred_type.<locals>.LinkedNodec             S   s   || _ || _d S )N)r[   ra   )r   r[   ra   r   r   r   r       s    z<TestJitClass.test_deferred_type.<locals>.LinkedNode.__init__c                s
    | j S )N)ra   )r   )rb   r   r   get_next_data   s    zATestJitClass.test_deferred_type.<locals>.LinkedNode.get_next_datac             S   s$   | }x|j d k	r|j }qW ||_ d S )N)ra   )r   r]   Zcurr   r   r   append_to_tail   s    
zBTestJitClass.test_deferred_type.<locals>.LinkedNode.append_to_tailN)r!   r"   r#   r    rc   rd   r   )rb   r   r   
LinkedNode   s   re   rE   iA  rF   rD   i7  i  )r   r   r   r   r   r   r'   Zdefiner(   r)   r-   r[   ZassertIsNonera   r   rZ   rc   rd   ZassertIsNotNone)	r   Z	node_typer.   re   firstsecondZfirst_meminfoZsecond_meminfoZ	first_valr   )rb   r   test_deferred_type   s>    

zTestJitClass.test_deferred_typec             C   s   t  }t|d< t|d< t|d< t|G dd dt}|ddd}G d	d
 d
tj}tt	
|}t|t|d }| |j|j | |j|j | |j|j d S )NrH   rQ   rR   c               @   s   e Zd Zdd ZdS )z-TestJitClass.test_c_structure.<locals>.Structc             S   s   || _ || _|| _d S )N)rH   rQ   rR   )r   rH   rQ   rR   r   r   r   r      s    z6TestJitClass.test_c_structure.<locals>.Struct.__init__N)r!   r"   r#   r    r   r   r   r   Struct  s   ri   iͫ     go!	@c               @   s(   e Zd ZdejfdejfdejfgZdS )z.TestJitClass.test_c_structure.<locals>.CStructrH   rQ   rR   N)r!   r"   r#   ctypesZc_int32Zc_int16Zc_doubleZ_fields_r   r   r   r   CStruct  s   rl   r   )r   r	   r   r   r   r'   rk   Z	StructureZc_void_pr   r\   castZPOINTERr-   rH   rQ   rR   )r   r.   ri   strl   r   Zcstructr   r   r   test_c_structure  s    zTestJitClass.test_c_structurec          	   C   s^   |   }|dd}|dd}tdd }| t}||| W d Q R X | dt|j d S )Nr   rD   c             S   s   | |kS )Nr   )rH   rQ   r   r   r   do_is*  s    z#TestJitClass.test_is.<locals>.do_iszno default `is` implementation)rA   r   r4   r   r6   r7   r8   )r   ZVectorZvec_aZvec_brp   r9   r   r   r   test_is%  s    

zTestJitClass.test_isc             C   s"   |   }|dd}| || d S )Nr   rD   )rA   ZassertIsInstance)r   r@   rI   r   r   r   test_isinstance3  s    
zTestJitClass.test_isinstancec          	   C   sD   |   }| t}G dd d|}W d Q R X | t|jd d S )Nc               @   s   e Zd ZdS )z+TestJitClass.test_subclassing.<locals>.SubVN)r!   r"   r#   r   r   r   r   SubV;  s   rs   zcannot subclass from a jitclass)rA   r4   r5   r-   r7   r8   )r   r@   r9   rs   r   r   r   test_subclassing8  s
    zTestJitClass.test_subclassingc             C   sJ   G dd dt }tdtfgG dd d|}|d}| | d d S )Nc               @   s   e Zd Zdd ZdS )z*TestJitClass.test_base_class.<locals>.Basec             S   s   | j S )N)attr)r   r   r   r   whatC  s    z/TestJitClass.test_base_class.<locals>.Base.whatN)r!   r"   r#   rv   r   r   r   r   BaseA  s   rw   ru   c               @   s   e Zd Zdd ZdS )z*TestJitClass.test_base_class.<locals>.Testc             S   s
   || _ d S )N)ru   )r   ru   r   r   r   r    I  s    z3TestJitClass.test_base_class.<locals>.Test.__init__N)r!   r"   r#   r    r   r   r   r   r$   F  s   r$   rE   )r'   r   r	   r-   rv   )r   rw   r$   rB   r   r   r   test_base_class@  s
    zTestJitClass.test_base_classc          	   C   sH   G dd dt }| t}td| W d Q R X | t|jd d S )Nc               @   s   e Zd ZdZdd ZdS )z'TestJitClass.test_globals.<locals>.MinerE   c             S   s   d S )Nr   )r   r   r   r   r    T  s    z0TestJitClass.test_globals.<locals>.Mine.__init__N)r!   r"   r#   Zconstantr    r   r   r   r   MineQ  s   ry   r   z-class members are not yet supported: constant)r'   r4   r5   r   r-   r7   r8   )r   ry   r9   r   r   r   test_globalsO  s
    zTestJitClass.test_globalsc             C   s   t dtfgG dd dt}|d}| |jd | |jd d|_| |jd | |jd tdd	 }||d
\}}}| |d | |d
 | |d d S )Nru   c               @   s.   e Zd Zdd Zedd Zejdd ZdS )z1TestJitClass.test_user_getter_setter.<locals>.Fooc             S   s
   || _ d S )N)ru   )r   ru   r   r   r   r    b  s    z:TestJitClass.test_user_getter_setter.<locals>.Foo.__init__c             S   s
   | j d S )Nr   )ru   )r   r   r   r   valuee  s    z7TestJitClass.test_user_getter_setter.<locals>.Foo.valuec             S   s   |d | _ d S )Nr   )ru   )r   r<   r   r   r   r{   i  s    N)r!   r"   r#   r    propertyr{   setterr   r   r   r   r_   _  s   r_   rE   rV   i  i  c             S   s"   | j }|| _ | j }| j}|||fS )N)r{   ru   )rJ   r<   rH   rQ   rR   r   r   r   rC   w  s
    z1TestJitClass.test_user_getter_setter.<locals>.bari7  i6  )r   r	   r'   r-   ru   r{   r   )r   r_   rJ   rC   rH   rQ   rR   r   r   r   test_user_getter_setter]  s    z$TestJitClass.test_user_getter_setterc          	   C   sH   G dd dt }| t}tg | W d Q R X | t|jd d S )Nc               @   s.   e Zd Zdd Zedd Zejdd ZdS )z1TestJitClass.test_user_deleter_error.<locals>.Fooc             S   s   d S )Nr   )r   r   r   r   r      s    z:TestJitClass.test_user_deleter_error.<locals>.Foo.__init__c             S   s   dS )Nr   r   )r   r   r   r   r{     s    z7TestJitClass.test_user_deleter_error.<locals>.Foo.valuec             S   s   d S )Nr   )r   r   r   r   r{     s    N)r!   r"   r#   r    r|   r{   deleterr   r   r   r   r_     s   r_   zdeleter is not supported: value)r'   r4   r5   r   r-   r7   r8   )r   r_   r9   r   r   r   test_user_deleter_error  s
    z$TestJitClass.test_user_deleter_errorc          	   C   s   G dd dt }| t}tdtfg| W d Q R X | t|jd | t}tdtfg| W d Q R X | t|jd d S )Nc               @   s(   e Zd Zdd Zedd Zdd ZdS )z3TestJitClass.test_name_shadowing_error.<locals>.Fooc             S   s   d S )Nr   )r   r   r   r   r      s    z<TestJitClass.test_name_shadowing_error.<locals>.Foo.__init__c             S   s   d S )Nr   )r   r   r   r   my_property  s    z?TestJitClass.test_name_shadowing_error.<locals>.Foo.my_propertyc             S   s   d S )Nr   )r   r   r   r   	my_method  s    z=TestJitClass.test_name_shadowing_error.<locals>.Foo.my_methodN)r!   r"   r#   r    r|   r   r   r   r   r   r   r_     s   r_   r   zname shadowing: my_propertyr   zname shadowing: my_method)r'   r4   	NameErrorr   r	   r-   r7   r8   )r   r_   r9   r   r   r   test_name_shadowing_error  s    z&TestJitClass.test_name_shadowing_errorc             C   s   t dtfgG dd dt}|}t dtfgG dd dt}|}|d}| |jd | | d |d}| |jd | | d	 d S )
Nr%   c               @   s   e Zd Zdd Zdd ZdS )z/TestJitClass.test_distinct_classes.<locals>.Fooc             S   s   |d | _ d S )NrD   )r%   )r   r%   r   r   r   r      s    z8TestJitClass.test_distinct_classes.<locals>.Foo.__init__c             S   s
   | j d S )Nr   )r%   )r   r   r   r   run  s    z3TestJitClass.test_distinct_classes.<locals>.Foo.runN)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S )z/TestJitClass.test_distinct_classes.<locals>.Fooc             S   s   |d | _ d S )NrD   )r%   )r   r%   r   r   r   r      s    z8TestJitClass.test_distinct_classes.<locals>.Foo.__init__c             S   s
   | j d S )Nr   )r%   )r   r   r   r   r     s    z3TestJitClass.test_distinct_classes.<locals>.Foo.runN)r!   r"   r#   r    r   r   r   r   r   r_     s   rX   rN      rF   rD   )r   r	   r'   r-   r%   r   )r   r_   ZFirstFooZ	SecondFoorJ   r   r   r   test_distinct_classes  s    z"TestJitClass.test_distinct_classesc                s   G dd dt   fdd}|d}| |jd |d}| |jd |tdg}tj|jdg |tdg}tj|jdg d S )Nc               @   s   e Zd Zdd ZdS )z0TestJitClass.test_parameterized.<locals>.MyClassc             S   s
   || _ d S )N)r{   )r   r{   r   r   r   r      s    z9TestJitClass.test_parameterized.<locals>.MyClass.__init__N)r!   r"   r#   r    r   r   r   r   MyClass  s   r   c                s   t dt| fg }|| S )Nr{   )r   r   )r{   cls)r   r   r   create_my_class  s    z8TestJitClass.test_parameterized.<locals>.create_my_classrE   g(@)r'   r-   r{   rO   ZarrayZtestingZassert_equal)r   r   rH   rQ   rR   dr   )r   r   test_parameterized  s    zTestJitClass.test_parameterizedc          	   C   s  t tt t d}t|G dd dt}d}||}| |j| | |j|d  | |j|d  | |j|j |j}| jd8  _| |j|d  | |	d|d  | |	|d d | |
d|jd  | |d|jd  | |j|d  | jd	8  _| |j|d
  tdd }| tj}|| W d Q R X | dt|j | t}|| W d Q R X | dt|j d S )N)r{   _valueZ__value	__value__c               @   st   e Zd Zdd Ze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d Z
dd Zdd ZdS )z2TestJitClass.test_protected_attrs.<locals>.MyClassc             S   s(   || _ |d | _|d | _|d | _d S )NrD   r   )r{   r   _MyClass__valuer   )r   r{   r   r   r   r      s    

z;TestJitClass.test_protected_attrs.<locals>.MyClass.__init__c             S   s   | j S )N)r   )r   r   r   r   private_value  s    z@TestJitClass.test_protected_attrs.<locals>.MyClass.private_valuec             S   s   | j S )N)r   )r   r   r   r   _inner_value  s    z?TestJitClass.test_protected_attrs.<locals>.MyClass._inner_valuec             S   s
   || _ d S )N)r   )r   vr   r   r   r     s    c             S   s   | j S )N)r   )r   r   r   r   __private_value  s    zBTestJitClass.test_protected_attrs.<locals>.MyClass.__private_valuec             S   s
   || _ d S )N)r   )r   r   r   r   r   r     s    c             S   s   | j }|| _ |S )N)_MyClass__private_value)r   newoldr   r   r   swap_private_value  s    zETestJitClass.test_protected_attrs.<locals>.MyClass.swap_private_valuec             S   s
   | j | S )N)r   )r   factorr   r   r   _protected_method  s    zDTestJitClass.test_protected_attrs.<locals>.MyClass._protected_methodc             S   s
   | j | S )N)r   )r   r   r   r   r   Z__private_method  s    zCTestJitClass.test_protected_attrs.<locals>.MyClass.__private_methodc             S   s
   |  |S )N)_MyClass__private_method)r   r   r   r   r   check_private_method  s    zGTestJitClass.test_protected_attrs.<locals>.MyClass.check_private_methodN)r!   r"   r#   r    r|   r   r   r}   r   r   r   r   r   r   r   r   r   r     s   r   rE   rD   r   iA  rF   d   e   c             S   s   | j S )N)_TestJitClass__value)instr   r   r   access_dunder,  s    z8TestJitClass.test_protected_attrs.<locals>.access_dunderr   )r	   r   r   r'   r-   r{   r   r   r   r   r   r   r   r   r4   r   ZTypingErrorr6   r7   r8   AttributeErrorZpy_func)r   r.   r   r{   r   Zfreeze_inst_valuer   r9   r   r   r   test_protected_attrs  s:    +z!TestJitClass.test_protected_attrs)rF   zPython 3-specific testc             C   sL   ddl m} dti}t||}|d}| |jd | |dd dS )zM
        Methods with annotations should compile fine (issue #1911).
        r   )AnnotatedClassr%   rX   rD   rN   N)Zannotation_usecasesr   r	   r   r-   r%   r=   )r   r   r.   r   rB   r   r   r   test_annotations:  s    zTestJitClass.test_annotationsc             C   sZ   t g G dd dt}| |jd | |jjd | |jjd | |jjd d S )Nc               @   s,   e Zd ZdZdd Zdd Zedd ZdS )	z*TestJitClass.test_docstring.<locals>.ApplezClass docstringc             S   s   dS )zinit docstringNr   )r   r   r   r   r    M  s    z3TestJitClass.test_docstring.<locals>.Apple.__init__c             S   s   dS )zfoo method docstringNr   )r   r   r   r   rJ   P  s    z.TestJitClass.test_docstring.<locals>.Apple.fooc             S   s   dS )zaval property docstringNr   )r   r   r   r   avalS  s    z/TestJitClass.test_docstring.<locals>.Apple.avalN)r!   r"   r#   __doc__r    rJ   r|   r   r   r   r   r   AppleJ  s   r   zClass docstringzinit docstringzfoo method docstringzaval property docstring)r   r'   r-   r   r    rJ   r   )r   r   r   r   r   test_docstringH  s    zTestJitClass.test_docstringc             C   st   dt fdtfg}t|G dd dt}d}d}d}||d}|f ddi|}| |j||  | |j| d S )	NrH   rQ   c               @   s   e Zd Zdd ZdS )z+TestJitClass.test_kwargs.<locals>.TestClassc             S   s   || | _ || _d S )N)rH   rQ   )r   r%   r&   zr   r   r   r    b  s    
z4TestJitClass.test_kwargs.<locals>.TestClass.__init__N)r!   r"   r#   r    r   r   r   r   	TestClass`  s   r   rD   g?)r&   r   r%   )r	   r   r   r'   r-   rH   rQ   )r   r.   r   r%   r&   r   kwargsZtcr   r   r   test_kwargs\  s    

zTestJitClass.test_kwargsc             C   sj   g }t |G dd dt}dd }x@tdD ]4}x.t||| |D ]\}}| || qJW q.W d S )Nc               @   s   e Zd Zdd Zdd ZdS )z5TestJitClass.test_generator_method.<locals>.TestClassc             S   s   d S )Nr   )r   r   r   r   r    s  s    z>TestJitClass.test_generator_method.<locals>.TestClass.__init__c             s   s"   xt |D ]}t|V  q
W d S )N)rangerO   rY   )r   niterir   r   r   genv  s    z9TestJitClass.test_generator_method.<locals>.TestClass.genN)r!   r"   r#   r    r   r   r   r   r   r   q  s   r   c             s   s"   xt | D ]}t|V  q
W d S )N)r   rO   rY   )r   r   r   r   r   expected_genz  s    z8TestJitClass.test_generator_method.<locals>.expected_genrK   )r   r'   r   zipr   rP   )r   r.   r   r   r   ZexpectZgotr   r   r   test_generator_methodn  s     z"TestJitClass.test_generator_methodN)"r!   r"   r#   r0   r1   r2   r:   r?   rA   r   rS   r^   r`   rh   ro   rq   rr   rt   rx   rz   r~   r   r   r   r   r   unittestZskipIfsysversion_infor   r   r   r   r   r   r   r   r      s4   7@'Zr   __main__)&Z
__future__r   r   r   collectionsr   rk   r   ZnumpyrO   Znumbar   r   r   r	   r
   r   r   r   r   r   r   r   r   Zsupportr   r   r   Znumba.jitclassr   Znumba.runtime.nrtr   Znumba.errorsr   r   r   r!   mainr   r   r   r   <module>   s(   $    l