§
    ƒÛg�x  ã                   ó  — d dl Z d dlZd dlZd dlmZ d dlmZ  eg d¢¦  «        Z G d„ de	¦  «        Z
 G d„ d e j        dd	¦  «        ¦  «        Z G d
„ de j        ¦  «        Z G d„ de	¦  «        Z G d„ de	¦  «        ZdS )é    N)ÚLoc)ÚUnsupportedError)Ú
SETUP_LOOPÚFOR_ITERÚ
SETUP_WITHÚBEFORE_WITHc                   ó    — e Zd Zd„ Zd„ Zd„ ZdS )ÚCFBlockc                 óL   — || _         g | _        i | _        i | _        d| _        d S )NF)ÚoffsetÚbodyÚoutgoing_jumpsÚincoming_jumpsÚterminating)Úselfr   s     úL/granary/edev/quantum/lib/python3.11/site-packages/numba/core/controlflow.pyÚ__init__zCFBlock.__init__   s2   € ØˆŒØˆŒ	ð !ˆÔð !ˆÔØ ˆÔÐÐó    c                 óh   — | j         t          | j        ¦  «        t          | j        ¦  «        f}d|z  S )Nz,block(offset:%d, outgoing: %s, incoming: %s))r   Úsortedr   r   )r   Úargss     r   Ú__repr__zCFBlock.__repr__   s7   € Ø”Ý�tÔ*Ñ+Ô+Ý�tÔ*Ñ+Ô+ð-ˆð >ÀÑDÐDr   c                 ó*   — t          | j        ¦  «        S ©N)Úiterr   ©r   s    r   Ú__iter__zCFBlock.__iter__"   s   € Ý�D”I‰ŒÐr   N)Ú__name__Ú
__module__Ú__qualname__r   r   r   © r   r   r
   r
      sD   € € € € € ð	!ð 	!ð 	!ðEð Eð Eðð ð ð ð r   r
   c                   ó"   — e Zd ZdZdZd„ Zd„ ZdS )ÚLoopz?
    A control flow loop, as detected by a CFGraph object.
    r!   c                 óL   — t          |t          ¦  «        o|j        | j        k    S r   )Ú
isinstancer#   Úheader©r   Úothers     r   Ú__eq__zLoop.__eq__3   s    € Ý˜%¥Ñ&Ô&ÐF¨5¬<¸4¼;Ò+FÐFr   c                 ó*   — t          | j        ¦  «        S r   )Úhashr&   r   s    r   Ú__hash__zLoop.__hash__6   s   € Ý�D”KÑ Ô Ð r   N)r   r   r    Ú__doc__Ú	__slots__r)   r,   r!   r   r   r#   r#   &   sF   € € € € € ðð ð €IðGð Gð Gð!ð !ð !ð !ð !r   r#   )ÚentriesÚexitsr&   r   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )Ú_DictOfContainerszŒA defaultdict with customized equality checks that ignore empty values.

    Non-empty value is checked by: `bool(value_item) == True`.
    c                 ó–   — t          |t          ¦  «        r.|                      ¦   «         }|                     ¦   «         }||k    S t          S r   )r%   r2   Ú_non_empty_itemsÚNotImplemented)r   r(   ÚmineÚtheirss       r   r)   z_DictOfContainers.__eq__@   sG   € Ý�eÕ.Ñ/Ô/ð 	"Ø×(Ò(Ñ*Ô*ˆDØ×+Ò+Ñ-Ô-ˆFØ˜6’>Ð!åÐr   c                 óH   — |                       |¦  «        }|t          u r|S | S r   )r)   r5   )r   r(   Úrets      r   Ú__ne__z_DictOfContainers.__ne__H   s*   € Ø�kŠk˜%Ñ Ô ˆØ•.Ð Ð ØˆJà�7ˆNr   c                 óX   — d„ t          |                      ¦   «         ¦  «        D ¦   «         S )Nc                 ó    — g | ]\  }}|¯||f‘ŒS r!   r!   )Ú.0ÚkÚvss      r   ú
<listcomp>z6_DictOfContainers._non_empty_items.<locals>.<listcomp>P   s%   € Ð@Ð@Ð@™E˜A˜r¸RÐ@��B�Ð@Ð@Ð@r   )r   Úitemsr   s    r   r4   z"_DictOfContainers._non_empty_itemsO   s&   € Ø@Ð@¥V¨D¯JªJ©L¬LÑ%9Ô%9Ð@Ñ@Ô@Ð@r   N)r   r   r    r-   r)   r:   r4   r!   r   r   r2   r2   :   sP   € € € € € ðð ð
ð ð ðð ð ðAð Að Að Að Ar   r2   c                   óŠ  — e Zd ZdZd„ Zd„ Zd<d„Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zd„ Zd„ Zd„ Zej        d„ ¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         Zd„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"d „ Z#d!„ Z$d"„ Z%d=d$„Z&d<d%„Z'd>d'„Z(d<d(„Z)d)„ Z*d<d*„Z+d+„ Z,d,„ Z-d-„ Z.d.„ Z/d/„ Z0d0„ Z1d=d1„Z2d2„ Z3d3„ Z4d<d4„Z5d5„ Z6d6„ Z7d7„ Z8d8„ Z9d9„ Z:d:„ Z;d;„ Z<dS )?ÚCFGraphzB
    Generic (almost) implementation of a Control Flow Graph.
    c                 ó¬   — t          ¦   «         | _        t          t           ¦  «        | _        t          t           ¦  «        | _        i | _        d | _        d S r   )ÚsetÚ_nodesr2   Ú_predsÚ_succsÚ
_edge_dataÚ_entry_pointr   s    r   r   zCFGraph.__init__X   s@   € Ý‘e”eˆŒÝ'­Ñ,Ô,ˆŒÝ'­Ñ,Ô,ˆŒØˆŒØ ˆÔÐÐr   c                 ó:   — | j                              |¦  «         dS )z“
        Add *node* to the graph.  This is necessary before adding any
        edges from/to the node.  *node* can be any hashable object.
        N)rF   Úadd©r   Únodes     r   Úadd_nodezCFGraph.add_node_   s   € ð
 	Œ�Š˜ÑÔÐÐÐr   Nc                 óÀ   — || j         vrt          d|›d| j         ›�¦  «        ‚|| j         vrt          d|›d| j         ›�¦  «        ‚|                      |||¦  «         dS )zÇ
        Add an edge from node *src* to node *dest*, with optional
        per-edge *data*.
        If such an edge already exists, it is replaced (duplicate edges
        are not possible).
        zCannot add edge as src node z not in nodes zCannot add edge as dest node N)rF   Ú
ValueErrorÚ	_add_edge)r   ÚsrcÚdestÚdatas       r   Úadd_edgezCFGraph.add_edgef   s†   € ð �d”kÐ!Ð!Ý�*Ø!˜c˜c 4¤; ;ð0ñ 1ô 1ð 1à�t”{Ð"Ð"Ý�*Ø"˜d˜d D¤K Kð1ñ 2ô 2ð 2à�Š�s˜D $Ñ'Ô'Ð'Ð'Ð'r   c              #   óP   K  — | j         |         D ]}|| j        ||f         fV — ŒdS )z¡
        Yield (node, data) pairs representing the successors of node *src*.
        (*data* will be None if no data was specified when adding the edge)
        N)rH   rI   )r   rS   rT   s      r   Ú
successorszCFGraph.successorsu   sG   è è € ð
 ”K Ô$ð 	3ð 	3ˆDØ˜œ¨¨T¨	Ô2Ð2Ð2Ð2Ð2Ð2ð	3ð 	3r   c              #   óP   K  — | j         |         D ]}|| j        ||f         fV — ŒdS )z¤
        Yield (node, data) pairs representing the predecessors of node *dest*.
        (*data* will be None if no data was specified when adding the edge)
        N)rG   rI   )r   rT   rS   s      r   ÚpredecessorszCFGraph.predecessors}   sG   è è € ð
 ”;˜tÔ$ð 	2ð 	2ˆCØ�t” s¨D yÔ1Ð1Ð1Ð1Ð1Ð1ð	2ð 	2r   c                 ó*   — || j         v sJ ‚|| _        dS )z=
        Set the entry point of the graph to *node*.
        N)rF   rJ   rM   s     r   Úset_entry_pointzCFGraph.set_entry_point…   s%   € ð �t”{Ð"Ð"Ð"Ð"Ø ˆÔÐÐr   c                 óZ   — | j         €t          d¦  «        ‚|                      ¦   «          dS )zÒ
        Compute essential properties of the control flow graph.  The graph
        must have been fully populated, and its entry point specified. Other
        graph properties are computed on-demand.
        Nzno entry point defined!)rJ   ÚRuntimeErrorÚ_eliminate_dead_blocksr   s    r   ÚprocesszCFGraph.processŒ   s4   € ð ÔÐ$ÝÐ8Ñ9Ô9Ð9Ø×#Ò#Ñ%Ô%Ð%Ð%Ð%r   c                 ó   — | j         S )zÅ
        Return a dictionary of {node -> set(nodes)} mapping each node to
        the nodes dominating it.

        A node D dominates a node N when any path leading to N must go through D
        )Ú_domsr   s    r   Ú
dominatorszCFGraph.dominators–   ó   € ð ŒzÐr   c                 ó   — | j         S )zÛ
        Return a dictionary of {node -> set(nodes)} mapping each node to
        the nodes post-dominating it.

        A node P post-dominates a node N when any path starting from N must go
        through P.
        )Ú
_post_domsr   s    r   Úpost_dominatorszCFGraph.post_dominatorsŸ   s   € ð ŒÐr   c                 ó   — | j         S )z®
        Return a dictionary of {node -> node} mapping each node to its
        immediate dominator (idom).

        The idom(B) is the closest strict dominator of V
        )Ú_idomr   s    r   Úimmediate_dominatorszCFGraph.immediate_dominators©   rd   r   c                 ó   — | j         S )a.  
        Return a dictionary of {node -> set(nodes)} mapping each node to
        the nodes in its dominance frontier.

        The dominance frontier _df(N) is the set of all nodes that are
        immediate successors to blocks dominated by N but which aren't
        strictly dominated by N
        )Ú_dfr   s    r   Údominance_frontierzCFGraph.dominance_frontier²   s   € ð Œxˆr   c                 ó   — | j         S )zÐ
        return a dictionary of {node -> set(nodes)} mapping each node to
        the set of nodes it immediately dominates

        The domtree(B) is the closest strict set of nodes that B dominates
        )Ú_domtreer   s    r   Údominator_treezCFGraph.dominator_tree½   s   € ð Œ}Ðr   c                 ó*   — |                       ¦   «         S r   )Ú_find_exit_pointsr   s    r   Ú_exit_pointszCFGraph._exit_pointsÆ   ó   € à×%Ò%Ñ'Ô'Ð'r   c                 ó*   — |                       ¦   «         S r   )Ú_find_dominatorsr   s    r   rb   zCFGraph._domsÊ   ó   € à×$Ò$Ñ&Ô&Ð&r   c                 ó*   — |                       ¦   «         S r   )Ú_find_back_edgesr   s    r   Ú_back_edgeszCFGraph._back_edgesÎ   rw   r   c                 ó*   — |                       ¦   «         S r   )Ú_find_topo_orderr   s    r   Ú_topo_orderzCFGraph._topo_orderÒ   rw   r   c                 ó*   — |                       ¦   «         S r   )Ú_find_descendentsr   s    r   Ú_descszCFGraph._descsÖ   rt   r   c                 ó*   — |                       ¦   «         S r   )Ú_find_loopsr   s    r   Ú_loopszCFGraph._loopsÚ   s   € à×ÒÑ!Ô!Ð!r   c                 ó*   — |                       ¦   «         S r   )Ú_find_in_loopsr   s    r   Ú	_in_loopszCFGraph._in_loopsÞ   s   € à×"Ò"Ñ$Ô$Ð$r   c                 ó*   — |                       ¦   «         S r   )Ú_find_post_dominatorsr   s    r   rf   zCFGraph._post_domsâ   s   € à×)Ò)Ñ+Ô+Ð+r   c                 ó*   — |                       ¦   «         S r   )Ú_find_immediate_dominatorsr   s    r   ri   zCFGraph._idomæ   s   € à×.Ò.Ñ0Ô0Ð0r   c                 ó*   — |                       ¦   «         S r   )Ú_find_dominance_frontierr   s    r   rl   zCFGraph._dfê   s   € à×,Ò,Ñ.Ô.Ð.r   c                 ó*   — |                       ¦   «         S r   )Ú_find_dominator_treer   s    r   ro   zCFGraph._domtreeî   s   € à×(Ò(Ñ*Ô*Ð*r   c                 ó   — | j         |         S )zx
        Return the set of descendents of the given *node*, in topological
        order (ignoring back edges).
        )r€   rM   s     r   ÚdescendentszCFGraph.descendentsò   s   € ð
 Œ{˜4Ô Ð r   c                 ó"   — | j         €J ‚| j         S )z.
        Return the entry point node.
        )rJ   r   s    r   Úentry_pointzCFGraph.entry_pointù   s   € ð Ô Ð,Ð,Ð,ØÔ Ð r   c                 ó   — | j         S )zG
        Return the computed set of exit nodes (may be empty).
        )rs   r   s    r   Úexit_pointszCFGraph.exit_points   s   € ð Ô Ð r   c                 ó&   — | j         | j                 S )zÿ
        Return the set of nodes constituting the graph's backbone.
        (i.e. the nodes that every path starting from the entry point
         must go through).  By construction, it is non-empty: it contains
         at least the entry point.
        )rf   rJ   r   s    r   ÚbackbonezCFGraph.backbone  s   € ð Œ˜tÔ0Ô1Ð1r   c                 ó   — | j         S )zˆ
        Return a dictionary of {node -> loop} mapping each loop header
        to the loop (a Loop instance) starting with it.
        ©rƒ   r   s    r   ÚloopszCFGraph.loops  s   € ð
 Œ{Ðr   c                 óR   ‡ — ˆ fd„‰ j                              |d¦  «        D ¦   «         S )zm
        Return the list of Loop objects the *node* belongs to,
        from innermost to outermost.
        c                 ó*   •— g | ]}‰j         |         ‘ŒS r!   r˜   )r=   Úxr   s     €r   r@   z$CFGraph.in_loops.<locals>.<listcomp>  s   ø€ ÐEÐEÐE 1�”˜A”ÐEÐEÐEr   r!   )r†   ÚgetrM   s   ` r   Úin_loopszCFGraph.in_loops  s2   ø€ ð
 FÐEÐEÐE¨¬×(:Ò(:¸4ÀÑ(DÔ(DÐEÑEÔEÐEr   c                 ó   — | j         S )zK
        Return the set of dead nodes (eliminated from the graph).
        )Ú_dead_nodesr   s    r   Ú
dead_nodeszCFGraph.dead_nodes  s   € ð ÔÐr   c                 ó   — | j         S )z/
        Return the set of live nodes.
        )rF   r   s    r   ÚnodeszCFGraph.nodes#  s   € ð Œ{Ðr   c                 ó   — | j         S )zb
        Return the sequence of nodes in topological order (ignoring back
        edges).
        )r}   r   s    r   Ú
topo_orderzCFGraph.topo_order)  s   € ð
 ÔÐr   Fc              #   ór   K  — t          |¦  «        }| j        }|rt          |¦  «        }|D ]
}||v r|V — ŒdS )z†
        Iterate over the *nodes* in topological order (ignoring back edges).
        The sort isn't guaranteed to be stable.
        N)rE   r}   Úreversed)r   r£   ÚreverseÚitÚns        r   Ú	topo_sortzCFGraph.topo_sort0  sZ   è è € õ
 �E‘
”
ˆØÔˆØð 	Ý˜"‘”ˆBØð 	ð 	ˆAØ�EˆzˆzØ���øð	ð 	r   c                 óœ  — ddl }|pt          j        }	 t          d|¬¦  «         |                      |¦  «         t          d|¬¦  «         |                      | j        |¬¦  «         t          d|¬¦  «         |                      | j        |¬¦  «         t          d	t          | j        ¦  «        |¬¦  «         t          d
|¬¦  «         |                      | j	        |¬¦  «         t          d|¬¦  «         |                      | j
        |¬¦  «         t          d|¬¦  «         |                      |                      ¦   «         |¬¦  «         dS )z3
        Dump extensive debug information.
        r   Né   zCFG adjacency lists:©ÚfilezCFG dominators:©ÚstreamzCFG post-dominators:zCFG back edges:z
CFG loops:zCFG node-to-loops:zCFG backbone:)ÚpprintÚsysÚstdoutÚprintÚ_dump_adj_listsrb   rf   r   rz   rƒ   r†   r–   )r   r¯   r²   s      r   ÚdumpzCFGraph.dump=  sM  € ð 	ˆˆˆØÐ!•s”zˆð	'ÝÐ(¨tÐ4Ñ4Ô4Ð4Ø× Ò  Ñ&Ô&Ð&ÝÐ dÐ+Ñ+Ô+Ð+Ø�Š�d”j¨ˆÑ.Ô.Ð.ÝÐ$¨4Ð0Ñ0Ô0Ð0Ø�Š�d”o¨dˆÑ3Ô3Ð3ÝÐ¥¨Ô(8Ñ!9Ô!9ÀÐEÑEÔEÐEÝˆl Ð&Ñ&Ô&Ð&Ø�Š�d”k¨$ˆÑ/Ô/Ð/ÝÐ"¨Ð.Ñ.Ô.Ð.Ø�Š�d”n¨TˆÑ2Ô2Ð2Ýˆo DÐ)Ñ)Ô)Ð)Ø�Š�d—m’m‘o”o¨dˆÑ3Ô3Ð3Ð3Ð3r   únumba_cfg.dotc                 ód  — 	 ddl }n# t          $ r t          d¦  «        ‚w xY w|                     |¬¦  «        }| j        D ]$}|                     t          |¦  «        ¦  «         Œ%| j        D ]B}| j        |         D ]2}|                     t          |¦  «        t          |¦  «        ¦  «         Œ3ŒC|S )zïRender the controlflow graph with GraphViz DOT via the
        ``graphviz`` python binding.

        Returns
        -------
        g : graphviz.Digraph
            Use `g.view()` to open the graph in the default PDF application.
        r   NzcThe feature requires `graphviz` but it is not available. Please install with `pip install graphviz`)Úfilename)ÚgraphvizÚImportErrorÚDigraphrF   rN   ÚstrrH   Úedge)r   rº   ÚgvÚgrª   r¿   s         r   Ú
render_dotzCFGraph.render_dotR  sØ   € ð	Ø!Ð!Ð!Ð!Ð!øÝð 	ð 	ð 	Ýð=ñô ð ð	øøøð
 �JŠJ ˆJÑ)Ô)ˆà”ð 	ð 	ˆAØ�FŠF•3�q‘6”6‰NŒNˆNˆNà”ð 	*ð 	*ˆAØœ Aœð *ð *�Ø—’•s˜1‘v”v�s 4™yœyÑ)Ô)Ð)Ð)ð*àˆs   ‚ ‡!c                 óž   — | j         |                              |¦  «         | j        |                              |¦  «         || j        ||f<   d S r   )rG   rL   rH   rI   )r   Úfrom_ÚtorU   s       r   rR   zCFGraph._add_edgeo  sO   € ð 	Œ�BŒ×Ò˜EÑ"Ô"Ð"ØŒ�EÔ×Ò˜rÑ"Ô"Ð"Ø%)ˆŒ˜˜r˜	Ñ"Ð"Ð"r   c                 ó&  — | j                              |d¦  «        D ],}| j        |                              |¦  «         | j        ||f= Œ-| j                             |d¦  «        D ],}| j         |                              |¦  «         | j        ||f= Œ-d S )Nr!   )rH   ÚpoprG   ÚremoverI   )r   rN   ÚsuccÚpreds       r   Ú_remove_node_edgeszCFGraph._remove_node_edgesv  s¢   € Ø”K—O’O D¨"Ñ-Ô-ð 	,ð 	,ˆDØŒK˜Ô×$Ò$ TÑ*Ô*Ð*Ø”  d 
Ð+Ð+Ø”K—O’O D¨"Ñ-Ô-ð 	,ð 	,ˆDØŒK˜Ô×$Ò$ TÑ*Ô*Ð*Ø”  d 
Ð+Ð+ð	,ð 	,r   c              #   ó  K  — |€| j         f}t          ¦   «         }t          |¦  «        }|rZ|                     ¦   «         }||vr>|V — |                     |¦  «         | j        |         D ]}|                     |¦  «         Œ|°Xd S d S r   )rJ   rE   ÚlistrÇ   rL   rH   Úappend)r   r/   ÚseenÚstackrN   rÉ   s         r   Ú_dfszCFGraph._dfs~  s«   è è € Øˆ?ØÔ(Ð*ˆGÝ‰uŒuˆÝ�W‘”ˆØð 	'Ø—9’9‘;”;ˆDØ˜4ÐÐØ�
�
�
Ø—’˜‘”�Ø œK¨Ô-ð 'ð '�DØ—L’L Ñ&Ô&Ð&Ð&ð ð 	'ð 	'ð 	'ð 	'ð 	'r   c                 óä   — t          ¦   «         }|                      ¦   «         D ]}|                     |¦  «         Œ| j        |z
  | _        || _        | j        D ]}|                      |¦  «         ŒdS )zx
        Eliminate all blocks not reachable from the entry point, and
        stash them into self._dead_nodes.
        N)rE   rÑ   rL   rF   r    rË   )r   ÚliverN   Údeads       r   r_   zCFGraph._eliminate_dead_blocks‹  s~   € õ
 ‰uŒuˆØ—I’I‘K”Kð 	ð 	ˆDØ�HŠH�T‰NŒNˆNˆNØœ;¨Ñ-ˆÔØˆŒàÔ$ð 	*ð 	*ˆDØ×#Ò# DÑ)Ô)Ð)Ð)ð	*ð 	*r   c                 ó”   — t          ¦   «         }| j        D ]1}| j                             |¦  «        s|                     |¦  «         Œ2|S )z2
        Compute the graph's exit points.
        )rE   rF   rH   r�   rL   )r   r”   rª   s      r   rr   zCFGraph._find_exit_points™  sM   € õ ‘e”eˆØ”ð 	#ð 	#ˆAØ”;—?’? 1Ñ%Ô%ð #Ø—’ Ñ"Ô"Ð"øØÐr   c                 óÆ   ‡‡‡‡‡‡— | j         Š| j        Šg Št          ¦   «         Šg Šˆˆˆˆˆˆfd„Š‰| j        fgŠ‰r$‰                     ¦   «         \  }} ||¦  «         ‰°$‰S )Nc                 óÆ   •— | ‰vrY‰                      | ¦  «         ‰                     ‰j        | f¦  «         ‰|          D ]!}| |f‰vr‰                     ‰|f¦  «         Œ d S d S r   ©rL   rÎ   )rN   rT   Ú
back_edgesÚdfs_recÚ
post_orderrÏ   rÐ   Úsuccss     €€€€€€r   rÚ   z(CFGraph._find_postorder.<locals>.dfs_rec¬  s‚   ø€ Ø˜4ÐÐØ—’˜‘”�Ø—’˜jÔ/°Ð6Ñ7Ô7Ð7Ø! $œKð 6ð 6�DØ˜d�|¨:Ð5Ð5ØŸš g¨t _Ñ5Ô5Ð5øð  Ðð6ð 6r   )rH   rz   rE   rJ   rÇ   )	r   ÚcbrU   rÙ   rÚ   rÛ   rÏ   rÐ   rÜ   s	      @@@@@@r   Ú_find_postorderzCFGraph._find_postorder£  s¦   øøøøøø€ Ø”ˆØÔ%ˆ
Øˆ
Ý‰uŒuˆàˆ
ð	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð ˜4Ô,Ð-Ð.ˆØð 	Ø—y’y‘{”{‰HˆB�ØˆBˆt‰HŒHˆHð ð 	ð Ðr   c                 óz  ‡‡	— ˆˆ	fd„}| j         }| j        }|                      ¦   «         }d„ t          |¦  «        D ¦   «         Š	||iŠ|                     ¦   «          |                     ¦   «          d}|rGd}|D ]@}t          j        |ˆfd„||         D ¦   «         ¦  «        }|‰vs‰|         |k    r|‰|<   d}ŒA|°G‰S )Nc                 óÐ   •— | |k    r^‰|          ‰|         k     r‰|          } ‰|          ‰|         k     °‰|          ‰|         k    r‰|         }‰|          ‰|         k    °| |k    °^| S r   r!   )ÚuÚvÚidomÚidxs     €€r   Ú	intersectz5CFGraph._find_immediate_dominators.<locals>.intersectÅ  sx   ø€ Ø�q’&�&Ø˜!”f˜s 1œv’o�oØ˜Qœ�Að ˜!”f˜s 1œv’o�oà˜!”f˜s 1œv’o�oØ˜Qœ�Að ˜!”f˜s 1œv’o�oð �q’&�&ð
 ˆHr   c                 ó   — i | ]\  }}||“Œ	S r!   r!   )r=   ÚiÚes      r   ú
<dictcomp>z6CFGraph._find_immediate_dominators.<locals>.<dictcomp>Ñ  s   € Ð1Ð1Ð1™˜˜1ˆq�!Ð1Ð1Ð1r   TFc              3   ó$   •K  — | ]
}|‰v ¯|V — Œd S r   r!   )r=   râ   rã   s     €r   ú	<genexpr>z5CFGraph._find_immediate_dominators.<locals>.<genexpr>Û  s4   øè è € ð -;ð -;°1Ø01°T°	°	ð ./Ø09°	°	°	ð-;ð -;r   )rJ   rG   rÞ   Ú	enumeraterÇ   r¨   Ú	functoolsÚreduce)
r   rå   ÚentryÚpreds_tableÚorderÚchangedrá   Únew_idomrã   rä   s
           @@r   rŠ   z"CFGraph._find_immediate_dominators»  s  øø€ ð	ð 	ð 	ð 	ð 	ð 	ð Ô!ˆØ”kˆà×$Ò$Ñ&Ô&ˆØ1Ð1¥	¨%Ñ 0Ô 0Ð1Ñ1Ô1ˆØ˜ˆˆØ�	Š	‰ŒˆØ�Š‰ŒˆàˆØð 	#ØˆGØð #ð #�Ý$Ô+¨Ið-;ð -;ð -;ð -;¸ÀA¼ð -;ñ -;ô -;ñ<ô <�ð ˜D�=�= D¨¤G¨xÒ$7Ð$7Ø&�D˜‘GØ"�Gøð ð 	#ð ˆr   c                 óÜ   — | j         }t          t          ¦  «        }|                     ¦   «         D ];\  }}||vrt          ¦   «         ||<   ||k    r||                              |¦  «         Œ<|S r   )ri   r2   rE   rA   rL   )r   rã   Údomtreerá   râ   s        r   rŽ   zCFGraph._find_dominator_treeã  sn   € ØŒzˆÝ#¥CÑ(Ô(ˆà—J’J‘L”Lð 	"ð 	"‰DˆAˆqà˜ÐÐÝ ™UœU�˜‘
Ø�AŠvˆvØ˜”
—’˜qÑ!Ô!Ð!øàˆr   c                 ó  — | j         }| j        }d„ |D ¦   «         }|D ]b}t          ||         ¦  «        dk     rŒ||         D ]=}|||         k    r/||                              |¦  «         ||         }|||         k    °/Œ>Œc|S )Nc                 ó,   — i | ]}|t          ¦   «         “ŒS r!   )rE   )r=   rá   s     r   ré   z4CFGraph._find_dominance_frontier.<locals>.<dictcomp>ó  s   € Ð%Ð%Ð%˜1ˆa•‘”Ð%Ð%Ð%r   é   )ri   rG   ÚlenrL   )r   rã   rð   Údfrá   râ   s         r   rŒ   z CFGraph._find_dominance_frontierð  s¤   € ØŒzˆØ”kˆØ%Ð% Ð%Ñ%Ô%ˆàð 	 ð 	 ˆAÝ�;˜q”>Ñ"Ô" QÒ&Ð&ØØ  ”^ð  ð  �Ø˜4 œ7’l�lØ�q”E—I’I˜a‘L”L�LØ˜Qœ�Að ˜4 œ7’l�løð ð
 ˆ	r   c                 óØ  ‡
— |r#t          | j        ¦  «        }| j        }| j        }n#t          | j        g¦  «        }| j        }| j        }|st          d¦  «        ‚i Š
|D ]}t          |g¦  «        ‰
|<   Œg }| j        D ]2}||vr,t          | j        ¦  «        ‰
|<   |                     |¦  «         Œ3|r·|                     ¦   «         }||v rŒt          |g¦  «        }||         }	|	r.|t          j
        t           j        ˆ
fd„|	D ¦   «         ¦  «        z  }|‰
|         k    rHt          |¦  «        t          ‰
|         ¦  «        k     sJ ‚|‰
|<   |                     ||         ¦  «         |°·‰
S )Nz5no entry points: dominator algorithm cannot be seededc                 ó    •— g | ]
}‰|         ‘ŒS r!   r!   )r=   ÚpÚdomss     €r   r@   z5CFGraph._find_dominators_internal.<locals>.<listcomp>#  s   ø€ Ð-EÐ-EÐ-E¸!¨d°1¬gÐ-EÐ-EÐ-Er   )rE   rs   rH   rG   rJ   r^   rF   rÎ   rÇ   rí   rî   Úintersectionrù   Úextend)r   Úpostr/   rð   Úsuccs_tablerè   Útodorª   Únew_domsÚpredsrþ   s             @r   Ú_find_dominators_internalz!CFGraph._find_dominators_internalÿ  s²  ø€ ð
 ð 	&Ý˜$Ô+Ñ,Ô,ˆGØœ+ˆKØœ+ˆKˆKå˜4Ô,Ð-Ñ.Ô.ˆGØœ+ˆKØœ+ˆKàð 	3Ýð  2ñ 3ô 3ð 3ð ˆØð 	ð 	ˆAÝ˜1˜#‘h”hˆD�‰GˆGàˆØ”ð 	ð 	ˆAØ˜ÐÐÝ˜dœkÑ*Ô*��Q‘Ø—’˜A‘”�øàð 	,Ø—’‘
”
ˆAØ�Gˆ|ˆ|ØÝ˜A˜3‘x”xˆHØ ”NˆEØð GØ�IÔ,­SÔ-=Ø-EÐ-EÐ-EÐ-E¸uÐ-EÑ-EÔ-EñGô Gñ G�à˜4 œ7Ò"Ð"Ý˜8‘}”}¥s¨4°¬7¡|¤|Ò3Ð3Ð3Ð3Ø"��Q‘Ø—’˜K¨œNÑ+Ô+Ð+ð ð 	,ð ˆr   c                 ó.   — |                       d¬¦  «        S )NF©r  )r  r   s    r   rv   zCFGraph._find_dominators*  s   € Ø×-Ò-°5Ð-Ñ9Ô9Ð9r   c                 óÄ  — t          ¦   «         }| j                             |¦  «         | j                             ¦   «         D ])}|j        s |j        D ]}|                      ||¦  «         ŒŒ*|                      d¬¦  «        }||= |                     ¦   «         D ]}| 	                    |¦  «         Œ|  
                    |¦  «         | j                             |¦  «         |S )NTr  )Úobjectrs   rL   rƒ   Úvaluesr0   r   rR   r  ÚdiscardrË   rÈ   )r   Ú
dummy_exitÚloopÚbÚpdomsrþ   s         r   rˆ   zCFGraph._find_post_dominators-  sî   € õ ‘X”Xˆ
ØÔ×Ò˜jÑ)Ô)Ð)Ø”K×&Ò&Ñ(Ô(ð 	2ð 	2ˆDØ”:ð 2Øœð 2ð 2�AØ—N’N 1 jÑ1Ô1Ð1Ð1øØ×.Ò.°DÐ.Ñ9Ô9ˆà�*ÐØ—L’L‘N”Nð 	%ð 	%ˆDØ�LŠL˜Ñ$Ô$Ð$Ð$Ø×Ò 
Ñ+Ô+Ð+ØÔ× Ò  Ñ,Ô,Ð,Øˆr   c                 ó`  ‡ ‡
‡— |�Jt          |t          ¦  «        st          dt          |¦  «        › �¦  «        ‚|                     dd¦  «         t          ¦   «         }g Š
i Š‰                      ¦   «         }t          ¦   «         }ˆ ˆ
ˆfd„} ||¦  «         d}‰
r‚|dz  }‰
d         }‰|         }|r@|                     ¦   «         }	|	‰
v r|                     ||	f¦  «         n9|	|vr ||	¦  «         n)‰
                     ¦   «          |                     |¦  «         ‰
°‚|�|dxx         |z  cc<   |S )zu
        Find back edges.  An edge (src, dest) is a back edge if and
        only if *dest* dominates *src*.
        Nz*stats* must be a dict; got Úiteration_countr   c                 óf   •— ‰                      | ¦  «         d„ ‰j        |          D ¦   «         ‰| <   d S )Nc                 ó   — g | ]}|‘ŒS r!   r!   )r=   rT   s     r   r@   z@CFGraph._find_back_edges.<locals>.push_state.<locals>.<listcomp>[  s   € Ð DÐ DÐ D¨$ Ð DÐ DÐ Dr   )rÎ   rH   )rN   r   rÐ   Úsuccs_states    €€€r   Ú
push_statez,CFGraph._find_back_edges.<locals>.push_stateY  s:   ø€ Ø�LŠL˜ÑÔÐØ DÐ D°$´+¸dÔ2CÐ DÑ DÔ DˆK˜ÑÐÐr   r­   éÿÿÿÿ)	r%   ÚdictÚ	TypeErrorÚtypeÚ
setdefaultrE   r’   rÇ   rL   )r   ÚstatsrÙ   r’   Úcheckedr  Úiter_ctÚtosÚ	tos_succsÚcur_noderÐ   r  s   `         @@r   ry   zCFGraph._find_back_edgesB  s•  øøø€ ð ÐÝ˜e¥TÑ*Ô*ð NÝÐ L½tÀE¹{¼{Ð LÐ LÑMÔMÐMØ×ÒÐ.°Ñ2Ô2Ð2õ
 ‘U”Uˆ
àˆàˆØ×&Ò&Ñ(Ô(ˆå‘%”%ˆð	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	ˆ
�;ÑÔÐð ˆØð 	!Ø�q‰LˆGØ˜”)ˆCØ# CÔ(ˆIàð !à$Ÿ=š=™?œ?�à˜uÐ$Ð$à—N’N C¨ ?Ñ3Ô3Ð3Ð3Ø WÐ,Ð,à�J˜xÑ(Ô(Ð(øð —	’	‘”�Ø—’˜CÑ Ô Ð ð% ð 	!ð( ÐØÐ#Ð$Ð$Ô$¨Ñ/Ð$Ð$Ñ$ØÐr   c                 ó¦   ‡‡‡‡‡— | j         Š| j        Šg Št          ¦   «         Šˆˆˆˆˆfd„Š ‰| j        ¦  «         ‰                     ¦   «          ‰S )Nc                 ó    •— | ‰vrH‰                      | ¦  «         ‰|          D ]}| |f‰vr ‰|¦  «         Œ‰                     | ¦  «         d S d S r   rØ   )rN   rT   Ú_dfs_recrÙ   rÛ   rÏ   rÜ   s     €€€€€r   r$  z*CFGraph._find_topo_order.<locals>._dfs_rec  so   ø€ Ø˜4ÐÐØ—’˜‘”�Ø! $œKð 'ð '�DØ˜d�|¨:Ð5Ð5Ø ˜ ™œ˜øØ×!Ò! $Ñ'Ô'Ð'Ð'Ð'ð  Ðr   )rH   rz   rE   rJ   r¨   )r   r$  rÙ   rÛ   rÏ   rÜ   s    @@@@@r   r|   zCFGraph._find_topo_ordery  s~   øøøøø€ Ø”ˆØÔ%ˆ
Øˆ
Ý‰uŒuˆð	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	ˆ�Ô"Ñ#Ô#Ð#Ø×ÒÑÔÐØÐr   c                 óô   — i }t          | j        ¦  «        D ]`}t          ¦   «         x||<   }| j        |         D ]=}||f| j        vr0|                     |¦  «         |                     ||         ¦  «         Œ>Œa|S r   )r§   r}   rE   rH   rz   rL   Úupdate)r   ÚdescsrN   Ú
node_descsrÉ   s        r   r   zCFGraph._find_descendents‹  s’   € ØˆÝ˜TÔ-Ñ.Ô.ð 	3ð 	3ˆDÝ'*¡u¤uÐ,ˆE�$‰K˜*Øœ DÔ)ð 3ð 3�Ø˜$�< tÔ'7Ð7Ð7Ø—N’N 4Ñ(Ô(Ð(Ø×%Ò% e¨D¤kÑ2Ô2Ð2øð3ð ˆr   c                 óp  — i }| j         D ]�\  }}|}t          |g¦  «        }|g}|rO|                     ¦   «         }||vr5|                     |¦  «         |                     | j        |         ¦  «         |°O||v r||                              |¦  «         Œ‹|||<   Œ‘i }|                     ¦   «         D ]„\  }}t          ¦   «         }	t          ¦   «         }
|D ]H}|	                     | j        |         |z
  ¦  «         |
                     | j        |         |z
  ¦  «         ŒIt          |||	|
¬¦  «        }|||<   Œ…|S )zC
        Find the loops defined by the graph's back edges.
        )r&   r   r/   r0   )
rz   rE   rÇ   rL   r   rG   r&  rA   rH   r#   )r   ÚbodiesrS   rT   r&   r   Úqueuerª   r™   r/   r0   r  s               r   r‚   zCFGraph._find_loops•  sb  € ð ˆØÔ)ð 	&ð 	&‰IˆC�àˆFõ ˜�x‘=”=ˆDØ�EˆEØð 1Ø—I’I‘K”K�Ø˜D�=�=Ø—H’H˜Q‘K”K�KØ—L’L ¤¨Q¤Ñ0Ô0Ð0ð	 ð 1ð ˜ÐÐØ�v”×%Ò% dÑ+Ô+Ð+Ð+à!%��v‘�ð ˆØ"ŸLšL™NœNð 	!ð 	!‰LˆF�DÝ‘e”eˆGÝ‘E”EˆEØð 4ð 4�Ø—’˜tœ{¨1œ~°Ñ4Ñ5Ô5Ð5Ø—’˜Tœ[¨œ^¨dÑ2Ñ3Ô3Ð3Ð3Ý˜v¨D¸'ÈÐOÑOÔOˆDØ ˆE�&‰MˆMØˆr   c                 óò   — | j         }t          d„ | j        D ¦   «         ¦  «        }t          |                     ¦   «         d„ ¬¦  «        D ],}|j        D ]"}||                              |j        ¦  «         Œ#Œ-|S )Nc              3   ó   K  — | ]}|g fV — Œ	d S r   r!   )r=   rª   s     r   rë   z)CFGraph._find_in_loops.<locals>.<genexpr>¼  s&   è è € Ð5Ð5 A˜˜B˜Ð5Ð5Ð5Ð5Ð5Ð5r   c                 ó*   — t          | j        ¦  «        S r   )rù   r   )r  s    r   ú<lambda>z(CFGraph._find_in_loops.<locals>.<lambda>¿  s   € ½CÀÄ	¹N¼N€ r   )Úkey)rƒ   r  rF   r   r  r   rÎ   r&   )r   r™   rž   r  rª   s        r   r…   zCFGraph._find_in_loops¹  s‰   € Ø”ˆåÐ5Ð5¨¬Ð5Ñ5Ô5Ñ5Ô5ˆõ ˜5Ÿ<š<™>œ>Ð/JÐ/JÐKÑKÔKð 	0ð 	0ˆDØ”Yð 0ð 0�Ø˜”×"Ò" 4¤;Ñ/Ô/Ð/Ð/ð0àˆr   c                 óœ   — t          d„ | j                             ¦   «         D ¦   «         ¦  «        }dd l}|                     ||¬¦  «         d S )Nc              3   óX   K  — | ]%\  }}|t          t          |¦  «        ¦  «        fV — Œ&d S r   )r   rÍ   )r=   rS   Údestss      r   rë   z*CFGraph._dump_adj_lists.<locals>.<genexpr>Å  sU   è è € ð @ð @Ù'˜S %ð �v¥d¨5¡k¤kÑ2Ô2Ð3ð @ð @ð @ð @ð @ð @r   r   r°   )r  rH   rA   r²   )r   r¯   Ú	adj_listsr²   s       r   r¶   zCFGraph._dump_adj_listsÄ  sg   € Ýð @ð @Ø+/¬;×+<Ò+<Ñ+>Ô+>ð@ñ @ô @ñ @ô @ˆ	àˆˆˆØ�Š�i¨ˆÑ-Ô-Ð-Ð-Ð-r   c                 óž   — t          |t          ¦  «        st          ‚dD ]-}t          | |d ¦  «        }t          ||d ¦  «        }||k    r dS Œ.dS )N)rF   rI   rJ   rG   rH   FT)r%   rC   ÚNotImplementedErrorÚgetattr)r   r(   rœ   ÚthisÚthats        r   r)   zCFGraph.__eq__Ê  se   € Ý˜%¥Ñ)Ô)ð 	&Ý%Ð%àMð 	ð 	ˆAÝ˜4  DÑ)Ô)ˆDÝ˜5 ! TÑ*Ô*ˆDØ�tŠ|ˆ|Ø�u�uð àˆtr   c                 ó.   — |                       |¦  «         S r   )r)   r'   s     r   r:   zCFGraph.__ne__Õ  s   € Ø—;’;˜uÑ%Ô%Ð%Ð%r   r   )F)r¸   )=r   r   r    r-   r   rO   rV   rX   rZ   r\   r`   rc   rg   rj   rm   rp   rí   Úcached_propertyrs   rb   rz   r}   r€   rƒ   r†   rf   ri   rl   ro   r�   r’   r”   r–   r™   rž   r¡   r£   r¥   r«   r·   rÂ   rR   rË   rÑ   r_   rr   rÞ   rŠ   rŽ   rŒ   r  rv   rˆ   ry   r|   r   r‚   r…   r¶   r)   r:   r!   r   r   rC   rC   S   s6  € € € € € ðð ð!ð !ð !ðð ð ð(ð (ð (ð (ð3ð 3ð 3ð2ð 2ð 2ð!ð !ð !ð&ð &ð &ðð ð ðð ð ðð ð ð	ð 	ð 	ðð ð ð Ôð(ð (ñ Ôð(ð Ôð'ð 'ñ Ôð'ð Ôð'ð 'ñ Ôð'ð Ôð'ð 'ñ Ôð'ð Ôð(ð (ñ Ôð(ð Ôð"ð "ñ Ôð"ð Ôð%ð %ñ Ôð%ð Ôð,ð ,ñ Ôð,ð Ôð1ð 1ñ Ôð1ð Ôð/ð /ñ Ôð/ð Ôð+ð +ñ Ôð+ð!ð !ð !ð!ð !ð !ð!ð !ð !ð2ð 2ð 2ðð ð ðFð Fð Fð ð  ð  ðð ð ð ð  ð  ðð ð ð ð4ð 4ð 4ð 4ð*ð ð ð ð:*ð *ð *ð *ð,ð ,ð ,ð'ð 'ð 'ð 'ð*ð *ð *ðð ð ðð ð ð0&ð &ð &ðPð ð ðð ð ð)ð )ð )ð )ðV:ð :ð :ðð ð ð*5ð 5ð 5ð 5ðnð ð ð$ð ð ð"ð "ð "ðH	ð 	ð 	ð.ð .ð .ð	ð 	ð 	ð&ð &ð &ð &ð &r   rC   c                   óÆ   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zdd„Zd„ Z	dd
„Z
d„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZeZeZeZeZeZeZeZeZd„ ZeZeZd„ Zd„ Z e Z!d„ Z"d„ Z#d„ Z$dS )ÚControlFlowAnalysiszæ
    Attributes
    ----------
    - bytecode

    - blocks

    - blockseq

    - doms: dict of set
        Dominators

    - backbone: set of block offsets
        The set of block that is common to all possible code path.

    c                 ó    — || _         i | _        i | _        g | _        d | _        d | _        d| _        d | _        g | _        g | _	        g | _
        d S ©NT)ÚbytecodeÚblocksÚ
liveblocksÚblockseqrþ   r–   Ú_force_new_blockÚ	_curblockÚ_blockstackrƒ   Ú_withs)r   r@  s     r   r   zControlFlowAnalysis.__init__ê  sU   € Ø ˆŒØˆŒØˆŒØˆŒØˆŒ	ØˆŒà $ˆÔØˆŒØˆÔØˆŒØˆŒˆˆr   c              #   ó<   K  — | j         D ]}| j        |         V — ŒdS )z=
        Return all blocks in sequence of occurrence
        N)rC  rA  ©r   rç   s     r   Ú
iterblockszControlFlowAnalysis.iterblocksø  s8   è è € ð ”ð 	!ð 	!ˆAØ”+˜a”.Ð Ð Ð Ð ð	!ð 	!r   c              #   óN   K  — | j         D ]}|| j        v r| j        |         V — ŒdS )zB
        Return all live blocks in sequence of occurrence
        N)rC  rB  rA  rI  s     r   Úiterliveblocksz"ControlFlowAnalysis.iterliveblocksÿ  sC   è è € ð ”ð 	%ð 	%ˆAØ�D”OÐ#Ð#Ø”k !”nÐ$Ð$Ð$øð	%ð 	%r   c              #   ó|   K  — |j                              ¦   «         D ]\  }}|| j        v r| j        |         |fV — Œ dS )zQ
        Yield (incoming block, number of stack pops) pairs for *block*.
        N)r   rA   rB  rA  )r   Úblockrç   Úpopss       r   Úincoming_blocksz#ControlFlowAnalysis.incoming_blocks  sY   è è € ð Ô+×1Ò1Ñ3Ô3ð 	+ð 	+‰GˆAˆtØ�D”OÐ#Ð#Ø”k !”n dÐ*Ð*Ð*Ð*øð	+ð 	+r   Nc                 ó<   — | j                              d ¬¦  «         d S )Nr®   )Úgraphr·   )r   r¯   s     r   r·   zControlFlowAnalysis.dump  s   € ØŒ
�Š˜TˆÑ"Ô"Ð"Ð"Ð"r   c                 óÄ  ‡ — ‰                       ¦   «         D ]}}d|j        z  }t          ‰ |d ¦  «        }|� ||¦  «         Œ+|j        rKt	          ‰ j        j        j        |j        ¦  «        }|j        dv rd}n
d|j        z  }t          ||¬¦  «        ‚Œ~t          ‰ j        ‰ j        dd …         ¦  «        D ]*\  }}‰ j        |         }|j        s|j        s
d|j        |<   Œ+t          ¦   «         }	‰ j        D ]}
|	                     |
¦  «         Œ‰ j                             ¦   «         D ]=}
|
j                             ¦   «         D ]!\  }}|	                     |
j        ||¦  «         Œ"Œ>|	                     t-          ‰ j        ¦  «        ¦  «         |	                     ¦   «          |	‰ _        ‰ j                             ¦   «         D ];}
|
j                             ¦   «         D ]\  }}|‰ j        |         j        |
j        <   Œ Œ<t5          ˆ fd„‰ j                             ¦   «         D ¦   «         ¦  «        ‰ _        t;          ‰ j        ¦  «        D ]}|‰ j        v r nŒt=          d	¦  «        ‚‰ j                             ¦   «         }tA          ¦   «         }‰ j         !                    ¦   «         D ]1}
‰ j         "                    |
¦  «        r| #                    |
¦  «         Œ2||z
  ‰ _        d S )
Nzop_%s>   ÚSETUP_FINALLYz2'try' block not supported until python3.7 or laterz$Use of unsupported opcode (%s) found)Úlocr­   r   c              3   ó6   •K  — | ]}|‰j         |         fV — Œd S r   )rA  )r=   rç   r   s     €r   rë   z*ControlFlowAnalysis.run.<locals>.<genexpr>:  sB   øè è € ð <ð <Ø#$ð !" 4¤;¨q¤>Ð2ð <ð <ð <ð <ð <ð <r   zNo live block that exits!?)$Ú
_iter_instÚopnamer7  Úis_jumpr   r@  Úfunc_idrº   Úlinenor   ÚziprC  rA  r   r   rC   rO   r  rA   rV   r   r\   Úminr`   rR  r   r  r£   rB  r§   ÚAssertionErrorr–   rE   Úkeysrž   rL   )r   ÚinstÚfnameÚfnÚlÚmsgÚcurÚnxtÚblkrR  r  ÚoutrO  Úlastblkr–   Úinloopblockss   `               r   ÚrunzControlFlowAnalysis.run  s+  ø€ Ø—O’OÑ%Ô%ð 	ð 	ˆDØ˜dœkÑ)ˆEÝ˜˜u dÑ+Ô+ˆBØˆ~Ø��4‘”��Ø”ð 
å˜œÔ-Ô6¸¼ÑDÔD�Ø”;Ð"3Ð3Ð3ØN�C�Cà@À4Ä;ÑN�CÝ& s°Ð2Ñ2Ô2Ð2ð õ ˜DœM¨4¬=¸¸¸Ô+<Ñ=Ô=ð 	,ð 	,‰HˆC�Ø”+˜cÔ"ˆCØÔ%ð ,¨c¬oð ,Ø*+�Ô" 3Ñ'øå‘	”	ˆØ”ð 	ð 	ˆAØ�NŠN˜1ÑÔÐÐØ”×#Ò#Ñ%Ô%ð 	4ð 	4ˆAØÔ-×3Ò3Ñ5Ô5ð 4ð 4‘	��TØ—’˜qœx¨¨dÑ3Ô3Ð3Ð3ð4à×Ò�c $¤+Ñ.Ô.Ñ/Ô/Ð/Ø�Š‰ŒˆØˆŒ
ð ”×#Ò#Ñ%Ô%ð 	Að 	AˆAØÔ-×3Ò3Ñ5Ô5ð Að A‘	��TØ<@�”˜CÔ Ô/°´Ñ9Ð9ðAõ ð <ð <ð <ð <Ø(,¬
×(8Ò(8Ñ(:Ô(:ð<ñ <ô <ñ <ô <ˆŒõ   ¤Ñ.Ô.ð 	?ð 	?ˆGØ˜$œ/Ð)Ð)Ø�ð *õ !Ð!=Ñ>Ô>Ð>ð ”:×&Ò&Ñ(Ô(ˆõ ‘u”uˆà”×!Ò!Ñ#Ô#ð 	$ð 	$ˆAØŒz×"Ò" 1Ñ%Ô%ð $Ø× Ò  Ñ#Ô#Ð#øà  <Ñ/ˆŒˆˆr   r   c                 ó$   — || j         j        |<   dS )z–
        Register a jump (conditional or not) to *target* offset.
        *pops* is the number of stack pops implied by the jump (default 0).
        N)rE  r   )r   ÚtargetrO  s      r   ÚjumpzControlFlowAnalysis.jumpP  s   € ð
 15ˆŒÔ% fÑ-Ð-Ð-r   c              #   óì   K  — | j         D ]i}|                      |¦  «        r*|                      |¦  «         |                      |¦  «         | j        j                             |j        ¦  «         |V — Œjd S r   )r@  Ú_use_new_blockÚ_guard_with_asÚ_start_new_blockrE  r   rÎ   r   ©r   r`  s     r   rW  zControlFlowAnalysis._iter_instW  s…   è è € Ø”Mð 	ð 	ˆDØ×"Ò" 4Ñ(Ô(ð ,Ø×#Ò# DÑ)Ô)Ð)Ø×%Ò% dÑ+Ô+Ð+ØŒNÔ×&Ò& t¤{Ñ3Ô3Ð3ØˆJˆJˆJˆJð	ð 	r   c                 óp   — |j         | j        j        v rd}n|j        t          v rd}n| j        }d| _        |S )NTF)r   r@  ÚlabelsrX  ÚNEW_BLOCKERSrD  )r   r`  Úress      r   rp  z"ControlFlowAnalysis._use_new_block_  sD   € ØŒ;˜$œ-Ô.Ð.Ð.ØˆCˆCØŒ[�LÐ(Ð(ØˆCˆCàÔ'ˆCà %ˆÔØˆ
r   c                 óž   — t          |j        ¦  «        | _        | j        | j        |j        <   | j                             |j        ¦  «         d S r   )r
   r   rE  rA  rC  rÎ   rs  s     r   rr  z$ControlFlowAnalysis._start_new_blockj  sA   € Ý  ¤Ñ-Ô-ˆŒØ#'¤>ˆŒ�D”KÑ ØŒ×Ò˜Tœ[Ñ)Ô)Ð)Ð)Ð)r   c                 ó|   — |j         dk    r.| j        |j                 j         }|dk    rd}t          |¦  «        ‚dS dS )zÞChecks if the next instruction after a SETUP_WITH is something other
        than a POP_TOP, if it is something else it'll be some sort of store
        which is not supported (this corresponds to `with CTXMGR as VAR(S)`).r   ÚPOP_TOPzGThe 'with (context manager) as (variable):' construct is not supported.N)rX  r@  Únextr   )r   Úcurrent_instÚnext_oprd  s       r   rq  z"ControlFlowAnalysis._guard_with_aso  sT   € ð Ô ,Ò.Ð.Ø”m LÔ$5Ô6Ô=ˆGØ˜)Ò#Ð#ð$�õ ' sÑ+Ô+Ð+ð /Ð.à#Ð#r   c                 óæ   — |                      ¦   «         }| j                             |¦  «         | j                             |j        |f¦  «         |                      |j        ¦  «         d| _        d S r?  )Úget_jump_targetrF  rÎ   rƒ   r   rn  r{  rD  ©r   r`  Úends      r   Úop_SETUP_LOOPz!ControlFlowAnalysis.op_SETUP_LOOP{  ók   € Ø×"Ò"Ñ$Ô$ˆØÔ×Ò Ñ$Ô$Ð$ØŒ×Ò˜DœK¨Ð-Ñ.Ô.Ð.ð 	�	Š	�$”)ÑÔÐØ $ˆÔÐÐr   c                 óæ   — |                      ¦   «         }| j                             |¦  «         | j                             |j        |f¦  «         |                      |j        ¦  «         d| _        d S r?  )r  rF  rÎ   rG  r   rn  r{  rD  r€  s      r   Úop_SETUP_WITHz!ControlFlowAnalysis.op_SETUP_WITH…  rƒ  r   c                 ó8   — | j                              ¦   «          d S r   )rF  rÇ   rs  s     r   Úop_POP_BLOCKz ControlFlowAnalysis.op_POP_BLOCK�  s   € ØÔ×ÒÑÔÐÐÐr   c                 ó–   — |                       |                     ¦   «         ¦  «         |                       |j        ¦  «         d| _        d S r?  ©rn  r  r{  rD  rs  s     r   Úop_FOR_ITERzControlFlowAnalysis.op_FOR_ITER’  óB   € Ø�	Š	�$×&Ò&Ñ(Ô(Ñ)Ô)Ð)Ø�	Š	�$”)ÑÔÐØ $ˆÔÐÐr   c                 ó–   — |                       |                     ¦   «         ¦  «         |                       |j        ¦  «         d| _        d S r?  r‰  rs  s     r   Ú_op_ABSOLUTE_JUMP_IFz(ControlFlowAnalysis._op_ABSOLUTE_JUMP_IF—  r‹  r   c                 óš   — |                       |                     ¦   «         ¦  «         |                       |j        d¬¦  «         d| _        d S )Nr­   )rO  Tr‰  rs  s     r   Ú_op_ABSOLUTE_JUMP_OR_POPz,ControlFlowAnalysis._op_ABSOLUTE_JUMP_OR_POP¦  sF   € Ø�	Š	�$×&Ò&Ñ(Ô(Ñ)Ô)Ð)Ø�	Š	�$”) !ˆ	Ñ$Ô$Ð$Ø $ˆÔÐÐr   c                 ób   — |                       |                     ¦   «         ¦  «         d| _        d S r?  ©rn  r  rD  rs  s     r   Úop_JUMP_ABSOLUTEz$ControlFlowAnalysis.op_JUMP_ABSOLUTE®  ó.   € Ø�	Š	�$×&Ò&Ñ(Ô(Ñ)Ô)Ð)Ø $ˆÔÐÐr   c                 ób   — |                       |                     ¦   «         ¦  «         d| _        d S r?  r‘  rs  s     r   Úop_JUMP_FORWARDz#ControlFlowAnalysis.op_JUMP_FORWARD²  r“  r   c                 ó,   — d| j         _        d| _        d S r?  ©rE  r   rD  rs  s     r   Úop_RETURN_VALUEz#ControlFlowAnalysis.op_RETURN_VALUE¸  ó   € Ø%)ˆŒÔ"Ø $ˆÔÐÐr   c                 ó,   — d| j         _        d| _        d S r?  r—  rs  s     r   Úop_RAISE_VARARGSz$ControlFlowAnalysis.op_RAISE_VARARGS¼  r™  r   c                 óT   — |                       | j        d         ¦  «         d| _        d S )Nr  T)rn  rF  rD  rs  s     r   Úop_BREAK_LOOPz!ControlFlowAnalysis.op_BREAK_LOOPÀ  s*   € Ø�	Š	�$Ô" 2Ô&Ñ'Ô'Ð'Ø $ˆÔÐÐr   r   )r   )%r   r   r    r-   r   rJ  rL  rP  r·   rk  rn  rW  rp  rr  rq  r‚  r…  r‡  rŠ  r�  Úop_POP_JUMP_IF_FALSEÚop_POP_JUMP_IF_TRUEÚop_JUMP_IF_FALSEÚop_JUMP_IF_TRUEÚop_POP_JUMP_FORWARD_IF_FALSEÚop_POP_JUMP_BACKWARD_IF_FALSEÚop_POP_JUMP_FORWARD_IF_TRUEÚop_POP_JUMP_BACKWARD_IF_TRUEr�  Úop_JUMP_IF_FALSE_OR_POPÚop_JUMP_IF_TRUE_OR_POPr’  r•  Úop_JUMP_BACKWARDr˜  r›  r�  r!   r   r   r=  r=  Ù  sº  € € € € € ðð ð ð ð ð!ð !ð !ð%ð %ð %ð+ð +ð +ð#ð #ð #ð #ð<0ð <0ð <0ð|5ð 5ð 5ð 5ðð ð ð	ð 	ð 	ð*ð *ð *ð

,ð 
,ð 
,ð%ð %ð %ð%ð %ð %ðð ð ð%ð %ð %ð
%ð %ð %ð
 0ÐØ.ÐØ+ÐØ*€Oà#7Ð Ø$8Ð!Ø"6ÐØ#7Ð ð%ð %ð %ð
 7ÐØ5Ðð%ð %ð %ð%ð %ð %ð 'Ðð%ð %ð %ð%ð %ð %ð%ð %ð %ð %ð %r   r=  )Úcollectionsrí   r³   Únumba.core.irr   Únumba.core.errorsr   Ú	frozensetrv  r
  r
   Ú
namedtupler#   Údefaultdictr2   rC   r=  r!   r   r   ú<module>r¯     s}  ðØ Ð Ð Ð Ø Ð Ð Ð Ø 
€
€
€
à Ð Ð Ð Ð Ð Ø .Ð .Ð .Ð .Ð .Ð .ð ˆyð ð ð ñ ô €ð
ð ð ð ð ˆfñ ô ð ð.!ð !ð !ð !ð !Ð!ˆ;Ô! &Ø"HñJô Jñ !ô !ð !ð(Að Að Að Að A˜Ô/ñ Aô Að Að2C
&ð C
&ð C
&ð C
&ð C
&ˆfñ C
&ô C
&ð C
&ðLi%ð i%ð i%ð i%ð i%˜&ñ i%ô i%ð i%ð i%ð i%r   