§
    1@ÄjÀ‚  ã                   óT  — d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ edv r e	g d¢¦  «        Z
nedv r e	g d¢¦  «        Z
n ee¦  «        ‚ 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)Ú	PYVERSION)©é   é   ©r   é   )Ú
SETUP_LOOPÚFOR_ITERÚ
SETUP_WITHÚBEFORE_WITHÚLOAD_SPECIAL)©r   é
   ©r   é   ©r   é   ©r   é   )r   r   r   r   c                   ó    — 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     úGC:\Projects\Historical\venv\Lib\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.
    r0   c                 óL   — t          |t          ¦  «        o|j        | j        k    S r)   )Ú
isinstancer2   Úheader©r    Úothers     r!   Ú__eq__zLoop.__eq__;   s    € Ý˜%¥Ñ&Ô&ÐF¨5¬<¸4¼;Ò+FÐFr#   c                 ó*   — t          | j        ¦  «        S r)   )Úhashr5   r+   s    r!   Ú__hash__zLoop.__hash__>   s   € Ý�D”KÑ Ô Ð r#   N)r-   r.   r/   Ú__doc__Ú	__slots__r8   r;   r0   r#   r!   r2   r2   .   sF   € € € € € ðð ð €IðGð Gð Gð!ð !ð !ð !ð !r#   r2   )ÚentriesÚexitsr5   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)   )r4   rA   Ú_non_empty_itemsÚNotImplemented)r    r7   ÚmineÚtheirss       r!   r8   z_DictOfContainers.__eq__H   sG   € Ý�eÕ.Ñ/Ô/ð 	"Ø×(Ò(Ñ*Ô*ˆDØ×+Ò+Ñ-Ô-ˆFØ˜6’>Ð!åÐr#   c                 óH   — |                       |¦  «        }|t          u r|S | S r)   )r8   rD   )r    r7   Úrets      r!   Ú__ne__z_DictOfContainers.__ne__P   s*   € Ø�kŠk˜%Ñ Ô ˆØ•.Ð Ð ØˆJà�7ˆNr#   c                 óX   — d„ t          |                      ¦   «         ¦  «        D ¦   «         S )Nc                 ó    — g | ]\  }}|¯||f‘ŒS r0   r0   )Ú.0ÚkÚvss      r!   ú
<listcomp>z6_DictOfContainers._non_empty_items.<locals>.<listcomp>X   s%   € Ð@Ð@Ð@™E˜A˜r¸RÐ@��B�Ð@Ð@Ð@r#   )r%   Úitemsr+   s    r!   rC   z"_DictOfContainers._non_empty_itemsW   s&   € Ø@Ð@¥V¨D¯JªJ©L¬LÑ%9Ô%9Ð@Ñ@Ô@Ð@r#   N)r-   r.   r/   r<   r8   rI   rC   r0   r#   r!   rA   rA   B   sP   € € € € € ðð ð
ð ð ðð ð ðAð Að Að Að Ar#   rA   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@d-„Z.d.„ Z/	 	 	 	 dAd/„Z0d0„ Z1d1„ Z2d2„ Z3d3„ Z4d4„ Z5d@d5„Z6d6„ Z7d7„ Z8d8„ Z9d9„ Z:d:„ Z;d;„ Z<d<„ Z=dS )BÚCFGraphzB
    Generic (almost) implementation of a Control Flow Graph.
    c                 ó¬   — t          ¦   «         | _        t          t           ¦  «        | _        t          t           ¦  «        | _        i | _        d | _        d S r)   )ÚsetÚ_nodesrA   Ú_predsÚ_succsÚ
_edge_dataÚ_entry_pointr+   s    r!   r"   zCFGraph.__init__`   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)rU   Úadd©r    Únodes     r!   Úadd_nodezCFGraph.add_nodeg   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)rU   Ú
ValueErrorÚ	_add_edge)r    ÚsrcÚdestÚdatas       r!   Úadd_edgezCFGraph.add_edgen   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)rW   rX   )r    rb   rc   s      r!   Ú
successorszCFGraph.successors}   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)rV   rX   )r    rc   rb   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)rU   rY   r\   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!)rY   Ú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±   rs   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!   rq   zCFGraph._domsÒ   ó   € à×$Ò$Ñ&Ô&Ð&r#   c                 ó*   — |                       ¦   «         S r)   )Ú_find_back_edgesr+   s    r!   Ú_back_edgeszCFGraph._back_edgesÖ   r†   r#   c                 ó*   — |                       ¦   «         S r)   )Ú_find_topo_orderr+   s    r!   Ú_topo_orderzCFGraph._topo_orderÚ   r†   r#   c                 ó*   — |                       ¦   «         S r)   )Ú_find_descendentsr+   s    r!   Ú_descszCFGraph._descsÞ   rƒ   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!   ru   zCFGraph._post_domsê   s   € à×)Ò)Ñ+Ô+Ð+r#   c                 ó*   — |                       ¦   «         S r)   )Ú_find_immediate_dominatorsr+   s    r!   rx   zCFGraph._idomî   s   € à×.Ò.Ñ0Ô0Ð0r#   c                 ó*   — |                       ¦   «         S r)   )Ú_find_dominance_frontierr+   s    r!   r{   zCFGraph._dfò   s   € à×,Ò,Ñ.Ô.Ð.r#   c                 ó*   — |                       ¦   «         S r)   )Ú_find_dominator_treer+   s    r!   r~   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�   r\   s     r!   ÚdescendentszCFGraph.descendentsú   s   € ð
 Œ{˜4Ô Ð r#   c                 ó"   — | j         €J ‚| j         S )z.
        Return the entry point node.
        )rY   r+   s    r!   Úentry_pointzCFGraph.entry_point  s   € ð Ô Ð,Ð,Ð,ØÔ Ð r#   c                 ó   — | j         S )zG
        Return the computed set of exit nodes (may be empty).
        )r‚   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.
        )ru   rY   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 r0   r§   )rL   Úxr    s     €r!   rO   z$CFGraph.in_loops.<locals>.<listcomp>#  s   ø€ ÐEÐEÐE 1�”˜A”ÐEÐEÐEr#   r0   )r•   Úgetr\   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.
        )rU   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_order1  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)rT   rŒ   Úreversed)r    r²   ÚreverseÚitÚns        r!   Ú	topo_sortzCFGraph.topo_sort8  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_listsrq   ru   r%   r‰   r’   r•   r¥   )r    r¾   rÁ   s      r!   ÚdumpzCFGraph.dumpE  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ÚDigraphrU   r]   ÚstrrW   Úedge)r    rÉ   ÚgvÚgr¹   rÎ   s         r!   Ú
render_dotzCFGraph.render_dotZ  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)   )rV   r[   rW   rX   )r    Úfrom_Útord   s       r!   ra   zCFGraph._add_edgew  sO   € ð 	Œ�BŒ×Ò˜EÑ"Ô"Ð"ØŒ�EÔ×Ò˜rÑ"Ô"Ð"Ø%)ˆŒ˜˜r˜	Ñ"Ð"Ð"r#   c                 ó&  — | j                              |d¦  «        D ],}| j        |                              |¦  «         | j        ||f= Œ-| j                             |d¦  «        D ],}| j         |                              |¦  «         | j        ||f= Œ-d S )Nr0   )rW   ÚpoprV   ÚremoverX   )r    r]   ÚsuccÚpreds       r!   Ú_remove_node_edgeszCFGraph._remove_node_edges~  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)   )rY   rT   ÚlistrÖ   r[   rW   Úappend)r    r>   ÚseenÚstackr]   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)rT   rà   r[   rU   r¯   rÚ   )r    Úliver]   Údeads       r!   rn   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.
        )rT   rU   rW   r¬   r[   )r    r£   r¹   s      r!   r�   zCFGraph._find_exit_points¡  sM   € õ ‘e”eˆØ”ð 	#ð 	#ˆAØ”;—?’? 1Ñ%Ô%ð #Ø—’ Ñ"Ô"Ð"øØÐr#   c                 ó¨  — |€| j         }|€| j        }|€| j        }t          g ¦  «        }g }|                     |¦  «         |dfg}|r‰|                     ¦   «         \  }}|r|                     |¦  «         Œ1|                     |df¦  «         ||         D ]8}	||	f|vr0|	|vr,|                     |	¦  «         |                     |	df¦  «         Œ9|°‰|S )NFT)rW   r‰   rY   rT   r[   rÖ   rÝ   )
r    ÚsuccsÚ
back_edgesr¡   rÞ   Ú	postorderrß   r]   Úchildren_pushedÚchilds
             r!   Ú_find_postorderzCFGraph._find_postorder«  s  € Øˆ=Ø”KˆEØÐØÔ)ˆJØÐØÔ+ˆKÝ�2‰wŒwˆØˆ	à�Š�ÑÔÐØ˜uÐ%Ð&ˆàð 	1Ø$)§I¢I¡K¤KÑ!ˆD�/àð Ø× Ò  Ñ&Ô&Ð&Øð
 �LŠL˜$ ˜Ñ&Ô&Ð&Ø˜tœð 1ð 1�Ø˜%�=¨
Ð2Ð2°uÀDÐ7HÐ7HØ—H’H˜U‘O”O�OØ—L’L %¨ Ñ0Ô0Ð0øð ð 	1ð  Ðr#   c                 ó^   — t          t          |                      ¦   «         ¦  «        ¦  «        S r)   )rÜ   r¶   rë   r+   s    r!   Ú_find_reverse_postorderzCFGraph._find_reverse_postorderÊ  s$   € Ý•H˜T×1Ò1Ñ3Ô3Ñ4Ô4Ñ5Ô5Ð5r#   c                 óº  ‡‡— ˆˆfd„}|€| j         }n|}|€| j        }n|}|                      |€| j        n||€| j        n||¬¦  «        }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)   r0   )Ú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#   )ræ   rç   r¡   c                 ó   — i | ]\  }}||“Œ	S r0   r0   )rL   Ú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)   r0   )rL   rñ   rò   s     €r!   ú	<genexpr>z5CFGraph._find_immediate_dominators.<locals>.<genexpr>ý  s4   øè è € ð -;ð -;°1Ø01°T°	°	ð ./Ø09°	°	°	ð-;ð -;r#   )
rV   rY   rë   rW   r‰   Ú	enumeraterÖ   r·   Ú	functoolsÚreduce)r    Úpredsr¡   ræ   rç   rô   Úpreds_tableÚentryÚorderÚchangedrð   Únew_idomrò   ró   s               @@r!   r™   z"CFGraph._find_immediate_dominatorsÍ  s]  øø€ ð 	ð 	ð 	ð 	ð 	ð 	ð ˆ=Øœ+ˆKˆKàˆKØÐØÔ%ˆEˆEàˆEà×$Ò$Ø!& �$”+�+°EØ+5Ð+=�tÔ'Ð'À:Øð %ñ 
ô 
ˆð
 2Ð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)   )rx   rA   rT   rP   r[   )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 r0   )rT   )rL   rð   s     r!   rø   z4CFGraph._find_dominance_frontier.<locals>.<dictcomp>  s   € Ð%Ð%Ð%˜1ˆa•‘”Ð%Ð%Ð%r#   é   )rx   rV   Úlenr[   )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                 óÐ  — |€| j         }i }t          |                     ¦   «         ¦  «        }|r·|d         }||v r|                     ¦   «          n”||         }||vrD||k    r(t	          |g¦  «        ||<   |                     ¦   «          nZ|                     |¦  «         nDt	          |g¦  «        }|                     ||         ¦  «         |||<   |                     ¦   «          |°·|S )Néÿÿÿÿ)rx   rÜ   ÚkeysrÖ   rT   rÝ   Úupdate)r    Úimmediate_domsÚresultrß   r]   Ú
other_nodeÚdomss          r!   Ú$_find_dominators_from_immediate_domsz,CFGraph._find_dominators_from_immediate_doms!  sú   € ð Ð!Ø!œZˆNàˆÝ�^×(Ò(Ñ*Ô*Ñ+Ô+ˆØð 	 Ø˜”9ˆDØ�vˆ~ˆ~Ø—	’	‘”��à+¨DÔ1�
Ø VÐ+Ð+Ø! TÒ)Ð)å'*¨D¨6¡{¤{˜˜t™ØŸ	š	™œ˜˜àŸš ZÑ0Ô0Ð0Ð0õ  ˜v™;œ;�DØ—K’K  zÔ 2Ñ3Ô3Ð3Ø#'�F˜4‘LØ—I’I‘K”K�Kð% ð 	 ð& ˆr#   c                 ó6   — |                       | j        ¦  «        S r)   )r  rx   r+   s    r!   r…   zCFGraph._find_dominatorsA  s   € Ø×8Ò8¸¼ÑDÔDÐDr#   c                 ó  — t          ¦   «         }| j        D ]}|                      ||¦  «         Œ| j                             ¦   «         D ])}|j        s |j        D ]}|                      ||¦  «         ŒŒ*|                      || j        ¬¦  «        }|  	                    || j
        | j        |¬¦  «        }|                      |¦  «        }||= |                     ¦   «         D ]}|                     |¦  «         Œ|                      |¦  «         |S )N)r¡   ræ   )r¡   rþ   ræ   rç   )Úobjectr‚   ra   r’   Úvaluesr?   r   rˆ   rV   r™   rW   r  ÚdiscardrÚ   )	r    Ú
dummy_exitÚexitÚloopÚbÚreversed_back_edgesÚim_pdomsÚpdomsr  s	            r!   r—   zCFGraph._find_post_dominatorsD  s;  € õ
 ‘X”Xˆ
ØÔ%ð 	-ð 	-ˆDØ�NŠN˜4 Ñ,Ô,Ð,Ð,Ø”K×&Ò&Ñ(Ô(ð 	2ð 	2ˆDØ”:ð 2Øœð 2ð 2�AØ—N’N 1 jÑ1Ô1Ð1Ð1øð #×3Ò3Ø"Ø”+ð 4ñ 
ô 
Ðð ×2Ò2Ø"Ø”+Ø”+Ø*ð	 3ñ 
ô 
ˆð ×9Ò9¸(ÑCÔCˆð �*ÐØ—L’L‘N”Nð 	%ð 	%ˆDØ�LŠL˜Ñ$Ô$Ð$Ð$Ø×Ò 
Ñ+Ô+Ð+Øˆr#   c                 óÀ  ‡‡‡‡— |�Jt          |t          ¦  «        st          dt          |¦  «        › �¦  «        ‚|                     dd¦  «         |€|                      ¦   «         }‰€| j        Št          ¦   «         }g Št          ¦   «         Ši Št          ¦   «         }ˆˆˆˆfd„} ||¦  «         d}‰r—|dz  }‰d         }‰|         }	|	r@|	                     ¦   «         }
|
‰v r| 	                    ||
f¦  «         nN|
|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                 ó†   •— ‰                      | ¦  «         ‰                     | ¦  «         d„ ‰|          D ¦   «         ‰| <   d S )Nc                 ó   — g | ]}|‘ŒS r0   r0   )rL   rc   s     r!   rO   z@CFGraph._find_back_edges.<locals>.push_state.<locals>.<listcomp>‡  s   € Ð >Ð >Ð >¨$ Ð >Ð >Ð >r#   )rÝ   r[   )r]   Úon_stackrß   ræ   Úsuccs_states    €€€€r!   Ú
push_statez,CFGraph._find_back_edges.<locals>.push_state„  sI   ø€ Ø�LŠL˜ÑÔÐØ�LŠL˜ÑÔÐØ >Ð >°%¸´+Ð >Ñ >Ô >ˆK˜ÑÐÐr#   r¼   r  )r4   ÚdictÚ	TypeErrorÚtypeÚ
setdefaultr¡   rW   rT   rÖ   r[   r×   )r    Ústatsr¡   ræ   rç   Úcheckedr&  Úiter_ctÚtosÚ	tos_succsÚcur_noder$  rß   r%  s      `       @@@r!   rˆ   zCFGraph._find_back_edgesh  sÁ  øøøø€ ð ÐÝ˜e¥TÑ*Ô*ð NÝÐ L½tÀE¹{¼{Ð LÐ LÑMÔMÐMØ×ÒÐ.°Ñ2Ô2Ð2àÐØ×*Ò*Ñ,Ô,ˆKØˆ=Ø”KˆEõ
 ‘U”Uˆ
àˆÝ‘5”5ˆàˆå‘%”%ˆð	?ð 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð
 	ˆ
�;ÑÔÐð ˆØð 	!Ø�q‰LˆGØ˜”)ˆCØ# CÔ(ˆIàð !à$Ÿ=š=™?œ?�à˜xÐ'Ð'à—N’N C¨ ?Ñ3Ô3Ð3Ð3Ø WÐ,Ð,à�J˜xÑ(Ô(Ð(øð —	’	‘”�Ø—’ Ñ$Ô$Ð$Ø—’˜CÑ Ô Ð ð' ð 	!ð* ÐØÐ#Ð$Ð$Ô$¨Ñ/Ð$Ð$Ñ$ØÐr#   c                 ó*   — |                       ¦   «         S r)   )rí   r+   s    r!   r‹   zCFGraph._find_topo_order¦  s   € Ø×+Ò+Ñ-Ô-Ð-r#   c                 óô   — i }t          | j        ¦  «        D ]`}t          ¦   «         x||<   }| j        |         D ]=}||f| j        vr0|                     |¦  «         |                     ||         ¦  «         Œ>Œa|S r)   )r¶   rŒ   rT   rW   r‰   r[   r  )r    Údescsr]   Ú
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.
        )r5   r   r>   r?   )
r‰   rT   rÖ   r[   ÚextendrV   r  rP   rW   r2   )r    Úbodiesrb   rc   r5   r   Úqueuer¹   r¨   r>   r?   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)   r0   )rL   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'  rU   r%   r  r   rÝ   r5   )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Ü   )rL   rb   Údestss      r!   rú   z*CFGraph._dump_adj_lists.<locals>.<genexpr>ã  sU   è è € ð @ð @Ù'˜S %ð �v¥d¨5¡k¤kÑ2Ô2Ð3ð @ð @ð @ð @ð @ð @r#   r   r¿   )r'  rW   rP   rÁ   )r    r¾   Ú	adj_listsrÁ   s       r!   rÅ   zCFGraph._dump_adj_listsâ  sg   € Ýð @ð @Ø+/¬;×+<Ò+<Ñ+>Ô+>ð@ñ @ô @ñ @ô @ˆ	àˆˆˆØ�Š�i¨ˆÑ-Ô-Ð-Ð-Ð-r#   c                 óž   — t          |t          ¦  «        st          S dD ]-}t          | |d ¦  «        }t          ||d ¦  «        }||k    r dS Œ.dS )N)rU   rX   rY   rV   rW   FT)r4   rR   rD   Úgetattr)r    r7   r«   ÚthisÚthats        r!   r8   zCFGraph.__eq__è  se   € Ý˜%¥Ñ)Ô)ð 	"Ý!Ð!àMð 	ð 	ˆAÝ˜4  DÑ)Ô)ˆDÝ˜5 ! TÑ*Ô*ˆDØ�tŠ|ˆ|Ø�u�uð àˆtr#   c                 ó.   — |                       |¦  «         S r)   )r8   r6   s     r!   rI   zCFGraph.__ne__ó  s   € Ø—;’;˜uÑ%Ô%Ð%Ð%r#   r)   )F)rÇ   )NNN)NNNN)>r-   r.   r/   r<   r"   r^   re   rg   ri   rk   ro   rr   rv   ry   r|   r   rü   Úcached_propertyr‚   rq   r‰   rŒ   r�   r’   r•   ru   rx   r{   r~   rŸ   r¡   r£   r¥   r¨   r­   r°   r²   r´   rº   rÆ   rÑ   ra   rÚ   rà   rn   r�   rë   rí   r™   r�   r›   r  r…   r—   rˆ   r‹   rŽ   r‘   r”   rÅ   r8   rI   r0   r#   r!   rR   rR   [   s\  € € € € € ðð ð!ð !ð !ðð ð ð(ð (ð (ð (ð3ð 3ð 3ð2ð 2ð 2ð!ð !ð !ð&ð &ð &ðð ð ðð ð ðð ð ð	ð 	ð 	ðð ð ð Ôð(ð (ñ Ôð(ð Ôð'ð 'ñ Ôð'ð Ôð'ð 'ñ Ôð'ð Ôð'ð 'ñ Ôð'ð Ôð(ð (ñ Ôð(ð Ôð"ð "ñ Ôð"ð Ôð%ð %ñ Ôð%ð Ôð,ð ,ñ Ôð,ð Ôð1ð 1ñ Ôð1ð Ôð/ð /ñ Ôð/ð Ôð+ð +ñ Ôð+ð!ð !ð !ð!ð !ð !ð!ð !ð !ð2ð 2ð 2ðð ð ðFð Fð Fð ð  ð  ðð ð ð ð  ð  ðð ð ð ð4ð 4ð 4ð 4ð*ð ð ð ð:*ð *ð *ð *ð,ð ,ð ,ð'ð 'ð 'ð 'ð*ð *ð *ðð ð ðð ð ð ð>6ð 6ð 6ð
 ØØØð6ð 6ð 6ð 6ðpð ð ðð ð ðð ð ð@Eð Eð Eðð ð ðH<ð <ð <ð <ð|.ð .ð .ðð ð ð"ð "ð "ðH	ð 	ð 	ð.ð .ð .ð	ð 	ð 	ð&ð &ð &ð &ð &r#   rR   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"e#dv rd„ Z$ne#dv rn e%e#¦  «        ‚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    rL  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)rO  rM  ©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)rO  rN  rM  rU  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   rP   rN  rM  )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)   )rM  )rL   rö   r    s     €r!   rú   z*ControlFlowAnalysis.run.<locals>.<genexpr>X  sB   øè è € ð <ð <Ø#$ð !" 4¤;¨q¤>Ð2ð <ð <ð <ð <ð <ð <r#   zNo live block that exits!?)$Ú
_iter_instÚopnamerC  Úis_jumpr   rL  Úfunc_idrÉ   Úlinenor   ÚziprO  rM  r   r   rR   r^   r  rP   re   r   rk   Úminro   r^  r   r'  r²   rN  r¶   ÚAssertionErrorr¥   rT   r  r­   r[   )r    ÚinstÚfnameÚfnÚlÚmsgÚcurÚnxtÚblkr^  r  Úoutr[  Úlastblkr¥   Úinloopblockss   `               r!   ÚrunzControlFlowAnalysis.run0  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)rQ  r   )r    Útargetr[  s      r!   ÚjumpzControlFlowAnalysis.jumpn  s   € ð
 15ˆŒÔ% fÑ-Ð-Ð-r#   c              #   óì   K  — | j         D ]i}|                      |¦  «        r*|                      |¦  «         |                      |¦  «         | j        j                             |j        ¦  «         |V — Œjd S r)   )rL  Ú_use_new_blockÚ_guard_with_asÚ_start_new_blockrQ  r   rÝ   r   ©r    rk  s     r!   rc  zControlFlowAnalysis._iter_instu  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   rL  Úlabelsrd  ÚNEW_BLOCKERSrP  )r    rk  Úress      r!   r{  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   rQ  rM  rO  rÝ   r~  s     r!   r}  z$ControlFlowAnalysis._start_new_blockˆ  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)rd  rL  Únextr   )r    Úcurrent_instÚnext_opro  s       r!   r|  z"ControlFlowAnalysis._guard_with_as�  sT   € ð Ô ,Ò.Ð.Ø”m LÔ$5Ô6Ô=ˆGØ˜)Ò#Ð#ð$�õ ' sÑ+Ô+Ð+ð /Ð.à#Ð#r#   c                 óæ   — |                      ¦   «         }| j                             |¦  «         | j                             |j        |f¦  «         |                      |j        ¦  «         d| _        d S rK  )Úget_jump_targetrR  rÝ   r’   r   ry  r†  rP  ©r    rk  Úends      r!   Úop_SETUP_LOOPz!ControlFlowAnalysis.op_SETUP_LOOP™  ók   € Ø×"Ò"Ñ$Ô$ˆØÔ×Ò Ñ$Ô$Ð$ØŒ×Ò˜DœK¨Ð-Ñ.Ô.Ð.ð 	�	Š	�$”)ÑÔÐØ $ˆÔÐÐr#   c                 óæ   — |                      ¦   «         }| j                             |¦  «         | j                             |j        |f¦  «         |                      |j        ¦  «         d| _        d S rK  )rŠ  rR  rÝ   rS  r   ry  r†  rP  r‹  s      r!   Úop_SETUP_WITHz!ControlFlowAnalysis.op_SETUP_WITH£  rŽ  r#   c                 ó8   — | j                              ¦   «          d S r)   )rR  rÖ   r~  s     r!   Úop_POP_BLOCKz ControlFlowAnalysis.op_POP_BLOCK­  s   € ØÔ×ÒÑÔÐÐÐr#   c                 ó–   — |                       |                     ¦   «         ¦  «         |                       |j        ¦  «         d| _        d S rK  ©ry  rŠ  r†  rP  r~  s     r!   Úop_FOR_ITERzControlFlowAnalysis.op_FOR_ITER°  óB   € Ø�	Š	�$×&Ò&Ñ(Ô(Ñ)Ô)Ð)Ø�	Š	�$”)ÑÔÐØ $ˆÔÐÐr#   c                 ó–   — |                       |                     ¦   «         ¦  «         |                       |j        ¦  «         d| _        d S rK  r”  r~  s     r!   Ú_op_ABSOLUTE_JUMP_IFz(ControlFlowAnalysis._op_ABSOLUTE_JUMP_IFµ  r–  r#   c                 óš   — |                       |                     ¦   «         ¦  «         |                       |j        d¬¦  «         d| _        d S )Nr¼   )r[  Tr”  r~  s     r!   Ú_op_ABSOLUTE_JUMP_OR_POPz,ControlFlowAnalysis._op_ABSOLUTE_JUMP_OR_POPÄ  sF   € Ø�	Š	�$×&Ò&Ñ(Ô(Ñ)Ô)Ð)Ø�	Š	�$”) !ˆ	Ñ$Ô$Ð$Ø $ˆÔÐÐr#   c                 ób   — |                       |                     ¦   «         ¦  «         d| _        d S rK  ©ry  rŠ  rP  r~  s     r!   Úop_JUMP_ABSOLUTEz$ControlFlowAnalysis.op_JUMP_ABSOLUTEÌ  ó.   € Ø�	Š	�$×&Ò&Ñ(Ô(Ñ)Ô)Ð)Ø $ˆÔÐÐr#   c                 ób   — |                       |                     ¦   «         ¦  «         d| _        d S rK  rœ  r~  s     r!   Úop_JUMP_FORWARDz#ControlFlowAnalysis.op_JUMP_FORWARDÐ  rž  r#   c                 ó,   — d| j         _        d| _        d S rK  ©rQ  r   rP  r~  s     r!   Úop_RETURN_VALUEz#ControlFlowAnalysis.op_RETURN_VALUEÖ  ó   € Ø%)ˆŒÔ"Ø $ˆÔÐÐr#   )r   r   r   r	   c                 ó,   — d| j         _        d| _        d S rK  r¢  r~  s     r!   Úop_RETURN_CONSTz#ControlFlowAnalysis.op_RETURN_CONSTÛ  s   € Ø)-ˆDŒNÔ&Ø$(ˆDÔ!Ð!Ð!r#   )r   r   c                 ó,   — d| j         _        d| _        d S rK  r¢  r~  s     r!   Úop_RAISE_VARARGSz$ControlFlowAnalysis.op_RAISE_VARARGSã  r¤  r#   c                 óT   — |                       | j        d         ¦  «         d| _        d S )Nr  T)ry  rR  rP  r~  s     r!   Úop_BREAK_LOOPz!ControlFlowAnalysis.op_BREAK_LOOPç  s*   € Ø�	Š	�$Ô" 2Ô&Ñ'Ô'Ð'Ø $ˆÔÐÐr#   r)   )r   )(r-   r.   r/   r<   r"   rV  rX  r\  rÆ   rv  ry  rc  r{  r}  r|  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¦  ÚNotImplementedErrorr¨  rª  r0   r#   r!   rI  rI  ÷  sþ  € € € € € ðð ð ð ð ð!ð !ð !ð%ð %ð %ð+ð +ð +ð#ð #ð #ð #ð<0ð <0ð <0ð|5ð 5ð 5ð 5ðð ð ð	ð 	ð 	ð*ð *ð *ð

,ð 
,ð 
,ð%ð %ð %ð%ð %ð %ðð ð ð%ð %ð %ð
%ð %ð %ð
 0ÐØ.ÐØ+ÐØ*€Oà#7Ð Ø$8Ð!Ø"6ÐØ#7Ð ð%ð %ð %ð
 7ÐØ5Ðð%ð %ð %ð%ð %ð %ð 'Ðð%ð %ð %ð Ð8Ð8Ð8ð	)ð 	)ð 	)ð 	)ð 
Ð(Ð	(Ð	(Øà!Ð! )Ñ,Ô,Ð,ð%ð %ð %ð%ð %ð %ð %ð %r#   rI  )Úcollectionsrü   rÂ   Únumba.core.irr   Únumba.core.errorsr   Únumba.core.utilsr   Ú	frozensetr�  r¶  r  r   Ú
namedtupler2   ÚdefaultdictrA   rR   rI  r0   r#   r!   ú<module>r¾     sà  ðØ Ð Ð Ð Ø Ð Ð Ð Ø 
€
€
€
à Ð Ð Ð Ð Ð Ø .Ð .Ð .Ð .Ð .Ð .Ø &Ð &Ð &Ð &Ð &Ð &ð Ð"Ð"Ð"Ø�9ð ð ð ñ ô €L€Lð Ð6Ð6Ð6Ø�9ð ð ð ñ ô €L€Lð Ð
˜iÑ
(Ô
(Ð(ðð ð ð ð ˆfñ ô ð ð.!ð !ð !ð !ð !Ð!ˆ;Ô! &Ø"HñJô Jñ !ô !ð !ð(Að Að Að Að A˜Ô/ñ Aô Að Að2Y
&ð Y
&ð Y
&ð Y
&ð Y
&ˆfñ Y
&ô Y
&ð Y
&ðxr%ð r%ð r%ð r%ð r%˜&ñ r%ô r%ð r%ð r%ð r%r#   