
    i             	          S SK r \ R                  " Sw0 S\_S\_S\_S\_S\_S\_S\_S	\_S
\_S\_S\_S\_S\_S\_S\_S\_6  S SKrS SKrS SKrS SKJr  SSKJ	r	  SSKJ
r
  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJrJr  SSKJrJrJr  SSKJrJr  SSKJr  SS KJr  SS!KJrJrJrJ r    " S" S#5      r! " S$ S%\5      r" " S& S'\5      r#S(r$S)r%S*r& " S+ S,\5      r' " S- S.\5      r( " S/ S0\5      r)S1 r*S2 r+S3 r,\ RZ                  S4\.S5\.4S6 j5       r/\ RZ                  S7\.S8\.S9\.S:\.4S; j5       r0 " S< S=\\!5      r1 " S> S?\\!5      r2 " S@ SA\5      r3 " SB SC\\!5      r4 " SD SE\\!5      r5 " SF SG\\!5      r6 " SH SI\\!5      r7 " SJ SK\\!5      r8 " SL SM\\!5      r9 " SN SO\5      r: " SP SQ\5      r;SR r< " SS ST\5      r= " SU SV\5      r> " SW SX\5      r? " SY SZ\5      r@ " S[ S\\\!5      rA " S] S^\5      rB " S_ S`\5      rC " Sa Sb\5      rD " Sc Sd\5      rE " Se Sf\5      rF " Sg Sh\5      rG " Si Sj\\!5      rH " Sk Sl\5      rI " Sm Sn\\!5      rJ " So Sp\5      rK " Sq Sr\5      rL " Ss St\5      rM " Su Sv\5      rNg)x    N
PyrexTypesNaming	ExprNodesNodesOptions	UtilNodesLetNode
LetRefNodeTreeFragmentEncodedStringerrorwarningcopyhashlibsys
itemgetter)r      )Code)r   )r   )r   )r   )r   )Builtin)Errors)VisitorTransformTreeVisitor)CythonTransformEnvTransformScopeTrackingTransform)r	   r
   )r   )r   )r   r   CompileErrorInternalErrorc                   B    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
rg)SkipDeclarations   a  
Variable and function declarations can often have a deep tree structure,
and yet most transformations don't need to descend to this depth.

Declaration nodes are removed after AnalyseDeclarationsTransform, so there
is no need to use this for transformations after that point.
c                     U$ N selfnodes     c/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/Cython/Compiler/ParseTreeTransforms.pyvisit_CTypeDefNode#SkipDeclarations.visit_CTypeDefNode&           c                     U$ r"   r#   r$   s     r'   visit_CVarDefNode"SkipDeclarations.visit_CVarDefNode)   r*   r+   c                     U$ r"   r#   r$   s     r'   visit_CDeclaratorNode&SkipDeclarations.visit_CDeclaratorNode,   r*   r+   c                     U$ r"   r#   r$   s     r'   visit_CBaseTypeNode$SkipDeclarations.visit_CBaseTypeNode/   r*   r+   c                     U$ r"   r#   r$   s     r'   visit_CEnumDefNode#SkipDeclarations.visit_CEnumDefNode2   r*   r+   c                     U$ r"   r#   r$   s     r'   visit_CStructOrUnionDefNode,SkipDeclarations.visit_CStructOrUnionDefNode5   r*   r+   c                 H    UR                   S:w  a  U R                  U5        U$ Nextern)
visibilityvisitchildrenr$   s     r'   visit_CppClassNode#SkipDeclarations.visit_CppClassNode8   s!    ??h&t$r+   r#   N)__name__
__module____qualname____firstlineno____doc__r(   r-   r0   r3   r6   r9   r@   __static_attributes__r#   r+   r'   r   r      s*    r+   r   c                   f   ^  \ rS rSrSrU 4S jrS rS rSS jrS r	S r
S	 rS
 rS rS rSrU =r$ )NormalizeTree?   a\  
    This transform fixes up a few things after parsing
    in order to make the parse tree more suitable for
    transforms.

    a) After parsing, blocks with only one statement will
    be represented by that statement, not by a StatListNode.
    When doing transforms this is annoying and inconsistent,
    as one cannot in general remove a statement in a consistent
    way and so on. This transform wraps any single statements
    in a StatListNode containing a single statement.

    b) The PassStatNode is a noop and serves no purpose beyond
    plugging such one-statement blocks; i.e., once parsed a
`    "pass" can just as well be represented using an empty
    StatListNode. This means less special cases to worry about
    in subsequent transforms (one always checks to see if a
    StatListNode has no children to see if the block is empty).
    c                 @   > [         TU ]  U5        SU l        SU l        g NF)super__init__is_in_statlist
is_in_exprr%   context	__class__s     r'   rN   NormalizeTree.__init__T   s    !#r+   c                     U R                  U5        [        UR                  [        R                  5      (       d/  [        R                  " UR
                  UR                  /S9Ul        U$ Nposstats)r?   
isinstancebodyr   StatListNoderX   r$   s     r'   visit_ModuleNodeNormalizeTree.visit_ModuleNodeY   sJ    4 $))U%7%788**txx		{KDIr+   c                 Z    U R                   nSU l         U R                  U5        X l         U$ NT)rP   r?   )r%   r&   stacktmps      r'   visit_ExprNodeNormalizeTree.visit_ExprNode`   s*    ??4 "r+   c                     U R                   nX l         U R                  U5        X0l         U R                   (       d1  U R                  (       d   [        R                  " UR
                  U/S9$ U$ rV   )rO   r?   rP   r   r\   rX   )r%   r&   is_listcontainerra   s       r'   visit_StatNodeNormalizeTree.visit_StatNodeg   sT    &&.4 &""4??%%$((4&AAKr+   c                 D    SU l         U R                  U5        SU l         U$ NTF)rO   r?   r$   s     r'   visit_StatListNode NormalizeTree.visit_StatListNodeq   s%    "4 #r+   c                 &    U R                  US5      $ r`   rf   r$   s     r'   visit_ParallelAssignmentNode*NormalizeTree.visit_ParallelAssignmentNodew       ""4..r+   c                 &    U R                  US5      $ r`   rm   r$   s     r'   r6    NormalizeTree.visit_CEnumDefNodez   rp   r+   c                 &    U R                  US5      $ r`   rm   r$   s     r'   r9   )NormalizeTree.visit_CStructOrUnionDefNode}   rp   r+   c                     UR                   R                  (       a*  [        R                  " UR                   R                  5      $ U R                  U5      $ )z!Eliminate useless string literals)expris_string_literalr   PassStatNoderX   rf   r$   s     r'   visit_ExprStatNode NormalizeTree.visit_ExprStatNode   s9    99&&%%diimm44&&t,,r+   c                     U$ r"   r#   r$   s     r'   r0   #NormalizeTree.visit_CDeclaratorNode   r*   r+   )rP   rO   F)rB   rC   rD   rE   rF   rN   r]   rb   rf   rj   rn   r6   r9   ry   r0   rG   __classcell__rS   s   @r'   rI   rI   ?   s?    ( 
///- r+   rI   c                       \ rS rSrSrg)PostParseError   r#   N)rB   rC   rD   rE   rG   r#   r+   r'   r   r      s    Dr+   r   zHCannot assign default value to fields in cdef classes, structs or unionsz0Invalid buffer defaults specification (see docs)z0Special attributes must not have a type declaredc                      ^  \ rS rSrSrU 4S jrS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rSrU =r$ )	PostParse   a=  
Basic interpretation of the parse tree, as well as validity
checking that can be done on a very basic level on the parse
tree (while still not being a problem with the basic syntax,
as such).

Specifically:
- Default values to cdef assignments are turned into single
assignments following the declaration (everywhere but in class
bodies, where they raise a compile error)

- Interpret some node structures into Python runtime values.
Some nodes take compile-time arguments (currently:
TemplatedTypeNode[args] and __cythonbufferdefaults__ = {args}),
which should be interpreted. This happens in a general way
and other steps should be taken to ensure validity.

Type arguments cannot be interpreted in this way.

- For __cythonbufferdefaults__ the arguments are checked for
validity.

TemplatedTypeNode has its directives interpreted:
Any first positional argument goes into the "dtype" attribute,
any "ndim" keyword argument goes into the "ndim" attribute and
so on. Also it is checked that the directive combination is valid.
- __cythonbufferdefaults__ attributes are parsed and put into the
type information.

Note: Currently Parsing.py does a lot of interpretation and
reorganization that can be refactored into this transform
if a more pure Abstract Syntax Tree is wanted.

- Some invalid uses of := assignment expressions are detected
c                 X   > [         TU ]  U5        SU R                  0U l        SU l        g )N__cythonbufferdefaults__F)rM   rN   handle_bufferdefaultsspecialattribute_handlersin_pattern_noderQ   s     r'   rN   PostParse.__init__   s/    !&)C)C*
&  %r+   c           
      x   [        5       nUR                  UR                  5        UR                  (       d:  UR                  (       d)  [        UR                  [        R                  5      (       a4  [        R                  " UR                  R                  UR                  S9nO3[        R                  " UR                  R                  UR                  S9n[        R                  " UR                  UR                  UR                  UR                  UR                   US S9Ul        U R                  U5        U$ )Nrv   value)nameargsstar_argstarstar_argr[   doc)YieldNodeCollectorr?   result_expr	has_yield	has_awaitrZ   r   YieldExprNoder   ExprStatNoderX   ReturnStatNodeDefNoder   r   r   r   def_node)r%   r&   	collectorr[   s       r'   visit_LambdaNodePostParse.visit_LambdaNode   s    &(	 0 01)"5"5DDTDTV_VmVm9n9n%%  $$4+;+;=D ''  $$D,<,<>DHH499T]]**4	!
 	4 r+   c                 \   [        5       nUR                  UR                  S S/S9  [        R                  " UR
                  UR                  S / S S UR                  UR                  SS9	Ul        [        R                  UR                  U R                  S;   S9  U R                  U5        U$ )NiteratorattrsexcludeT)r   r   r   r   r   r[   is_async_defis_generator_expressionpyclasscclassscope_is_class)r   r?   loopr   r   rX   r   r   r   _AssignmentExpressionChecker	do_checks
scope_typer%   r&   r   s      r'   visit_GeneratorExpressionNode'PostParse.visit_GeneratorExpressionNode   s    &(			
|LHH499$d)<)<$(	*
 	%..tyy\qIq.r4 r+   c                    UR                   (       d=  [        5       nUR                  UR                  5        UR                  (       a  SUl         [
        R                  UR                  U R                  S;   S9  U R                  U5        U$ )NTr   r   )has_local_scoper   r?   r   r   r   r   r   r   s      r'   visit_ComprehensionNode!PostParse.visit_ComprehensionNode   sj    ##*,I##DII.""'+$$..tyy\qIq.r4 r+   c                     [        UR                  [        R                  5      (       d  [	        UR
                  [        5      eUR                  U R                  l        UR
                  U R                  l	        g r"   )
rZ   defaultr   DictNoder   rX   ERR_BUF_DEFAULTS
scope_nodebuffer_defaults_nodebuffer_defaults_pos)r%   decls     r'   r   PostParse.handle_bufferdefaults   sK    $,,	(:(:;; +;<</3||,.2hh+r+   c                 |    U R                  U5        U/n/ nUR                   GH  nUn[        U[        R                  [        R
                  45      (       a=  UR                  n[        U[        R                  [        R
                  45      (       a  M=  [        U[        R                  5      (       Ga8  UR                  Gb*  U R                  S;   a  [        U R                  [        R                  5      (       aU  U R                  R                  UR                  5      nU(       a)  XELa  [        UR                   ["        5      eU" U5        GM.  [        UR                   [$        5      eU R                  S:g  nUR'                  [        R(                  " UR                   [*        R,                  " UR                   UR                  S9UR                  UUR.                  S95        S Ul        UR'                  U5        GM     X1l        U$ ! [         a%  nU R0                  R3                  U5         S nAg S nAff = f)N)r   r   structmoduler   )lhsrhsfirstfrom_pxd_cvardef)r?   declaratorsrZ   r   CPtrDeclaratorNodeCConstDeclaratorNodebaseCNameDeclaratorNoder   r   r   CClassDefNoder   getr   r   rX   ERR_INVALID_SPECIALATTR_TYPEERR_CDEF_INCLASSappendSingleAssignmentNoder   NameNodein_pxdrR   nonfatal_error)	r%   r&   rY   newdeclsr   declbasehandlerfirst_assignmentes	            r'   r-   PostParse.visit_CVarDefNode   s   
 	t$FEH(( E,D,DeF`F`+abb'}}H !E,D,DeF`F`+abbh(A(ABB''3??.MM)$//5;N;NOO*.*H*H*L*LTYY*W#*'+';.<TXXGc.d(d$+DM$,"0;K"LL+/??h+F(U%?%? ) 2 2488(-- P ( 0 08H-1[[&: ; ,0(%+ ),  (L 	 LL''*		s   BH E5H 
H;H66H;c                 r    U R                  U5        U R                  XR                  UR                  /5      $ r"   )r?   _visit_assignment_noder   r   r$   s     r'   visit_SingleAssignmentNode$PostParse.visit_SingleAssignmentNode  s.    4 **4((DHH1EFFr+   c                 v    U R                  U5        U R                  XR                  UR                  /-   5      $ r"   )r?   r   lhs_listr   r$   s     r'   visit_CascadedAssignmentNode&PostParse.visit_CascadedAssignmentNode  s0    4 **4$((1KLLr+   c                    [        U Vs/ s H)  nUR                  (       d  UR                  (       d  M'  SPM+     sn5      S:  a  U$ / n[        X$5        / n[	        XE5        / nU Hp  nUSS nUS   n[        U5      S:X  a$  [        R                  " UR                  US   US9nO[        R                  " UR                  XxS9nUR                  U5        Mr     [        U5      S:X  a  US   n	O"[        R                  " US   R                  US9n	U(       aE  U V
s/ s H  n
U
R                  U
4PM     nn
[        U5        USSS2    H  u  p[        X5      n	M     U	$ s  snf s  sn
f )	zWFlatten parallel assignments into separate single
assignments or cascaded assignments.
r      Nr   r   r   )r   r   rY   )sumis_sequence_constructorrw   flatten_parallel_assignmentseliminate_rhs_duplicateslenr   r   rX   CascadedAssignmentNoder   ParallelAssignmentNode
expressionsort_common_subsequencesr	   )r%   r&   	expr_listrv   expr_list_list	temp_refsnodesr   r   assign_nodetempduplicates_and_temps_temp_refs                 r'   r    PostParse._visit_assignment_node#  so    y Myt00D4J4J y M NPQR K$Y?	 ;'I "~HB-C8}!11#''"1+S2 33CGG'4LL ( u:?(K66uQx||USK1:$=1: '+oot%<1: ! $=$%9:3DbD9%h<  : EM8$=s   &EEE#c                     UR                    H8  nUR                  (       a  U R                  X25        M'  UR                  U5        M:     U$ r"   )r   r   _flatten_sequencer   )r%   seqresultargs       r'   r   PostParse._flatten_sequenceK  s:    88C**&&s3c"	 
 r+   c                 V    U R                  U5        U R                  U/ 5      Ul        U$ r"   )r?   r   r   r$   s     r'   visit_DelStatNodePostParse.visit_DelStatNodeS  s)    4 **44	r+   c                    UR                   (       a  [        R                  " UR                  [        R
                  " UR                  R                  UR                  R                  S9/SS9n[        R                  " UR                  [        R                  " UR                  UR                  [        R                  " UR                  U/S9S9/S9Ul
        U R                  U5        U$ )Nr   T)r   ignore_nonexistingr   )r[   finally_clause)is_except_asr   DelStatNoderX   r   r   targetr   r\   TryFinallyStatNoder[   r?   )r%   r&   
del_targets      r'   visit_ExceptClauseNode PostParse.visit_ExceptClauseNodeX  s    **((KKOO$++*:*:< =#'	)J
 **//HH#(#5#5)l$,- ./DI 	4 r+   c           
         UR                   c`  [        R                  " UR                  [        R
                  " UR                  [        S5      S9UR                  SSSSS9Ul         SUl        U R                  U5        U$ )zUExtract the exception raising into a RaiseStatNode to simplify GIL handling.
        NAssertionErrorr   T)exc_type	exc_valueexc_tbcausebuiltin_exc_namewrap_tuple_value)		exceptionr   RaiseStatNoderX   r   r   r   r   r?   r$   s     r'   visit_AssertStatNodePostParse.visit_AssertStatNodek  sp     >>!"00"++DHH=IY;Z[**!1!%DN DJ4 r+   c                 D    [        UR                  UR                  5        g r"   )r   rX   whatr$   s     r'   visit_ErrorNodePostParse.visit_ErrorNode|  s    dhh		"r+   c                 H    UR                  5         U R                  U5        U$ r"   )validate_targetsr?   r$   s     r'   visit_MatchCaseNodePostParse.visit_MatchCaseNode  s!    4 r+   c                 H    UR                  5         U R                  U5        U$ r"   )validate_irrefutabler?   r$   s     r'   visit_MatchNodePostParse.visit_MatchNode  s!    !!#4 r+   c                 Z    U R                   Sso l         U R                  U5        X l         U$ r`   )r   r?   )r%   r&   r   s      r'   visit_PatternNodePostParse.visit_PatternNode  s.    040D0Dd--4 .r+   c                 v    U R                   (       a  [        UR                  S5        U R                  U5        U$ )Nz/f-strings are not accepted for pattern matching)r   r   rX   r?   r$   s     r'   visit_JoinedStrNodePostParse.visit_JoinedStrNode  s-    $((MN4 r+   c                     U R                   S:X  a6  UR                  S;   a&  [        UR                  SUR                   S3S5        g U R	                  U5      $ )Nr   )__getreadbuffer____getwritebuffer____getsegcount____getcharbuffer__'zD' relates to the old Python 2 buffer protocol and is no longer used.r   )r   r   r   rX   visit_FuncDefNoder$   s     r'   visit_DefNodePostParse.visit_DefNode  sT    OOx'		ppDHH$)) -- -./1%%d++r+   )r   r   )rB   rC   rD   rE   rF   rN   r   r   r   r   r-   r   r   r   r   r  r  r  r  r"  r&  r)  r,  r5  rG   r~   r   s   @r'   r   r      sq    "F%$	7%\GM&P
&"

, ,r+   r   c                   F   ^  \ rS rSrU 4S jrS rS rS rS rS r	Sr
U =r$ )	%_AssignmentExpressionTargetNameFinderi  c                 0   > [         TU ]  5         0 U l        g r"   )rM   rN   target_namesr%   rS   s    r'   rN   ._AssignmentExpressionTargetNameFinder.__init__  s    r+   c                     UR                   (       a  UR                  /$ UR                  (       a7  / nUR                   H#  nUR	                  U R                  U5      5        M%     U$ / $ r"   )is_namer   r   r   extendfind_target_names)r%   r  namesr  s       r'   r@  7_AssignmentExpressionTargetNameFinder.find_target_names  sR    >>KK= ++E{{T33C89 #L	r+   c                     [        U R                  UR                  5      5      U R                  U'   U R	                  U5        g r"   )tupler@  r  r:  r?   r$   s     r'   visit_ForInStatNode9_AssignmentExpressionTargetNameFinder.visit_ForInStatNode  s4    "'(>(>t{{(K"L$4 r+   c                     g r"   r#   r$   s     r'   r   =_AssignmentExpressionTargetNameFinder.visit_ComprehensionNode      r+   c                     g r"   r#   r$   s     r'   r   6_AssignmentExpressionTargetNameFinder.visit_LambdaNode  rI  r+   c                 &    U R                  U5        g r"   r?   r$   s     r'   
visit_Node0_AssignmentExpressionTargetNameFinder.visit_Node      4 r+   )r:  )rB   rC   rD   rE   rN   r@  rE  r   r   rN  rG   r~   r   s   @r'   r8  r8    s&    	!! !r+   r8  c                   l   ^  \ rS rSrSrU 4S jrS rS r\S 5       r	S r
S rS	 rS
 rS rS rSrU =r$ )r   i  zY
Enforces rules on AssignmentExpressions within generator expressions and comprehensions
c                 F  > [         TU ]  5         [        5       nUR                  U5        UR                  U l        SU l        SU l        X l        SU l	        [        5       U l        U R
                  R                  5        H  nU R                  R                  U5        M      g NFr#   )rM   rN   r8  visitr:  target_names_dictin_iteratorin_nested_generatorr   current_target_namessetall_target_namesvaluesupdate)r%   	loop_noder   target_name_finderrA  rS   s        r'   rN   %_AssignmentExpressionChecker.__init__  s    BD  +!3!@!@ #( ,$&! #++224E!!((/ 5r+   c                     U R                   U R                  U R                  U R                  U R                  4nSU l        SU l        SU l        [        5       U l        U$ rS  )rV  rW  r   rZ  rX  rY  r%   	old_states     r'   _reset_state)_AssignmentExpressionChecker._reset_state  se    %%t'?'?ATATVZVkVkmq  nG  nG  H	#( #$&! #r+   c                 F    Uu  U l         U l        U l        U l        U l        g r"   )rV  rW  r   rZ  rX  ra  s     r'   
_set_state'_AssignmentExpressionChecker._set_state  s&     }Fy$2D4GI^`d`yr+   c                 6    U " X5      nUR                  U5        g r"   )rT  )clsr]  r   checkers       r'   r   &_AssignmentExpressionChecker.do_checks  s    i0i r+   c                 P   U R                   (       a  U R                  U5        g U R                  nU R                  R	                  US 5      nU(       a  U =R                  U-  sl        SU l        U R                  UR                  5        SU l        U R                  USS9  X l        g )NTF)r   r   )rW  r?   rX  rU  r   rV  rT  r   )r%   r&   rX  target_names       r'   rE  0_AssignmentExpressionChecker.visit_ForInStatNode  s    ##t$#88,,00t<%%4%

4==! 47$8!r+   c                    U R                   (       a  [        UR                  S5        U R                  (       a  [        UR                  S5        UR                  U R
                  ;   a$  [        UR                  SUR                  -  5        g UR                  U R                  ;   a$  [        UR                  SUR                  -  5        g g )NzKassignment expression cannot be used in a comprehension iterable expressionzKassignment expression within a comprehension cannot be used in a class bodyzIassignment expression cannot rebind comprehension iteration variable '%s'zHcomprehension inner loop cannot rebind assignment expression target '%s')rV  r   rX   r   rn  rX  rZ  r$   s     r'   visit_AssignmentExpressionNode;_AssignmentExpressionChecker.visit_AssignmentExpressionNode  s    $((ij$((ijt888$((g""# $!6!66$((f""# $ 7r+   c                 |    U R                  5       nU R                  UR                  5        U R                  U5        g r"   )rc  rT  r   rf  )r%   r&   rb  s      r'   r   -_AssignmentExpressionChecker.visit_LambdaNode  s0     %%'	

4##$	"r+   c                 X    U R                   nSU l         U R                  U5        X l         g r`   )rW  r?   r%   r&   rW  s      r'   r   4_AssignmentExpressionChecker.visit_ComprehensionNode  s*    "66#' 4 #6 r+   c                 l    U R                   nSU l         U R                  UR                  5        X l         g r`   )rW  rT  r   rv  s      r'   r   :_AssignmentExpressionChecker.visit_GeneratorExpressionNode  s,    "66#' 

499#6 r+   c                 &    U R                  U5        g r"   rM  r$   s     r'   rN  '_AssignmentExpressionChecker.visit_Node  rP  r+   )rZ  rX  rV  rW  r   rU  )rB   rC   rD   rE   rF   rN   rc  rf  classmethodr   rE  rq  r   r   r   rN  rG   r~   r   s   @r'   r   r     sO    0F ! !9"
$#77! !r+   r   c                 0  ^^^^^ [        5       m0 mUUUU4S jmU  H  nUS   nT" U5        M     T(       d  gUU4S jmT H:  nUR                  (       d  M  [        [        TUR                  5      5      Ul        M<     U  H  nT" US   5      US'   M     g)zReplace rhs items by LetRefNodes if they appear more than once.
Creates a sequence of LetRefNodes that set up the required temps
and appends them to ref_node_sequence.  The input list is modified
in-place.
c                 &  > U R                   (       d  U R                  (       a  g U T;   a)  U T;  a"  [        U 5      nUTU '   TR                  U5        g g TR	                  U 5        U R
                  (       a  U R                   H  nT" U5        M     g g r"   )
is_literalr>  r
   r   addr   r   )r&   ref_nodeitemfind_duplicatesref_node_sequence	ref_nodes
seen_nodess      r'   r  1eliminate_rhs_duplicates.<locals>.find_duplicates  s}    ??dll :9$%d+"*	$!((2 %
 NN4 ++ IID#D) & ,r+   r   Nc                    > U T;   a  TU    $ U R                   (       a$  [        [        TU R                  5      5      U l        U $ r"   )r   listmapr   )r&   r  substitute_nodess    r'   r  2eliminate_rhs_duplicates.<locals>.substitute_nodes4  s;    9T?"))S!1499=>DIr+   )rY  r   r  r  r   )	r   r  r   r   r&   r  r  r  r  s	    `   @@@@r'   r   r     s     JI* *  $	m $  '''S!1499=>DI 
 $	(27	" $r+   c                    ^ U4S jmU4S jn[        U 5       Ha  u  p#US   nUn[        US-
  SS5       H  nU" X@U   S   5      (       d  M  UnM     XR:w  d  MA  [        X%S5       H  nXS-
     X'   M     X0U'   Mc     g)a  Sort items/subsequences so that all items and subsequences that
an item contains appear before the item itself.  This is needed
because each rhs item must only be evaluated once, so its value
must be evaluated first and then reused when packing sequences
that contain it.

This implies a partial order, and the sort must be stable to
preserve the original order as much as possible, so we use a
simple insertion sort (which is very fast for short sequences, the
normal case in practice).
c                 ~   > U  H6  nX!L a    gUR                   (       d  M  T" UR                  U5      (       d  M6    g   gri   r   r   )r   xr  containss      r'   r  *sort_common_subsequences.<locals>.containsP  s9    Dy---(499a2H2H	 
 r+   c                 P   > UR                   =(       a    T" UR                  U 5      $ r"   r  )abr  s     r'   
lower_than,sort_common_subsequences.<locals>.lower_thanW  s    ((@Xaffa-@@r+   r   r   r   N)	enumeraterange)itemsr  rX   r  keynew_posir  s          @r'   r   r   D  s    A u%	1gs1ub"%A#Qx{++ & >3, 1: -!'N &r+   c                     / nU R                   nU R                  nU R                  nUR                  nU H   nU" U5      nUR                  U" X'S95        M"     U$ )Nr   )rX   rS   r   r   )literalcharsrX   stypesval	sval_typecharcvals           r'   #unpack_string_to_character_literalsr  f  sX    E
++CE==DIU3+,  Lr+   inputoutputc                 8   U S   nUR                   (       d  [        U[        R                  5      (       a-  [	        U S S  Vs/ s H  o3R                   PM     sn5      (       d  UR                  U 5        g / nUR                   (       a  UR                  nOUR                  (       a  [        U5      n[        W5      n[        U5       Vs/ s H  n/ PM     nn/ n	U S S  GH  nUR                   (       d:  UR                  (       a  [        UR                  S5        UR                  U5        MO  [        UR                  5      n
SnUR                   H  nU[        UR                  5      -  nM     US:  a*  [        UR                  S5        UR                  X2/5        M  X-
  U:  aD  [        UR                  SXfS:g  =(       a    S=(       d    S4-  5        UR                  X2/5        GM  U(       a  [        XUR                  U5        GM.  X:  a/  [        UR                  S	X4-  5        UR                  X2/5        GMb  [!        XR                  5       H  u  pUR                  U5        M     GM     U(       a"  UR                  U5        UR                  U5        [!        X5       H*  u  pU(       d  M  UR                  U5        [#        X5        M,     U	 H5  nUS   R                   (       a  [#        X5        M$  UR                  U5        M7     g s  snf s  snf )
Nr   z4starred assignment target must be in a list or tupler   r   z,more than 1 starred expression in assignmentz#need more than %d value%s to unpacks z/too many values to unpack (expected %d, got %d))r   rZ   r   UnicodeNoder   r   r   rw   r  r   r  
is_starredr   rX   boolmap_starred_assignmentzipr   )r  r  r   r   complete_assignmentsrhs_argsrhs_sizer   lhs_targetsstarred_assignmentslhs_sizestarred_targetsrv   targetscascades                  r'   r   r   r  s    )C((JsI<Q<Q,R,RuSbzJz33zJKKe
""88			6s; #&h-H$X/!2K/Sbz**~~cggUV '',sxx=HHDtDOO44O Q#''IJMM3)$'(2#''@A63<"=> ?MM3)$";#&88X7 #''L() *MM3)$!$[((!;t$ "<9 > ##C(*+ K27NN3(9 3 '1:--(9MM'"	 'w K 0s   L	Lr  r  lhs_argsr  c                 
   [        [        X5      5       H?  u  nu  pVUR                  (       a  Un[        U5      U-
  S-
  n  O UR	                  U5        MA     [        S5      e[        [        X* S  X'S-   S  5      5       H  u  nu  pVUR	                  U5        M     X'   R                  n	X7S  n
U(       a  U
S U*  n
U
(       a  U
S   R                  nOU	R                  nUR	                  U	[        R                  " XS9/5        g )Nr   z6no starred arg found when splitting starred assignmentr   )rX   r   )
r  r  r  r   r   r   r  rX   r   ListNode)r  r  r  r  r  r  rv   starredlhs_remainingr  starred_rhsrX   s               r'   r  r    s	    (K(BC?G??GMA-1Mt D TUU (K,H,4q[\,B)D E?GtE
 %%F8$K!/M>2!n  jj	""s= ? @r+   c                   @   ^  \ rS rSrSrSrSrU 4S jrS rS r	Sr
U =r$ )	PxdPostParsei  ad  
Basic interpretation/validity checking that should only be
done on pxd trees.

A lot of this checking currently happens in the parser; but
what is listed below happens here.

- "def" functions are let through only if they fill the
getbuffer/releasebuffer slots

- cdef functions are let through only if they are on the
top level and are declared "inline"
z>function definition in pxd file must be declared 'cdef inline'z5inline function definition in pxd file cannot be '%s'c                 0   > SU l         [        TU ]	  U5      $ )Npxd)r   rM   __call__r%   r&   rS   s     r'   r  PxdPostParse.__call__  s    w%%r+   c                 Z    U R                   nSU l         U R                  U5        X l         U$ Nr   )r   r?   )r%   r&   olds      r'   visit_CClassDefNode PxdPostParse.visit_CClassDefNode  s*    oo"4 r+   c                 N   U R                   n[        U[        R                  5      (       a"  U R                  S:X  a  UR
                  S;   a  S n[        U[        R                  5      (       a  SUR                  ;   ae  U R                  S;   aU  SUl        UR                  S:w  a  U R                  UR                  -  nO0UR                  (       a  U R                  S-  nOS nOU R                   nU(       a0  U R                  R                  [        UR                  U5      5        g U$ )Nr   )__getbuffer____releasebuffer__inline)r  r   Tprivateapi)ERR_INLINE_ONLYrZ   r   r   r   r   CFuncDefNode	modifiersinline_in_pxdr>   ERR_NOGO_WITH_INLINEr  rR   r   r   rX   )r%   r&   errs      r'   r4  PxdPostParse.visit_FuncDefNode  s     ""tU]]++80KII!GGCdE..//DNN*OO'88%)"??i/33dooECXX33e;CC**LL''txx(EFKr+   )r   )rB   rC   rD   rE   rF   r  r  r  r  r4  rG   r~   r   s   @r'   r  r    s*     WOR& r+   r  c                   L   ^  \ rS rSrU 4S jrS rS r\R                  r	Sr
U =r$ )TrackNumpyAttributesi  c                 @   > [         TU ]  5         [        5       U l        g r"   )rM   rN   rY  numpy_module_namesr;  s    r'   rN   TrackNumpyAttributes.__init__!  s    "%%r+   c                     UR                   S:X  a.  U R                  R                  UR                  =(       d    S5        U$ )Nnumpy)module_namer  r  as_namer$   s     r'   visit_CImportStatNode*TrackNumpyAttributes.visit_CImportStatNode%  s2    w&##''(?@r+   c                     U R                  U5        UR                  nUR                  (       a  UR                  U R                  ;   d  UR
                  (       a  SUl        U$ r`   )r?   objr>  r   r  is_numpy_attribute)r%   r&   r  s      r'   visit_AttributeNode(TrackNumpyAttributes.visit_AttributeNode*  sF    4 hhKKCHH(?(??CDZDZ&*D#r+   )r  )rB   rC   rD   rE   rN   r  r  r   recurse_to_childrenrN  rG   r~   r   s   @r'   r  r    s    (
 "55Jr+   r  c            
       4  ^  \ rS rSrSr\R                  \R                  \R                  \R                  " SS5      \R                  " SS5      \R                  " SS5      \R                  " SS5      \R                  \R                  S.	rS\R                  " S	5      0r1 S
kr\R                  \5        1 Skr1 SkrU 4S jrS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S r"S r#S r$S  r%S! r&S" r'S# r(S$ r)S% r*S& r+S' r,S( r-S)r.U =r/$ )*InterpretCompilerDirectivesi4  a  
After parsing, directives can be stored in a number of places:
- #cython-comments at the top of the file (stored in ModuleNode)
- Command-line arguments overriding these
- @cython.directivename decorators
- with cython.directivename: statements
- replaces "cython.compiled" with BoolNode(value=True)
  allowing unreachable blocks to be removed at a fairly early stage
  before cython typing rules are forced on applied

This transform is responsible for interpreting these various sources
and store the directive in two ways:
- Set the directives attribute of the ModuleNode for global directives.
- Use a CompilerDirectivesNode to override directives for a subtree.

(The first one is primarily to not have to modify with the tree
structure, so that ModuleNode stay on top.)

The directives are stored in dictionaries from name to value in effect.
Each such dictionary is always filled in for all possible directives,
using default values where no value is given by the user.

The available directives are controlled in Options.py.

Note that we have to run this prior to analysis, and so some minor
duplication of functionality has to occur: We manually track cimports
and which names the "cython" module may have been imported to.
Tz++z--F)	typeofzoperator.addresszoperator.dereferencezoperator.preincrementzoperator.predecrementzoperator.postincrementzoperator.postdecrementzoperator.typeidaddresszoperator.comma,>   NULLcastunionsizeofr   declarepointertypedefcompiledparallel
fused_type>   viewcimportsoperatorr  dataclasses>   pranger  threadidc                 6  > [         TU ]  U5        [        5       U l        SS0U l        0 U l        [        R                  " [        R                  " 5       5      nUR                  5        H'  u  pE[        R                  " U5      U[        U5      '   M)     X0l        g )Nstaticmethod)rM   rN   rY  cython_module_namesdirective_namesparallel_directivesr   deepcopyr   get_directive_defaultsr  str
directives)r%   rR   compilation_directive_defaultsr  r  r   rS   s         r'   rN   $InterpretCompilerDirectives.__init__z  sx    !#&5  .?#% ]]7#A#A#CD
8>>@JC#'==#7Js3x  A$r+   c           
         [         R                  R                  US 5      nU(       a4  X4;  a/  U R                  R	                  [        USU< SU< S35      5        gU[         R                  ;  a  [        USU< S35        g)NzThe z& compiler directive is not allowed in z scopeFzInvalid directive: 'z'.T)r   directive_scopesr   rR   r   r   directive_typesr   )r%   rX   	directivescopelegal_scopess        r'   check_directive_scope1InterpretCompilerDirectives.check_directive_scope  sl    //33ItDE5LL''sHQSX=Z )[ \ 7 77cDEr+   c                 (   UR                  S5      (       d  g UR                  SS5      S   nX0R                  ;   a  g SnSR                  5       S S  Vs/ s H  oUR                  5       PM     nnU H%  u  pxUR                  SU-   5      (       d  M   SU-  n  O   U(       dM  U[        R
                  ;   n	U	(       d'  UR                  S	5      (       d  SS
KJn
  [        X5      n	U	(       a  SU-  n[        USU< SU(       a  SOS< U< 35        g s  snf )Ncython..r   r   r  z                imp                  cimports
                cimp                 cimports
                para                 parallel
                parra                parallel
                dataclass            dataclasses
            r   zDid you mean 'cython.%s' ?r   )Shadowz2Instead, use 'import cython' and then 'cython.%s'.r3  z ' is not a valid cython.* modulez. )

startswithsplitvalid_cython_submodules
splitlinesr   r  r  r  hasattrr   )r%   rX   r  	submoduleextralinehintswrongcorrectis_simple_cython_namer  s              r'   _check_valid_cython_module6InterpretCompilerDirectives._check_valid_cython_module  s   %%i00%%c1-a0	444& 
Sb&"
&"TJJL &" 	 
 $NE%%i%&7884w> $ $-1H1H$H!(1E1Ec1J1J &(/(B%$LyXcDr!
 	/
s   Dc                    [        UR                  5       HQ  nU R                  UR                  US5      (       a  M'  U R	                  UR                  US5        UR                  U	 MS     UR
                  U l        U R                  R                  UR                  5        U R                  Ul        U R                  Ul	        U R                  U5        U R                  Ul        U$ )Nr   )sorteddirective_commentsr  rX   wrong_scope_errorr  module_scoper  r\  r  r?   r  )r%   r&   r  s      r'   r]   ,InterpretCompilerDirectives.visit_ModuleNode  s    $112C--dhhXFF&&txxh?++C0 3
 !JJt667//#'#;#; 4 #'#;#; r+   c                 n    U R                   UR                   so l         U R                  U5        X l         U$ r"   r  r?   r%   r&   old_directivess      r'   visit_CompilerDirectivesNode8InterpretCompilerDirectives.visit_CompilerDirectivesNode  s.    *.//4??'4 (r+   c                     U[         R                  ;   =(       d+    XR                  ;   =(       d    [        R                  " U5      $ r"   )r   r  special_methodsr   parse_basic_type)r%   r   s     r'   is_cython_directive/InterpretCompilerDirectives.is_cython_directive  s9    /// 2,,,2++D1	3r+   c                 H   US-   R                  S5      nU(       a  UR                  S5      nUS:X  a  SU R                  S'   U$ US:X  a'  U R                   H  nSU-  U R                  U'   M     U$ [	        U5      S:w  d  US   U R                  ;  a  [        US	U-  5        U$ )
z
Checks to see if fullname (e.g. cython.parallel.prange) is a valid
parallel directive. If it is a star import it also updates the
parallel_directives.
r  cython.parallel.cython.parallelr  zcython.parallel.*zcython.parallel.%s   r   zNo such directive: %s)r  r  r  valid_parallel_directivesr   r   )r%   	full_namerX   r   r  r   s         r'   is_parallel_directive1InterpretCompilerDirectives.is_parallel_directive  s     c/--.@A!,I--7H((4  11 ::D5ID5PD,,T2 ; 	 i.A%B-t'E'EEc2Y>?r+   c                    UR                   nUS:X  a  [        UR                  S5        UR                  S5      (       aL  UR                  (       a%  UR                  S:w  a  U[        S5      S  Ul         U$ [        UR                  S5        US:X  a0  U R                  R                  UR                  =(       d    S5        U$ UR                  S5      (       Ga  UR                  S5      (       a$  [        UR                  UR                   S-   5        OU R                  UR                  U5        US	:X  af  UR                  (       a)  UR                  S:w  a  X R                  UR                  '   g U R                  R                  S5        UU R                  S	'    g UR                  (       a  US
S  U R                  UR                  '   g U R                  R                  S5        g U$ )Ncython.cimportszGCannot cimport the 'cython.cimports' package directly, only submodules.cython.cimports.cythonzkPython cimports must use 'from cython.cimports... import ...' or 'import ... as ...', not just 'import ...'r  r6  z is not a moduler7     )r  r   rX   r  r  r   r  r  r"  r  r  r%   r&   r  s      r'   r  1InterpretCompilerDirectives.visit_CImportStatNode  s   &&++$((ef!!"455|| 8#.s3E/F/G#H $((CD ("$$(()AB* ) ##I..%%&899dhh 0 03E EF//+F//<<DLLH$<=H,,T\\:  ,,00:9D ,,$57  5@_$$T\\2
  ((,,X6 r+   c                    UR                   nUS:X  d  UR                  S5      (       a1  U R                  UR                  X!R                  UR
                  5      $ UR                  (       Gd  US:X  d  UR                  S5      (       Ga   U R                  UR                  U5        US-   SS  n/ nUR
                   H  u  pVnX6-   nSU-   n	U R                  XR                  5      (       a  XR                  U=(       d    U'   MH  U R                  U5      (       a  XR                  U=(       d    U'   Mw  US;   a,  XR                  U=(       d    U'   UR                  XVU45        M  UR                  XVU45        M     U(       d  g XAl        U$ )Nr>  r?  r@  r  r  rA  )r  typing)r  r  _create_cimport_from_importrX   relative_levelimported_namesr"  r;  r  r3  r  r   )
r%   r&   r  r  newimprX   r   r  r:  qualified_names
             r'   visit_FromCImportStatNode5InterpretCompilerDirectives.visit_FromCImportStatNode  sf   &&++{/E/EFX/Y/Y33+':':D<O<OQ Q$$$x';+A+A)+L+L++DHHkB$s*AB/IF&*&9&9"7%,	!*Y!6--nhhGG AO,,W_=--i88<E((D9";;<E((D9MM3g"67MM3g"67 ':  "(r+   c                 X   UR                   nUR                  R                  nUS:X  d  UR                  S5      (       aw  / nUR                   H>  u  pVUR                  UR                  XUUR                  :X  a  S OUR                  45        M@     U R                  UR                  X2R                  U5      $ US:X  d  UR                  S5      (       a  U R                  UR                  R                  U5        US-   SS  n/ nUR                   H  u  pVXu-   n	SU	-   n
U R                  XR                  5      (       a  XR                  UR                  '   MH  U R                  U	5      (       a  XR                  UR                  '   Mx  UR                  XV45        M     U(       d  g Xl        U$ )Nr>  r?  r@  r  r  rA  )r   r  r   r  r  r   rX   r   rF  levelr"  r;  r  r3  r  )r%   r&   import_noder  rH  r   	name_noder  rI  r:  rJ  s              r'   visit_FromImportStatNode4InterpretCompilerDirectives.visit_FromImportStatNode,  sv   kk!--33++{/E/EFX/Y/YN#'::%%]]D)..2H$inn]_ $. 33+'8'8.J JH$(>(>y(I(I++K,C,C,G,GU$s*AB/IF#'::%,	!*Y!6--nhhGG?M,,Y^^<--i88;D((8MM4"34 $. Jr+   c                    US:X  d  UR                  S5      (       a  [        U[        S5      S  5      nU(       a  [        R                  " XUUS9$ U VVVs/ s H   u  pVn[        R
                  " UUUUS:H  S9PM"     snnn$ s  snnnf )Nr>  r?  )r  rG  rH  r   )r  r  is_absolute)r  r   r   r   FromCImportStatNodeCImportStatNode)r%   node_posr  rN  rH  rX   dotted_namer  s           r'   rF  7InterpretCompilerDirectives._create_cimport_from_importH  s    ++{/E/EFX/Y/Y'C8J4K4L(MNK,,$-/ / 2@ 2@-Cg %% +# %
	,
 2@  s   'Bc                    [        UR                  [        R                  5      (       a  UR                  R                  R
                  nUS:w  a  UR                  S5      (       d  U$ [        R                  " UR                  X!R                  R                  S9nU R                  U5      nU$ U R                  U5        U$ )Nr@  r  )r  r  )rZ   r   r   
ImportNoder  r   r  r   rV  rX   r   r   r  r?   rB  s      r'   r   6InterpretCompilerDirectives.visit_SingleAssignmentNode]  s    dhh	 4 455((..44Kh&{/E/Ei/P/P(({T\T\TaTabD--d3D  t$r+   c                 R   UR                   (       a  U R                  US5        UR                  U R                  ;   a  SUl        O.U R
                  R                  UR                  5      nUb  X!l        UR                  5       S:X  a  [        R                  " UR                  SS9$ U$ )N
annotationTr  r   )r^  
visitchildr   r  is_cython_moduler  r   cython_attributeas_cython_attributer   BoolNoderX   )r%   r&   r  s      r'   visit_NameNode*InterpretCompilerDirectives.visit_NameNodej  s    ??OOD,/99000$(D!,,00;I$(1%##%3%%dhhd;;r+   c                     U R                  U5        UR                  5       S:X  a  [        R                  " UR                  SS9$ U$ )Nr  Tr   )r?   rb  r   rc  rX   r$   s     r'   r  /InterpretCompilerDirectives.visit_AttributeNodex  s=    4 ##%3%%dhhd;;r+   c                 ^    UR                   (       a  U R                  UR                   5        U$ r"   )rv   rT  r$   s     r'   visit_AnnotationNode0InterpretCompilerDirectives.visit_AnnotationNode  s      99JJtyy!r+   c                 L    U R                  US5        U R                  U5        U$ Ncppclass)r_  r?   r$   s     r'   visit_NewExprNode-InterpretCompilerDirectives.visit_NewExprNode  s#    j)4 r+   c           	         [        U[        R                  5      (       Gaj  U R                  US5        UR                  R                  5       nU(       Ga5  [        R                  R                  U5      nU(       Ga  UR                  5       u  pE/ n/ nUb  U[        La  UR                   H~  nUu  pU< SU	R                  < 3n[        R                  R                  U5      (       a/  UR                  U R                  X/S UR                  5      5        Mm  UR                  U5        M     U(       d  S nOXul        U(       a  U(       d	  U(       d  U$ UR                  U R                  X$XQR                  R                  5      5        U$ g [        U[        R                   [        R"                  45      (       a  U R%                  U5        UR                  5       nU(       a  [        R                  R                  U5      nU[&        L a>  [        R(                  " UR                  SS9nU R                  X,/S UR                  5      /$ Ub  U[        R*                  L a  US 4/$ [-        UR                  SU-  5      eg )Nfunctionr  Tr   z5The '%s' directive should be used as a function call.)rZ   r   CallNoder_  rq  rb  r   r  r   explicit_args_kwdsdictkey_value_pairsr   r   try_to_parse_directiverX   AttributeNoder   rT  r  rc  DEFER_ANALYSIS_OF_ARGUMENTSr   )r%   r&   optnamedirectivetyper   kwdsr  ru  keyvaluer  r   sub_optnamer  s                r'   try_to_parse_directives3InterpretCompilerDirectives.try_to_parse_directives  s    dI..//OOD*-mm779G ' 7 7 ; ;G D !%!8!8!:JD!#J&(O'M,E(,(<(<H)1JC5<cii*HK&66::;GG * 1 1$2M2Mk[bdhjrjvjv2w x / 6 6x @ )=  /#'D3B0%d4#--%%d&A&A'QUWdWdWhWh&ij%%  y66	8J8JKLLJJt..0G ' 7 7 ; ;G D D(#,,TXXTBC 77dhhWXX"*mw?b?b.b$dO,,("Y\c"ce er+   c                 T   US:X  a*  U R                   R                  (       d  [        USU-  5      eUS:X  a  [        U5      S:  nSnU(       a  UR                  (       a  UR                  S   n[        UR                  5      S:X  au  UR
                  R                  (       aZ  UR
                  R                  S:X  a@  [        UR                  [        R                  5      (       a  UR                  R                  nOSnU(       a  [        US5      eSU(       a  US   U44$ S U44$ [        R                  R                  U5      n[        U5      S:X  a<  [        US   [        R                  5      (       a  U[        R                  " 5       U   4$ U[         L aS  Uc1  [        U5      S:w  d"  [        US   [        R                  5      (       d  [        US	U-  5      eXS   R                  4$ U["        L a]  Uc1  [        U5      S:w  d"  [        US   [        R$                  5      (       d  [        US
U-  5      eU[#        US   R                  5      4$ U[&        L a]  Uc1  [        U5      S:w  d"  [        US   [        R(                  5      (       d  [        USU-  5      eU['        US   R                  5      4$ U[*        L a'  Uc  [        U5      S:w  a  [        USU-  5      eXS   4$ U[,        L a/  [        U5      S:w  a  [        USU-  5      eXR/                  5       4$ U[0        L aV  U(       a(  [        UR                  5      S:w  a  [        USU-  5      eX V	s/ s H  n	['        U	R                  5      PM     sn	4$ [3        U5      (       ac  Uc1  [        U5      S:w  d"  [        US   [        R(                  5      (       d  [        USU-  5      eX" U['        US   R                  5      5      4$ U[        R4                  L a  XU(       a  UR/                  5       44$ 0 44$  es  sn	f )N
np_pythranz.The %s directive can only be used in C++ mode.	exceptvalr   Tr   checkzYThe exceptval directive takes 0 or 1 positional arguments and the boolean keyword "check"8The %s directive takes one compile-time boolean argumentz8The %s directive takes one compile-time integer argumentz7The %s directive takes one compile-time string argumentz(The %s directive takes one type argumentz1The %s directive takes no prepositional argumentsz+The %s directive takes no keyword arguments)rR   cppr   r   ru  r  rw   r   rZ   r   rc  r   r  r   NoneNoder  r  intIntNoder  r  typert  as_python_dictr  callablerx  )
r%   ry  r   r{  rX   	arg_errorr  kwrz  r  s
             r'   rv  2InterpretCompilerDirectives.try_to_parse_directive  s   l"4<<+;+; &VY`&`aa#D	AIE,,))!,,,-200RVV\\W5L"288Y-?-?@@HHNNE $I$tv vT$q'U!CDDtU!CDD//33G<t9>ja)2D2DEEG::<WEEEd"3t9>DGYM_M_9`9`$SNQXXZ Z!W]]++c!3t9>DGYM^M^9_9_$SNQXXZ ZSa/00c!3t9>DGYMbMb9c9c$SMPWWY YSa/00d"3t9>$S>HJ J!W%%d"4yA~$SG'QS S//111d"D001Q6$SAGKM M>c#))n>>>m$$3t9>DGYMbMb9c9c$SMPWWY Y]7CQ4FGHHgAAATD$7$7$9JKKrJKK5 ?s   P%c           	      Z   U(       d  U(       a   eU R                  U5      $ U R                  n[        R                  " U40 UD6nUb  [        R                  " U40 UD6nOUnXT:X  a  U R                  U5      $ XPl        Ubf  Xe:w  aa  [        R
                  " UR                  R                  [        R                  " UR                  R                  UUR                  S9/S9Ul        U R                  U5      nX@l        [        U[        R                  5      (       a'  UR                  UR                  5        UR                  n[        U[        R
                  5      (       d   [        R
                  " UR                  U/S9n[        R                  " UR                  XuUR                  S9$ )N)r  r[   r   )r[   r  is_terminator)rN  r  r   copy_inherited_directivesr   r\   r[   rX   CompilerDirectivesNoderZ   r\  r  )r%   r&   r  contents_directivesr-  new_directivesnew_contents_directivesretbodys           r'   visit_with_directives1InterpretCompilerDirectives.visit_with_directives  sg   ***??4(( ::>XZX*&-&G&G'7"5'7# '5#+??4(((+'9**		00		#:!YY(DI //$'(gu;;<<!!'"4"45llG'5#5#566(('CG++KKgPWPePeg 	gr+   c                 N    U R                  US5      u  p#U R                  XU5      $ )Nrq  _extract_directivesr  r%   r&   r  r  s       r'   r4  -InterpretCompilerDirectives.visit_FuncDefNode!  +    *.*B*B4*T'
))$<OPPr+   c                    U R                  US5      u  p#UR                  5        HM  u  pEUS:X  a  XQl        M  US;  d  M  U R                  R	                  [        UR                  SU-  5      5        MO     U R                  XS S9$ )Nrq  locals)finalr   zXCdef functions can only take cython.locals(), staticmethod, or final decorators, got %s.r  )r  r  directive_localsrR   r   r   rX   r  )r%   r&   r  r   r   r   s         r'   r-   -InterpretCompilerDirectives.visit_CVarDefNode%  s    00zB
%++-KDx(-%66++NHHACGH-I J	 . ))$PT)UUr+   c                 N    U R                  US5      u  p#U R                  XU5      $ r  r  r  s       r'   r  /InterpretCompilerDirectives.visit_CClassDefNode1  s+    *.*B*B4*R'
))$<OPPr+   c                 N    U R                  US5      u  p#U R                  XU5      $ rl  r  r  s       r'   r@   .InterpretCompilerDirectives.visit_CppClassNode5  r  r+   c                 N    U R                  US5      u  p#U R                  XU5      $ )Nclassr  r  s       r'   visit_PyClassDefNode0InterpretCompilerDirectives.visit_PyClassDefNode9  s+    *.*B*B4*Q'
))$<OPPr+   c           	      :   UR                   (       d  0 0 4$ / n/ n/ n[        U R                  5      n[        5       nUR                   SSS2    GH  nU R	                  UR
                  5      n	U	GbO  U	 GHE  n
U R                  UR                  U
S   U5      (       Ga  U
u  pUS;   am  Uc  SnOdUu  pU(       d1  [        U5      S:w  d"  [        US   [        R                  5      (       d  [        UR                  SU-  5      eUS   R                  nX4n
UR                  X5      U:w  a8  US:X  a  S	U;   a  [        UR                  S
5        UR!                  U
5        XU'   O&[#        UR                  SU< Ub  SU-  OS< S35        U
S   S:X  a  UR!                  U5        U
S   S:X  d  GM:  US:X  d  GMC  SnGMH     GMr  UR!                  U5        GM     USSS2   USSS2   -   Ul         0 n0 nU H  u  pX;   a{  X   n[        U[        5      (       a  UR%                  U5        OT[        U[&        5      (       a  UR)                  U5        O-US:X  a  XU   :w  a  [        UR                  S5        XU'   OXU'   U[*        R,                  ;  d  M  UUU'   M     UU4$ )z
Returns two dicts - directives applied to this function/class
and directives applied to its contents. They aren't always the
same (since e.g. cfunc should not be applied to inner functions)
Nr   r   )nogilwith_gilTr   r  cfuncufuncz=Cannot apply @cfunc to @ufunc, please reverse the decorators.z*Directive does not change previous value (z=%rr  )r   r   r  collection_typez4Multiple values of collection_type are not supported)
decoratorsrt  r  objectr~  	decoratorr  rX   r   rZ   r   rc  r   r   r   r   r   r   r\  r  r?  r   immediate_decorator_directives)r%   r&   
scope_namer  realdecsbothcurrent_opt_dictmissingdecr  r  r   r   r   r{  optdictcontents_optdict	old_values                     r'   r  /InterpretCompilerDirectives._extract_directives=  s    r6M
0(??4R4(C!99#--HN)!/I11$((IaL*UU&/#88$}(,-2
#'3t9>DQRGU^UgUgAhAh*8B|  @D  CD  +E  %E(,Q)-I+//>%G#w7>N3N %cgg/n o&--i85:T2#CGG $u7Heemb&P.R S$Q<>9 KK, |x/J'4I%-
1 "04 $; )< #4R4.4":5%KD#M	 i..$$U+	400$$U+00Udm5Kdhh(^_$)DM %7AAA). &! &" (((r+   c                    0 nU R                  UR                  5      =(       d    /  H  nUc  M  UR                  b1  U R                  R	                  [        UR                  S5      5        MF  Uu  pEUS;   a  U R                  X5      s  $ US:X  a  Uu  pgU R                  XU5      s  $ U R                  UR                  US5      (       d  M  XRU'   M     U(       a  U R                  UR                  US S9$ U R                  U5      $ )Nz6Compiler directive with statements cannot contain 'as')r  gilcritical_sectionzwith statementr  )r~  managerr  rR   r   r   rX   _transform_with_gil_transform_critical_sectionr  r  r[   rN  )r%   r&   directive_dictr  r   r   r   r{  s           r'   visit_WithStatNode.InterpretCompilerDirectives.visit_WithStatNode  s    55dllCIrII {{&++"488-efh#KD''//;;++"
77DII++DHHd<LMM',t$ J  --dii]a-bbt$$r+   c                 \   US;   d   eUR                   nS n[        U[        R                  5      (       al  UR                  (       a[  [        UR                  5      S:  a2  U R                  R                  [        UR                  SU-  5      5        UR                  S   nOQ[        U[        R                  5      (       a2  U R                  R                  [        UR                  SU-  5      5        [        R                  " UR                  X!R                  US9nU R                  U5      $ )N)r  r  r   z6Compiler directive %s accepts one positional argument.r   )stater[   	condition)r  rZ   r   SimpleCallNoder   r   rR   r   r   rX   GeneralCallNoder   GILStatNoder[   rN  )r%   r&   r  r  r  s        r'   r  /InterpretCompilerDirectives._transform_with_gil  s    ((((,,	gy7788W\\7<< 1$++"488-ehm-mnpQI!:!:;;LL''txx)adi)ijl  YYR[\t$$r+   c                    [        U5      S:  d  [        U5      S:  d  U(       a/  U R                  R                  [        UR                  S5      5        [
        R                  " UR                  X!R                  S9nU R                  U5      $ )Nr   r   zBcritical_section directive accepts one or two positional argumentsr   r[   )	r   rR   r   r   rX   r   CriticalSectionStatNoder[   rN  )r%   r&   r   r{  s       r'   r  7InterpretCompilerDirectives._transform_critical_section  sj    t9q=CIMTLL''txx)mn ,,HH4ii
 t$$r+   )r  r  r  r(  r  )0rB   rC   rD   rE   rF   r   
TypeofNodeAmpersandNodeDereferenceNodeinc_dec_constructor
TypeidNodeunop_method_nodesc_binop_constructorbinop_method_nodesr1  r\  r  r9  rN   r  r"  r]   r.  r3  r;  r  rK  rQ  rF  r   rd  r  ri  rn  r~  rv  r  r4  r-   r  r@   r  r  r  r  r  rG   r~   r   s   @r'   r  r  4  sb   : &&%33 ) 9 9"+"?"?d"K"+"?"?d"K"+"?"?t"L"+"?"?t"L"+"6"6 **  	)"?"?"DO
 ,-!%	$N3
*"HB8*
*X>@'gTQ
VQQQB)J%,%% %r+   r  c                      ^  \ rS rSrSrSrSrSrSr\	R                  \R                  \	R                  S.rS rS rS rS	 rS
 rS rS rS rU 4S jrSrU =r$ )ParallelRangeTransformi  a  
Transform cython.parallel stuff. The parallel_directives come from the
module node, set there by InterpretCompilerDirectives.

    x = cython.parallel.threadavailable()   -> ParallelThreadAvailableNode
    with nogil, cython.parallel.parallel(): -> ParallelWithBlockNode
        print cython.parallel.threadid()    -> ParallelThreadIdNode
        for i in cython.parallel.prange(...):  -> ParallelRangeNode
            ...
NF)zcython.parallel.parallelzcython.parallel.threadidzcython.parallel.prangec                 Z    UR                   U R                  ;   =(       d    UR                  $ r"   )r   r  r`  r$   s     r'   node_is_parallel_directive1ParallelRangeTransform.node_is_parallel_directive  s"    yyD444M8M8MMr+   c                    U R                   (       a  SR                  U R                  5      nORU R                  U R                  S      nU< SSR                  U R                  SS 5      < 3nUR	                  S5      nU R
                  R                  U5      nUc=  U R                   (       a  U R                  S   S:w  d  [        UR                  SU-  5        SU l         SU l        U$ )z
Figure out which parallel directive was used and return the associated
Node class.

E.g. for a cython.parallel.prange() call we return ParallelRangeNode
r  r   r   Nr  zInvalid directive: %sF)	namenode_is_cython_modulejoinparallel_directiver  rstripdirective_to_noder   r   rX   )r%   r&   r  ri  s       r'   get_directive_class_node/ParallelRangeTransform.get_directive_class_node  s     ))!8!89I001H1H1KLI#,#&88D,C,CAB,G#HJI!((-I$$((3; > > $ 7 7 :j H$((3i?@).&"&
r+   c                 l    UR                   (       a"  UR                   U l         U R                  U5      $ U$ )zL
If any parallel directives were imported, copy them over and visit
the AST
)r  rN  r$   s     r'   r]   'ParallelRangeTransform.visit_ModuleNode  s1    
 ##'+'?'?D$??4(( r+   c                 x    U R                  U5      (       a#  UR                  /U l        UR                  U l        U$ r"   )r  r   r  r`  r  r$   s     r'   rd  %ParallelRangeTransform.visit_NameNode  s4    **400'+yykD#-1-B-BD*r+   c                     U R                  U5        U R                  (       a%  U R                  R                  UR                  5        U$ r"   )r?   r  r   	attributer$   s     r'   r  *ParallelRangeTransform.visit_AttributeNode  s6    4 ""##**4>>:r+   c                 b   U R                  US5        U R                  (       d  U R                  USS9  U$ [        U[        R
                  5      (       a#  UR                  R                  nUR                  nOUR                  n0 nU R                  U5      nU(       a  U" UR                  X#S9nU$ )Nrq  )rq  rm  )r   kwargs)r_  r  r?   rZ   r   r  positional_argsr   keyword_argsr  rX   )r%   r&   r   r  parallel_directive_classs        r'   visit_CallNode%ParallelRangeTransform.visit_CallNode  s    j)&&t];K
 dI5566'',,D&&F99DF#'#@#@#F # ,DHH4ODr+   c                    U R                  UR                  5      n[        U[        R                  5      (       aX  U R
                  S:X  a   [        UR                  R                  S5        SU l        U R                  US5      nSU l        X2l	        U$ U R                  (       aC  U R                  U5      nU(       d  gU[        R                  L a  [        UR                  S5        gU R                  US5        U$ )z.Rewrite with cython.parallel.parallel() blockszparallel withz*Nested parallel with blocks are disallowedr[   Nz%The parallel directive must be called)rT  r  rZ   r   ParallelWithBlockNoder  r   rX   r_  r[   r  r  )r%   r&   newnoder[   r  s        r'   r  )ParallelRangeTransform.visit_WithStatNode  s    **T\\*gu::;;zz_,dll&&BD )DJ??40DDJLN$$'+'D'DT'J$+'5+F+FFdhh GHf%r+   c                 Z   U R                  US5        U R                  US5        [        UR                  R                  [        R
                  5      nU R                  nU(       a  UR                  R                  nUR                  Ul        UR                  Ul        UR                  Ul	        Un[        UR                  [        R                  5      (       d   [        UR                  R                  S5        SU l        U R                  US5        X0l        U R                  US5        U$ )z/Rewrite 'for i in cython.parallel.prange(...):'r   r  z+Can only iterate over an iteration variabler  r[   else_clause)r_  rZ   r   sequencer   ParallelRangeNoder  r  r[   r  r   r   r   rX   )r%   r&   	in_prangeprevious_stateparallel_range_nodes        r'   rE  *ParallelRangeTransform.visit_ForInStatNode<  s    j)h't}}55$668	 #'--"8"8)-&'+yy$.2.>.>+&Ddkk9+=+=>>dkkooCE "DJf%#
m,r+   c                 *   > Ub  [         TU ]  U5      $ g)zVisit a node that may be NoneN)rM   rT  r  s     r'   rT  ParallelRangeTransform.visit[  s    7=&& r+   )r  r  r  r  )rB   rC   rD   rE   rF   r  r  in_context_manager_sectionr  r   r  r   ParallelThreadIdNoder   r  r  r  r]   rd  r  r  r  rE  rT  rG   r~   r   s   @r'   r  r    s    	  !& "' E %*$?$?$-$B$B"'"9"9	N2
0:>' 'r+   r  c                   8    \ rS rSrS rS r\R                  rSr	g)WithTransformia  c                 p   U R                  US/5        UR                  nUR                  nUR                  UR                  UR
                  pen[        R                  " U5      =oal        [        R                  " U[        R                  " U[        R                  " U5      [        U(       a  SOS5      SS9/ SS9Ul        U(       a#  [        R                  " X!R                  S9Ul        Ub*  [        R                  " U[        R                   " X%US9U/S	9n[        R"                  " US[%        S
5       Vs/ s H  n[        R&                  " U5      PM     snS9n[        R(                  " U[        R*                  " U[        R,                  " U[        R.                  " U[        R0                  " X!SUU(       a  [        R                  " US S9OS S9S9[        R2                  " U5      S9/S S9S S US9n	[        R4                  " U[        R6                  " X$U	/S S9[        R8                  " U[        R0                  " X!S[        R"                  " U[%        S
5       Vs/ s H  n[        R:                  " U5      PM     snS9U(       a  [        R                  " US S9OS S9S9SS9Ul        U$ s  snf s  snf )Nr[   
__aenter__	__enter__T)r  r  is_special_lookup)rq  r   is_temp)r  )r   	with_noder   r8  )slowr   F)	with_stattest_if_runr   
await_exproperand)r  r[   )
if_clausesr  )r[   patternr  excinfo_target)r[   except_clausesr  r   r   )r[   r  handle_error_case)r?   rX   is_asyncr[   r  r  r   	ProxyNoder  rw  	CloneNoder   
enter_callAwaitExprNoder   r\   WithTargetAssignmentStatNode	TupleNoder  ExcValueNodeExceptClauseNode
IfStatNodeIfClauseNodeNotNodeWithExitCallNodeReraiseStatNoder  TryExceptStatNoder   r  )
r%   r&   rX   r  r[   r  r  r   r  except_clauses
             r'   r   WithTransform.visit_WithStatNodeb  sv   4&*hh== $		4;;g!*!4!4W!==,#22)11,,W5'kR"&(  '55cODO%%6649D #,,St16qC;19AI""3'C; <..e&&&&y'8'8)C)C #,1%3U]9+B+B3D+Qcg	*i(j #2237
! !" )!
& ,,e-- - 
 !--)44 $",,E!H"MHq9#5#5c#:H"MOIQy66sEW[]^ $
	 IC;@ #Ns   8 J. J3"c                     U$ r"   r#   r$   s     r'   rb   WithTransform.visit_ExprNode      r+   r#   N)
rB   rC   rD   rE   r  rb   r   r  rN  rG   r#   r+   r'   r
  r
  a  s    <| "55Jr+   r
  c                   :   ^  \ rS rSrU 4S jrS rS rS rSrU =r	$ )#_GeneratorExpressionArgumentsMarkeri  c                 .   > [         TU ]  5         Xl        g r"   )rM   rN   gen_expr)r%   r4  rS   s     r'   rN   ,_GeneratorExpressionArgumentsMarker.__init__  s     r+   c                     UR                   (       d$  UR                  (       a   eU R                  Ul        U R                  U5        g r"   )r  generator_arg_tagr4  r?   r$   s     r'   rb   2_GeneratorExpressionArgumentsMarker.visit_ExprNode  s2    ../.%)]]D"4 r+   c                     g r"   r#   r$   s     r'   rN  ._GeneratorExpressionArgumentsMarker.visit_Node  s     	r+   c                 &    U R                   Ul        g r"   )r4  r7  r$   s     r'   r   A_GeneratorExpressionArgumentsMarker.visit_GeneratorExpressionNode  s    !%r+   )r4  )
rB   rC   rD   rE   rN   rb   rN  r   rG   r~   r   s   @r'   r2  r2    s    !!
/ /r+   r2  c                   D    \ rS rSrS rS rS rS r\R                  r
Srg)_HandleGeneratorArgumentsi  c                    SSK Jn  [        U[        R                  5      (       d   eXl        [        UR                  R                  5      U l        [        UR                  5      U l	        SU l
        0 U l        U R                  U5        U R                  R                  5        H  u  p4UR                  XU5        M     U R                  UR                  l        U R                  Ul	        U$ )Nr   )Visitorr   )r  r@  rZ   r   GeneratorExpressionNodegen_noder  r   r   call_parameters	tag_countsubstitutionsr?   r  recursively_replace_node)r%   r&   r@  kvs        r'   r  "_HandleGeneratorArguments.__call__  s    $	 A ABBBB++,	#D$8$894 &&,,.DA ,,Ta8	 / "YY#33r+   c                 &    U R                  USS9nU$ )NF)do_visit_children_handle_ExprNode)r%   r&   new_nodes      r'   r   7_HandleGeneratorArguments.visit_GeneratorExpressionNode  s    (((G r+   c                 V   UR                   Gb  U R                  Gbt  U R                  UR                   :X  GaY  UR                  nU R                  nU =R                  S-  sl        [	        SR                  U5      5      nU R                  R                  nUR                  R                  U5      (       Gd"  SSK	J
n  [	        [        R                  UR                  [        U5      5      -   5      n[        R                   " X5S9n	UR"                  n
[$        R&                  " U
SS9n
Xl        [        R(                  " X9S S S S9nU	R*                  Ul        Xl        U R,                  R/                  U5        S Ul         U R0                  R/                  U5        UR3                  UR                  U5      Ul        XR4                  l        SUR4                  l        U(       a*  U R                  S sol        U R;                  U5        Xl        [<        R>                  " X5SS	9nU R                  R                  R@                  R                  RC                  UR*                  5      Ul        UR4                  R"                  Ul        XRD                  U'   U$ U(       a  U R;                  U5        U$ )
Nr   z.{})SymtabrX   r   F)remove_fakeref)rX   
declarator	base_typer   r^  T)r   initialized_check)#r7  rB  rX   rD  r   formatr   local_scopelookup_herer  rQ  r   genexpr_arg_prefixpunycodify_namer  r   r   r  r   remove_cv_refCArgDeclNoder   r   r   rC  declare_argumententrycname
in_closurer?   r   r   gbodylookuprE  )r%   r&   rK  rX   name_sourcer   r   rQ  r`  	name_declr  new_argrB  rP  s                 r'   rM  *_HandleGeneratorArguments._handle_ExprNode  s   "".4==3L!7!77((C ..KNNaN k!:;D}}--H''33D99$%f&?&?&BXBXY\]hYiBj&jk!55#I	yy "//UK!%,,:>Y]_(~~#		  ))-&$$++D1 ( 9 9(:N:NPW X&+#+/(  +/--'-""4( (
 "**3USI"mm44::FFMMinn]IO&__11IN'0t$t$r+   c                 &    U R                  US5      $ r`   rL  r$   s     r'   rb   (_HandleGeneratorArguments.visit_ExprNode  s    $$T400r+   )r   rC  rB  rE  rD  N)rB   rC   rD   rE   r  r   rM  rb   r   r  rN  rG   r#   r+   r'   r>  r>    s$    ,;z1 "55Jr+   r>  c                      ^  \ rS rSrSrSr\" S5      \" S5      \" S5      S.R                  rU 4S jr	S	 r
S
 rS rS r\S 5       rS rS r\S 5       rSrU =r$ )DecoratorTransformi#  z
Transforms method decorators in cdef classes into nested calls or properties.

Python-style decorator properties are transformed into a PropertyNode
with up to the three getter, setter and deleter DefNodes.
The functional style isn't supported yet.
N__get____set____del__)gettersetterdeleterc                    > U R                   c  / U l         U R                   R                  0 5        [        TU ]  U5      nU R                   R	                  5         U$ r"   )_propertiesr   rM   r  popr  s     r'   r  &DecoratorTransform.visit_CClassDefNode3  sQ    #!D#w*40r+   c                     [        UR                  S   [        5      (       a  SOSn[        UR                  SUR                  -  U5        U$ )Nr   r   z4'property %s:' syntax is deprecated, use '@property')rZ   rX   r  r   r   )r%   r&   rN  s      r'   visit_PropertyNode%DecoratorTransform.visit_PropertyNode;  s@    S11qPSWS\S\\^cdr+   c                    U R                  U5      nUR                  (       d  U$ U R                  S:w  d  U R                  R                  S:w  a  [        UR                  5      S:X  aO  UR                  S   R                  R                  (       a'  UR                  S   R                  R                  S:X  d#  [        UR                  S   R                  S5        U$ UnU R                  U5      nU(       a[  UR                  R                  (       a*  UR                  5       nU(       a  U R                  XU5      nO[        UR                  S5        UR                  (       a  U R                  XR                  S   5      $ U$ )Nr   r=   r   r   r   z0Cdef functions cannot take arbitrary decorators.z*C property decorator can only be @property)r4  r  r   r   r>   r   r  r>  r   r   rX   _find_property_decoratordeclared_name_add_property_reject_decorated_property)r%   r&   ret_nodedecorator_noder   s        r'   visit_CFuncDefNode%DecoratorTransform.visit_CFuncDefNodeA  s#   %%d+K__(DOO,F,F(,R (A-$//!2D2N2N2V2VOOA&0055Gdooa(,,.`aK66t<''//))+#11$nMHn((*VW??2249KLLr+   c                    U R                   nU R                  U5      nUS:w  d  UR                  (       d  U$ U R                  U5      nUb  UR                  nUR
                  (       a  U R                  XR                  U5      $ U R                  UR                  5      nU(       a  UR                  R                  UR                  :w  a>  [        UR                  SUR                  R                  < SUR                  < S35        O<[        UR                  5      S:  a  U R                  X5      $ U R                  XU5      $ UR                   Hf  nUR                  nUR
                  (       d  M"  U=R                   UR                  S:H  -  sl        U=R"                  UR                  S:H  -  sl        Mh     UR                  nS Ul        U R%                  XUR                  5      $ )Nr   z&Mismatching property names, expected 'z', got 'r3  r   r|  r   )r   r4  r  rz  r  r>  r|  r   _map_property_attributer  r  r   rX   r   r}  _add_to_propertyis_classmethodis_staticmethodchain_decorators)r%   r&   r   r  r  handler_namefuncdecss           r'   r5   DecoratorTransform.visit_DefNode[  s   __
%%d+!K 66t<%&00I  ))$		>JJ#;;I<O<OP }}))TYY6n00"+--"4"4diiAB T__-1#>>tTT#44TXX I&&D|||##tyyM'AA#$$		^(CC$	 ) $$T;;r+   c                    U R                   S   nUR                  S S S2    He  nUR                  nUR                  (       a  UR                  S:X  a  Us  $ UR
                  (       d  MG  UR                  R                  U;   d  Mc  Us  $    g )Nr   property)rs  r  r  r>  r   is_attributer  )r%   r&   
propertiesr  r  s        r'   rz  +DecoratorTransform._find_property_decorator  sv    %%b)
"oodd3N&00I  Y^^z%A%%'''IMM,>,>*,L%% 4 r+   c                 f    U R                    H   nX!:w  d  M
  [        UR                  S5        M"     U $ )Nz=Property methods with additional decorators are not supported)r  r   rX   )r&   r  decos      r'   r}  -DecoratorTransform._reject_decorated_property  s.     OOD%dhh _` $ r+   c                 p   [        UR                  5      S:  a  U R                  X5      $ UR                  R                  U5        U R                  S   n[        U[        R                  5      n[        R                  " UR                  U/S9nU(       al  X$;   a  [        UR                  S5        SUR                  ;  a  [        UR                  S5        [        R                  " UR                  UR                  X&S9nOX$;   aq  XB   nUR                  (       a  [        UR                  S5        g [        S5      Ul        UR                  Ul	        UR                  Ul        U/UR"                  l        g [        S5      Ul        [        R&                  " UR                  X!R                  US	9nXtU'   U$ )
Nr   r   r   C property redeclaredr  z+C property method must be declared 'inline')r   r   r[   rl  )r   r   r[   )r   r  r}  removers  rZ   r   r  r\   rX   r   r  CPropertyNoder   is_cpropertyr   r   r[   rY   PropertyNode)r%   r&   r   r  r  r  r[   props           r'   r|   DecoratorTransform._add_property  sV   t!#224HH~.%%b)
!$(:(:;!!$((4&9!dhh 78t~~-dhh MN&&txxTXXDTD#D  dhh 78 	 *)4	8888#'&		%i0DI%%t>D4r+   c                 r   U R                   S   nXAR                     nUR                  (       a  [        UR                  S5        g X!l        UR
                  R                  U5        UR                  R                  n[        U5       H  u  pxUR                  U:X  d  M  XU'     g    UR                  U5        g )Nr   r  )rs  r   r  r   rX   r  r  r[   rY   r  r   )	r%   r&   r   r  r  r  rY   r  stats	            r'   r  #DecoratorTransform._add_to_property  s    %%b)
))$$((34	y)		 'GAyyD a  (
 LLr+   c                 r   [         R                  " U R                  US9nUSSS2    H.  n[         R                  " UR                  UR                  U/S9nM0     [         R                  " U R                  US9n[
        R                  " U R                  UUS9n[
        R                  " U/5      nX`l        X/$ )a6  
Decorators are applied directly in DefNode and PyClassDefNode to avoid
reassignments to the function/class name - except for cdef class methods.
For those, the reassignment is required as methods are originally
defined in the PyMethodDef struct.

The IndirectionNode allows DefNode to override the decorator.
r   Nr   rq  r   r   )	r   r   rX   r  r  r   r   IndirectionNodedecorator_indirection)r&   r  r   decorator_resultr  rP  reassignments          r'   r  #DecoratorTransform.chain_decorators  s     %--dhhTB#DbD)I(77",,&' ) * &&txxd;	11HH "
 ,,l^<%1"##r+   )rs  )rB   rC   rD   rE   rF   rs  r   r   r  r  rw  r  r5  rz  r   r}  r|  r  r  rG   r~   r   s   @r'   rk  rk  #  s     K  	*	* + 
c	 4$<L
  <" $ $r+   rk  c                   2    \ rS rSrSrS r\r\r\r\r	\r
Srg)CnameDirectivesTransformi  z
Only part of the CythonUtilityCode pipeline. Must be run before
DecoratorTransform in case this is a decorator for a cdef class.
It filters out @cname('my_cname') decorators and rewrites them to
CnameDecoratorNodes.
c                    [        USS 5      (       d  U R                  U5      $ [        UR                  5       GH)  u  p#UR                  n[        U[        R                  5      (       d  M3  UR                  R                  (       d  MP  UR                  R                  S:X  d  Ml  UR                  5       u  pEU(       a  [        S5      e[        U5      S:w  a  [        S5      eUS   R                  (       a   US   R                  [         R"                  L d  [        S5      eUS   R%                  S 5      nUR                  U	 [&        R(                  " UR*                  UUS9n  O   U R                  U5      $ )	Nr  r`  z/cname decorator does not take keyword argumentsr   z*cname decorator takes exactly one argumentr   z4argument to cname decorator must be a string literal)rX   r&   r`  )getattrrN  r  r  r  rZ   r   rr  rq  r>  r   rs  r  r   r  r  r   unicode_typecompile_time_valuer   CnameDecoratorNoderX   )r%   r&   r  r  r   r  r`  s          r'   handle_function(CnameDirectivesTransform.handle_function  sD   t\400??4((%doo6LA!++I9i&8&899&&...&&++w6(;;=(MO O t9>(HJ J Q**tAw||w?S?S/S(RT T Q2248OOA&//DHH46;=1 74 t$$r+   r#   N)rB   rC   rD   rE   rF   r  r4  r  r6   r9   r-   rG   r#   r+   r'   r  r    s-    %@ ()("1'r+   r  c                   H    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rSrg)ForwardDeclareTypesi  z
Declare all global cdef names that we allow referencing in other places,
before declaring everything (else) in source code order.
c                     U R                   nUR                  nUR                  Ul        U R                  U5        X2l        U$ r"   )r(  r  r?   )r%   r&   envr  s       r'   r.  0ForwardDeclareTypes.visit_CompilerDirectivesNode  s9    nn4 r+   c                     UR                   U l        UR                  U R                  l        U R                  U5        U$ r"   )r  r(  r  r?   r$   s     r'   r]   $ForwardDeclareTypes.visit_ModuleNode  s3     JJ'+$4 r+   c                     U R                   R                  nSU R                   l        U R                  U5        X R                   l        U$ Nr   )r(  in_cincluder?   )r%   r&   old_cinclude_flags      r'   visit_CDefExternNode(ForwardDeclareTypes.visit_CDefExternNode#  sA     --99()%4 (9%r+   c                 <    UR                  U R                  5        U$ r"   )r  r(  r$   s     r'   r6   &ForwardDeclareTypes.visit_CEnumDefNode*  s    T&&'r+   c                     UR                   U R                  R                  ;  a  UR                  U R                  5        U$ r"   )r   r(  entriesr  r$   s     r'   r9   /ForwardDeclareTypes.visit_CStructOrUnionDefNode.  s1    99D--555LL**+r+   c                    UR                   U R                  R                  ;  a  UR                  U R                  5        U R                  R                  UR                      R                  nUb  UR
                  (       a  UR                  (       dz  UR                  (       ai  UR                  nUR                   HM  nUR                  (       d  M  UR                  R                  (       d  M3  UR                  R                  5         MO     U$ r"   )
class_namer(  r  r  r  is_extension_typeis_builtin_typer  cfunc_entriesis_fused"get_all_specialized_function_types)r%   r&   r  r  r_  s        r'   r  'ForwardDeclareTypes.visit_CClassDefNode3  s    ??$"3"3";";;LL**+  ((9>> 6 6t?S?SX\XbXbJJE,,:::%**"5"5"5JJAAC - r+   c                     U$ r"   r#   r$   s     r'   r4  %ForwardDeclareTypes.visit_FuncDefNode?  r0  r+   c                     U$ r"   r#   r$   s     r'   r  (ForwardDeclareTypes.visit_PyClassDefNodeC  r0  r+   )r(  N)rB   rC   rD   rE   rF   r.  r]   r  r6   r9   r  r4  r  rG   r#   r+   r'   r  r    s/    


r+   r  c                   |  ^  \ rS rSr\" SS\" S5      /S9r\" SS\" S5      /S9r\" SS\" S5      /S9r\" S\" S5      /S	9r	\" S
\" S5      /S	9r
SrSrU 4S jrS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rU 4S jrS rS r S  r!S! r"S" r#S# r$S$ r%S% r&S& r'S' r(S( r)S) r*S* r+S+r,U =r-$ ),AnalyseDeclarationsTransformiH  zr
property NAME:
    def __get__(self):
        return ATTR
    def __set__(self, value):
        ATTR = value
    c_classNrN  pipelinez
property NAME:
    def __get__(self):
        return ATTR
    def __set__(self, value):
        ATTR = value
    def __del__(self):
        ATTR = None
    z?
property NAME:
    def __get__(self):
        return ATTR
    a  
cdef class NAME:
    cdef TYPE value
    def __init__(self, MEMBER=None):
        cdef int count
        count = 0
        INIT_ASSIGNMENTS
        if IS_UNION and count > 1:
            raise ValueError, "At most one union member should be specified."
    def __str__(self):
        return STR_FORMAT % MEMBER_TUPLE
    def __repr__(self):
        return REPR_FORMAT % MEMBER_TUPLE
    )r  z;
if VALUE is not None:
    ATTR = VALUE
    count += 1
    r   c                    > / U l         [        5       U l        [        5       nUR                  U l        UR                  U5      $ r"   )seen_vars_stackrY  fused_error_funcsrM   r4  _super_visit_FuncDefNoder  )r%   rootsuper_classrS   s      r'   r  %AnalyseDeclarationsTransform.__call__x  s;    !!$g(3(E(E%##D))r+   c                 V    U R                   S   R                  UR                  5        U$ Nr   )r  r  r   r$   s     r'   rd  +AnalyseDeclarationsTransform.visit_NameNode  s$    R $$TYY/r+   c                 L   / U l         U R                  R                  [        5       5        UR	                  U R                  5       5        U R                  U5        U R                  R                  5         UR                  R                  R                  U R                   5        U$ r"   )extra_module_declarationsr  r   rY  analyse_declarationscurrent_envr?   rt  r[   rY   r?  r$   s     r'   r]   -AnalyseDeclarationsTransform.visit_ModuleNode  sx    )+&##CE*!!$"2"2"454   "		t==>r+   c                     U =R                   S-  sl         UR                  U R                  5       5        U R                  U5        U =R                   S-  sl         U$ r  )	in_lambdar  r  r?   r$   s     r'   r   -AnalyseDeclarationsTransform.visit_LambdaNode  sH    !!!$"2"2"454 !r+   c                 X   U R                  U5      nUR                  (       a@  SUR                  R                  ;   a&  SSKJn  U" XR                  R                  S   U 5        UR                  (       Ga5  UR                  R
                  (       Ga  UR                  (       Ga  / nUR                  R                   Hd  nUR                  (       d  M  U R                  U5      nUR                  UR                  5        U R                  U5        UR                  U5        Mf     U(       a  UR                  =R                  U-  sl        UR                  S:w  aQ  UR                  R                  S5      (       d1  UR                  R                  S5      (       d  U R!                  U5        U$ )Ndataclasses.dataclassr   )handle_cclass_dataclassr=   
__reduce____reduce_ex__)visit_ClassDefNoder  r  	Dataclassr  implementedr[   var_entriesneeds_propertycreate_Propertyr  rT  r   rY   r>   rc  _inject_pickle_methods)r%   r&   r  rY   r_  r  s         r'   r  0AnalyseDeclarationsTransform.visit_CClassDefNode  s(   &&t,::1TZZ5J5JJ:#D***?*?@W*XZ^_:::$**000TYYYE//'''#33E:H11$**=JJx(LL* 0 		5(8+ JJ--l;; JJ--o>>++D1r+   c                    U R                  5       nUR                  R                  S   SL a  g UR                  R                  S   SL n/ nUR                  R                  nS nS nUb  UR                  S UR                  R                   5       5        U=(       d    UR                  R                  S5      nU=(       d=    UR                  R                  S5      =(       d    UR                  R                  S5      nUR                  nUb  M  UR                  S S	9  U(       a  g U Vs/ s Hd  nUR                  R                  (       a  M   UR                  R                  U5      (       a"  UR                  R                  U5      (       a  Mb  UPMf     n	nU Vs/ s H!  oR                  R                  (       d  M  UPM#     n
nU(       d  U	(       d  U
(       a  U(       d  U(       a  S
nO>U	(       a  SSR                  S U	 5       5      -  nOSSR                  S U
 5       5      -  nU(       a  [        UR                   U5        [#        SSU0-  S[%        S 5      /S9R'                  0 5      nUR)                  UR                  5        U R+                  U5        UR,                  R.                  R1                  U5        g U HV  nUR                  R                  (       a  M   UR                  R3                  U5        UR                  R5                  U5        MX     U Vs/ s H  oR6                  PM     nnSR                  [9        U5       VVs/ s H  u  pSU< SU< S3PM     snn5      n[;        U5      n[=        U5      S:w  a  UUS   S-  /-   S S nSUR>                   3n[=        U5      nURA                  [B        RD                  RG                  SS5      5        SU SS R                  U5       S S R                  U5      RI                  S!5      < S"URJ                   S#U S$URJ                   S%U S&URJ                   S'U S(US) S*3nURA                  [B        RD                  RG                  S+S5      5        [#        US,[%        S 5      /S9R'                  0 5      nUR)                  UR                  R                  5        U R+                  U5        U RL                  R1                  U5        S R                  S- U 5       5      [=        U5      S.:X  a  SOS/-   nS0R                  U Vs/ s H/  oR                  R                  (       d  M  S1UR6                   S23PM1     sn=(       d    S3/5      nS4U S5U S6U S7US8    S9U S7US8    S:U S;3n[#        US[%        S 5      /S9R'                  0 5      nUR)                  UR                  5        U RO                  XR                  5        U R+                  U5        U RQ                  5         UR,                  R.                  R1                  U5        g s  snf s  snf s  snf s  snnf s  snf )<Nauto_pickleFTc              3   H   #    U  H  oR                   S ;  d  M  Uv   M     g7f))__weakref____dict__Nr   .0r   s     r'   	<genexpr>FAnalyseDeclarationsTransform._inject_pickle_methods.<locals>.<genexpr>  s     m*?Q66QlClqq*?s   "	"	__cinit__r  r  c                     U R                   $ r"   r   )r   s    r'   <lambda>EAnalyseDeclarationsTransform._inject_pickle_methods.<locals>.<lambda>  s    qvvr+   )r  z2no default __reduce__ due to non-trivial __cinit__z6%s cannot be converted to a Python object for picklingr  c              3   @   #    U  H  nS UR                   -  v   M     g7fzself.%sNr   r  s     r'   r  r    s      Y}v|qrZcfgflflZlv|   zZPickling of struct members such as %s must be explicitly requested with @auto_pickle(True)c              3   @   #    U  H  nS UR                   -  v   M     g7fr  r   r  s     r'   r  r    s     ;`X_STI<NX_r   z
                def __reduce_cython__(self):
                    raise TypeError, "%(msg)s"
                def __setstate_cython__(self, __pyx_state):
                    raise TypeError, "%(msg)s"
                msgr  r  z; z__pyx_result.z = __pyx_state[]r8  r   r   __pyx_unpickle_UpdateUnpickledDictzExtensionTypes.cz
                cdef extern from *:
                    int __Pyx_CheckUnpickleChecksum(long, long, long, long, const char*) except -1
                    int __Pyx_UpdateUnpickledDict(object, object, Py_ssize_t) except -1

                def z(__pyx_type, long __pyx_checksum, tuple __pyx_state):
                    cdef object __pyx_result
                    __Pyx_CheckUnpickleChecksum(__pyx_checksum, z, zUTF-8z%)
                    __pyx_result = z].__new__(__pyx_type)
                    if __pyx_state is not None:
                        z__set_state(<z[> __pyx_result, __pyx_state)
                    return __pyx_result

                cdef z__set_state(z8 __pyx_result, __pyx_state: tuple):
                    zJ
                    __Pyx_UpdateUnpickledDict(__pyx_result, __pyx_state, dz)
            CheckUnpickleChecksumr   c              3   ,   #    U  H
  nS U 3v   M     g7f)self.Nr#   )r  rH  s     r'   r  r  	  s     G5F%s5Fs   r   r  z or r	  z is not NoneFalsez
                def __reduce_cython__(self):
                    cdef tuple state
                    cdef object _dict
                    cdef bint use_setstate
                    state = (a	  )
                    _dict = getattr(self, '__dict__', None)
                    if _dict is not None and _dict:
                        state += (_dict,)
                        use_setstate = True
                    else:
                        use_setstate = zE
                    if use_setstate:
                        return z, (type(self), r   zH, None), state
                    else:
                        return zZ, state)

                def __setstate_cython__(self, __pyx_state):
                    z+__set_state(self, __pyx_state)
            ))r  r  r  r_  r  r?  r  rc  rU  sortis_pyobjectcan_coerce_to_pyobjectcan_coerce_from_pyobjectis_struct_or_unionr  r   rX   r   rI   
substituter  rT  r[   rY   r   create_to_py_utility_codecreate_from_py_utility_coder   r  _calculate_pickle_checksumsr   punycode_class_nameuse_utility_coder   UtilityCodeload_cachedencoder  r  enter_scope
exit_scope)r%   r&   r  auto_pickle_forcedall_membersri  cinitinherited_reducer   non_pystructsr  pickle_funcall_members_namesixrH  assignments	checksumsunpickle_func_namenum_membersunpickle_codeunpickle_funcmembersany_notnone_memberspickle_codes                            r'   r  3AnalyseDeclarationsTransform._inject_pickle_methods  s    ::  /58!ZZ22=ATIjjooom#))*?*?mm:SYY--k:E/v3993C3CL3QvUXU^U^UeUefuUv--C	 o
 	-.  #
"!66%% /0vv/L/LS/Q/Q23&&2Q2QRU2V { 	 
 *GkVV-F-F1kGFw/AJNQTQYQYY}v|Y}Q}}
13688;`X_;`3`a "dhh$& (
 cl(#  =+>*?A BLB  ,,TZZ8JJ{#IIOO"";/ !vv)))FF44S9FF66s; !
 2= =A =))&'89%9EB 89"=9% K 44EFI9~"&)B-!*;)<<bqA	#243K3K2L!M/0K  !1!1!=!=>SUg!hi!
 (( )AAE9AU@VVXY]YbYbctYuY|Y|  ~E  ZF  YI I$$(OO#4 5+,M$//9J K ))doo5F G M "JJUVW YM$   !1!1!=!=>UWi!jk(hR_`dReQfgrrsuvM..tzz/?/?@JJ}%**11-@iiG5FGGRUVgRhlmRm3suvG"(++U`.wU`PQdjdjdvdv/Kqvvhl/KU`.w  /E  }D  |E  #F
 &Y '( )<'< =  23?9Q<. Q  23?9Q<. Q (( )%K* '{)}]aObNcdooprsK,,TZZ8T::.JJ{#OOIIOO"";/g
 HF !>%X /xs6   +X6>X6X6X;>X;"Y Y
0YYc                    / nU Hc  nUR                   nUR                  (       a2  UR                  S;  d"  UR                  UR                  5      (       d  MR  UR	                  U5        Me     U(       aS  [        U R                  5      nUR                  nUR                  XUR                  5      u  pU
R                  U5        X:/nU$ )zL
Create function calls to the decorators and reassignments to
the function.
)r   r|  )
r  r>  r   rY  r   rk  rR   r&   r  r  )r%   old_decoratorsr  r&   r  r  r  	transformr   r   reassignmentss              r'   _handle_fused_def_decorators9AnalyseDeclarationsTransform._handle_fused_def_decorators7	  s     
'I&&DLLII%DDOODII..!!), ( *4<<8IyyH(99hmm 5A..s3(Dr+   c                 &   UR                   R                  SUR                  5        U R                  US5        UR	                  U5        SUR                  R
                  R                  l        [        R                  R                  UR                  SS9n[        R                  " UR                  U5      5      nXCl        U R                  UR                  [        R                  " U5      U5      Ul        U(       a  U R#                  XU5      nU$ )z#Handle def or cpdef fused functionsr   py_funcFT)binding)rY   insertr5  r_  update_fused_defnode_entryr_  	signatureuse_fastcallr   PyCFunctionNodefrom_defnoder  coerce_to_tempresulting_fused_function_create_assignmentr  fused_func_assignmentr2  )r%   r  r  r&   pycfuncs        r'   _handle_def(AnalyseDeclarationsTransform._handle_defQ	  s     	

!T\\*i('',49$$1++88t8T%%g&<&<S&AB(/%%)%<%<LL)--g6&=" 44ZdKDr+   c                     SSK Jn  U R                  (       d  U R                  (       a  U R                  U R                  ;  a>  U R                  (       a  [        UR                  S5        O[        UR                  S5        U R                  R                  U R                  5        [        R                  " UR                  5      Ul
        UR                   HB  nUR                  R                  (       d  M   UR                  R                  5       S   Ul        MD     U$ [        USS5      nUR!                  X!5      nX l        U R#                  U5        SU l        UR$                  (       a  U R'                  XQU5      nU$ )z:Create a fused function for a DefNode with fused argumentsr   )	FusedNodezFused lambdas not allowedzCannot nest fused functionsr   r  N)r  rE  fused_functionr  r  r   rX   r  r   rx   r[   r   r  r  get_fused_typesr  FusedCFuncDefNoder?   r5  rB  )r%   r  r&   rE  r  r  s         r'   _create_fused_function3AnalyseDeclarationsTransform._create_fused_functione	  s   $..""$*@*@@>>$(($?@$(($AB""&&t':':;**4884DIyy88$$$"xx779!<CH ! KT<6
**45"4 "<<##JT:Dr+   c                     UR                   (       a\  UR                  (       aK  [        UR                  S5        SUl        [        R
                  " UR                  / S9UR                  l        UR                  $ )NzFused generators not supportedFr   )is_generatorhas_fused_argumentsr   rX   r   r\   rb  r[   r$   s     r'   _handle_fused*AnalyseDeclarationsTransform._handle_fused	  sR    !9!9$((<=',D$#00DDJJO'''r+   c                 f   U R                  5       nU R                  R                  [        5       5        UR                  nUR                  U5        UR                  R                  5        H  u  pEUR                  U5      (       a  M  UR                  U5      nU(       a=  UR                  (       a,  UR                  (       a  UR                  UR                  5      nU(       a  UR                  XFUR                  5        M  [        UR                  S5        M     U R!                  U5      (       a  U R#                  X!5      nO,UR$                  R'                  U5        U R)                  U5      nU R                  R+                  5         SUR,                  ;   a  SSKJn  UR3                  U5      $ U$ )a  
Analyse a function and its body, as that hasn't happened yet.  Also
analyse the directive_locals set by @cython.locals().

Then, if we are a function with fused arguments, replace the function
(after it has declared itself in the symbol table!) with a
FusedCFuncDefNode, and analyse its children (which are in turn normal
functions). If we're a normal function, just analyse the body of the
function.

Not a typer  r   )UFuncs)r  r  r   rY  rX  declare_argumentsr  r  rY  analyse_as_typer  fused_to_specific
specializedeclare_varrX   r   rN  rI  r[   r  r  rt  r  r  rR  convert_to_ufunc)r%   r&   r  lenvvar	type_noder  rR  s           r'   r4  .AnalyseDeclarationsTransform.visit_FuncDefNode	  sE     ##CE*t$ #3399;NC##C(( 006DMMd.D.D??4+A+ABD$$S	>)--6 < d##..s9DII**40006D  "doo% **400r+   c                    U R                  U5      n[        U[        R                  5      (       d  U$ U R	                  5       nUR
                  c6  [        R                  " U5      Ul        UR
                  R                  U5        UR                  (       d  UR                  (       a  U$ UR                  U5      (       d  U$ XR                  X5      /$ r"   )r4  rZ   r   r   r  code_objectr   CodeObjectNoder  fused_py_funcis_generator_bodyneeds_assignment_synthesis_synthesize_assignmentr%   r&   r  s      r'   r5  *AnalyseDeclarationsTransform.visit_DefNode	  s    %%d+$..K #(77=D11#6!7!7K..s33K11$<==r+   c                     UR                   cZ  UR                  cM  [        R                  R	                  U5      Ul         UR                   R                  U R                  5       5        U R                  U5      $ r"   )r^  r5  r   r_  	for_cfuncr  r  r4  r$   s     r'   r  /AnalyseDeclarationsTransform.visit_CFuncDefNode	  s^    #(<(77AA$GD11$2B2B2DE%%d++r+   c                 $    U R                  U5      $ r"   )r4  r$   s     r'   visit_GeneratorBodyDefNode7AnalyseDeclarationsTransform.visit_GeneratorBodyDefNode	  s    %%d++r+   c                 ^    U R                  U5      nUR                  UR                  l        U$ r"   )r5  r^  rb  )r%   r&   r   s      r'   visit_GeneratorDefNode3AnalyseDeclarationsTransform.visit_GeneratorDefNode	  s)    ##D)!%!1!1

r+   c                    UnUR                   (       d  UR                  (       a2  UR                  nUR                   (       a  M  UR                  (       a  M2  UR                   =(       d    U R                  R	                  S5      nUR
                  (       a&  [        R                  R                  X5      =oQl	        O[        R                  R                  X5      nUR                  Ul        U R                  XU5      $ )Nr6  )is_py_class_scopeis_c_class_scopeouter_scopecurrent_directivesr   is_closure_scoper   InnerFunctionNoder<  py_cfunc_noder;  r6  is_cyfunctionr?  )r%   r&   r  genvr6  r   s         r'   rc  3AnalyseDeclarationsTransform._synthesize_assignment	  s    $$(=(=##D $$$(=(=(= ''Q4+B+B+F+Fy+Q  '0'B'B'O'OPT'^^C$++88GC [[&&t#66r+   c                 n   UR                   (       aK  UR                   S S S2    H.  n[        R                  " UR                  UR                  U/S9nM0     S Ul         [
        R                  " UR                  [        R                  " UR                  UR                  S9US9nUR                  U5        U$ )Nr   r  r   r   )
r  r   r  rX   r  r   r   r   r   r  )r%   r   r   r  r  assmts         r'   r?  /AnalyseDeclarationsTransform._create_assignment	  s    %0026	..MM(225" 7
 #'H**LL""8<<hmmD 	""3'r+   c                    > U R                   R                  5       n[        TU ]  U5        U R                   R	                  U5        g r"   )r  rt  rM   visit_func_outer_attrsr   )r%   r&   stackrS   s      r'   r~  3AnalyseDeclarationsTransform.visit_func_outer_attrs	  s8    $$((*&t,##E*r+   c                    U R                  5       nUR                  U5        UR                  (       a  U R                  R	                  [        U R                  S   5      5        U R                  XR                  5        UR                  UR                  5        U R                  U5        U R                  5         U R                  R                  5         U$ UR                  U5        U R                  U5        U$ r  )r  r  
expr_scoper  r   rY  r  analyse_scoped_declarationsr?   r  rt  rd  s      r'   visit_ScopedExprNode1AnalyseDeclarationsTransform.visit_ScopedExprNode	  s     !!#&??  ''D,@,@,D(EFT??3,,T__=t$OO  $$&
  ,,S1t$r+   c                 f    U R                  U5        UR                  U R                  5       5        U$ r"   r?   r  r  r$   s     r'   visit_TempResultFromStatNode9AnalyseDeclarationsTransform.visit_TempResultFromStatNode
  ,    4 !!$"2"2"45r+   c                 F    UR                   S:X  a  g U R                  U5      $ r<   )r>   r  r$   s     r'   r@   /AnalyseDeclarationsTransform.visit_CppClassNode
  s"    ??h&**400r+   c                      g r"   )*r   rw  rX   r   r   r_  r  r  r  r   r   r  init_assignmentr  r   struct_or_union_wrapperr   r\   rc  	is_structr#  r  replacerY   r  shadowr[   rZ   rU  CSimpleBaseTypeNoder   r   kw_onlyr   r  rT  r  basic_pyobject_propertybasic_propertyr  r  r  )r%   r&   
self_valuer  
attributesr_  init_assignmentsattr
str_formatwrapper_class
class_bodyinit_methodarg_templater  templater  s                   r'   r9   8AnalyseDeclarationsTransform.visit_CStructOrUnionDefNode
  s
     r+   c                 (    U R                  U5        U$ r"   rM  r$   s     r'   r0   2AnalyseDeclarationsTransform.visit_CDeclaratorNodei
  s    4 r+   c                     U$ r"   r#   r$   s     r'   r(   /AnalyseDeclarationsTransform.visit_CTypeDefNoden
  r*   r+   c                     g r"   r#   r$   s     r'   r3   0AnalyseDeclarationsTransform.visit_CBaseTypeNodeq
  s    r+   c                 (    UR                   S:X  a  U$ g )Npublic)r>   r$   s     r'   r6   /AnalyseDeclarationsTransform.visit_CEnumDefNodet
  s    ??h&Kr+   c                 V   UR                   U R                  S   ;   az  U R                  5       R                  UR                   5      nUb+  UR                  S:w  a>  UR
                  R                  (       d#  [        UR                  SUR                   -  5        U R                  U5        U$ )Nr   r=   z,cdef variable '%s' declared after it is used)
r   r  r  rc  r>   r  rq  r   rX   r?   r%   r&   r_  s      r'   visit_CNameDeclaratorNode6AnalyseDeclarationsTransform.visit_CNameDeclaratorNodez
  s    99,,R00$$&--dii8E!1!1X!=!KK88dhh NQUQZQZ Z[4 r+   c                 &    U R                  U5        g r"   rM  r$   s     r'   r-   .AnalyseDeclarationsTransform.visit_CVarDefNode
  s    4 r+   c                     U R                  US5      nU(       d  g [        U5      [        L a  US   Ul        U/USS  -   $ U$ )Nr&   r   r   )r_  r  r  r&   )r%   r&   
child_nodes      r'   visit_CnameDecoratorNode5AnalyseDeclarationsTransform.visit_CnameDecoratorNode
  sH    __T62

t#"1DI6JqrN**r+   c                    UR                   S:X  a5  UR                  R                  (       a  U R                  nO)U R                  nOUR                   S:X  a  U R
                  nWR                  S[        R                  " UR                  [        R                  " UR                  SS9UR                  S90UR                  S9R                  S   nUR                  Ul        UR                  Ul        U$ )	Nr  readonlyATTRr%   rR  )rX   r  r  )rX   r   )r>   r  r  r  r  basic_property_ror  r   rw  rX   r   r   rY   r   )r%   r_  r  r  s       r'   r  ,AnalyseDeclarationsTransform.create_Property
  s    x'zz%%77..+--H&&	//EII4=4F4F599[a4b:?**F
 		 ' 
 % 

yyr+   c                 f    U R                  U5        UR                  U R                  5       5        U$ r"   r  r$   s     r'   rq  ;AnalyseDeclarationsTransform.visit_AssignmentExpressionNode
  r  r+   )r  r  r  rF  r  ).rB   rC   rD   rE   r   rI   r  r  r  r  r  rF  r  r  rd  r]   r   r  r  r2  rB  rI  rN  r4  r5  r  rj  rm  rc  r?  r~  r  r  r@   r9   r0   r(   r3   r6   r  r-   r  r  rq  rG   r~   r   s   @r'   r  r  H  sQ   ! # M$$7#8:N + , M$$7#8: % & M$$7#8	: + , !&') # $ !&'	)O NI**K0Z4(<('R>,,7 +"
1P7l

( r+   r  c                 <   SR                  U 5      R                  S5      n[        R                  S:  a  SS0O0 n/ nS HB  n [	        [
        U5      nU" U40 UD6R                  5       nUR                  SUS S -   5        MD     U$ ! [        [        4 a     M[  f = f)	N zutf-8)r8  	   usedforsecurityF)sha256sha1md50xrA  )
r  r  r   version_infor  r   	hexdigestAttributeError
ValueErrorr   )member_namesmember_names_stringhash_kwargsr%  	algo_name
mkchecksumchecksums          r'   r  r  
  s     ((<077@030@0@F0J$e,PRKI.		 )4J!"5EEOOQH 	!,- / 	 
+ 		s   'BBBc                   t   ^  \ rS rSrSrSrSrU 4S jrSS jrS r	S r
S rS	 rS
 rS rS rS rS rSrU =r$ ) CalculateQualifiedNamesTransformi
  zR
Calculate and store the '__qualname__' and the global
module name on some nodes.
Fc                    > U R                  5       R                  U l        / U l        [        5       nUR                  U l        UR                  U l        U R                  U5        U$ r"   )	global_scoperJ  r  rM   r4  r  r  _super_visit_ClassDefNoder?   )r%   r&   _superrS   s      r'   r]   1CalculateQualifiedNamesTransform.visit_ModuleNode
  sX    ,,.== (.(@(@%)/)B)B&4 r+   c                     U(       a!  U R                   S S  nUR                  U5        OU R                   n[        SR                  U5      5      Ul        U R
                  Ul        g )Nr  )rJ  r   r   r  qualnamer  )r%   r&   r   r  s       r'   _set_qualname.CalculateQualifiedNamesTransform._set_qualname
  sO    **1-HOOD!**H%chhx&89++r+   c                     UR                   (       a$  UR                  (       d  UR                  /U l        g U R                  R	                  UR                  5        g r"   )is_pyglobalis_pyclass_attrr   rJ  r   )r%   r_  s     r'   _append_entry.CalculateQualifiedNamesTransform._append_entry
  s9    U%:%:#(::,D&&uzz2r+   c                 ^    U R                  XR                  5        U R                  U5        U$ r"   )r  r   r?   r$   s     r'   visit_ClassNode0CalculateQualifiedNamesTransform.visit_ClassNode
  s'    4+4 r+   c                 J    U R                  U5        U R                  U5        U$ r"   )r  r?   r$   s     r'   visit_PyClassNamespaceNode;CalculateQualifiedNamesTransform.visit_PyClassNamespaceNode
  s#    4 4 r+   c                 r   U R                   S S  nUR                  R                  (       aP  U R                   (       a?  U R                   S   S:X  a,  U R                   R                  5         U R	                  U5        O%U R	                  XR                  R
                  5        U R                  U5        X l         U$ Nr   <locals>)rJ  r   
is_wrapperrt  r  r   r?   r%   r&   orig_qualified_names      r'   visit_PyCFunctionNode6CalculateQualifiedNamesTransform.visit_PyCFunctionNode
  s    "11!4==##(;(;@S@STV@W[e@e##%t$t]]%7%784 1r+   c                    UR                   (       a  U R                  (       aw  U R                  S   S:X  d   U R                  5       eU R                  S S  nU R                  R                  5         U R                  U5        U R	                  U5        X l        U$ U R                  XR
                  5        U R                  U5        U$ r  )r  rJ  rt  r  r  r   r4  r  s      r'   r5  .CalculateQualifiedNamesTransform.visit_DefNode
  s    ??t22&&r*j8M$:M:MM8"&"5"5a"8##%t$))$/"5  tYY/""4(r+   c                    U R                   S S  n[        USS 5      S:X  a  U R                   R                  S5        OU R                  UR                  5        U R                   R                  S5        U R                  U5        X l         U$ )Nr   z<lambda>r  )rJ  r  r   r  r_  r  r  s      r'   r4  2CalculateQualifiedNamesTransform.visit_FuncDefNode   sw    "11!44&*4&&z2tzz*"":.%%d+1r+   c           	         UR                   R                  U5      n[        R                  " UR                  [        U5      USS9n[        R                  " UR                  US9nUR                  R                  R                  S[        R                  " UR                  UUS9R                  U R                  5       5      5        g )NT)r   r_  	is_targetr   r   r   )r  rY  r   r   rX   r   r  r[   rY   r7  r   r   analyse_expressionsr  )r%   r&   r   r   r_  r   r   s          r'   generate_assignment4CalculateQualifiedNamesTransform.generate_assignment  s    

&&t,  HHt$	
 ##DHHE:		q%"<"<HH#
 
d..0
1		3r+   c           	      `   U R                   nSU l         U R                  nSU l        U R                  S S  n[        USS 5      =(       d3    U R	                  5       R                  UR                  R                  5      nU R                  U5        U R                  U5        U R                   (       a5  U R                  US[        SR                  U R                  5      5      5        U R                  (       a&  U R                  US[        U R                  5      5        X@l        X l         X0l        U$ )NFr_  rD   r  rC   )needs_qualname_assignmentneeds_module_assignmentrJ  r  r  rY  r  r   r  r  r  r   r  r  )r%   r&   orig_needs_qualname_assignmentorig_needs_module_assignmentr  r_  s         r'   r  3CalculateQualifiedNamesTransform.visit_ClassDefNode  s   )-)G)G&).&'+'C'C$',$"11!4w- B!!#//0@0@A 	5!&&t,))$$T>%2388D<O<O3P%QS''$$T<%243C3C%DF1)G&'C$r+   c                     U R                  5       nUR                  (       a0  UR                  S:X  a	  SU l        U$ UR                  S:X  a  SU l        U$ )NrD   TrC   )r  rq  r   r  r  )r%   r&   r  s      r'   rd  /CalculateQualifiedNamesTransform.visit_NameNode.  sQ      "!! yyN*15.  l*/3,r+   )r  r  r  r  r  rJ  r"   )rB   rC   rD   rE   rF   r  r  r]   r  r  r  r  r  r5  r4  r  r  rd  rG   r~   r   s   @r'   r  r  
  sR     !&#,3
		3* r+   r  c                   >    \ rS rSrS rS rS rS rS rS r	S r
S	rg
)AnalyseExpressionsTransformi=  c                     UR                   R                  5         UR                  R                  UR                   5      Ul        UR                  1/U l        U R                  U5        U R                  U5        U$ r"   )r  infer_typesr[   r  rX   	positionsr?   _build_positionsr$   s     r'   r]   ,AnalyseExpressionsTransform.visit_ModuleNode?  s\    

 II11$**=	88*4 d#r+   c                    UR                   R                  5         UR                  R                  UR                   5      Ul        U R                  S   R                  UR                  5        UR                  (       a  U R                  S   nOUR                  1nU R                  R                  U5        U R                  U5        U R                  U5        U$ r  )rX  r   r[   r  r  r  rX   r  r   r?   r  )r%   r&   local_positionss      r'   r4  -AnalyseExpressionsTransform.visit_FuncDefNodeG  s    $$&II11$2B2BC	rtxx(??"nnR0O#xxjOo.4 d#r+   c                     UR                   (       a5  UR                  R                  5         UR                  UR                  5      nU R	                  U5        U$ r"   )r   r  r   analyse_scoped_expressionsrb   r$   s     r'   r  0AnalyseExpressionsTransform.visit_ScopedExprNodeW  sB    OO'')224??CDD!r+   c                     U R                  U5        UR                  (       a'  UR                  R                  (       d  UR                  nU$ )a~  
Replace index nodes used to specialize cdef functions with fused
argument types with the Attribute- or NameNode referring to the
function. We then need to copy over the specialization properties to
the attribute or name node.

Because the indexing might be a Python indexing operation on a fused
function, or (usually) a Cython indexing operation, we need to
re-analyse the types.
)rb   is_fused_indexr  is_errorr   r$   s     r'   visit_IndexNode+AnalyseExpressionsTransform.visit_IndexNode^  s5     	D!tyy'9'999Dr+   c                 x    U R                   S   R                  UR                  5        U R                  U5        U$ r  r  r  rX   r?   r$   s     r'   rb   *AnalyseExpressionsTransform.visit_ExprNodeq  0    rtxx(4 r+   c                 x    U R                   S   R                  UR                  5        U R                  U5        U$ r  r  r$   s     r'   rf   *AnalyseExpressionsTransform.visit_StatNodev  r  r+   c                 x   [        U R                  R                  5       [        SS5      SS9nSnSn/ nU H&  u  pgnUR	                  XwXU:X  a  UOUS-   45        XxpCM(     UR                  5         XQl        UR                  5         [        U5       V	V
s0 s H  u  pX_M	     sn
n	UR                  l	        gs  sn
n	f )zW
Build the PEP-626 line table and "bytecode-to-position" mapping used for CodeObjects.
r   r   T)r  reverser   r   N)
r%  r  rt  r   r   r  node_positionsr  rX  node_positions_to_offset)r%   	func_noder  	next_linenext_column_in_linerangesr   r  start_columnr  positions              r'   r  ,AnalyseExpressionsTransform._build_positions{  s     !NN 1a 	
	 	%.!A\MM4|T]L]5Hcorscstu-1* &/ 	#)   )3:
3 K3:
	6 :
s   B6)r  N)rB   rC   rD   rE   r]   r4  r  r  rb   rf   r  rG   r#   r+   r'   r  r  =  s%     &


r+   r  c                   ,    \ rS rSrS rS rS rS rSrg)FindInvalidUseOfFusedTypesi  c                 6    SU l         U R                  U5        U$ rL   )_in_fused_functionrT  )r%   trees     r'   r  #FindInvalidUseOfFusedTypes.__call__  s    "'

4r+   c                 &    U R                  U5        g r"   rM  r$   s     r'   rN  %FindInvalidUseOfFusedTypes.visit_Node  rP  r+   c                    U R                   nUR                  U l         U R                   (       dB  UR                  (       d1  UR                  R                  (       a  [        UR                  S5        U R                  U5        X l         g )Nz-Return type is not specified as argument type)r#  rM  ra  return_typer  r   rX   r?   )r%   r&   outer_statuss      r'   r4  ,FindInvalidUseOfFusedTypes.visit_FuncDefNode  s`    .."&":":&& ))d.>.>.G.Gdhh OP4 ".r+   c                     U R                   (       dC  UR                  (       a2  UR                  R                  (       a  [        UR                  S5        g U R                  U5        g )Nz6Invalid use of fused types, type cannot be specialized)r#  r  r  r   rX   r?   r$   s     r'   rb   )FindInvalidUseOfFusedTypes.visit_ExprNode  s<    &&4999K9K$((TU t$r+   )r#  N)	rB   rC   rD   rE   r  rN  r4  rb   rG   r#   r+   r'   r!  r!    s    
!/%r+   r!  c                        \ rS rSrS rS rSrg)ExpandInplaceOperatorsi  c                   ^	 UR                   nUR                  nUR                  R                  (       a  U$ [	        U[
        R                  5      (       a  U$ U R                  5       nSU	4S jjm	 T	" USS9u  p%UR                  " S0 UR                  D6n[
        R                  " UR                  UR                  UUSS9nSUl        UR                  U5      nUR!                  U5        UR#                  U5        [$        R&                  " UR                  UUR)                  UR                  U5      S9nUR+                  5         U H  n[-        X5      nM     U$ ! [         a    Us $ f = f)Nc                 \  > U R                   (       a  U / 4$ U R                  R                  (       a  U(       d  [        U 5      n X /4$ U R                  (       aM  T" U R
                  5      u  p#[        U R                  5      n[        R                  " U R                  X$S9X4/-   4$ U R                  (       a>  T" U R                  US9u  pS[        R                  " U R                  XPR                  S9U4$ [        U [        R                  5      (       a  [!        S5      e[        U 5      n X /4$ )N)r   indexsetting)r  r  z@Don't allow things like attributes of buffer indexing operations)r>  r  r  r
   is_subscriptr   r2  r   	IndexNoderX   r  r  rw  r  rZ   BufferIndexNoder  )r&   r4  r   tempsr2  r  side_effect_free_references         r'   r9  VExpandInplaceOperators.visit_InPlaceAssignmentNode.<locals>.side_effect_free_reference  s    ||Rx&&w!$'V|#""8C"4::. **488$LeV]o]]""7'R
 ..txxSNN[]bbbD)";";<< !cdd!$'V|#r+   Tr3  )r  operand1operand2inplacer   r}   r#   )r   r   r  is_cpp_classrZ   r   r7  r  r  rS   r  
binop_noderX   r  r  analyse_target_typesanalyse_typesanalyse_operationr   r   	coerce_tor  r	   )
r%   r&   r   r   r  let_ref_nodesdupbinoptr9  s
            @r'   visit_InPlaceAssignmentNode2ExpandInplaceOperators.visit_InPlaceAssignmentNode  sA   hhhh88  Kc94455K 	$$	!;C!NC mm+cll+$$TXX040303-1	3 &&s+#$))HH#.0
 	A1#D +  	K	s   1	E E+*E+c                     U$ r"   r#   r$   s     r'   rb   %ExpandInplaceOperators.visit_ExprNode  r0  r+   r#   N)rB   rC   rD   rE   rH  rb   rG   r#   r+   r'   r/  r/    s    4lr+   r/  c                   F    \ rS rSrSrSrS rS rS rS r	S r
S	 rS
 rSrg)AdjustDefByDirectivesi  z
Adjust function and class definitions by the decorator directives:

@cython.cfunc
@cython.cclass
@cython.ccall
@cython.inline
@cython.nogil
@cython.critical_section
)r   total_orderingr  c                 X    UR                   U l         SU l        U R                  U5        U$ rL   )r  in_py_classr?   r$   s     r'   r]   &AdjustDefByDirectives.visit_ModuleNode  s(    // 4 r+   c                 n    U R                   nUR                   U l         U R                  U5        X l         U$ r"   r+  r,  s      r'   r.  2AdjustDefByDirectives.visit_CompilerDirectivesNode  s.    //4 (r+   c           
         / nSU R                   ;   a  UR                  S5        U R                   R                  S5      nU R                   R                  S5      nU R                   R                  S5      nUc  SOSnU R                   R                  S5      nUc)  U R                   S   (       a  UR                  nUb  Uc  S	nOUc  S U(       a  SOS4nU R                   R                  S
5      (       a&  SU R                   ;  a  [	        UR
                  S5        SU R                   ;   af  SU R                   ;   a  [	        UR
                  S5        U(       a  [	        UR
                  S5        UR                  SX#XuUS9nU R                  U5      $ SU R                   ;   aL  U R                  (       a  [	        UR
                  S5        O$UR                  SX#UXuUS9nU R                  U5      $ SU;   a  [	        UR
                  S5        U(       a  [	        UR
                  S5        U(       a  [	        UR
                  S5        U R                  U5        U$ )Nr  r  r  r  FTreturnsannotation_typingr`   c_compile_guardr  z+c_compile_guard only allowed on C functionsccallz-cfunc and ccall directives cannot be combinedz-ccall functions cannot be declared 'with_gil')overridabler  r  rU  
except_valhas_explicit_exc_clausez#cfunc directive is not allowed here)rY  r  r  r  rU  rZ  r[  z,Python functions cannot be declared 'inline'z+Python functions cannot be declared 'nogil'z.Python functions cannot be declared 'with_gil')
r  r   r   return_type_annotationr   rX   as_cfunctionrT  rP  r4  )r%   r&   r  r  r  rZ  r[  return_type_nodes           r'   r5  #AdjustDefByDirectives.visit_DefNode  s   	t&X&##G,??&&z2__((5
+5+=%4??..y9#8K(L#::+
0B)
(8eDJ??011gT__6T$((IJdoo%$//)dhh OPdhh OP$$ I(Yp % rD ::d##doo%dhh EF(( %RZ,]t ) v zz$''y $((JK$((IJ$((LMt$r+   c                 4   SU R                   ;   av  U R                   S   nUb  [        UR                  S5        [        R                  " UR                  [
        R                  " UR                  US9/UR                  S9nX1l        U R                  U5        U$ )Nr  z2critical_section decorator does not take arguments)r  r  )	r  r   rX   r   r  r   #FirstArgumentForCriticalSectionNoder[   r?   )r%   r&   r   new_bodys       r'   r4  'AdjustDefByDirectives.visit_FuncDefNodeB  s    0OO$67E dhh TU44CCDHHX\]^YYH
 !I4 r+   c                     U$ r"   r#   r$   s     r'   r   &AdjustDefByDirectives.visit_LambdaNodeP  r0  r+   c                    ^  [        U 4S jT R                   5       5      (       a!  UR                  5       nT R                  U5      $ T R                  nST l        T R                  U5        UT l        U$ )Nc              3   @   >#    U  H  oTR                   ;   v   M     g 7fr"   )r  )r  r  r%   s     r'   r  =AdjustDefByDirectives.visit_PyClassDefNode.<locals>.<genexpr>U  s     U=T	DOO+=Ts   T)anyconverts_to_cclass	as_cclassrT  rP  r?   r%   r&   old_in_pyclasss   `  r'   r  *AdjustDefByDirectives.visit_PyClassDefNodeT  sc    UT=T=TUUU>>#D::d##!--N#Dt$-DKr+   c                 Z    U R                   nSU l         U R                  U5        X l         U$ rL   )rP  r?   rl  s      r'   r  )AdjustDefByDirectives.visit_CClassDefNode_  s.    )) 4 )r+   )r  rP  N)rB   rC   rD   rE   rF   rj  r]   r.  r5  r4  r   r  r  rG   r#   r+   r'   rM  rM    s4    	 O,\	r+   rM  c                   :    \ rS rSrSrS rS rS
S jrS rS r	S	r
g)AlignFunctionDefinitionsig  ze
This class takes the signatures from a .pxd file and applies them to
the def methods in a .py file.
c                 J    UR                   U l         U R                  U5        U$ r"   )r  r?   r$   s     r'   r]   )AlignFunctionDefinitions.visit_ModuleNodem  s     ZZ
4 r+   c                    U R                   R                  UR                  5      nU(       a  UR                  (       a   U R	                  UR                  5       U5      $ UR                   (       a  UR                   R                  (       dK  [        UR                  SUR                  -  5        UR                  (       a  [        UR                  S5        g U$ Nz'%s' redeclaredzprevious declaration here)	r  rc  r   	is_cclassr  rk  is_builtin_scoper   rX   r%   r&   pxd_defs      r'   r  -AlignFunctionDefinitions.visit_PyClassDefNoder  s    **##DII.  //0@'JJ]]'--*H*Hdhh 1DII =>;;'++'BCr+   Nc                    Uc%  U R                   R                  UR                  5      nU(       a:  UR                  (       d  U$ U R                   nUR                  R                   U l         U R                  U5        U(       a  WU l         U$ r"   r  rc  r  defined_in_pxdr  r?   r%   r&   rz  rr  s       r'   r  ,AlignFunctionDefinitions.visit_CClassDefNode~  g    ?jj''8G))**K ++DJ4 $DJr+   c                    U R                   R                  UR                  5      nU(       a  UR                   (       a  UR                   R                  (       dm  UR                  (       dK  [        UR                  SUR                  -  5        UR                  (       a  [        UR                  S5        g UR                  U5      nU$ rv  )r  rc  r   rx  is_cfunctionr   rX   r]  ry  s      r'   r5  &AlignFunctionDefinitions.visit_DefNode  s    **##DII.GMM1O1O''dhh 1DII =>;;'++'BC$$W-D r+   c                     U$ r"   r#   r$   s     r'   rb   'AlignFunctionDefinitions.visit_ExprNode  r0  r+   r  r"   )rB   rC   rD   rE   rF   r]   r  r  r5  rb   rG   r#   r+   r'   rr  rr  g  s     


r+   rr  c                   6    \ rS rSrS rS rS	S jrS rS rSr	g)
AutoCpdefFunctionDefinitionsi  c                     UR                   U l         [        5       U l        UR                  U l        U R	                  U5        U$ r"   )r  rY  rH  r  r?   r$   s     r'   r]   -AutoCpdefFunctionDefinitions.visit_ModuleNode  s5    //!eZZ
4 r+   c                     U R                   R                  (       a\  U R                  S   (       aH  UR                  U R                  ;  a.  UR                  5       (       a  UR                  U R                   S9nU$ )N
auto_cpdefr  )r  is_module_scoper  r   rH  is_cdef_func_compatibler]  r$   s     r'   r5  *AutoCpdefFunctionDefinitions.visit_DefNode  sW    JJ&&4??<+HIIT%8%880022$$4::$6Dr+   Nc                    Uc%  U R                   R                  UR                  5      nU(       a:  UR                  (       d  U$ U R                   nUR                  R                   U l         U R                  U5        U(       a  WU l         U$ r"   r}  r  s       r'   r  0AutoCpdefFunctionDefinitions.visit_CClassDefNode  r  r+   c                     U R                   R                  (       a0  UR                   H   u  p#U R                  R	                  U5        M"     U$ r"   )r  r  r  rH  r  )r%   r&   r   r   s       r'   rQ  5AutoCpdefFunctionDefinitions.visit_FromImportStatNode  s:     ::%%::##''- &r+   c                     U$ r"   r#   r$   s     r'   rb   +AutoCpdefFunctionDefinitions.visit_ExprNode  r0  r+   )r  rH  r  r"   )
rB   rC   rD   rE   r]   r5  r  rQ  rb   rG   r#   r+   r'   r  r    s    r+   r  c                   8    \ rS rSrS rS rS rS rS rS r	Sr
g	)
RemoveUnreachableCodei  c                 v   U R                   S   (       d  U$ U R                  U5        [        UR                  5      S:X  aY  [	        UR                  S   [
        R                  5      (       a-  UR                  S   R                  (       d  UR                  S S 2	 [        UR                  S5       H  u  p#UR                  (       d  M  U[        UR                  5      :  aL  U R                   S   (       a$  [        UR                  U   R                  SS5        UR                  S U Ul        SUl          U$    U$ )Nremove_unreachabler   r   warn.unreachableUnreachable coder   T)rs  r?   r   rY   rZ   r   r\   r  r  r   rX   )r%   r&   idxr  s       r'   rj   (RemoveUnreachableCode.visit_StatListNode  s    &&';<K4 tzz?aJtzz!}e>P>P$Q$QZ^ZdZdefZgZmZm

1"4::q1IC!!!TZZ(../AB

3 3 35GK!%DS!1DJ%)" 2 r+   c                 l    U R                  U5        UR                  R                  (       a  SUl        U$ r`   )r?   r[   r  r$   s     r'   visit_IfClauseNode(RemoveUnreachableCode.visit_IfClauseNode  s*    4 99""!%Dr+   c                     U R                  U5        UR                  (       aI  UR                  R                  (       a.  UR                   H  nUR                  (       a  M    U$    SUl        U$ r`   )r?   r  r  r  )r%   r&   clauses      r'   visit_IfStatNode&RemoveUnreachableCode.visit_IfStatNode  sZ    4  0 0 > >//+++  * &*"r+   c                     U R                  U5        UR                  R                  (       aM  UR                  (       a<  U R                  S   (       a!  [        UR                  R                  SS5        S Ul        U$ )Nr  r  r   )r?   r[   r  r  rs  r   rX   r$   s     r'   visit_TryExceptStatNode-RemoveUnreachableCode.visit_TryExceptStatNode  sZ    4 99""t'7'7&&'9:((,,.@!D#Dr+   c                 l    U R                  U5        UR                  R                  (       a  SUl        U$ r`   )r?   r  r  r$   s     r'   visit_TryFinallyStatNode.RemoveUnreachableCode.visit_TryFinallyStatNode  s,    4 ,,!%Dr+   c                 l    U R                   S   (       d  [        R                  " UR                  / S9nU$ )zEliminate useless PassStatNode	linetracerW   )rs  r   r\   rX   r$   s     r'   visit_PassStatNode(RemoveUnreachableCode.visit_PassStatNode  s-     &&{3%%$(("=Dr+   r#   N)rB   rC   rD   rE   rj   r  r  r  r  r  rG   r#   r+   r'   r  r    s      r+   r  c                   p   ^  \ rS rSr/ 4U 4S jjrS rS rS rS rS r	S r
S	 rS
 rS rS rS rSrU =r$ )r   i  c                    > [         TU ]  5         / U l        / U l        / U l        / U l        SU l        SU l        SU l        Xl	        g rL   )
rM   rN   yieldsrU  finallysexceptshas_return_valuer   r   excludes)r%   r  rS   s     r'   rN   YieldNodeCollector.__init__  sE     % r+   c                 F    XR                   ;  a  U R                  U5        g g r"   )r  r?   r$   s     r'   rN  YieldNodeCollector.visit_Node  s    }}$t$ %r+   c                 j    U R                   R                  U5        SU l        U R                  U5        g r`   )r  r   r   r?   r$   s     r'   visit_YieldExprNode&YieldNodeCollector.visit_YieldExprNode  )    4 4 r+   c                 j    U R                   R                  U5        SU l        U R                  U5        g r`   )r  r   r   r?   r$   s     r'   visit_AwaitExprNode&YieldNodeCollector.visit_AwaitExprNode  r  r+   c                     U R                  U5        UR                  (       a  SU l        U R                  R	                  U5        g r`   )r?   r   r  rU  r   r$   s     r'   visit_ReturnStatNode'YieldNodeCollector.visit_ReturnStatNode  s1    4 ::$(D!D!r+   c                 \    U R                  U5        U R                  R                  U5        g r"   )r?   r  r   r$   s     r'   r  +YieldNodeCollector.visit_TryFinallyStatNode"  s"    4 T"r+   c                 \    U R                  U5        U R                  R                  U5        g r"   )r?   r  r   r$   s     r'   r  *YieldNodeCollector.visit_TryExceptStatNode&  s"    4 D!r+   c                     g r"   r#   r$   s     r'   r  %YieldNodeCollector.visit_ClassDefNode*  rI  r+   c                     g r"   r#   r$   s     r'   r4  $YieldNodeCollector.visit_FuncDefNode-  rI  r+   c                     g r"   r#   r$   s     r'   r   #YieldNodeCollector.visit_LambdaNode0  rI  r+   c                     [        UR                  [        R                  5      (       a&  U R	                  UR                  R
                  5        g g r"   )rZ   r   r   _ForInStatNoderT  r   r$   s     r'   r   0YieldNodeCollector.visit_GeneratorExpressionNode3  s6    dii!5!566 JJtyy))* 7r+   c                     g r"   r#   r$   s     r'   visit_CArgDeclNode%YieldNodeCollector.visit_CArgDeclNode:  s     	r+   )r  r  r  r   r  r   rU  r  )rB   rC   rD   rE   rN   rN  r  r  r  r  r  r  r4  r   r   r  rG   r~   r   s   @r'   r   r     sG     " 	!%!
!
"#"+ r+   r   c                   8    \ rS rSrS rS rS rS rS rS r	Sr
g	)
MarkClosureVisitori@  c                 D    SU l         / U l        U R                  U5        U$ rL   )needs_closurer  r?   r$   s     r'   r]   #MarkClosureVisitor.visit_ModuleNodeD  s$    "4 r+   c                    SU l         U R                  U5        U R                   Ul         SU l         [        U R                  5      nUR                  U5        UR                  (       a~  [
        R                  nUR                  (       a8  [
        R                  nUR                  UR                  -    H
  nSUl        M     OU R                  S   (       a  [
        R                  nOiUR                  (       a4  [        S UR                   5       5      n[!        UR"                  S5        U$ UR                  (       a  [
        R$                  nOU$ ['        UR                  S5       H  u  pdXdl        M     UR                  UR*                  -   UR,                  -    H
  nSUl        M     [
        R0                  " UR"                  UR2                  UR4                  UR                  UR                  =(       a    UR                  S9nU" UR"                  UR2                  UR6                  UR8                  UR:                  UR<                  UR>                  XR@                  URB                  URD                  S9n	U	$ )	NFTiterable_coroutinec              3   J   #    U  H  oR                   (       d  M  Uv   M     g 7fr"   )is_await)r  ys     r'   r  7MarkClosureVisitor.visit_FuncDefNode.<locals>.<genexpr>\  s     C$4q

$4s   #	#z/'await' not allowed in generators (use 'yield')r   )rX   r   r[   is_coroutine_bodyis_async_gen_body)rX   r   r   r   r   r   r  rb  lambda_namer\  r   )#r  r?   r   r  r   r   AsyncDefNoder   AsyncGenNoder  rU  in_async_genrs  IterableAsyncDefNoder   nextr   rX   GeneratorDefNoder  	label_numr  r  in_generatorGeneratorBodyDefNoder   r[   r   r   r   r   r  r  r\  r   )
r%   r&   r   coroutine_type
yield_exprfoundr  retnoderb  	coroutines
             r'   r4  $MarkClosureVisitor.visit_FuncDefNodeJ  s   "4 !//!&t}}5	%"//N""!&!3!3"+"2"2Y5F5F"FJ.2J+ #G(()=>!&!;!;  CI$4$4CCE%))NOK  "33NK&y'7'7;MA#$  < ((9+=+==	@Q@QQG#'G  R **tyytyy"//"//GI4G4GI #tyytyy]]1B1BT__%5%5#'#>#>$($@$@B	 r+   c                     SU l         U R                  U5        U R                   Ul         SU l         UR                   (       a'  UR                  (       a  [        UR                  S5        U$ )NFTz1closures inside cpdef functions not yet supported)r  r?   rY  r   rX   r$   s     r'   r  %MarkClosureVisitor.visit_CFuncDefNodev  sS    "4 !//!$"2"2$((OPr+   c                 f    SU l         U R                  U5        U R                   Ul         SU l         U$ )NFT)r  r?   r$   s     r'   r   #MarkClosureVisitor.visit_LambdaNode  s3    "4 !//!r+   c                 6    U R                  U5        SU l        U$ r`   )r?   r  r$   s     r'   r  %MarkClosureVisitor.visit_ClassDefNode  s    4 !r+   c                    U R                   n[        UR                  [        R                  5      (       a  UR                  R
                  /U l         U R                  U5      nX l         [        UR                  [        R                  5      (       d  U$ UR                  R
                  R                  nUR                  (       a  U$ [        U5      R                  U5        U$ r"   )r  rZ   r   r   r  r   r   r  r  r2  rT  )r%   r&   r  itseqs       r'   r   0MarkClosureVisitor.visit_GeneratorExpressionNode  s    ==dii!5!566!YY//0DM$$T* $))U%9%9:: K		""++K+D177>r+   )r  r  N)rB   rC   rD   rE   r]   r4  r  r   r  r   rG   r#   r+   r'   r  r  @  s!    *X
r+   r  c                   \   ^  \ rS rSrU 4S jrS rS rSS jrS rS r	S r
S	 rS
 rSrU =r$ )CreateClosureClassesi  c                 @   > [         TU ]  U5        / U l        SU l        g rL   )rM   rN   pathr  rQ   s     r'   rN   CreateClosureClasses.__init__  s    !	r+   c                 J    UR                   U l        U R                  U5        U$ r"   )r  r(  r?   r$   s     r'   r]   %CreateClosureClasses.visit_ModuleNode  s!     JJ4 r+   c                 >   / n/ nUR                   R                  5        Hy  nUR                  R                  5        HX  u  pVU(       d  M  UR                  (       a  UR                  XV45        M3  UR                  (       d  MF  UR                  XV45        MZ     M{     X#4$ r"   )rX  iter_local_scopesr  r  from_closurer   ra  )r%   r&   r  ra  r  r   r_  s          r'   find_entries_used_in_closures2CreateClosureClasses.find_entries_used_in_closures  s    
%%779E$}}224%% ''6%%%%%tm4  5 : ''r+   c           	         UR                   (       a  UR                  R                  5        Hd  nUR                  R	                  5        HC  nUR
                  (       a  M  UR                  (       a  M)  UR                  (       a  M<  SUl        ME     Mf     U R                  U5      u  pgUR                  5         SUl        SUl        UR                  nUR                  R                  n	U	R                  (       d  U	R                   (       a2  U	R"                  n	U	R                  (       a  M  U	R                   (       a  M2  U(       dU  U R$                  (       d  U(       a=  U(       d(  UR&                  (       d  [)        S5      eUR&                  nSUl        SUl        UR                   (       a  O6U(       d  U(       d  g U(       d   SUl        U	R.                  Ul        SUl        g UR1                  [2        R4                  5      < SUR                  R6                  R9                  SS5      < 3n
[;        U
5      n
UR=                  XR>                  SSS9nSUR@                  l!        XXl        UR@                  R                  nSUl"        SUl#        URH                  (       d  UR                   (       a  SURJ                  S'   [L        RN                  (       a  [L        RN                  URJ                  S	'   U(       ag  U	RP                  (       d   eURS                  UR>                  [2        RT                  [2        RT                  U	R.                  R@                  SS
9  SUl        U Hm  u  pURS                  UR>                  URV                  (       d  URX                  OS UR6                  UR@                  SS
9nURZ                  (       d  Mf  SUl-        Mo     SUl        UR]                  UR.                  5        g )NTFz%DefNode does not have assignment noder   r  __)r   rX   definingimplementingno_gc_clearfreelist)rX   r   r`  r  is_cdefr   )/rL  rX  r  r  r[  r  r  
is_cglobalra  r  r  r  needs_outer_scoper_  r  rp  rq  rr  r  rv  r   needs_closure_codeis_passthroughscope_classnext_idr   closure_class_prefixr`  r  r   declare_c_classrX   r  is_final_typeis_internalis_closure_class_scoper   r  r   closure_freelist_sizert  rW  outer_scope_cnamein_subscoper   is_declared_genericcheck_c_class)r%   r&   target_module_scope
inner_noder  r_  r  ra  
func_scopecscoper  class_scoper   closure_entrys                 r'   create_class_from_scope,CreateClosureClasses.create_class_from_scope  s   ));;="]]113E!...%2C2C2CuGWGWGW+/( 4 >
 $(#E#Ed#K  #!&%%
!!&&&*A*A''F &&&&*A*A*A j))'(OPP!//
,1J)%*D"L(,J%%+%7%7J"%)D"  ''(C(CDJJ$$S.0  (#33hh 4  $(

 !&jj&&"&-1* 1 148K""=1((181N1NK"":.****##)/)A)A*0*B*B)/););)@)@,0	 $ 2
 &*D"%KD'33II','8'8UZZdkkZZ 4 M (((451 & "))**@*@Ar+   c                     [        UR                  [        R                  5      (       d  U$ U R                  nSU l        U R                  UR                  U R                  U5        U R                  U5        X l        U$ r`   )rZ   r   r   r   r  r#  r(  r?   )r%   r&   was_in_lambdas      r'   r   %CreateClosureClasses.visit_LambdaNode
  s`    $--77K$$T]]D4E4EtL4 &r+   c                 T   U R                   (       a  U R                  U5        U$ UR                  (       d  U R                  (       aa  U R	                  XR
                  5        U R                  R                  U5        U R                  U5        U R                  R                  5         U$ r"   )r  r?   r  r  r#  r(  r   rt  r$   s     r'   r4  &CreateClosureClasses.visit_FuncDefNode  sq    >>t$K((/@/@AIIT"t$IIMMOr+   c                 (    U R                  U5        U$ r"   rM  r$   s     r'   rj  /CreateClosureClasses.visit_GeneratorBodyDefNode!      4 r+   c                 l    UR                   (       d  U R                  U5      $ U R                  U5        U$ r"   )rY  r4  r?   r$   s     r'   r  'CreateClosureClasses.visit_CFuncDefNode%  s/    ))$//t$Kr+   c                 D    [        5       " U5      nU R                  U5      $ r"   )r>  r   r$   s     r'   r   2CreateClosureClasses.visit_GeneratorExpressionNode,  s     (*40$$T**r+   )r  r(  r  r"   )rB   rC   rD   rE   rN   r]   r  r#  r   r4  rj  r  r   rG   r~   r   s   @r'   r  r    s8    

(PBd
	+ +r+   r  c                   Z    \ rS rSrSrSrS r\r\rS r	S r
S rS r\R                  rS	rg
)InjectGilHandlingi1  z
Allow certain Python operations inside of nogil blocks by implicitly acquiring the GIL.

Must run before the AnalyseDeclarationsTransform to make sure the GILStatNodes get
set up, parallel sections know that the GIL is acquired inside of them, etc.
Fc                 h    U R                   (       a   [        R                  " UR                  SUS9nU$ )zYAllow the (Python statement) node in nogil sections by wrapping it in a 'with gil' block.r  r  r[   )r  r   r  rX   r$   s     r'   _inject_gil_in_nogil&InjectGilHandling._inject_gil_in_nogil<  s&    ::$$TXXUFDr+   c                 t    U R                   nUR                  S:H  U l         U R                  U5        X l         U$ )Nr  )r  r  r?   r%   r&   	was_nogils      r'   visit_GILStatNode#InjectGilHandling.visit_GILStatNodeJ  s3    JJ	jjG+
4 
r+   c                    U R                   n[        UR                  [        R                  5      (       a=  UR                  R                   =(       a    UR                  R
                  (       + U l         U R                  U5        X l         U$ r"   )r  rZ   rT  r   CFuncDeclaratorNoder  r?   r8  s      r'   r  $InjectGilHandling.visit_CFuncDefNodeQ  s]    JJ	doou'@'@AA..Ot7O7O3ODJ4 
r+   c                 n    U R                   nUR                   U l         U R                  U5        X l         U$ r"   )r  r?   r8  s      r'   visit_ParallelRangeNode)InjectGilHandling.visit_ParallelRangeNodeY  s.    JJ	ZZ
4 
r+   c                     U$ r"   r#   r$   s     r'   rb    InjectGilHandling.visit_ExprNode`  r0  r+   )r  N)rB   rC   rD   rE   rF   r  r5  visit_RaiseStatNodevisit_PrintStatNoder:  r  r@  rb   r   r  rN  rG   r#   r+   r'   r2  r2  1  sB     E /. "55Jr+   r2  c                   n   ^  \ rS rSrSrU 4S jrS rS rS rS r	S r
S	 rS
 rS rS rS rS rSrU =r$ )GilCheckig  a  
Call `node.gil_check(env)` on each node to make sure we hold the
GIL when we need it.  Raise an error when on Python operations
inside a `nogil` environment.

Additionally, raise exceptions for closely nested with gil or with nogil
statements. The latter would abort Python.
c                    > UR                   /U l        [        R                  R                  U l        [        R                  R                  U l        [        TU ]!  U5      $ r"   )	r  	env_stackr   
NoGilStateHasGilnogil_state"nogil_state_at_current_gilstatnoderM   r  )r%   r  rS   s     r'   r  GilCheck.__call__q  sH    ** ++22272B2B2I2I/w%%r+   c                 ~   U R                   nUR                  nU(       a  [        U R                  5      S:  ah  U R                  S   R                  (       a  [
        R                  R                  O[
        R                  R                  U l         U R                  X5        X l         U R                  US US9  X0l         g )Nr   r   )
rL  outer_attrsr   rI  r  r   rJ  NoGilrK  r?   )r%   r&   rL  r9  rQ  s        r'   _visit_scoped_childrenGilCheck._visit_scoped_childrenx  s    $$	&&3t~~.2*...*<*B*B  &&HXHXH_H_ t1&4t[A$r+   c                    U R                   R                  UR                  5        UR                  R                  nU R                  nU(       a  [
        R                  R                  U l        U(       a,  UR                  (       a  UR                  UR                  5        U R                  XR                  5        X0l        U R                   R                  5         U$ r"   )rI  r   rX  r  rL  r   rJ  
NoGilScopenogil_checkrS  rt  )r%   r&   inner_nogilrL  s       r'   r4  GilCheck.visit_FuncDefNode  s    d../&&,,&&$//::D4++T--.##D*:*:; 'r+   c                    UR                   b/  [        UR                   R                  SUR                  -  5        U$ U R                  (       a!  UR
                  (       a  UR                  5         U R                  nUR                  S:H  nX#:X  a\  U R                  [        R                  R                  :X  d4  U(       d  [        UR                  S5        O[        UR                  S5        U R                  [        R                  R                  :X  a  SUl	        [        UR                  [        R                  5      (       a  UR                  R                  u  Ul        U R                  nU R                  U l        U(       a  [        R                  R                  O[        R                  R                   nU R#                  X5        X@l        U$ )Nz<Non-constant condition in a `with %s(<condition>)` statementr  z3Trying to acquire the GIL while it is already held.z;Trying to release the GIL while it was previously released.F)r  r   rX   r  rL  rW  r   rJ  rV  scope_gil_state_knownrZ   r  r\   rY   rM  rR  rK  rS  )r%   r&   r9  is_nogilrM  rL  s         r'   r:  GilCheck.visit_GILStatNode  sb   >>%$..$$57;zzBC K 0 0$$	JJ') )9)9U=M=M=X=X)Xdhh !0 1 dhh !7 8u//:::).D&d))5+=+=>> $(#6#6#<#< D-1-T-T*262B2B/08e&&,,e>N>N>U>U##D62T/r+   c                    UR                   (       d(  U R                  [        R                  R                  :X  az  UR                   Sso!l         [        R
                  " UR                  SUS9nU(       d/  U R                  [        R                  R                  :X  a  SUl        U R                  U5      $ U R                  (       d  [        UR                  S5        g UR                  U R                  S   5        U R                  U5        U$ )NFr  r4  z)prange() can only be used without the GILr   )r  rL  r   rJ  rV  r  rX   r[  r:  r   rW  rI  r?   )r%   r&   node_was_nogils      r'   r@   GilCheck.visit_ParallelRangeNode  s    ::))U-=-=-H-HH)-U&NJ$$TXXW4HD!d&6&6%:J:J:U:U&U .3*))$//$((GH+,4 r+   c                    U R                   (       d  [        UR                  S5        g U R                   [        R                  R
                  :X  a8  [        R                  " UR                  SUS9nSUl        U R                  U5      $ UR                  (       a  UR                  U R                  S   5        U R                  U5        U$ )Nz5The parallel section may only be used without the GILr  r4  Fr   )rL  r   rX   r   rJ  rV  r  r[  r:  rW  rI  r?   r$   s     r'   visit_ParallelWithBlockNode$GilCheck.visit_ParallelWithBlockNode  s    $(( & 'u//::: $$TXXW4HD).D&))$// T^^B/04 r+   c                     U R                   (       d  U R                  U5      $ SUl        SUl        U R	                  U5        U$ )z=
Take care of try/finally statements in nogil code sections.
NT)rL  rN  rW  is_try_finally_in_nogilr?   r$   s     r'   r  !GilCheck.visit_TryFinallyStatNode  s?     ??4(('+$4 r+   c                 $    U R                  U5      $ r"   rN  r$   s     r'   visit_CriticalSectionStatNode&GilCheck.visit_CriticalSectionStatNode      t$$r+   c                 $    U R                  U5      $ r"   rh  r$   s     r'   visit_CythonLockStatNode!GilCheck.visit_CythonLockStatNode  rk  r+   c                     U R                   [        R                  R                  :X  a  SUl        U R                  U5        U$ rL   )rM  r   rJ  rV  r[  r?   r$   s     r'   visit_GILExitNodeGilCheck.visit_GILExitNode  s7    22e6F6F6Q6QQ).D&4 r+   c                 h   U R                   (       a@  U R                  (       a/  UR                  (       a  UR                  U R                   S   5        UR                  (       a  U R	                  XR                  5        OU R                  U5        U R                  (       a  U R                  Ul        U$ r  )rI  rL  rW  rQ  rS  r?   in_nogil_contextr$   s     r'   rN  GilCheck.visit_Node  sw    >>d..43C3CT^^B/0''.>.>?t$$($4$4D!r+   c                    UR                   (       Ga3  UR                   R                  R                  (       Ga  UR                  R                  (       a  UR                  R
                  S:X  a  [        UR                  5      S:X  a  S nU R                  [        R                  R                  :X  a  SnO*U R                  [        R                  R                  :X  a  SnU(       aa  [        R                  " UR                  UR                  R                   R"                  U-   UR                  R                  UR                   /S9nU R%                  U5      $ )Nacquirer   NogilGilr  )r%   r  is_cython_lock_typerq  r  r  r   r   rL  r   rJ  rR  rK  r   PythonCapiCallNoderX   r_  r`  rN  )r%   r&   suffixs      r'   visit_SimpleCallNodeGilCheck.visit_SimpleCallNode  s    III$))..<<<**t}}/F/F)/SDII!# F5#3#3#9#99 !!U%5%5%<%<< 33HHMM''--6MM&&))	 t$$r+   )rI  rL  rM  )rB   rC   rD   rE   rF   r  rS  r4  r:  r@  rb  r  ri  rm  rp  rN  r|  rG   r~   r   s   @r'   rG  rG  g  sJ    &
%(!F&(
%%	% %r+   rG  c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
CoerceCppTempsi  a  
For temporary expression that are implemented using std::optional it's necessary the temps are
assigned using `__pyx_t_x = value;` but accessed using `something = (*__pyx_t_x)`. This transform
inserts a coercion node to take care of this, and runs absolutely last (once nothing else can be
inserted into the tree)

TODO: a possible alternative would be to split ExprNode.result() into ExprNode.rhs_result() and ExprNode.lhs_result()???
c                 f    U R                  5       R                  (       a  U R                  U5        U$ r"   )r  r  r?   r$   s     r'   r]   CoerceCppTemps.visit_ModuleNode&  s'    !!t$r+   c                 .   U R                  U5        U R                  5       R                  S   (       aa  UR                  5       (       aL  UR                  R
                  (       a1  UR                  R                  (       d  [        R                  " U5      nU$ )N
cpp_locals)	r?   r  r  result_in_tempr  r>  is_fake_referencer   CppOptionalTempCoercionr$   s     r'   rb   CoerceCppTemps.visit_ExprNode,  sd    4 )),7##%%$))*@*@II//44T:Dr+   c                     U$ r"   r#   r$   s     r'   visit_CppOptionalTempCoercion,CoerceCppTemps.visit_CppOptionalTempCoercion6  r*   r+   c                     U$ r"   r#   r$   s     r'   visit_CppIteratorNode$CoerceCppTemps.visit_CppIteratorNode9  r*   r+   c                 <    U R                  UR                  5        U$ r"   )r?   rv   r$   s     r'   ry   !CoerceCppTemps.visit_ExprStatNode<  s    499%r+   r#   N)rB   rC   rD   rE   rF   r]   rb   r  r  ry   rG   r#   r+   r'   r  r    s     r+   r  c                      ^  \ rS rSrSrU 4S jrS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rU 4S jrU 4S jrS rS rSrU =r$ )TransformBuiltinMethodsiB  z
Replace Cython's own cython.* builtins by the corresponding tree nodes.
Also handle some Python special builtin functions (e.g. super()/locals())
that require introspection by the compiler.
c                 4   > [         TU ]  " U0 UD6  0 U l        g r"   )rM   rN   def_node_body_insertions)r%   r   r{  rS   s      r'   rN    TransformBuiltinMethods.__init__H  s    $'$'(*%r+   c                 L    UR                   (       a  g U R                  U5        U$ r"   )declaration_onlyr?   r$   s     r'   r   2TransformBuiltinMethods.visit_SingleAssignmentNodeL  s!      t$Kr+   c                 F    U R                  U5        U R                  U5      $ r"   )r?   visit_cython_attributer$   s     r'   r  +TransformBuiltinMethods.visit_AttributeNodeS  s!    4 **400r+   c                     UR                   S:X  a9  U R                  5       nUR                  S5      nU(       d  U R                  U5      nU R	                  U5      $ )NrS   )r   r  rY  _inject_classr  )r%   r&   rY  r_  s       r'   rd  &TransformBuiltinMethods.visit_NameNodeW  sP    99$##%D$$\2E))$/**400r+   c                 r   UR                  5       nU(       Ga  US:X  a0  SSKJn  [        R                  " UR
                  [        U5      S9nU$ US:X  a"  [        R                  " UR
                  5      nU$ US;   aV  [        R                  " UR
                  [        U5      U R                  5       R                  5       R                  U5      S9nU$ [        R                  " U5      (       a   U$ U R                  R                  R!                  U5      (       a   U$ [#        UR
                  SU-  5        U$ )	N__version__r   )r  r   r  )rY  	frozensetr   r   r_  z>'%s' not a valid cython attribute or is being used incorrectly)rb  r  r  r   r  rX   r   NullNoder   r  builtin_scoperY  r   r2  rR   cython_scopelookup_qualified_namer   )r%   r&   r  versions       r'   r  .TransformBuiltinMethods.visit_cython_attribute_  s   ,,.	M)5 ,,TXX]7=ST  f$ ))$((3  BB ))$((y9Q040@0@0B0P0P0R0^0^_h0ik  ,,Y77
 	 **@@KK  dhh `cl lmr+   c                    U R                  5       nU R                  U5        [        UR                  5      S:X  a  UR                  R	                  [
        R                  " UR                  5      5        UR                  (       dI  UR                  R	                  [
        R                  " UR                  U R                  5       U5      5        U$ r  )r  r?   r   r   r   r   GlobalsExprNoderX   r  LocalsExprNodecurrent_scope_node)r%   r&   rY  s      r'   visit_ExecStatNode*TransformBuiltinMethods.visit_ExecStatNoder  s    !4 tyy>QIIY66txx@A''		  ,,$"9"9";TCD r+   c                    U R                  5       nUR                  U5      nU(       a  U$ UR                  nUS;   a  US:X  aG  [        UR                  5      S:  a.  [        U R                  S[        UR                  5      -  5        U$ US:X  a`  [        UR                  5      S:  a,  [        U R                  S[        UR                  5      -  5        [        UR                  5      S:  a  U$ [        R                  " XPR                  5       U5      $ [        UR                  5      S:  a,  [        U R                  S[        UR                  5      -  5        [        UR                  5      S:  a  U$ UR                  (       d  UR                  (       an  UR                  (       a1  U R                  5       n[        R                  " UR                  5      nO[        R                  " U5      n[        R                  " U5      $ [        S	 UR                   R#                  5        5       5      nU V	s/ s H  n	[        R$                  " XYS
9PM     n
n	[        R&                  " XZS9$ s  sn	f )N)r  varsr  r   zGBuiltin 'locals()' called with wrong number of args, expected 0, got %dr  r   zGBuiltin 'vars()' called with wrong number of args, expected 0-1, got %dzFBuiltin 'dir()' called with wrong number of args, expected 0-1, got %dc              3   ^   #    U  H#  oR                   (       d  M  UR                   v   M%     g 7fr"   r   )r  rZ  s     r'   r  9TransformBuiltinMethods._inject_locals.<locals>.<genexpr>  s      W5Jchh5Js   --r   r  )r  rY  rX   r   r   r   r   r  r  rp  r  r  rt  r  SortedDictKeysNoder%  r  r[  IdentifierStringNoder  )r%   r&   	func_namerY  r_  rX   r   locals_dictlocal_namesrZ  r  s              r'   _inject_locals&TransformBuiltinMethods._inject_locals}  s   !  +Khh**H$TYY!);dhh iDII!' (f$tyy>A%$(($m		N%+ ,tyy>A%K++C1H1H1JDQQ499~!dhh hDII!' (499~!%%)=)=))"557G"+"5"5gll"CK"+";";C"@K 33K@@  WT\\5H5H5J WWK +- + 33CC +  -%%c66-s   3I'c                 (   U R                  U5        UR                  S;   ap  [        UR                  [        R
                  5      (       aG  UR                  R                  n[        U[        R                  5      (       a  UR                  nX!l        U$ )Nnot_in)r?   r  rZ   r<  r   r  r  NoneCheckNode)r%   r&   r  s      r'   visit_PrimaryCmpNode,TransformBuiltinMethods.visit_PrimaryCmpNode  sh    4 ==H$$--)E)EFFmm''c9#:#:;;''C #r+   c                 $    U R                  U5      $ r"   )r  r$   s     r'   visit_CascadedCmpNode-TransformBuiltinMethods.visit_CascadedCmpNode  s    ((..r+   c                    U R                  5       nUR                  U5      n[        UR                  5      S:w  d  U(       a  UR                  (       d  U$ UR                  R                  [        R                  " UR                  5      5        UR                  (       dI  UR                  R                  [        R                  " UR                  U R                  5       U5      5        U$ r  )r  rc  r   r   
is_builtinr   r   r  rX   r  r  r  )r%   r&   r  rY  r_  s        r'   _inject_eval$TransformBuiltinMethods._inject_eval  s    !I&tyy>Q51A1AK		22488<=##II((HHd557?@ r+   c           	          U R                  5       n[        U[        R                  5      (       d  U$ S =n=pE[	        U R
                  5       H  u  pg[        U[        R                  5      (       a  UnUn  OZ[        U[        R                  5      (       a  UnUR                  nUn	M[  [        U[        R                  5      (       d  M|  UnUn	M     U(       a  U(       d  U$ X0R                  ;  Ga  UR                  R                  n
WR                  (       a4  [        R                  " XR                  R                   UR"                  S9nOQUR$                  (       a>  [        R&                  " XS LS9nU(       a  SUl        OSUl        SUR*                  l        OU$ [        R.                  " U
[        R                  " U
[1        S5      S9US9nUR3                  W	5        X0R                  ;  d   eXR                  U'   U$ )Nr  rL  TrS   r   r   )r  rZ   r   FuncDefNodereversedrI  ClassDefNoder  rb  r  r[   rX   rq  r   r   r  r   r_  rp  ClassCellNoderequires_classobj
class_cell	is_activer   r   r  )r%   r&   current_def_node	fdef_node
class_nodegenerator_node
stack_nodestack_scoper!  
fdef_scoperX   r   r   s                r'   r  %TransformBuiltinMethods._inject_class  s   224*E,=,=>>K 376	6J'/'?#J*e&8&899'
)J(>(>??!+&,,	(
J(9(9::&	(
 (@ 
K 999..$$C++  ((&6&6&;&;","2"24 ..--cVZ@Z[!7;N426I/26
%%/44S&&s{1KLK ,,Z8$A$AAAA7B)))4r+   c                    U R                  5       nUR                  U5      nU(       d  UR                  (       a  U$ U R                  5       n[	        U[
        R                  5      (       a*  UR                  (       a  [        U R                  5      S:  a  U$ U R                  S   u  pgUR                  (       a~  SUl
        SUR                  l        [        R                  " UR                  UR                   S9[        R"                  " UR                  UR                  S   R$                  S9/Ul        U$ UR&                  (       ay  [        R"                  " UR                  UR(                  R$                  UR*                  S9[        R"                  " UR                  UR                  S   R$                  S9/Ul        U$ )Nr   rP  Tr  r   r   r  )r  rY  r   r  rZ   r   r   r   rI  rp  r  r  r  r   r  rX   rL  r   r   rq  r  r_  )r%   r&   r  rY  r_  r   r  r!  s           r'   _inject_super%TransformBuiltinMethods._inject_super  sV   !  +DIIK**,(EMM22(--3t~~K^abKbK"&.."4
(()-H&.2J!!+''HH8+@+@B""488(--2B2G2GHDI  ))""HH:#3#3#8#8$**, ""488(--2B2G2GH	DI r+   c                 ^   U R                   R                  US 5      nU(       a  [        UR                  [        R
                  5      (       a'  UR                  R                  R                  SU5        g [        R
                  " UR                  R                  X!R                  /S9Ul        g g )Nr   r   )	r  rt  rZ   r[   r   r\   rY   r7  rX   )r%   r&   body_insertions      r'   _do_body_insertion*TransformBuiltinMethods._do_body_insertion  sx    66::4F$))U%7%788		&&q.9!..tyy}}6Dii5PR		 r+   c                 H   > [         TU ]  U5      nU R                  U5        U$ r"   )rM   r4  r  r  s     r'   r4  )TransformBuiltinMethods.visit_FuncDefNode  s%    w(.%r+   c                 H   > [         TU ]  U5      nU R                  U5        U$ r"   )rM   rj  r  r  s     r'   rj  2TransformBuiltinMethods.visit_GeneratorBodyDefNode#  s%    w1$7%r+   c                 
   UR                   R                  5       nU(       Ga  U[        R                  ;   ay  [	        UR
                  5      S:w  a%  [        UR                   R                  SU-  5        GOV[        R                  U   " UR                   R                  UR
                  S   S9nGOU[        R                  ;   a  [	        UR
                  5      S:w  a%  [        UR                   R                  SU-  5        GO[        R                  U   " UR                   R                  UR
                  S   UR
                  S   S9nGOUS:X  a  [	        UR
                  5      S:w  a"  [        UR                   R                  S	5        GO?UR
                  S   R                  U R                  5       5      nU(       a9  [        R                  " UR                   R                  X1R
                  S   S
S9nGO[        UR
                  S   R                  S5        GOUS:X  a  [	        UR
                  5      S:w  a"  [        UR                   R                  S5        GOmUR
                  S   R                  U R                  5       5      nU(       a+  [        R                  " UR                   R                  US9nGO[        R                  " UR                   R                  UR
                  S   S9nGOUS:X  a  [	        UR
                  5      S:w  a"  [        UR                   R                  S5        GO[        R                  " UR                   R                  SUR
                  S   UR
                  S   5      nSUl        GOFUS:X  a  [	        UR
                  5      S:w  a"  [        UR                   R                  S5        GO[        R                  " UR                   R                  SUR
                  S   UR
                  S   5      nSUl        OUS:X  a.  [        R"                  " UR                  [%        S5      S9Ul         OUS:X  a.  [        R"                  " UR                  [%        S5      S9Ul         ONU R&                  R(                  R+                  U5      (       a  O#[        UR                   R                  SU-  5        U R-                  U5        [/        U[        R0                  5      (       av  UR                   R2                  (       a[  UR                   R4                  nUS;   a  U R7                  X5      $ US:X  a  U R9                  X5      $ US:X  a  U R;                  X5      $ U$ )Nr   z%s() takes exactly one argumentr   r  r   z %s() takes exactly two arguments)r;  r<  r  Dcast() takes exactly two arguments and an optional typecheck keywordFr  r  	typecheckrQ  r  z#sizeof() takes exactly one argument)arg_typecmodz"cmod() takes exactly two arguments%Tcdivz"cdiv() takes exactly two arguments/rY  r   r   z*'%s' not a valid cython language construct)dirr  r  evalrM   )rq  rb  r  r  r   r   r   rX   r  rT  r  r   TypecastNodeSizeofTypeNodeSizeofVarNoder?  	cdivisionr   r   rR   r  r  r?   rZ   r  r>  r   r  r  r  )r%   r&   rq  r  r  s        r'   r|  ,TransformBuiltinMethods.visit_SimpleCallNode(  s   ==4466HHHtyy>Q&$--++-NQY-YZ6HHR))499Q<AD8KKKtyy>Q&$--++-ORZ-Z[6II(S))DIIaL499UV<YDV#tyy>Q&$--++`b  99Q<778H8H8JKD(55 MM--D))A,Z_ a diil..=X%tyy>Q&$--++-RS99Q<778H8H8JKD(778I8ITXY(66t}}7H7HRVR[R[\]R^_V#tyy>Q&$--++-QR$//0A0A3		RSVZV_V_`aVbcD%)DNV#tyy>Q&$--++-QR$//0A0A3		RSVZV_V_`aVbcD%)DNU" ) 2 2488-PUBV W^+ ) 2 2488-P^B_ `**@@JJdmm''BXMO 	4 dI4455$--:O:O**I55**4;;F"((99G#))$::r+   c                 x   UR                   R                  5       nUS:X  Ga  UR                  R                  nUR                  R                  S 5      n[        U5      S:w  d$  [        U5      S:  d  [        U5      S:X  a'  SU;  a!  [        UR                   R                  S5        OUS   R                  U R                  5       5      nU(       a@  UR                  SS5      n[        R                  " UR                   R                  XSS   US9nO[        US   R                  S	5        U R                  U5        U$ )
Nr  r   r   r  r  r   Fr  rQ  )rq  rb  r  r   r  r  r   r   rX   rT  r  r   r   r  r?   )r%   r&   rq  r   r  r  r  s          r'   visit_GeneralCallNode-TransformBuiltinMethods.visit_GeneralCallNoden  s   ==446v'',,D&&99$?FD	Q#f+/[A%+V*Cdmm''\^ Aw..t/?/?/AB &

; >I$11))1gQZ\D $q'++|44 r+   )r  )rB   rC   rD   rE   rF   rN   r   r  rd  r  r  r  r  r  r  r  r  r  r4  rj  r|  r  rG   r~   r   s   @r'   r  r  B  sg    
+11&	%7N	/9v6R

DL r+   r  c                   J   ^  \ rS rSrSrU 4S jrS rS rS rS r	S r
S	rU =r$ )
ReplaceFusedTypeChecksi  a  
This is not a transform in the pipeline. It is invoked on the specific
versions of a cdef function with fused argument types. It filters out any
type branches that don't match. e.g.

    if fused_t is mytype:
        ...
    elif fused_t in other_fused_type:
        ...
c                 P   > [         TU ]  5         Xl        SSKJn  U" SS9U l        g )Nr   )ConstantFoldingT)
reevaluate)rM   rN   rX  Optimizer  r0  )r%   rX  r  rS   s      r'   rN   ReplaceFusedTypeChecks.__init__  s#    &-(D9r+   c                 F    U R                  U5        U R                  U5      $ )zK
Filters out any if clauses with false compile time type check
expression.
r?   r0  r$   s     r'   r  'ReplaceFusedTypeChecks.visit_IfStatNode  s!    
 	4 ~~d##r+   c                 F    U R                  U5        U R                  U5      $ )z)
Fold constant condition of GILStatNode.
r  r$   s     r'   r:  (ReplaceFusedTypeChecks.visit_GILStatNode  s!     	4 ~~d##r+   c                    [         R                  " SS9   UR                  R                  U R                  5      nUR
                  R                  U R                  5      nS S S 5        W(       Ga  W(       Ga  [        R                  " UR                  SS9n[        R                  " UR                  SS9nU R                  X!R                  R                  5      nUR                  nUS;   a[  U R                  X1R
                  R                  5      nUR                  U5      nUS;   nU(       a  U(       d  U(       d	  U(       d  U$ U$ US;   a  [        U[        R                  5      (       a  UR                  nUR                   (       a"  [#        UR                  R                  S5        U$ UR                   (       d"  [#        UR
                  R                  S	5        U$ [        R$                  " U5      n	U	 H'  n
UR                  U
5      (       d  M  US
:X  a  Us  $ Us  $    US:X  a  U$ U$ U$ ! , (       d  f       GN= f)NT)ignoreFr   )isis_not==z!=)r  r  )inr  zType is fusedz-Can only use 'in' or 'not in' on a fused typer  r  )r   local_errorsr;  rT  rX  r<  r   rc  rX   specialize_typer  same_asrZ   r   CTypedefTypetypedef_base_typer  r   get_specialized_types)r%   r&   type1type2
false_node	true_nodeopis_sameeqtypesspecialized_types              r'   r  +ReplaceFusedTypeChecks.visit_PrimaryCmpNode  s     -MM11$2B2BCEMM11$2B2BCE . U"++DHHEBJ!**4884@I((0A0ABEB11,,UMM4E4EF--.<'GB$$6 3 '' eZ%<%<==!33E>>$--++_=" ! $--++IK  '<<UCE,1( ==)9::!Tz'0 0'1 1 -2 X~((_ .-s   AH..
H=c                      UR                  U R                  R                  5      $ ! [         a    [	        US5        Us $ f = f)NzType is not specific)rV  rX  rU  KeyErrorr   )r%   r  rX   s      r'   r  &ReplaceFusedTypeChecks.specialize_type  sA    	??4#3#3#E#EFF 	#-.K	s   $' AAc                 (    U R                  U5        U$ r"   rM  r$   s     r'   rN  !ReplaceFusedTypeChecks.visit_Node  r,  r+   )rX  r0  )rB   rC   rD   rE   rF   rN   r  r:  r  r  rN  rG   r~   r   s   @r'   r  r    s,    	:$$0d r+   r  c                   P   ^  \ rS rSrSrU 4S jrS rS rS rS r	S r
S	 rS
rU =r$ )DebugTransformi  z1
Write debug information for this Cython module.
c                    > [         TU ]  U5        [        5       U l        U R                  R
                  U l        UR                  U l        / U l	        SU l
        g rL   )rM   rN   rY  visitedrR   gdb_debug_outputwritertbc_filec_output_filenested_funcdefsregister_stepinto)r%   rR   optionsr   rS   s       r'   rN   DebugTransform.__init__  sL    !u ,,55#]]  " "'r+   c                    UR                   U R                  l        [        UR                   UR                  S   R
                  U R                  S9nU R                  R                  SU5        U R                  R                  S5        U R                  U5        U R                   H  nU R                  U5        M     SU l        U R                  U5        SU l        U R                  R                  S5        U R                  R                  S5        0 nUR                  R                  R!                  5        H  u  pVUR"                  U R$                  ;  d  M!  UR&                  R)                  S5      (       a  MC  UR*                  R,                  (       a  M`  UR*                  R.                  (       a  M}  XdU'   M     U R1                  U5        U R                  R                  S5        U$ )	Nr   )r  filename
c_filenameModule	FunctionsTFGlobals__pyx_)full_module_namer   r  rt  rX   r(  r"  startr?   r#  r4  r$   serialize_modulenode_as_functionendr  r  r  rJ  r  r   r  r  r  r  serialize_local_variables)r%   r&   r   nested_funcdefr  rG  rH  s          r'   r]   DebugTransform.visit_ModuleNode  sp   "33--XXa[))))+
 	h& 	k"4  #22N"">2 3 "&--d3!&K  	i JJ&&,,.DA  4FF%%h//FF'''FF,,,
 / 	&&w/I r+   c           
      p   U R                   R                  UR                  R                  5        [	        USS5      (       a  U$ U R
                  (       a  U R                  R                  U5        U$ UR                  c  SnO UR                  R                  R                  nUR                  R                  =(       d    UR                  R                  n[        UR                  R                  =(       d    [	        USS5      UUUR                  R                  [        UR                  S   5      S9nU R                   R#                  SUS	9  U R                   R#                  S
5        U R%                  UR                  R&                  5        U R                   R)                  S
5        U R                   R#                  S5        UR                  R*                   HM  nU R                   R#                  UR                  5        U R                   R)                  UR                  5        MO     U R                   R)                  S5        U R                   R#                  S5        SU l        U R-                  U5        SU l        U R                   R)                  S5        U R                   R)                  S5        U$ )Nr  Fr  r   z	<unknown>r   )r   r`  pf_cnamerJ  linenoFunctionr   Locals	ArgumentsStepIntoFunctionsT)r  r  rX  rJ  r  r$  r#  r   r5  r_  
func_cnamepyfunc_cnamert  r   r  rX   r   r/  r2  r  r1  arg_entriesr?   )r%   r&   r6  r`  r   r  s         r'   r4   DebugTransform.visit_FuncDefNode!  s   ))8894u--K!!  ''-K <<H||))44H
 

''@4::+@+@FGD&+$F++::txx{#% 	j.h&&t'7'7'?'?@Hk"##//CGGMM#((#GGKK! 0 	K )*!%4 !&'(Jr+   c                    U R                   (       a  UR                  b  UR                  R                  (       a{  [        USS5      (       ai  UR                  R
                  bR  [        UR                  R
                  S9nU R                  R                  SUS9  U R                  R                  S5        U R                  U5        U$ )N	is_calledFr   StepIntoFunctionr9  )r$  r  r  r  r_  r=  rt  r   r/  r1  r?   r%   r&   r   s      r'   rd  DebugTransform.visit_NameNodeR  s    ""		%		&&k511

%%1 djj334EGGMM,EM:GGKK*+4 r+   c                     U R                  U[        UR                  R                  S5      S   UR	                  5       SSSSS95        g)z
Serialize the module-level code as a function so the debugger will know
it's a "relevant frame" and it will know where to set the breakpoint
for 'break modulename'.
r  r   r  1True)r   r`  r6  rJ  r7  is_initmodule_functionN)!_serialize_modulenode_as_functionrt  r.  
rpartitionmodule_init_func_cnamer$   s     r'   r0  /DebugTransform.serialize_modulenode_as_functiond  sN     	..tT&&11#6r:--/ #)	6
 		r+   c                 :   U R                   R                  SUS9  U R                   R                  S5        U R                  UR                  R                  5        U R                   R                  S5        U R                   R                  S5        U R                   R                  S5        U R                   R                  S5        SU l        U R                  U5        SU l        U R                   R                  S5        U R                   R                  S5        g )Nr8  r9  r:  r;  r<  TF)r   r/  r2  r  r  r1  r$  r?   rD  s      r'   rJ  0DebugTransform._serialize_modulenode_as_functionu  s    j.h&&tzz'9'9:Hk"K )*!%4 !&'(Jr+   c           	      J   UR                  5        GH  nUR                  (       d  M  UR                  R                  (       a  SnOSnUR                  (       au  [
        R                  < SUR                  R                  < 3nUR                  R                  R                  < SUR                  R                  < SUR                  < 3nOWUR                  (       a.  [
        R                  < SUR                  < 3nUR                  nOUR                  nUR                  nUR                  (       d  SnO[        UR                  S   5      n[        UR                  UUUUS9nU R                   R#                  SU5        U R                   R%                  S5        GM     g )	NPythonObjectCObjectz->r  0r   )r   r`  rJ  r  r7  LocalVar)r[  r`  r  r  r  r   cur_scope_cnameouter_entryr  rr  rJ  r   ra  rX   r  rt  r   r/  r1  )r%   r  r_  vartyper`  qnamer7  r   s           r'   r2  (DebugTransform.serialize_local_variables  s1   ^^%E;;zz%%(#!! %+$:$:$)$5$5$;$;= ',kk&=&=&L&L&+kk&6&6&+jj2 !!$*$:$:$)KK1,,,,99 UYYq\*ZZ$E GGMM*e,GGKK
#U &r+   )r"  r#  r$  r   r  )rB   rC   rD   rE   rF   rN   r]   r4  rd  r0  rJ  r2  rG   r~   r   s   @r'   r  r    s2    ' &P/b$" $+$ +$r+   r  c                      ^  \ rS rSrSrU 4S jrS\4S jrS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rSrU =r$ )HasNoExceptionHandlingVisitori  z
Used by finalExceptClauseNode to work out if the body
needs to handle exceptions at all. This includes:

1. Can raise an exception.
2. May try to access the traceback.
c                 >   > SU l         S U l        [        TU ]  5         g r`   )uses_no_exceptionsassignment_lhsrM   rN   r;  s    r'   rN   &HasNoExceptionHandlingVisitor.__init__  s    "&"r+   returnc                 <    U R                  U5        U R                  $ r"   )rT  r]  r$   s     r'   r  &HasNoExceptionHandlingVisitor.__call__  s    

4&&&r+   c                     SU l         g rL   r]  r$   s     r'   rN  (HasNoExceptionHandlingVisitor.visit_Node  s
    "'r+   c                 &    U R                  U5        g r"   rM  r$   s     r'   ry   0HasNoExceptionHandlingVisitor.visit_ExprStatNode  rP  r+   c                 &    U R                  U5        g r"   rM  r$   s     r'   rj   0HasNoExceptionHandlingVisitor.visit_StatListNode  rP  r+   c                 6    UR                   (       d  SU l        g g rL   )r  r]  r$   s     r'   rb   ,HasNoExceptionHandlingVisitor.visit_ExprNode  s    &+D# r+   c                     SU l         g rL   rd  r$   s     r'   r  ,HasNoExceptionHandlingVisitor.visit_CallNode  s     #(r+   c                     g r"   r#   r$   s     r'   r  0HasNoExceptionHandlingVisitor.visit_PassStatNode  rI  r+   c                 J    U R                   (       d  g U R                  U5        g r"   )r]  r?   r$   s     r'   r  2HasNoExceptionHandlingVisitor.visit_ReturnStatNode  s    &&4 r+   c                 t   U R                   (       d  g UR                  U l        U R                  UR                  5        S U l        UR                  R
                  nUR                  (       d)  UR                  (       d  UR                  (       d  SU l         U R                   (       d  g U R                  US/S9  g )NFr   rm  )
r]  r   r^  rT  r   r  
is_numericr  is_memoryviewslicer?   )r%   r&   rhs_types      r'   r   8HasNoExceptionHandlingVisitor.visit_SingleAssignmentNode  s    &&"hh

488"88==##x';';x?Z?Z ',D#&&4%1r+   c                    U R                   (       d  g UR                  nU R                  UL ab  UR                  (       dP  UR                  (       d>  UR
                  (       d,  UR                  (       d  UR                  (       d  SU l         g g g g g g UR                  (       a,  UR                  (       a  UR                  (       a  SU l         g g g UR                  (       d3  UR
                  (       d"  UR                  (       d  UR                  (       aG  UR                  (       d  UR                  (       a$  UR                  R                  (       d  SU l         g g g SU l         g rL   )r]  r_  r^  r  is_argis_localra  r  is_cpp_optionalrV  
cf_is_nullcf_maybe_nullr  rs  r  s      r'   rd  ,HasNoExceptionHandlingVisitor.visit_NameNode  s    &&

$&$$NNe&6&6%:L:L*/' ;M&6N )5$
 ((T-C-C.3D+ .D( 53C3CuGYGYOOt'9'9499CWCW /4D+ DX'9 +0'r+   c                    UR                   (       a  SU l        OLUR                  R                  (       d  UR                  R
                  (       a  U R                  ULa  SU l        UR                  R                  (       d=  UR                  R                  (       d"  UR                  R                  (       d  SU l        U R                  (       a  U R                  U5        g g rL   )

is_py_attrr]  r  rt  r_  rz  r^  r  rs  r?   r$   s     r'   r  1HasNoExceptionHandlingVisitor.visit_AttributeNode
  s    ??&+D#ii**djj.H.HdNaNaimNm ',D#		%%)=)=A]A]&+D#""t$ #r+   c                     UR                   R                  R                  (       d,  UR                   R                  R                  (       d  SU l        U R                  (       d  g U R                  U5        g rL   )r   r  is_arrayis_ptrr]  r?   r$   s     r'   r  -HasNoExceptionHandlingVisitor.visit_IndexNode  sE    		''499>>+@+@&+D#&&4 r+   c                 &    U R                  U5        g r"   rM  r$   s     r'   visit_CoerceToTempNode4HasNoExceptionHandlingVisitor.visit_CoerceToTempNode  rP  r+   )r^  r]  )rB   rC   rD   rE   rF   rN   r  r  rN  ry   rj   rb   r  r  r  r   rd  r  r  r  rG   r~   r   s   @r'   r[  r[    sZ    
' '(!!,(
!
26%!! !r+   r[  r#   )Or@  r  r  r   r   r   r  r   r  r   r   r   r   r   r   r   r   r@  r   r   r   r   r   r   r	   r
   r   StringEncodingr   r   r   r   r   r   rI   r   r   r   r   r   r8  r   r   r   r  r  r  r   r  r  r  r  r  r
  r2  r>  rk  r  r  r  r  r  r  r!  r/  rM  rr  r  r  r   r  r  r2  rG  r  r  r  r  r[  r#   r+   r'   <module>r     s}     "& " "6 " "")/"9?" "/5"EK" " &," 39" CI" OU" !	"   
          2 J J * & ) ? ? BIO IX )\ ( ^ E Q K,& K,\!K !<V!; V!r,8\"D	 H# H#d H# H#V $@ $@4 $@SW $@cg $@ $@N6?$4 6r6+-= 6*{	%/ {	%|l'_.> l'^C6$&6 C6L/+7G /2`6 02B `6Fz$/1A z$z,(0@ ,(^6/ 6r`	< `	F$}| }@]
/ ]
@% %>:\ :zkO-= k\3 3l)? )X5O 5p< <~Z ZzQ+? Q+h36(*: 36ls% s%l"\#3 "J@l @F
\- \~N$_ N$bk!K k!r+   