3
^                 @   s   d Z ddlmZmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ eddd	d
gZeddd	gZG dd deZdddZdddZedkrdd Zdd Zdd Ze	 Zeeeejdd dS ) z
For a given source or bytecode file or code object, retrieve
  * linenumbers,
  * bytecode offsets, and
  * nested functions (code objects)

This is useful for example in debuggers that want to set breakpoints only
at valid locations.
    )check_object_pathload_module)iscode)get_instructions_bytes)get_opcode_module)
namedtupleLineOffsetsline_numberoffsetscodeLineOffsetsCompactnamec               @   s(   e Zd Zd
ddZdd ZdddZd	S )LineOffsetInfoFc       	   	   C   s.  t |std|t|f || _|j| _|| _i | _g | _g | _	t
|j|dd| _g | _d }xt|j||j|j|j|j|j | jdD ]V}|j}| j	j| | jj| |jr|r| jj| t|j|g|}q|j	j| qW | jj| |r*x2|jD ](}t | rt||d}|| j|j<  qW d S )Nz0code parameter %s needs to be a code type; is %sT)Z	dup_lines)bytecodeopcvarnamesnames	constantscells
linestarts)r   	TypeErrortyper   co_namer   r   childrenlinesr
   dictfindlinestartsr   Zinstructionsr   co_codeco_varnamesco_names	co_constsco_cellvarsco_freevarsoffsetappendstarts_liner   r   )	selfr   r   include_childrenZlast_line_infoinstrr#   c	code_info r+   M/home/psgendb/BIRCHDEV/python/lib/python3.6/site-packages/xdis/lineoffsets.py__init__    sJ    

zLineOffsetInfo.__init__c             C   s   t | j S )N)strline_numbers)r&   r+   r+   r,   __str__O   s    zLineOffsetInfo.__str__Tc       	      C   s   |rJi }xN| j D ]4}|j}|j|g ||< || jt|jj|j qW nt| j	j
 }|rx:| jj
 D ],}|jd||d}|r|j| qh||7 }qhW |stt|S |S )z7Return all of the valid lines for a given piece of codeT)r'   include_dupsinclude_offsets)r   r	   getr$   r   r   r   r
   listr   valuesr   r/   updateset)	r&   r'   r1   r2   r   linumberchildZchild_linesr+   r+   r,   r/   R   s,    zLineOffsetInfo.line_numbersN)F)FTF)__name__
__module____qualname__r-   r0   r/   r+   r+   r+   r,   r      s   
/
r   Fc             C   sD   t | }t|\}}}}}}}	|r(d}
nd }
t||
}t||| S )Npypy)r   r   r   r   )filenametoplevel_onlyZobj_pathversion	timestampZ	magic_intr   r>   source_sizeZsip_hashZvariantr   r+   r+   r,   lineoffsets_in_files   s    
rD   c             C   s   t | j|S )N)rD   __file__)moduler@   r+   r+   r,   lineoffsets_in_module   s    rG   __main__c              C   s   d} d}| |fS )N      r+   )xyr+   r+   r,   
multi_line   s     rM   c              C   s   dd } |  S )Nc               S   s   dS )N   r+   r+   r+   r+   r,   bar   s    zfoo.<locals>.barr+   )rO   r+   r+   r,   foo   s    rP   c             C   s"  | j j }t|rRtd| jt|f  x| j j D ]}td|  q4W td ntd| j  td| jddd  td| jd	d	d  td
| jd	dd  td| j | j | jddd}x4|j D ](\}}td|djdd |D f  qW tdd  x| j	D ]}t| qW d S )Nz%s has %d childrenz	%s
z%s has no childrenz"	lines with children and dups:
	%sT)r1   r'   z-	lines without children and without dups:
	%sFz%	lines without dups and children:
	%szOffsets in %s)r2   r'   z	line: %4d: %sz, c             S   s   g | ]}t |jqS r+   )r.   r
   ).0ir+   r+   r,   
<listcomp>   s    z#print_code_info.<locals>.<listcomp>=   )
r   keyslenprintr   r/   r
   itemsjoinr   )r*   r   r:   r   Zline_numr8   r+   r+   r,   print_code_info   s2    

$r\   T)r'   N)F)F)__doc__Z	xdis.loadr   r   Zxdis.codetyper   Zxdis.bytecoder   Zxdis.op_importsr   collectionsr   r   r   objectr   rD   rG   r;   rM   rP   r\   r   __code__r+   r+   r+   r,   <module>	   s    T

