
    h             	          S SK r \ R                  " St0 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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. S/\5      r(S0 r)S1 r*S2 r+\ RX                  S3\-S4\-4S5 j5       r.\ RX                  S6\-S7\-S8\-S9\-4S: j5       r/ " S; S<\\ 5      r0 " S= S>\\ 5      r1 " S? S@\5      r2 " SA SB\\ 5      r3 " SC SD\\ 5      r4 " SE SF\\ 5      r5 " SG SH\\ 5      r6 " SI SJ\\ 5      r7 " SK SL\\ 5      r8 " SM SN\5      r9 " SO SP\5      r:SQ r; " SR SS\5      r< " ST SU\5      r= " SV SW\5      r> " SX SY\5      r? " SZ S[\\ 5      r@ " S\ S]\5      rA " S^ S_\5      rB " S` Sa\5      rC " Sb Sc\5      rD " Sd Se\5      rE " Sf Sg\5      rF " Sh Si\\ 5      rG " Sj Sk\5      rH " Sl Sm\\ 5      rI " Sn So\5      rJ " Sp Sq\5      rK " Sr Ss\5      rLg)u    N
PyrexTypesNaming	ExprNodesNodesOptions	UtilNodesLetNode
LetRefNodeTreeFragmentEncodedStringerrorwarningcopyhashlibsys
itemgetter)r      )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     ]/var/www/fran/franai/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_CEnumDefNode1   r)   r*   c                     U$ r!   r"   r#   s     r&   visit_CStructOrUnionDefNode,SkipDeclarations.visit_CStructOrUnionDefNode4   r)   r*   c                 H    UR                   S:w  a  U R                  U5        U$ Nextern)
visibilityvisitchildrenr#   s     r&   visit_CppClassNode#SkipDeclarations.visit_CppClassNode7   s!    ??h&t$r*   r"   N)__name__
__module____qualname____firstlineno____doc__r'   r,   r/   r2   r5   r8   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&   rM   NormalizeTree.__init__S   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   StatListNoderW   r#   s     r&   visit_ModuleNodeNormalizeTree.visit_ModuleNodeX   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)rO   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$ rU   )rN   r>   rO   r   r[   rW   )r$   r%   is_listcontainerr`   s       r&   visit_StatNodeNormalizeTree.visit_StatNodef   sT    &&.4 &""4??%%$((4&AAKr*   c                 D    SU l         U R                  U5        SU l         U$ NTF)rN   r>   r#   s     r&   visit_StatListNode NormalizeTree.visit_StatListNodep   s%    "4 #r*   c                 &    U R                  US5      $ r_   re   r#   s     r&   visit_ParallelAssignmentNode*NormalizeTree.visit_ParallelAssignmentNodev       ""4..r*   c                 &    U R                  US5      $ r_   rl   r#   s     r&   r5    NormalizeTree.visit_CEnumDefNodey   ro   r*   c                 &    U R                  US5      $ r_   rl   r#   s     r&   r8   )NormalizeTree.visit_CStructOrUnionDefNode|   ro   r*   c                     UR                   R                  (       a*  [        R                  " UR                   R                  5      $ U R                  U5      $ )z!Eliminate useless string literals)expris_string_literalr   PassStatNoderW   re   r#   s     r&   visit_ExprStatNode NormalizeTree.visit_ExprStatNode   s9    99&&%%diimm44&&t,,r*   c                     U$ r!   r"   r#   s     r&   r/   #NormalizeTree.visit_CDeclaratorNode   r)   r*   )rO   rN   F)rA   rB   rC   rD   rE   rM   r\   ra   re   ri   rm   r5   r8   rx   r/   rF   __classcell__rR   s   @r&   rH   rH   >   s?    ( 
///- r*   rH   c                       \ rS rSrSrg)PostParseError   r"   N)rA   rB   rC   rD   rF   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)rL   rM   handle_bufferdefaultsspecialattribute_handlersin_pattern_noderP   s     r&   rM   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ru   value)nameargsstar_argstarstar_argrZ   doc)YieldNodeCollectorr>   result_expr	has_yield	has_awaitrY   r   YieldExprNoder   ExprStatNoderW   ReturnStatNodeDefNoder   r   r   r   def_node)r$   r%   	collectorrZ   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   rZ   is_async_defis_generator_expressionpyclasscclassscope_is_class)r   r>   loopr   r   rW   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!   )
rY   defaultr   DictNoder   rW   ERR_BUF_DEFAULTS
scope_nodebuffer_defaults_nodebuffer_defaults_pos)r$   decls     r&   r   PostParse.handle_bufferdefaults   sK    $,,	(:(:;; +;<</3||,.2hh+r*   c                 f    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a-  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S95        S Ul        UR'                  U5        GM     X1l        U$ ! [         a%  nU R.                  R1                  U5         S nAg S nAff = f)N)r   r   structmoduler   )lhsrhsfirst)r>   declaratorsrY   r   CPtrDeclaratorNodeCConstDeclaratorNodebaseCNameDeclaratorNoder   r   r   CClassDefNoder   getr   r   rW   ERR_INVALID_SPECIALATTR_TYPEERR_CDEF_INCLASSappendSingleAssignmentNoder   NameNoderQ   nonfatal_error)	r$   r%   rX   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&J K ,0(%) )*  (L 	 LL''*		s   BH E*H 
H0H++H0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   rX   )sumis_sequence_constructorrv   flatten_parallel_assignmentseliminate_rhs_duplicateslenr   r   rW   CascadedAssignmentNoder   ParallelAssignmentNode
expressionsort_common_subsequencesr	   )r$   r%   	expr_listru   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_sequenceI  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_DelStatNodeQ  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   )rZ   finally_clause)is_except_asr   DelStatNoderW   r   r   targetr   r[   TryFinallyStatNoderZ   r>   )r$   r%   
del_targets      r&   visit_ExceptClauseNode PostParse.visit_ExceptClauseNodeV  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   RaiseStatNoderW   r   r   r   r   r>   r#   s     r&   visit_AssertStatNodePostParse.visit_AssertStatNodei  sp     >>!"00"++DHH=IY;Z[**!1!%DN DJ4 r*   c                 D    [        UR                  UR                  5        g r!   )r   rW   whatr#   s     r&   visit_ErrorNodePostParse.visit_ErrorNodez  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   rW   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   rW   visit_FuncDefNoder#   s     r&   visit_DefNodePostParse.visit_DefNode  sT    OOx'		ppDHH$)) -- -./1%%d++r*   )r   r   )rA   rB   rC   rD   rE   rM   r   r   r   r   r,   r   r   r   r   r  r  r  r  r  r#  r&  r)  r2  rF   r}   r~   s   @r&   r   r      sq    "F%$	7$Z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!   )rL   rM   target_namesr$   rR   s    r&   rM   ._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  r7  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  rF  r*   c                 &    U R                  U5        g r!   r>   r#   s     r&   
visit_Node0_AssignmentExpressionTargetNameFinder.visit_Node      4 r*   )r7  )rA   rB   rC   rD   rM   r=  rB  r   r   rK  rF   r}   r~   s   @r&   r5  r5    s&    	!! !r*   r5  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"   )rL   rM   r5  visitr7  target_names_dictin_iteratorin_nested_generatorr   current_target_namessetall_target_namesvaluesupdate)r$   	loop_noder   target_name_finderr>  rR   s        r&   rM   %_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$ rP  )rS  rT  r   rW  rU  rV  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!   )rS  rT  r   rW  rU  r^  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!   )rQ  )clsrZ  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   )rT  r>   rU  rR  r   rS  rQ  r   )r$   r%   rU  target_names       r&   rB  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')rS  r   rW   r   rk  rU  rW  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!   )r`  rQ  r   rc  )r$   r%   r_  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_   )rT  r>   r$   r%   rT  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_   )rT  rQ  r   rs  s      r&   r   :_AssignmentExpressionChecker.visit_GeneratorExpressionNode	  s,    "66#' 

499#6 r*   c                 &    U R                  U5        g r!   rJ  r#   s     r&   rK  '_AssignmentExpressionChecker.visit_Node  rM  r*   )rW  rU  rS  rT  r   rR  )rA   rB   rC   rD   rE   rM   r`  rc  classmethodr   rB  rn  r   r   r   rK  rF   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_nodes2  s;    9T?"))S!1499=>DIr*   )rV  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rh   r   r   )r   xr  containss      r&   r  *sort_common_subsequences.<locals>.containsN  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_thanU  s    ((@Xaffa-@@r*   r   r   r   N)	enumeraterange)itemsr  rW   r  keynew_posir  s          @r&   r   r   B  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   )rW   rR   r   r   )literalcharsrW   stypesval	sval_typecharcvals           r&   #unpack_string_to_character_literalsr  d  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   rY   r   UnicodeNoder   r   r   rv   r  r   r  
is_starredr   rW   boolmap_starred_assignmentzipr   )r  r  r   r   complete_assignmentsrhs_argsrhs_sizer   lhs_targetsstarred_assignmentslhs_sizestarred_targetsru   targetscascades                  r&   r   r   p  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   )rW   r   )
r  r  r  r   r   r   r  rW   r   ListNode)r  r  r  r  r  r  ru   starredlhs_remainingr  starred_rhsrW   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   rL   __call__r$   r%   rR   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_ONLYrY   r   r   r   r   CFuncDefNode	modifiersinline_in_pxdr=   ERR_NOGO_WITH_INLINEr  rQ   r   r   rW   )r$   r%   errs      r&   r1  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   )rA   rB   rC   rD   rE   r  r  r  r  r1  rF   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!   )rL   rM   rV  numpy_module_namesr8  s    r&   rM   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  )rA   rB   rC   rD   rM   r  r  r   recurse_to_childrenrK  rF   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/$ )*InterpretCompilerDirectivesi2  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)rL   rM   rV  cython_module_namesdirective_namesparallel_directivesr   deepcopyr   get_directive_defaultsr  str
directives)r$   rQ   compilation_directive_defaultsr  r  r   rR   s         r&   rM   $InterpretCompilerDirectives.__init__x  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   rQ   r   r   directive_typesr   )r$   rW   	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'.r0  z ' is not a valid cython.* modulez. )

startswithsplitvalid_cython_submodules
splitlinesr   r	  r  r  hasattrr   )r$   rW   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  rW   wrong_scope_errorr  module_scoper  rY  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_namerW   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  r3  z is not a moduler4     )r  r   rW   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  r>  )r  typing)r  r  _create_cimport_from_importrW   relative_levelimported_namesr  r8  r   r0  r  r   )
r$   r%   r  r  newimprW   r   r  r7  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  r>  )r   r  r   r  r  r   rW   r   rC  levelr  r8  r   r0  r  )r$   r%   import_noder  rE  r   	name_noder  rF  r7  rG  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  rD  rE  r   )r  r  is_absolute)r  r   r   r   FromCImportStatNodeCImportStatNode)r$   node_posr  rK  rE  rW   dotted_namer  s           r&   rC  7InterpretCompilerDirectives._create_cimport_from_importF  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  )rY   r   r   
ImportNoder  r   r  r   rS  rW   r   r   r  r>   r?  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   BoolNoderW   )r$   r%   r
  s      r&   visit_NameNode*InterpretCompilerDirectives.visit_NameNodeh  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>   r_  r   r`  rW   r#   s     r&   r  /InterpretCompilerDirectives.visit_AttributeNodev  s=    4 ##%3%%dhhd;;r*   c                 ^    UR                   (       a  U R                  UR                   5        U$ r!   )ru   rQ  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.)rY   r   CallNoder\  rn  r_  r   r	  r   explicit_args_kwdsdictkey_value_pairsr   r   try_to_parse_directiverW   AttributeNoder   rQ  r  r`  DEFER_ANALYSIS_OF_ARGUMENTSr   )r$   r%   optnamedirectivetyper   kwdsr  rr  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)rQ   cppr   r   rr  r  rv   r   rY   r   r`  r   r	  r   NoneNoder  r  intIntNoder  r  typerq  as_python_dictr  callableru  )
r$   rv  r   rx  rW   	arg_errorr  kwrw  r   s
             r&   rs  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  rZ   r   )rZ   r  is_terminator)rK  r  r   copy_inherited_directivesr   r[   rZ   rW   CompilerDirectivesNoderY   rY  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      $ )Nrn  _extract_directivesr  r$   r%   r  r  s       r&   r1  -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$ )Nrn  locals)finalr  zXCdef functions can only take cython.locals(), staticmethod, or final decorators, got %s.r  )r  r  directive_localsrQ   r   r   rW   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_CClassDefNode/  s+    *.*B*B4*R'
))$<OPPr*   c                 N    U R                  US5      u  p#U R                  XU5      $ ri  r  r  s       r&   r?   .InterpretCompilerDirectives.visit_CppClassNode3  r  r*   c                 N    U R                  US5      u  p#U R                  XU5      $ )Nclassr  r  s       r&   visit_PyClassDefNode0InterpretCompilerDirectives.visit_PyClassDefNode7  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;   aW  X   n[        U[        5      (       a  UR%                  U5        O0[        U[&        5      (       a  UR)                  U5        O	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  )
decoratorsrq  r  objectr{  	decoratorr  rW   r   rY   r   r`  r   r   r   r   r   r   rY  r  r<  r   immediate_decorator_directives)r$   r%   
scope_namer  realdecsbothcurrent_opt_dictmissingdecr  r
  r   r   r   rx  optdictcontents_optdict	old_values                     r&   r  /InterpretCompilerDirectives._extract_directives;  sl    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+$)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  rQ   r   r   rW   _transform_with_gil_transform_critical_sectionr  r  rZ   rK  )r$   r%   directive_dictr
  r   r   r   rx  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   )staterZ   	condition)r  rY   r   SimpleCallNoder   r   rQ   r   r   rW   GeneralCallNoder   GILStatNoderZ   rK  )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   rZ   )	r   rQ   r   r   rW   r   CriticalSectionStatNoderZ   rK  )r$   r%   r   rx  s       r&   r  7InterpretCompilerDirectives._transform_critical_section  sj    t9q=CIMTLL''txx)mn ,,HH4ii
 t$$r*   )r  r  r  r%  r   )0rA   rB   rC   rD   rE   r   
TypeofNodeAmpersandNodeDereferenceNodeinc_dec_constructor
TypeidNodeunop_method_nodesc_binop_constructorbinop_method_nodesr.  rY  r  r6  rM   r  r  r\   r+  r0  r8  r  rH  rN  rC  r   ra  r  rf  rk  r{  rs  r  r1  r,   r  r?   r  r  r  r  r  rF   r}   r~   s   @r&   r  r  2  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@)F%,%% %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   rW   )r$   r%   r
  rf  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   rK  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&   ra  %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$ )Nrn  )rn  rj  )r   kwargs)r\  r  r>   rY   r   r  positional_argsr   keyword_argsr  rW   )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 disallowedrZ   Nz%The parallel directive must be called)rQ  r  rY   r   ParallelWithBlockNoder  r   rW   r\  rZ   r  r  )r$   r%   newnoderZ   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  rZ   else_clause)r\  rY   r   sequencer   ParallelRangeNoder  r  rZ   r  r   r   r   rW   )r$   r%   	in_prangeprevious_stateparallel_range_nodes        r&   rB  *ParallelRangeTransform.visit_ForInStatNode8  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)rL   rQ  r  s     r&   rQ  ParallelRangeTransform.visitW  s    7=&& r*   )r  r  r   r  )rA   rB   rC   rD   rE   r  r  in_context_manager_sectionr  r   r  r   ParallelThreadIdNoder  r  r  r  r\   ra  r  r  r  rB  rQ  rF   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)WithTransformi]  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 )NrZ   
__aenter__	__enter__T)r  r  is_special_lookup)rn  r   is_temp)r   )r   	with_noder   r5  )slowr   F)	with_stattest_if_runr   
await_exproperand)r  rZ   )
if_clausesr  )rZ   patternr  excinfo_target)rZ   except_clausesr  r   r   )rZ   r  handle_error_case)r>   rW   is_asyncrZ   r  r  r   	ProxyNoder  rt  	CloneNoder   
enter_callAwaitExprNoder   r[   WithTargetAssignmentStatNode	TupleNoder  ExcValueNodeExceptClauseNode
IfStatNodeIfClauseNodeNotNodeWithExitCallNodeReraiseStatNoder	  TryExceptStatNoder   r  )
r$   r%   rW   r  rZ   r  r  r   r  except_clauses
             r&   r   WithTransform.visit_WithStatNode^  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&   ra   WithTransform.visit_ExprNode      r*   r"   N)
rA   rB   rC   rD   r  ra   r   r  rK  rF   r"   r*   r&   r  r  ]  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!   )rL   rM   gen_expr)r$   r0  rR   s     r&   rM   ,_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_tagr0  r>   r#   s     r&   ra   2_GeneratorExpressionArgumentsMarker.visit_ExprNode  s2    ../.%)]]D"4 r*   c                     g r!   r"   r#   s     r&   rK  ._GeneratorExpressionArgumentsMarker.visit_Node  s     	r*   c                 &    U R                   Ul        g r!   )r0  r3  r#   s     r&   r   A_GeneratorExpressionArgumentsMarker.visit_GeneratorExpressionNode  s    !%r*   )r0  )
rA   rB   rC   rD   rM   ra   rK  r   rF   r}   r~   s   @r&   r.  r.    s    !!
/ /r*   r.  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<  rY   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rW   r   F)remove_fakeref)rW   
declarator	base_typer   r[  T)r   initialized_check)#r3  r>  rW   r@  r   formatr   local_scopelookup_herer  rM  r   genexpr_arg_prefixpunycodify_namer  r   r   r  r   remove_cv_refCArgDeclNoder   r   r   r?  declare_argumententrycname
in_closurer>   r   r   gbodylookuprA  )r$   r%   rG  rW   name_sourcer   r   rM  r\  	name_declr  new_argr>  rM  s                 r&   rI  *_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_   rH  r#   s     r&   ra   (_HandleGeneratorArguments.visit_ExprNode  s    $$T400r*   )r   r?  r>  rA  r@  N)rA   rB   rC   rD   r  r   rI  ra   r   r  rK  rF   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   rL   r  popr  s     r&   r  &DecoratorTransform.visit_CClassDefNode/  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')rY   rW   r  r   r   )r$   r%   rK  s      r&   visit_PropertyNode%DecoratorTransform.visit_PropertyNode7  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)r1  r  r   r   r=   r   r  r;  r   r   rW   _find_property_decoratordeclared_name_add_property_reject_decorated_property)r$   r%   ret_nodedecorator_noder   s        r&   visit_CFuncDefNode%DecoratorTransform.visit_CFuncDefNode=  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 'r0  r   ry  r  )r   r1  r  rv  r  r;  rx  r   _map_property_attributer  r  r   rW   r   ry  _add_to_propertyis_classmethodis_staticmethodchain_decorators)r$   r%   r   r{  r  handler_namefuncdecss           r&   r2   DecoratorTransform.visit_DefNodeW  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)ro  r  r  r;  r   is_attributer  )r$   r%   
propertiesr{  r  s        r&   rv  +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   rW   )r%   r{  decos      r&   ry  -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   rZ   rh  )r   r   rZ   )r   r  ry  removero  rY   r   r  r[   rW   r   r  CPropertyNoder   is_cpropertyr   r   rZ   rX   PropertyNode)r$   r%   r   r{  r  r  rZ   props           r&   rx   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  )ro  r   r  r   rW   r  r  rZ   rX   r  r   )	r$   r%   r   r  r  r  rX   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   rn  r   r   )	r   r   rW   r  r  r   r   IndirectionNodedecorator_indirection)r%   r  r   decorator_resultr  rM  reassignments          r&   r  #DecoratorTransform.chain_decorators  s     %--dhhTB#DbD)I(77",,&' ) * &&txxd;	11HH "
 ,,l^<%1"##r*   )ro  )rA   rB   rC   rD   rE   ro  r   r   r  r  rs  r|  r2  rv  r  ry  rx  r  r  rF   r}   r~   s   @r&   rg  rg    s     K  	*	* + 
c	 4$<L
  <" $ $r*   rg  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)rW   r%   r\  )getattrrK  r  r  r  rY   r   ro  rn  r;  r   rp  r  r   r|  r  r   unicode_typecompile_time_valuer   CnameDecoratorNoderW   )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)rA   rB   rC   rD   rE   r  r1  r  r5   r8   r,   rF   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&   r5   &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&   r8   /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_CClassDefNode/  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&   r1  %ForwardDeclareTypes.visit_FuncDefNode;  r,  r*   c                     U$ r!   r"   r#   s     r&   r  (ForwardDeclareTypes.visit_PyClassDefNode?  r,  r*   )r%  N)rA   rB   rC   rD   rE   r+  r\   r  r5   r8   r  r1  r  rF   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-$ ),AnalyseDeclarationsTransformiD  zr
property NAME:
    def __get__(self):
        return ATTR
    def __set__(self, value):
        ATTR = value
    c_classNrK  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_stackrV  fused_error_funcsrL   r1  _super_visit_FuncDefNoder  )r$   rootsuper_classrR   s      r&   r  %AnalyseDeclarationsTransform.__call__t  s;    !!$g(3(E(E%##D))r*   c                 V    U R                   S   R                  UR                  5        U$ Nr   )r  r}  r   r#   s     r&   ra  +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   rV  analyse_declarationscurrent_envr>   rp  rZ   rX   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  implementedrZ   var_entriesneeds_propertycreate_Propertyr  rQ  r   rX   r=   r_  _inject_pickle_methods)r$   r%   r  rX   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[9        U5      nSUR:                  -  n[#        SUSSR                  U5      -  SR                  U5      UR<                  SR                  S [?        U5       5       5      [A        U5      S.-  S[%        S 5      /S9R'                  0 5      nUR)                  UR                  R                  5        U R+                  U5        U RB                  R1                  U5        [#        SUUS   SR                  S U 5       5      [A        U5      S:X  a  SOS -   S!R                  U Vs/ s H.  oR                  R                  (       d  M  S"UR6                  -  PM0     sn=(       d    S#/5      S$.-  S[%        S 5      /S9R'                  0 5      nUR)                  UR                  5        U RE                  XR                  5        U R+                  U5        U RG                  5         UR,                  R.                  R1                  U5        g s  snf s  snf s  s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__pyx_unpickle_%sa  
                def %(unpickle_func_name)s(__pyx_type, long __pyx_checksum, __pyx_state):
                    cdef object __pyx_PickleError
                    cdef object __pyx_result
                    if __pyx_checksum not in %(checksums)s:
                        from pickle import PickleError as __pyx_PickleError
                        raise __pyx_PickleError, "Incompatible checksums (0x%%x vs %(checksums)s = (%(members)s))" %% __pyx_checksum
                    __pyx_result = %(class_name)s.__new__(__pyx_type)
                    if __pyx_state is not None:
                        %(unpickle_func_name)s__set_state(<%(class_name)s> __pyx_result, __pyx_state)
                    return __pyx_result

                cdef %(unpickle_func_name)s__set_state(%(class_name)s __pyx_result, tuple __pyx_state):
                    %(assignments)s
                    if len(__pyx_state) > %(num_members)d and hasattr(__pyx_result, '__dict__'):
                        __pyx_result.__dict__.update(__pyx_state[%(num_members)d])
                z(%s)z, z; c              3   <   #    U  H  u  pS U< SU< S3v   M     g7f)z__pyx_result.z = __pyx_state[]Nr"   )r  ixrD  s      r&   r  r  	  s#      -C%AEB @A"E%As   )unpickle_func_name	checksumsmembersr  assignmentsnum_membersr   ap  
                def __reduce_cython__(self):
                    cdef tuple state
                    cdef object _dict
                    cdef bint use_setstate
                    state = (%(members)s)
                    _dict = getattr(self, '__dict__', None)
                    if _dict is not None:
                        state += (_dict,)
                        use_setstate = True
                    else:
                        use_setstate = %(any_notnone_members)s
                    if use_setstate:
                        return %(unpickle_func_name)s, (type(self), %(checksum)s, None), state
                    else:
                        return %(unpickle_func_name)s, (type(self), %(checksum)s, state)

                def __setstate_cython__(self, __pyx_state):
                    %(unpickle_func_name)s__set_state(self, __pyx_state)
                r   c              3   ,   #    U  H
  nS U-  v   M     g7fr  r"   )r  rD  s     r&   r  r  "	  s     (R@Q1Q@Qs   r   r  z or zself.%s is not NoneFalse)r  checksumr  any_notnone_members)$r  r  r  r[  r  r<  r  r_  rQ  sortis_pyobjectcan_coerce_to_pyobjectcan_coerce_from_pyobjectis_struct_or_unionr  r   rW   r   rH   
substituter  rQ  rZ   rX   r   create_to_py_utility_codecreate_from_py_utility_coder   _calculate_pickle_checksumspunycode_class_namer  r  r   r  enter_scope
exit_scope)r$   r%   r  auto_pickle_forcedall_membersrf  cinitinherited_reducer   non_pystructsr  pickle_funcall_members_namesr  r  unpickle_funcs                    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 =34EFI!4t7O7O!O ) *" +=!'$))I*>!>#yy):;"&//#'99 -C%./@%A-C $C $''8#9	!*2 "]4-@,A3C2 DN:b>3 4 ..tzz/?/?@JJ}%**11-@& (( += )!#yy(R@Q(RR]`ar]swx]xVY  A   B,2KKal  9Dal\]pvpv  qC  qC9W9NQRQWQW9Wal  9D  9Q  IP  HQ  -R'(4  =+>*?5A4 BLB5 6 ,,TZZ8T::.JJ{#OOIIOO"";/[
 HF !>z 9Ds0   +U>UUU>U"U*UU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  ry  )
r  r;  r   rU  r   rg  rQ   r%   r  r  )r$   old_decoratorsr  r%   r  r  r  	transformr   r   reassignmentss              r&   _handle_fused_def_decorators9AnalyseDeclarationsTransform._handle_fused_def_decorators-	  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)rX   insertr(  r\  update_fused_defnode_entryr[  	signatureuse_fastcallr   PyCFunctionNodefrom_defnoder  coerce_to_tempresulting_fused_function_create_assignmentr  fused_func_assignmentr%  )r$   r  r  r%   pycfuncs        r&   _handle_def(AnalyseDeclarationsTransform._handle_defG	  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  r8  fused_functionr  r  r   rW   r}  r   rw   rZ   r   r  r  get_fused_typesr  FusedCFuncDefNoder>   r(  r5  )r$   r  r%   r8  r   r  s         r&   _create_fused_function3AnalyseDeclarationsTransform._create_fused_function[	  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   rW   r   r[   r^  rZ   r#   s     r&   _handle_fused*AnalyseDeclarationsTransform._handle_fusedy	  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   rV  rT  declare_argumentsr  r  rU  analyse_as_typer  fused_to_specific
specializedeclare_varrW   r   rA  r<  rZ   r  r  rp  r  r  rE  convert_to_ufunc)r$   r%   r  lenvvar	type_noder  rE  s           r&   r1  .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!   )r1  rY   r   r   r  code_objectr   CodeObjectNoder  fused_py_funcis_generator_bodyneeds_assignment_synthesis_synthesize_assignmentr$   r%   r  s      r&   r2  *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!   )rQ  r(  r   rR  	for_cfuncr  r  r1  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!   )r1  r#   s     r&   visit_GeneratorBodyDefNode7AnalyseDeclarationsTransform.visit_GeneratorBodyDefNode	  s    %%d++r*   c                 ^    U R                  U5      nUR                  UR                  l        U$ r!   )r2  rQ  r^  )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      $ )Nr)  )is_py_class_scopeis_c_class_scopeouter_scopecurrent_directivesr   is_closure_scoper   InnerFunctionNoder/  py_cfunc_noder.  r)  is_cyfunctionr2  )r$   r%   r  genvr)  r   s         r&   rV  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  rW   r  r   r   r   r   r  )r$   r   r   r  r  assmts         r&   r2  /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  rp  rL   visit_func_outer_attrsr   )r$   r%   stackrR   s      r&   rq  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   rV  r  analyse_scoped_declarationsr>   r  rp  rW  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   rt  rW   r   r   r[  r  r  r  r   r   r  init_assignmentr  r   struct_or_union_wrapperr   r[   r`  	is_structr  r  replacerX   r  shadowrZ   rY   rQ  CSimpleBaseTypeNoder   r   kw_onlyr   r  rP  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&   r8   8AnalyseDeclarationsTransform.visit_CStructOrUnionDefNode	
  s
     r*   c                 (    U R                  U5        U$ r!   rJ  r#   s     r&   r/   2AnalyseDeclarationsTransform.visit_CDeclaratorNodeW
  s    4 r*   c                     U$ r!   r"   r#   s     r&   r'   /AnalyseDeclarationsTransform.visit_CTypeDefNode\
  r)   r*   c                     g r!   r"   r#   s     r&   r2   0AnalyseDeclarationsTransform.visit_CBaseTypeNode_
  s    r*   c                 (    UR                   S:X  a  U$ g )Npublic)r=   r#   s     r&   r5   /AnalyseDeclarationsTransform.visit_CEnumDefNodeb
  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  r_  r=   r  rd  r   rW   r>   )r$   r%   r[  s      r&   visit_CNameDeclaratorNode6AnalyseDeclarationsTransform.visit_CNameDeclaratorNodeh
  s    99,,R00$$&--dii8E!1!1X!=!KK88dhh NQUQZQZ Z[4 r*   c                 &    U R                  U5        g r!   rJ  r#   s     r&   r,   .AnalyseDeclarationsTransform.visit_CVarDefNodeq
  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_CnameDecoratorNodev
  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$   rN  )rW   r  r  )rW   r   )r=   r  r  r  r  basic_property_ror  r   rt  rW   r   r   rX   r   )r$   r[  r  r  s       r&   r  ,AnalyseDeclarationsTransform.create_Property
  s    x'zz%%77..+--H&&	//EII4=4F4F599[a4b:?**F( 99	 '  $eA	'
 

yyr*   c                 f    U R                  U5        UR                  U R                  5       5        U$ r!   rz  r#   s     r&   rn  ;AnalyseDeclarationsTransform.visit_AssignmentExpressionNode
  r}  r*   )r  r  r  r9  r  ).rA   rB   rC   rD   r   rH   r  r  r  r  r  r9  r  r  ra  r\   r   r  r  r%  r5  r<  rA  r1  r2  r|  r]  r`  rV  r2  rq  rw  r{  r?   r8   r/   r'   r2   r5   r  r,   r  r  rn  rF   r}   r~   s   @r&   r  r  D  sQ   ! # M$$7#8:N + , M$$7#8: % & M$$7#8	: + , !&') # $ !&'	)O NI**E0N4(<('R>,,7 +"
1H7\

" 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)r5  	   usedforsecurityF)sha256sha1md50xr>  )
r  encoder   version_infor  r   	hexdigestAttributeError
ValueErrorr   )member_namesmember_names_stringhash_kwargsr  	algo_name
mkchecksumr	  s          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_scoperG  r  rL   r1  r  r  _super_visit_ClassDefNoder>   )r$   r%   _superrR   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  )rG  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   rG  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>)rG  r   
is_wrapperrp  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  rG  rp  r  r  r   r1  r  s      r&   r2  .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  )rG  r  r   r  r[  r  r  s      r&   r1  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  rU  r   r   rW   r   r  rZ   rX   r*  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[  rC   r  rB   )needs_qualname_assignmentneeds_module_assignmentrG  r  r  rU  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$ )NrC   TrB   )r  rd  r   r  r  )r$   r%   r  s      r&   ra  /CalculateQualifiedNamesTransform.visit_NameNode  sQ      "!! yyN*15.  l*/3,r*   )r  r  r  r  r  rG  r!   )rA   rB   rC   rD   rE   r  r  r\   r  r  r  r  r  r2  r1  r  r  ra  rF   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_typesrZ   r  rW   	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  )rT  r  rZ   r  r  r}  rW   r  r   r>   r  )r$   r%   local_positionss      r&   r1  -AnalyseExpressionsTransform.visit_FuncDefNode2  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   ru  r  analyse_scoped_expressionsra   r#   s     r&   rw  0AnalyseExpressionsTransform.visit_ScopedExprNodeB  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.
)ra   is_fused_indexr  is_errorr   r#   s     r&   visit_IndexNode+AnalyseExpressionsTransform.visit_IndexNodeI  s5     	D!tyy'9'999Dr*   c                 x    U R                   S   R                  UR                  5        U R                  U5        U$ r  r  r}  rW   r>   r#   s     r&   ra   *AnalyseExpressionsTransform.visit_ExprNode\  0    rtxx(4 r*   c                 x    U R                   S   R                  UR                  5        U R                  U5        U$ r  r  r#   s     r&   re   *AnalyseExpressionsTransform.visit_StatNodea  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  rp  r   r   r  node_positionsr  rT  node_positions_to_offset)r$   	func_noder  	next_linenext_column_in_linerangesr   r  start_columnr  positions              r&   r  ,AnalyseExpressionsTransform._build_positionsf  s     !NN 1a 	
	 	%.!A\MM4|T]L]5Hcorscstu-1* &/ 	#)   )3:
3 K3:
	6 :
s   B6)r  N)rA   rB   rC   rD   r\   r1  rw  r  ra   re   r  rF   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$ rK   )_in_fused_functionrQ  )r$   trees     r&   r  #FindInvalidUseOfFusedTypes.__call__  s    "'

4r*   c                 &    U R                  U5        g r!   rJ  r#   s     r&   rK  %FindInvalidUseOfFusedTypes.visit_Node  rM  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  r@  rT  return_typer  r   rW   r>   )r$   r%   outer_statuss      r&   r1  ,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   rW   r>   r#   s     r&   ra   )FindInvalidUseOfFusedTypes.visit_ExprNode  s<    &&4999K9K$((TU t$r*   )r  N)	rA   rB   rC   rD   r  rK  r1  ra   rF   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   r$  r   	IndexNoderW   r  r  rt  r  rY   BufferIndexNoder  )r%   r&  r   tempsr$  r  side_effect_free_references         r&   r+  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*   Tr%  )r  operand1operand2inplacer   r|   r"   )r   r   r  is_cpp_classrY   r   r)  r  r  rR   r  
binop_noderW   r  r  analyse_target_typesanalyse_typesanalyse_operationr   r   	coerce_tor  r	   )
r$   r%   r   r   r  let_ref_nodesdupbinoptr+  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&   ra   %ExpandInplaceOperators.visit_ExprNode  r,  r*   r"   N)rA   rB   rC   rD   r:  ra   rF   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$ rK   )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  rG  
except_valhas_explicit_exc_clausez#cfunc directive is not allowed here)rK  r  r  r  rG  rL  rM  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   rW   as_cfunctionrQ  rB  r1  )r$   r%   r  r  r  rL  rM  return_type_nodes           r&   r2  #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   rW   r   r  r   #FirstArgumentForCriticalSectionNoderZ   r>   )r$   r%   r   new_bodys       r&   r1  'AdjustDefByDirectives.visit_FuncDefNode-  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_LambdaNode;  r,  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>@  s     U=T	DOO+=Ts   T)anyconverts_to_cclass	as_cclassrQ  rB  r>   r$   r%   old_in_pyclasss   `  r&   r  *AdjustDefByDirectives.visit_PyClassDefNode?  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$ rK   )rB  r>   r^  s      r&   r  )AdjustDefByDirectives.visit_CClassDefNodeJ  s.    )) 4 )r*   )r  rB  N)rA   rB   rC   rD   rE   r\  r\   r+  r2  r1  r   r  r  rF   r"   r*   r&   r?  r?    s4    	 O,\	r*   r?  c                   :    \ rS rSrSrS rS rS
S jrS rS r	S	r
g)AlignFunctionDefinitionsiR  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_ModuleNodeX  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  r_  r   	is_cclassr  r]  is_builtin_scoper   rW   r$   r%   pxd_defs      r&   r  -AlignFunctionDefinitions.visit_PyClassDefNode]  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  r_  r  defined_in_pxdr  r>   r$   r%   rl  re  s       r&   r  ,AlignFunctionDefinitions.visit_CClassDefNodei  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$ rh  )r  r_  r   rj  is_cfunctionr   rW   rO  rk  s      r&   r2  &AlignFunctionDefinitions.visit_DefNodev  s    **##DII.GMM1O1O''dhh 1DII =>;;'++'BC$$W-D r*   c                     U$ r!   r"   r#   s     r&   ra   'AlignFunctionDefinitions.visit_ExprNode  r,  r*   r  r!   )rA   rB   rC   rD   rE   r\   r  r  r2  ra   rF   r"   r*   r&   rd  rd  R  s     


r*   rd  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  rV  rE  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_cpdefry  )r  is_module_scoper  r   rE  is_cdef_func_compatiblerO  r#   s     r&   r2  *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!   ro  rq  s       r&   r  0AutoCpdefFunctionDefinitions.visit_CClassDefNode  rs  r*   c                     U R                   R                  (       a0  UR                   H   u  p#U R                  R	                  U5        M"     U$ r!   )r  r  r  rE  r}  )r$   r%   r   r   s       r&   rN  5AutoCpdefFunctionDefinitions.visit_FromImportStatNode  s:     ::%%::##''- &r*   c                     U$ r!   r"   r#   s     r&   ra   +AutoCpdefFunctionDefinitions.visit_ExprNode  r,  r*   )r  rE  r  r!   )
rA   rB   rC   rD   r\   r2  r  rN  ra   rF   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)rf  r>   r   rX   rY   r   r[   r  r  r   rW   )r$   r%   idxr  s       r&   ri   (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>   rZ   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>   rZ   r  r  rf  r   rW   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	linetracerV   )rf  r   r[   rW   r#   s     r&   visit_PassStatNode(RemoveUnreachableCode.visit_PassStatNode  s-     &&{3%%$(("=Dr*   r"   N)rA   rB   rC   rD   ri   r  r  r  r  r  rF   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 rK   )
rL   rM   yieldsrG  finallysexceptshas_return_valuer   r   excludes)r$   r  rR   s     r&   rM   YieldNodeCollector.__init__  sE     % r*   c                 F    XR                   ;  a  U R                  U5        g g r!   )r  r>   r#   s     r&   rK  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  rG  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  rF  r*   c                     g r!   r"   r#   s     r&   r1  $YieldNodeCollector.visit_FuncDefNode  rF  r*   c                     g r!   r"   r#   s     r&   r   #YieldNodeCollector.visit_LambdaNode  rF  r*   c                     [        UR                  [        R                  5      (       a&  U R	                  UR                  R
                  5        g g r!   )rY   r   r   _ForInStatNoderQ  r   r#   s     r&   r   0YieldNodeCollector.visit_GeneratorExpressionNode  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   rG  r  )rA   rB   rC   rD   rM   rK  r  r  r  r  r  r  r1  r   r   r  rF   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$ rK   )needs_closurer  r>   r#   s     r&   r\   #MarkClosureVisitor.visit_ModuleNode/  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>G  s     C$4q

$4s   #	#z/'await' not allowed in generators (use 'yield')r   )rW   r   rZ   is_coroutine_bodyis_async_gen_body)rW   r   r   r   r   r   r  r^  lambda_namerN  r   )#r  r>   r   r  r   r   AsyncDefNoder   AsyncGenNoder  rG  in_async_genrf  IterableAsyncDefNoder   nextr   rW   GeneratorDefNoder  	label_numr  r  in_generatorGeneratorBodyDefNoder   rZ   r   r   r   r   r  r  rN  r   )
r$   r%   r   coroutine_type
yield_exprfoundr  retnoder^  	coroutines
             r&   r1  $MarkClosureVisitor.visit_FuncDefNode5  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>   rK  r   rW   r#   s     r&   r|  %MarkClosureVisitor.visit_CFuncDefNodea  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_LambdaNodej  s3    "4 !//!r*   c                 6    U R                  U5        SU l        U$ r_   )r>   r  r#   s     r&   r  %MarkClosureVisitor.visit_ClassDefNodeq  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  rY   r   r   r  r   r   r  r|  r.  rQ  )r$   r%   r  itseqs       r&   r   0MarkClosureVisitor.visit_GeneratorExpressionNodev  s    ==dii!5!566!YY//0DM$$T* $))U%9%9:: K		""++K+D177>r*   )r  r  N)rA   rB   rC   rD   r\   r1  r|  r   r  r   rF   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 rK   )rL   rM   pathr  rP   s     r&   rM   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!   )rT  iter_local_scopesr  r  from_closurer   r]  )r$   r%   r  r]  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   rW   definingimplementingno_gc_clearfreelist)rW   r   r\  r  is_cdefr   )/r?  rT  r  r  rX  r  r  
is_cglobalr]  r  r  r  needs_outer_scoper[  r  rc  rd  re  r  ri  r   needs_closure_codeis_passthroughscope_classnext_idr   closure_class_prefixr\  r  r   declare_c_classrW   r  is_final_typeis_internalis_closure_class_scoper   r  r   closure_freelist_sizerg  rJ  outer_scope_cnamein_subscoper   is_declared_genericcheck_c_class)r$   r%   target_module_scope
inner_noder  r[  r  r]  
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_   )rY   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   rp  r#   s     r&   r1  &CreateClosureClasses.visit_FuncDefNode  sq    >>t$K((/@/@AIIT"t$IIMMOr*   c                 (    U R                  U5        U$ r!   rJ  r#   s     r&   r]  /CreateClosureClasses.visit_GeneratorBodyDefNode      4 r*   c                 l    UR                   (       d  U R                  U5      $ U R                  U5        U$ r!   )rK  r1  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!   )rA   rB   rC   rD   rM   r\   r  r  r   r1  r]  r|  r   rF   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
)InjectGilHandlingi  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  rZ   )r  r   r  rW   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_GILStatNode5  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  rY   rP  r   CFuncDeclaratorNoder  r>   r*  s      r&   r|  $InjectGilHandling.visit_CFuncDefNode<  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>   r*  s      r&   visit_ParallelRangeNode)InjectGilHandling.visit_ParallelRangeNodeD  s.    JJ	ZZ
4 
r*   c                     U$ r!   r"   r#   s     r&   ra    InjectGilHandling.visit_ExprNodeK  r,  r*   )r  N)rA   rB   rC   rD   rE   r  r'  visit_RaiseStatNodevisit_PrintStatNoder,  r|  r2  ra   r   r  rK  rF   r"   r*   r&   r$  r$    sB     E /. "55Jr*   r$  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$ )GilCheckiR  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        S U l        [        R                  R                  U l        [        TU ]%  U5      $ r!   )
r  	env_stackr   
NoGilStateHasGilnogil_statein_lock_block"nogil_state_at_current_gilstatnoderL   r  )r$   r  rR   s     r&   r  GilCheck.__call__\  sP    ** ++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   )
r>  outer_attrsr   r;  r  r   r<  NoGilr=  r>   )r$   r%   r>  r+  rD  s        r&   _visit_scoped_childrenGilCheck._visit_scoped_childrend  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                  S so0l        U R
                  nU(       a  [        R                  R                  U l        U(       a,  UR                  (       a  UR                  UR                  5        U R                  XR
                  5        X@l        X0l        U R                   R                  5         U$ r!   )r;  r   rT  r  r?  r>  r   r<  
NoGilScopenogil_checkrF  rp  )r$   r%   inner_nogilr?  r>  s        r&   r1  GilCheck.visit_FuncDefNodep  s    d../&&,,,0,>,>))&&$//::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U(       dg  U R                  (       aV  U R                  R                  R                  R                  SS9R                  5       n[        UR                  SU S3S5        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        XPl        U$ )Nz<Non-constant condition in a `with %s(<condition>)` statementr  T)pyrexzAcquiring the GIL inside a z: lock. To avoid potential deadlocks acquire the GIL first.r   z3Trying to acquire the GIL while it is already held.z;Trying to release the GIL while it was previously released.F)r  r   rW   r  r>  rJ  r?  r   r  empty_declaration_codestripr   r   r<  rI  scope_gil_state_knownrY   r  r[   rX   r@  rE  r=  rF  )r$   r%   r+  is_nogil	type_namer@  r>  s          r&   r,  GilCheck.visit_GILStatNode  s   >>%$..$$57;zzBC K 0 0$$	JJ')D..**..33JJQUJV\\^I-i[ 9F F	  )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  r&  z)prange() can only be used without the GILr   )r  r>  r   r<  rI  r  rW   rQ  r,  r   rJ  r;  r>   )r$   r%   node_was_nogils      r&   r2   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  r&  Fr   )r>  r   rW   r   r<  rI  r  rQ  r,  rJ  r;  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)r>  rK  rJ  is_try_finally_in_nogilr>   r#   s     r&   r  !GilCheck.visit_TryFinallyStatNode  s?     ??4(('+$4 r*   c                 $    U R                  U5      $ r!   )rK  r#   s     r&   visit_CriticalSectionStatNode&GilCheck.visit_CriticalSectionStatNode  s    t$$r*   c                 Z    U R                   Uso l         U R                  U5      nX l         U$ r!   )r?  rK  )r$   r%   r?  r   s       r&   visit_CythonLockStatNode!GilCheck.visit_CythonLockStatNode  s.    ,0,>,>))&*r*   c                     U R                   [        R                  R                  :X  a  SUl        U R                  U5        U$ rK   )r@  r   r<  rI  rQ  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  )r;  r>  rJ  rD  rF  r>   in_nogil_contextr#   s     r&   rK  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_typern  r  r  r   r   r>  r   r<  rE  r=  r   PythonCapiCallNoderW   r[  r\  rK  )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*   )r;  r?  r>  r@  )rA   rB   rC   rD   rE   r  rF  r1  r,  r2  rY  r  r_  rb  re  rK  rq  rF   r}   r~   s   @r&   r9  r9  R  sJ    &
%,)V&(
%	% %r*   r9  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  r0  is_fake_referencer   CppOptionalTempCoercionr#   s     r&   ra   CoerceCppTemps.visit_ExprNode%  sd    4 )),7##%%$))*@*@II//44T:Dr*   c                     U$ r!   r"   r#   s     r&   visit_CppOptionalTempCoercion,CoerceCppTemps.visit_CppOptionalTempCoercion/  r)   r*   c                     U$ r!   r"   r#   s     r&   visit_CppIteratorNode$CoerceCppTemps.visit_CppIteratorNode2  r)   r*   c                 <    U R                  UR                  5        U$ r!   )r>   ru   r#   s     r&   rx   !CoerceCppTemps.visit_ExprStatNode5  s    499%r*   r"   N)rA   rB   rC   rD   rE   r\   ra   r~  r  rx   rF   r"   r*   r&   rt  rt    s     r*   rt  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$ )TransformBuiltinMethodsi;  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!   )rL   rM   def_node_body_insertions)r$   r   rx  rR   s      r&   rM    TransformBuiltinMethods.__init__A  s    $'$'(*%r*   c                 L    UR                   (       a  g U R                  U5        U$ r!   )declaration_onlyr>   r#   s     r&   r   2TransformBuiltinMethods.visit_SingleAssignmentNodeE  s!      t$Kr*   c                 F    U R                  U5        U R                  U5      $ r!   )r>   visit_cython_attributer#   s     r&   r  +TransformBuiltinMethods.visit_AttributeNodeL  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      $ )NrR   )r   r  rU  _inject_classr  )r$   r%   rL  r[  s       r&   ra  &TransformBuiltinMethods.visit_NameNodeP  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  )rV  	frozensetr  r   r[  z>'%s' not a valid cython attribute or is being used incorrectly)r_  r  r  r   r  rW   r   NullNoder   r  builtin_scoperU  r   r/  rQ   cython_scopelookup_qualified_namer   )r$   r%   r  versions       r&   r  .TransformBuiltinMethods.visit_cython_attributeX  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   GlobalsExprNoderW   r  LocalsExprNodecurrent_scope_node)r$   r%   rL  s      r&   visit_ExecStatNode*TransformBuiltinMethods.visit_ExecStatNodek  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  rM  s     r&   r  9TransformBuiltinMethods._inject_locals.<locals>.<genexpr>  s      W5Jchh5Js   --r   r  )r  rU  rW   r   r   r   r   r  r  rc  r  r  rq  r  SortedDictKeysNoder"  r  rX  IdentifierStringNoder  )r$   r%   	func_namerL  r[  rW   r   locals_dictlocal_namesrM  r  s              r&   _inject_locals&TransformBuiltinMethods._inject_localsv  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  rY   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  r_  r   r   
is_builtinr   r   r  rW   r  r  r  )r$   r%   r  rL  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  r?  TrR   r   r   )r  rY   r   FuncDefNodereversedr;  ClassDefNoder  r^  r  rZ   rW   rd  r   r   r  r   r[  rc  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_scoperW   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   rC  Tr  r   r   r  )r  rU  r   r  rY   r   r   r   r;  rc  r  r  r  r   r  rW   r?  r   r   rd  r  r[  )r$   r%   r  rL  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  rp  rY   rZ   r   r[   rX   r*  rW   )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!   )rL   r1  r  r  s     r&   r1  )TransformBuiltinMethods.visit_FuncDefNode  s%    w(.%r*   c                 H   > [         TU ]  U5      nU R                  U5        U$ r!   )rL   r]  r  r  s     r&   r]  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  	typecheckrD  r  z#sizeof() takes exactly one argument)arg_typecmodz"cmod() takes exactly two arguments%Tcdivz"cdiv() takes exactly two arguments/rV  r   r  z*'%s' not a valid cython language construct)dirr  r  evalrL   )rn  r_  r  r  r   r   r   rW   r  rG  r  r   TypecastNodeSizeofTypeNodeSizeofVarNoder1  	cdivisionr   r   rQ   r  r  r>   rY   r  r;  r   r  r  r  )r$   r%   rn  r  r  s        r&   rq  ,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  rD  )rn  r_  r  r   r  r  r   r   rW   rG  r  r   r   r  r>   )r$   r%   rn  r   r  r  r  s          r&   visit_GeneralCallNode-TransformBuiltinMethods.visit_GeneralCallNodeg  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  )rA   rB   rC   rD   rE   rM   r   r  ra  r  r  r  r  r  r  r  r  r  r1  r]  rq  r  rF   r}   r~   s   @r&   r  r  ;  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)rL   rM   rT  Optimizer  r#  )r$   rT  r  rR   s      r&   rM   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>   r#  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-  rG  rT  r.  r   r`  rW   specialize_typer  same_asrY   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)rI  rT  rH  KeyErrorr   )r$   r  rW   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!   rJ  r#   s     r&   rK  !ReplaceFusedTypeChecks.visit_Node  r  r*   )rT  r#  )rA   rB   rC   rD   rE   rM   r  r,  r  r  rK  rF   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 rK   )rL   rM   rV  visitedrQ   gdb_debug_outputwritertbc_filec_output_filenested_funcdefsregister_stepinto)r$   rQ   optionsr   rR   s       r&   rM   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  rq  rW   r  r  startr>   r  r1  r   serialize_modulenode_as_functionendr  r  r  rG  r  r   r  r  ru  r  serialize_local_variables)r$   r%   r   nested_funcdefr  rC  rD  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_cnamerG  linenoFunctionr   Locals	ArgumentsStepIntoFunctionsT)r  r}  rT  rG  r  r  r  r   r(  r[  
func_cnamepyfunc_cnamerq  r   r  rW   r  r$  r'  r  r&  arg_entriesr>   )r$   r%   r+  r\  r   r   s         r&   r1   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   StepIntoFunctionr.  )r  r  ru  r  r[  r2  rq  r  r$  r&  r>   r$   r%   r   s      r&   ra  DebugTransform.visit_NameNodeK  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\  r+  rG  r,  is_initmodule_functionN)!_serialize_modulenode_as_functionrq  r#  
rpartitionmodule_init_func_cnamer#   s     r&   r%  /DebugTransform.serialize_modulenode_as_function]  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 )Nr-  r.  r/  r0  r1  TF)r  r$  r'  r  r  r&  r  r>   r9  s      r&   r?  0DebugTransform._serialize_modulenode_as_functionn  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\  rG  r  r,  LocalVar)rX  r\  r  r  r  r   cur_scope_cnameouter_entryr  re  rG  r   r]  rW   r  rq  r  r$  r&  )r$   r  r[  vartyper\  qnamer,  r   s           r&   r'  (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  )rA   rB   rC   rD   rE   rM   r\   r1  ra  r%  r?  r'  rF   r}   r~   s   @r&   r  r    s2    ' &P/b$" $+$ +$r*   r  r"   )Mr=  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   rH   r   r   r   r   r   r5  r   r   r   r  r  r  r   r  r  r  r  r  r  r.  r:  rg  r  r  r  r  r  r  r  r!  r?  rd  r{  r  r   r  r  r$  r9  rt  r  r  r  r"   r*   r&   <module>rP     sk     "& " "6 " "")/"9?" "/5"EK" " &," 39" CI" OU" !	"   
         2 J J * & ) ? ? BIO IX )\ ( ^ E Q J,& J,Z!K !<V!; V!r,8\"D	 H# H#d H# H#V $@ $@4 $@SW $@cg $@ $@N6?$4 6r6+-= 6*y	%/ y	%xl'_.> l'^C6$&6 C6L/+7G /2`6 02B `6Fz$/1A z$z,(0@ ,(^6/ 6rO	< O	d$}| }@]
/ ]
@% %>:\ :zkO-= k\3 3l)? )X5O 5p< <~Z ZzQ+? Q+h36(*: 36lA% A%H"\#3 "J@l @F
\- \~N$_ N$r*   