3 \m� @sNdZddlZddlmZmZmZmZmZmZmZm Z m Z m Z m Z m Z mZmZddlZdddddgZd d�ZGd d �d �Ze�ZGd d�de�ZGd d�de�ZGdd�de�ZGdd�de�Zedk�rJddlZddlZeejd��Zej �Z!WdQRXee!ej"j#ejd�dd�Z$x0e$j%�D]$Z&e$j'e&�Z(e)e(e(j*�e(j+���q"WdS)z2Interface to the compiler's internal symbol tables�N)�USE� DEF_GLOBAL� DEF_LOCAL� DEF_PARAM� DEF_IMPORT� DEF_BOUND� DEF_ANNOT� SCOPE_OFF� SCOPE_MASK�FREE�LOCAL�GLOBAL_IMPLICIT�GLOBAL_EXPLICIT�CELL�symtable� SymbolTable�Class�Function�SymbolcCstj|||�}t||�S)N)� _symtabler�_newSymbolTable)�code�filenameZ compile_type�top�r� /usr/lib64/python3.6/symtable.pyr sc@s$eZdZdd�Zdd�Zdd�ZdS)�SymbolTableFactorycCstj�|_dS)N)�weakref�WeakValueDictionary�_SymbolTableFactory__memo)�selfrrr�__init__szSymbolTableFactory.__init__cCs6|jtjkrt||�S|jtjkr,t||�St||�S)N)�typer� TYPE_FUNCTIONr� TYPE_CLASSrr)r �tablerrrr�news     zSymbolTableFactory.newcCs8||f}|jj|d�}|dkr4|j||�}|j|<|S)N)r�getr&)r r%r�key�objrrr�__call__s zSymbolTableFactory.__call__N)�__name__� __module__� __qualname__r!r&r*rrrrrsrc@s�eZdZdd�Zdd�Zdd�Zdd�Zd d �Zd d �Zd d�Z dd�Z dd�Z dd�Z dd�Z dd�Zdd�Zdd�Zdd�ZdS) rcCs||_||_i|_dS)N)�_table� _filename�_symbols)r Z raw_tablerrrrr!'szSymbolTable.__init__cCsN|jtkrd}n d|jj}|jjdkr6dj||j�Sdj||jj|j�SdS)N�z%s �globalz<{0}SymbolTable for module {1}>z<{0}SymbolTable for {1} in {2}>)� __class__rr+r.�name�formatr/)r Zkindrrr�__repr__,s   zSymbolTable.__repr__cCs:|jjtjkrdS|jjtjkr$dS|jjtjkr6dSdS)N�moduleZfunction�class)r.r"rZ TYPE_MODULEr#r$)r rrr�get_type9szSymbolTable.get_typecCs|jjS)N)r.�id)r rrr�get_idCszSymbolTable.get_idcCs|jjS)N)r.r4)r rrr�get_nameFszSymbolTable.get_namecCs|jjS)N)r.�lineno)r rrr� get_linenoIszSymbolTable.get_linenocCst|jjtjk�S)N)�boolr.r"rr#)r rrr� is_optimizedLszSymbolTable.is_optimizedcCs t|jj�S)N)r?r.�nested)r rrr� is_nestedOszSymbolTable.is_nestedcCs t|jj�S)N)r?r.�children)r rrr� has_childrenRszSymbolTable.has_childrencCsdS)z7Return true if the scope uses exec. Deprecated method.Fr)r rrr�has_execUszSymbolTable.has_execcCs |jjj�S)N)r.�symbols�keys)r rrr�get_identifiersYszSymbolTable.get_identifierscCsD|jj|�}|dkr@|jj|}|j|�}t|||�}|j|<|S)N)r0r'r.rF�_SymbolTable__check_childrenr)r r4Zsym�flags� namespacesrrr�lookup\s    zSymbolTable.lookupcs�fdd��j�D�S)Ncsg|]}�j|��qSr)rL)�.0�ident)r rr� esz+SymbolTable.get_symbols..)rH)r r)r r� get_symbolsdszSymbolTable.get_symbolscs��fdd��jjD�S)Ncs"g|]}|j�krt|�j��qSr)r4rr/)rM�st)r4r rrrOhsz0SymbolTable.__check_children..)r.rC)r r4r)r4r rZ__check_childrengs zSymbolTable.__check_childrencs�fdd��jjD�S)Ncsg|]}t|�j��qSr)rr/)rMrQ)r rrrOmsz,SymbolTable.get_children..)r.rC)r r)r r� get_childrenls zSymbolTable.get_childrenN)r+r,r-r!r6r9r;r<r>r@rBrDrErHrLrPrIrRrrrrr%s  c@sDeZdZdZdZdZdZdd�Zdd�Zdd�Z dd �Z d d �Z dS) rNcst��fdd��j�D��S)Ncs g|]}��jj|�r|�qSr)r.rF)rMrN)r � test_funcrrrOzsz.Function.__idents_matching..)�tuplerH)r rSr)r rSrZ__idents_matchingyszFunction.__idents_matchingcCs |jdkr|jdd��|_|jS)NcSs|t@S)N)r)�xrrr�sz)Function.get_parameters..)�_Function__params�_Function__idents_matching)r rrr�get_parameters}s zFunction.get_parameterscs0|jdkr*ttf��fdd�}|j|�|_|jS)Ncs|t?t@�kS)N)r r )rU)�locsrrrV�sz%Function.get_locals..)�_Function__localsr rrX)r �testr)rZr� get_locals�s    zFunction.get_localscs0|jdkr*ttf��fdd�}|j|�|_|jS)Ncs|t?t@�kS)N)r r )rU)�globrrrV�sz&Function.get_globals..)�_Function__globalsr rrX)r r\r)r^r� get_globals�s    zFunction.get_globalscCs$|jdkrdd�}|j|�|_|jS)NcSs|t?t@tkS)N)r r r )rUrrrrV�sz$Function.get_frees..)�_Function__freesrX)r �is_freerrr� get_frees�s  zFunction.get_frees) r+r,r-rWr[rar_rXrYr]r`rcrrrrrqsc@seZdZdZdd�ZdS)rNcCs:|jdkr4i}x|jjD]}d||j<qWt|�|_|jS)N�)�_Class__methodsr.rCr4rT)r �drQrrr� get_methods�s   zClass.get_methods)r+r,r-rergrrrrr�sc@s�eZdZd dd�Zdd�Zdd�Zdd �Zd d �Zd d �Zdd�Z dd�Z dd�Z dd�Z dd�Z dd�Zdd�Zdd�Zdd�ZdS)!rNcCs(||_||_|t?t@|_|p f|_dS)N)� _Symbol__name�_Symbol__flagsr r �_Symbol__scope�_Symbol__namespaces)r r4rJrKrrrr!�szSymbol.__init__cCs dj|j�S)Nz)r5rh)r rrrr6�szSymbol.__repr__cCs|jS)N)rh)r rrrr<�szSymbol.get_namecCst|jtj@�S)N)r?rirr)r rrr� is_referenced�szSymbol.is_referencedcCst|jt@�S)N)r?rir)r rrr� is_parameter�szSymbol.is_parametercCst|jttfk�S)N)r?rjr r)r rrr� is_global�szSymbol.is_globalcCst|jtk�S)N)r?rjr)r rrr�is_declared_global�szSymbol.is_declared_globalcCst|jt@�S)N)r?rir)r rrr�is_local�szSymbol.is_localcCst|jt@�S)N)r?rir)r rrr� is_annotated�szSymbol.is_annotatedcCst|jtk�S)N)r?rjr )r rrrrb�szSymbol.is_freecCst|jt@�S)N)r?rir)r rrr� is_imported�szSymbol.is_importedcCst|jt@�S)N)r?rir)r rrr� is_assigned�szSymbol.is_assignedcCs 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. )r?rk)r rrr� is_namespace�s zSymbol.is_namespacecCs|jS)z.Return a list of namespaces bound to this name)rk)r rrr�get_namespaces�szSymbol.get_namespacescCs t|j�dkrtd��|jdS)z�Returns the single namespace bound to this name. Raises ValueError if the name is bound to multiple namespaces. rdz$name is bound to multiple namespacesr)�lenrk� ValueError)r rrr� get_namespace�szSymbol.get_namespace)N)r+r,r-r!r6r<rlrmrnrorprqrbrrrsrtrurxrrrrr�s  �__main__rd�exec),�__doc__rrrrrrrrr r r r r rrr�__all__rrr�objectrrrrr+�os�sys�open�argv�f�read�src�path�split�modrHrNrL�info�printrprtrrrr�s&@L& C