ó zfc @ sì d Z d d l Z d d l Z d d l Td d l m Z d d d d d d g e Z [ e j e j e j e j e f Z d d „ Z d d „ Z d d „ Z d d d d d „ Z e Z d „ Z d „ Z d „ Z e d k rè e ƒ n d S( s0 Disassembler of Python byte code into mnemonics.iÿÿÿÿN( t *( t __all__t dist disassemblet distbt discot findlinestartst findlabelsc C sH | d k r t ƒ d St | t j ƒ r5 | j } n t | d ƒ rP | j } n t | d ƒ rk | j } n t | d ƒ rö | j j ƒ } | j ƒ x® | D]U \ } } t | t ƒ rš d | GHy t | ƒ Wn t k rê } d G| GHn XHqš qš WnN t | d ƒ rt | ƒ n2 t | t ƒ r.t | ƒ n t d t | ƒ j ‚ d S( sn Disassemble classes, methods, functions, or code. With no argument, disassemble the last traceback. Nt im_funct func_codet __dict__s Disassembly of %s:s Sorry:t co_codes( don't know how to disassemble %s objects( t NoneR t isinstancet typest InstanceTypet __class__t hasattrR R R t itemst sortt _have_codeR t TypeErrorR t strt disassemble_stringt typet __name__( t xR t namet x1t msg( ( s /usr/lib64/python2.7/dis.pyR s6 c C sl | d k rR y t j } Wn t k r5 t d ‚ n Xx | j rN | j } q9 Wn t | j j | j ƒ d S( s2 Disassemble a traceback (default: last traceback).s no last traceback to disassembleN( R t syst last_tracebackt AttributeErrort RuntimeErrort tb_nextR t tb_framet f_codet tb_lasti( t tb( ( s /usr/lib64/python2.7/dis.pyR 3 s c C sa | j } t | ƒ } t t | ƒ ƒ } t | ƒ } d } d } d } x| | k r\| | } t | ƒ } | | k r• | d k r† Hn d | | Gn d G| | k r¬ d Gn d G| | k rà d Gn d Gt | ƒ j d ƒ Gt | j d ƒ G| d } | t k rXt | | ƒ t | | d ƒ d | } d } | d } | t k rT| d } n t | ƒ j d ƒ G| t k r�d t | j | ƒ d GqX| t k r±d | j | d GqX| t k rÖd t | | ƒ d GqX| t k rød | j | d GqX| t k rd t | d GqX| t k rX| d k rB| j | j } n d | | d GqXn HqH Wd S( s Disassemble a code object.i s %3ds s -->s >>s i i i i i l i t (t )s (to N( R R t dictR t lenR t ordt reprt rjustt opnamet ljustt HAVE_ARGUMENTt EXTENDED_ARGt hasconstt co_constst hasnamet co_namest hasjrelt haslocalt co_varnamest hascomparet cmp_opt hasfreet co_cellvarst co_freevars( t cot lastit codet labelst linestartst nt it extended_argt freet ct opt oparg( ( s /usr/lib64/python2.7/dis.pyR = s\ * c C sÚ t | ƒ } t | ƒ } d } xµ| | k rÕ| | } t | ƒ } | | k rV d Gn d G| | k rm d Gn d Gt | ƒ j d ƒ Gt | j d ƒ G| d } | t k rÑt | | ƒ t | | d ƒ d } | d } t | ƒ j d ƒ G| t k r$| rd t | | ƒ d GqÎd | GqÑ| t k rZ| d k rOd | | d GqÎd | GqÑ| t k rd t | | ƒ d GqÑ| t k r¯| r¤d | | d GqÎd | GqÑ| t k rÑd t | d GqÑn Hq! Wd S( Ni s -->s s >>s i i i i i i R' R( s (%d)s (to ( R R* R+ R, R- R. R/ R0 R2 R4 R R6 R7 R9 R: ( R@ R? t varnamest namest constantsRA RC RD RG RH RI ( ( s /usr/lib64/python2.7/dis.pyR n sH & c C sí g } t | ƒ } d } xÎ | | k rè | | } t | ƒ } | d } | t k r t | | ƒ t | | d ƒ d } | d } d } | t k r¢ | | } n | t k r· | } n | d k rå | | k râ | j | ƒ qâ qå q q W| S( s` Detect all offsets in a byte code which are jump targets. Return the list of offsets. i i i i iÿÿÿÿ( R* R+ R0 R6 t hasjabst append( R@ RA RC RD RG RH RI t label( ( s /usr/lib64/python2.7/dis.pyR ˜ s&