
[[\                 @   s  d  Z  d d l Z d d l m Z m Z m Z m Z m Z m Z m Z m	 Z	 m
 Z
 m Z m Z m Z m Z m Z d d l Z d d d d d g Z d	 d   Z Gd
 d   d  Z e   Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z e d k rd d l Z d d l Z e e j d   Z e j    Z! Wd QXe e! e j" j# e j d  d d  Z$ xB e$ j%   D]1 Z& e$ j' e&  Z( e) e( e( j*   e( j+    qWn  d S)z2Interface to the compiler's internal symbol tables    N)USE
DEF_GLOBAL	DEF_LOCAL	DEF_PARAM
DEF_IMPORT	DEF_BOUNDOPT_IMPORT_STAR	SCOPE_OFF
SCOPE_MASKFREELOCALGLOBAL_IMPLICITGLOBAL_EXPLICITCELLsymtableSymbolTableClassFunctionSymbolc             C   s"   t  j |  | |  } t | |  S)N)	_symtabler   _newSymbolTable)codefilenameZcompile_typetop r   /usr/lib/python3.4/symtable.pyr      s    c               @   s4   e  Z d  Z d d   Z d d   Z d d   Z d S)SymbolTableFactoryc             C   s   t  j   |  _ d  S)N)weakrefWeakValueDictionary_SymbolTableFactory__memo)selfr   r   r   __init__   s    zSymbolTableFactory.__init__c             C   sK   | j  t j k r t | |  S| j  t j k r> t | |  St | |  S)N)typer   TYPE_FUNCTIONr   
TYPE_CLASSr   r   )r    tabler   r   r   r   new   s
    zSymbolTableFactory.newc             C   sQ   | | f } |  j  j | d   } | d  k rM |  j | |  } |  j  | <n  | S)N)r   getr&   )r    r%   r   keyobjr   r   r   __call__   s
     zSymbolTableFactory.__call__N)__name__
__module____qualname__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 d   Z d	 d
   Z d d   Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d    Z d! S)"r   c             C   s   | |  _  | |  _ i  |  _ d  S)N)_table	_filename_symbols)r    Z	raw_tabler   r   r   r   r!   '   s    		zSymbolTable.__init__c             C   sm   |  j  t k r d } n d |  j  j } |  j j d k rM d j | |  j  Sd j | |  j j |  j  Sd  S)N z%s globalz<{0}SymbolTable for module {1}>z<{0}SymbolTable for {1} in {2}>)	__class__r   r+   r.   nameformatr/   )r    Zkindr   r   r   __repr__,   s    			zSymbolTable.__repr__c             C   s|   |  j  j t j k r d S|  j  j t j k r2 d S|  j  j t j k rK d S|  j  j d k sx t d j |  j  j    d  S)	NmoduleZfunctionclass         zunexpected type: {0})r9   r:   r;   )r.   r"   r   ZTYPE_MODULEr#   r$   AssertionErrorr5   )r    r   r   r   get_type9   s    zSymbolTable.get_typec             C   s
   |  j  j S)N)r.   id)r    r   r   r   get_idC   s    zSymbolTable.get_idc             C   s
   |  j  j S)N)r.   r4   )r    r   r   r   get_nameF   s    zSymbolTable.get_namec             C   s
   |  j  j S)N)r.   lineno)r    r   r   r   
get_linenoI   s    zSymbolTable.get_linenoc             C   s&   t  |  j j t j k o" |  j j  S)N)boolr.   r"   r   r#   	optimized)r    r   r   r   is_optimizedL   s    zSymbolTable.is_optimizedc             C   s   t  |  j j  S)N)rC   r.   nested)r    r   r   r   	is_nestedP   s    zSymbolTable.is_nestedc             C   s   t  |  j j  S)N)rC   r.   children)r    r   r   r   has_childrenS   s    zSymbolTable.has_childrenc             C   s   d S)z7Return true if the scope uses exec.  Deprecated method.Fr   )r    r   r   r   has_execV   s    zSymbolTable.has_execc             C   s   t  |  j j t @ S)z&Return true if the scope uses import *)rC   r.   rD   r   )r    r   r   r   has_import_starZ   s    zSymbolTable.has_import_starc             C   s   |  j  j j   S)N)r.   symbolskeys)r    r   r   r   get_identifiers^   s    zSymbolTable.get_identifiersc             C   sa   |  j  j |  } | d  k r] |  j j | } |  j |  } t | | |  } |  j  | <n  | S)N)r0   r'   r.   rL   _SymbolTable__check_childrenr   )r    r4   Zsymflags
namespacesr   r   r   lookupa   s     zSymbolTable.lookupc                s     f d d     j    D S)Nc                s   g  |  ] }   j  |   q Sr   )rR   ).0ident)r    r   r   
<listcomp>j   s   	 z+SymbolTable.get_symbols.<locals>.<listcomp>)rN   )r    r   )r    r   get_symbolsi   s    zSymbolTable.get_symbolsc                s       f d d    j  j D S)Nc                s1   g  |  ]' } | j    k r t |  j   q Sr   )r4   r   r/   )rS   st)r4   r    r   r   rU   m   s   	z0SymbolTable.__check_children.<locals>.<listcomp>)r.   rH   )r    r4   r   )r4   r    r   Z__check_childrenl   s    zSymbolTable.__check_childrenc                s     f d d     j  j D S)Nc                s"   g  |  ] } t  |   j   q Sr   )r   r/   )rS   rW   )r    r   r   rU   r   s   	z,SymbolTable.get_children.<locals>.<listcomp>)r.   rH   )r    r   )r    r   get_childrenq   s    zSymbolTable.get_childrenN)r+   r,   r-   r!   r6   r=   r?   r@   rB   rE   rG   rI   rJ   rK   rN   rR   rV   rO   rX   r   r   r   r   r   %   s    
c               @   sd   e  Z d  Z d Z d Z d Z d Z d d   Z d d   Z d d   Z	 d d	   Z
 d
 d   Z d S)r   Nc                s&   t     f d d     j   D  S)Nc                s,   g  |  ]" }    j  j |  r |  q Sr   )r.   rL   )rS   rT   )r    	test_funcr   r   rU      s   	 z.Function.__idents_matching.<locals>.<listcomp>)tuplerN   )r    rY   r   )r    rY   r   Z__idents_matching~   s    zFunction.__idents_matchingc             C   s1   |  j  d  k r* |  j d d    |  _  n  |  j  S)Nc             S   s   |  t  @S)N)r   )xr   r   r   <lambda>   s    z)Function.get_parameters.<locals>.<lambda>)_Function__params_Function__idents_matching)r    r   r   r   get_parameters   s    zFunction.get_parametersc                sI   |  j  d  k rB t t f     f d d   } |  j |  |  _  n  |  j  S)Nc                s   |  t  ?t @  k S)N)r	   r
   )r[   )locsr   r   r\      s    z%Function.get_locals.<locals>.<lambda>)_Function__localsr   r   r^   )r    testr   )r`   r   
get_locals   s
    zFunction.get_localsc                sI   |  j  d  k rB t t f     f d d   } |  j |  |  _  n  |  j  S)Nc                s   |  t  ?t @  k S)N)r	   r
   )r[   )globr   r   r\      s    z&Function.get_globals.<locals>.<lambda>)_Function__globalsr   r   r^   )r    rb   r   )rd   r   get_globals   s
    zFunction.get_globalsc             C   s7   |  j  d  k r0 d d   } |  j |  |  _  n  |  j  S)Nc             S   s   |  t  ?t @t k S)N)r	   r
   r   )r[   r   r   r   r\      s    z$Function.get_frees.<locals>.<lambda>)_Function__freesr^   )r    is_freer   r   r   	get_frees   s    zFunction.get_frees)r+   r,   r-   r]   ra   rg   re   r^   r_   rc   rf   ri   r   r   r   r   r   v   s   c               @   s"   e  Z d  Z d Z d d   Z d S)r   Nc             C   sR   |  j  d  k rK i  } x! |  j j D] } d | | j <q" Wt |  |  _  n  |  j  S)Nr9   )_Class__methodsr.   rH   r4   rZ   )r    drW   r   r   r   get_methods   s    zClass.get_methods)r+   r,   r-   rj   rl   r   r   r   r   r      s   c               @   s   e  Z d  Z d d d  Z d d   Z d d   Z d d	   Z d
 d   Z d d   Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d S)r   Nc             C   s6   | |  _  | |  _ | t ?t @|  _ | p, f  |  _ d  S)N)_Symbol__name_Symbol__flagsr	   r
   _Symbol__scope_Symbol__namespaces)r    r4   rP   rQ   r   r   r   r!      s    		zSymbol.__init__c             C   s   d j  |  j  S)Nz<symbol {0!r}>)r5   rm   )r    r   r   r   r6      s    zSymbol.__repr__c             C   s   |  j  S)N)rm   )r    r   r   r   r@      s    zSymbol.get_namec             C   s   t  |  j t j @ S)N)rC   rn   r   r   )r    r   r   r   is_referenced   s    zSymbol.is_referencedc             C   s   t  |  j t @ S)N)rC   rn   r   )r    r   r   r   is_parameter   s    zSymbol.is_parameterc             C   s   t  |  j t t f k  S)N)rC   ro   r   r   )r    r   r   r   	is_global   s    zSymbol.is_globalc             C   s   t  |  j t k  S)N)rC   ro   r   )r    r   r   r   is_declared_global   s    zSymbol.is_declared_globalc             C   s   t  |  j t @ S)N)rC   rn   r   )r    r   r   r   is_local   s    zSymbol.is_localc             C   s   t  |  j t k  S)N)rC   ro   r   )r    r   r   r   rh      s    zSymbol.is_freec             C   s   t  |  j t @ S)N)rC   rn   r   )r    r   r   r   is_imported   s    zSymbol.is_importedc             C   s   t  |  j t @ S)N)rC   rn   r   )r    r   r   r   is_assigned   s    zSymbol.is_assignedc             C   s   t  |  j  S)a  Returns true if name binding introduces new namespace.

        If the name is used as the target of a function or class
        statement, this will be true.

        Note that a single name can be bound to multiple objects.  If
        is_namespace() is true, the name may also be bound to other
        objects, like an int or list, that does not introduce a new
        namespace.
        )rC   rp   )r    r   r   r   is_namespace   s    zSymbol.is_namespacec             C   s   |  j  S)z.Return a list of namespaces bound to this name)rp   )r    r   r   r   get_namespaces   s    zSymbol.get_namespacesc             C   s/   t  |  j  d k r$ t d   n  |  j d S)zReturns the single namespace bound to this name.

        Raises ValueError if the name is bound to multiple namespaces.
        r9   z$name is bound to multiple namespacesr   )lenrp   
ValueError)r    r   r   r   get_namespace   s    zSymbol.get_namespace)r+   r,   r-   r!   r6   r@   rq   rr   rs   rt   ru   rh   rv   rw   rx   ry   r|   r   r   r   r   r      s   __main__r9   exec),__doc__r   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   __all__r   r   r   objectr   r   r   r   r+   ossysopenargvfreadsrcpathsplitmodrN   rT   rR   infoprintru   rx   r   r   r   r   <module>   s&   ^	Q&@)