
    h|                       S SK r \ R                  " \\\\\\\\\\\\\\\S9  S SKr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Jr  \\4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%  S r&\RN                  \RP                  44S jr)S r*S r+S r, " S S\RZ                  5      r.S r/S r0 " S S\Rb                  5      r2 " S  S!\Rb                  5      r3 " S" S#\Rh                  \"5      r5 " S$ S%\Rh                  5      r6 " S& S'\Rb                  5      r7 " S( S)\Rp                  \Rb                  5      r9 " S* S+\Rp                  \Rt                  5      r;S, r<\Rz                  " S-S.5      r>\Rz                  " S/S.5      r? " S0 S1\Rh                  \"5      r@ " S2 S3\Rb                  \Rp                  5      rA " S4 S5\R                  5      rCg)6    N)UtilityCodeEncodedStringbytes_literalencoded_stringNodes	ExprNodes
PyrexTypesBuiltin	UtilNodes_py_int_typesrecopycodecs	itertools
attrgetter)r      )	TypeSlots)UnicodeNodenot_a_constant)r   )r   )r	   )Visitor)r
   )r   )Options)r   TempitaUtilityCode)r   r   r   )errorwarning)SkipDeclarations   )Utils)reducec                 0    [         R                  " U S5      $ )N
Optimize.c)r   load_cached)names    R/var/www/fran/franai/venv/lib/python3.13/site-packages/Cython/Compiler/Optimize.pyload_c_utilityr$   %   s    ""466    c                 >    [        X5      (       a  U R                  $ U $ N)
isinstancearg)nodecoercion_nodess     r#   unwrap_coerced_noder,   )   s    $''xxKr%   c                     [        U [        R                  5      (       a-  U R                  n [        U [        R                  5      (       a  M-  U $ r'   )r(   r   ResultRefNode
expressionr*   s    r#   unwrap_noder1   /   s8    
T922
3
3 T922
3
3Kr%   c                 
   [        U 5      n [        U5      n[        U [        R                  5      (       a8  [        U[        R                  5      (       a  U R                  UR                  :H  $ [        U [        R
                  5      (       aw  [        U[        R
                  5      (       aX  U R                  (       + =(       a@    [        U R                  UR                  5      =(       a    U R                  UR                  :H  $ gNF)
r1   r(   r   NameNoder"   AttributeNode
is_py_attris_common_valueobj	attribute)abs     r#   r7   r7   5   s    AAAA!Y''((Z9;M;M-N-Nvv!Y,,--*Q	@W@W2X2X<<`OAEE155$A`akkUVU`U`F``r%   c                 (    U b  U R                   c  g U $ r'   )constant_resultr0   s    r#   filter_none_noder>   ?   s    D008Kr%   c                   h    \ rS rSrSrS r\R                  R                  r	S r
S rS rS rS rS	rg
)_YieldNodeCollectorE   z1
YieldExprNode finder for generator expressions.
c                 ^    [         R                  R                  U 5        0 U l        / U l        g r'   )r   TreeVisitor__init__yield_stat_nodesyield_nodes)selfs    r#   rD   _YieldNodeCollector.__init__I   s&    $$T* "r%   c                 \    U R                   R                  U5        U R                  U5        g r'   )rF   appendvisitchildrenrG   r*   s     r#   visit_YieldExprNode'_YieldNodeCollector.visit_YieldExprNodeP   s$    %4 r%   c                     U R                  U5        UR                  U R                  ;   a  XR                  UR                  '   g g r'   )rK   exprrF   rE   rL   s     r#   visit_ExprStatNode&_YieldNodeCollector.visit_ExprStatNodeT   s9    4 99(((/3!!$)), )r%   c                     g r'    rL   s     r#   visit_GeneratorExpressionNode1_YieldNodeCollector.visit_GeneratorExpressionNode[       r%   c                     g r'   rT   rL   s     r#   visit_LambdaNode$_YieldNodeCollector.visit_LambdaNode^   rW   r%   c                     g r'   rT   rL   s     r#   visit_FuncDefNode%_YieldNodeCollector.visit_FuncDefNodea   rW   r%   )rF   rE   N)__name__
__module____qualname____firstlineno____doc__rD   r   rC   rK   
visit_NoderM   rQ   rU   rY   r\   __static_attributes__rT   r%   r#   r@   r@   E   s8    
 $$22J!4r%   r@   c                 B    [        U 5      n[        U5      S:w  a  gUS   $ )Nr   )NNr   )_find_yield_statementslen)r*   yield_statementss     r#   _find_single_yield_expressionri   e   s)    -d3
!Ar%   c                     [        5       nUR                  U 5         UR                   Vs/ s H  nUR                  UR                  U   4PM      nnU$ s  snf ! [
         a    / n U$ f = fr'   )r@   rK   rF   r)   rE   KeyError)r*   	collector
yield_noderh   s       r#   rf   rf   l   s    #%ID! (33
3
 ^^Y77
CD3 	 
 
  s"   A %AA A A)(A)c                      \ rS rSrSrS rS rS#S jrS rS#S jr	\
R                  " \
R                  \
R                  " S\R                  S	5      /S
S9r\
R                  " \
R"                  \
R                  " S\R                  S	5      /SS9rS#S jr\
R                  " \
R(                  \
R                  " S\
R*                  S	5      \
R                  " S\
R,                  S	5      \
R                  " S\
R"                  S	5      /5      r\
R                  " \
R*                  \
R                  " S\
R0                  S	5      \
R                  " S\
R2                  S	5      \
R                  " S\
R4                  S	5      \
R                  " S\
R6                  S	5      /SS9rS#S jrS#S jrS rS r S#S jr!S r"S r#\
R                  " \
R0                  \
R                  " S\
R0                  S	5      \
R                  " S\
R*                  S	5      \
R                  " S\
R0                  S	5      \
R                  " S\
R2                  S	5      \
R                  " S\
R6                  S	5      /5      r$\
R                  " \
R0                  \
R                  " S\
R0                  S	5      \
R                  " S\
R*                  S	5      \
R                  " S\
R2                  S	5      \
R                  " S \
R6                  S	5      /5      r%S! r&S"r'g	)$IterationTransformz   zTransform some common for-in loop patterns into efficient C loops:

- for-in-dict loop becomes a while loop calling PyDict_Next()
- for-in-enumerate is replaced by an external counter variable
- for-in-range loop becomes a plain C for loop
c                    UR                  5       (       Ga;  UR                  n[        R                  " U5      nUR                  R
                  (       a+  UR                  R                  R                  R                  nO UR                  R                  R                  n[        R                  " U5      nUR                  U5      n[        R                  " USUR                  US9n[        R                  " U[        R                   " X#[        R"                  " USS9S9[        R$                  " U5      /S9n[        R&                  " U[        R(                  " X'US9/S S9n	[        R*                  " UU/[        R,                  " UU[        R.                  " UR                  R                  UR                  S	9U	[        R                   " X#[        R"                  " US
S9S9S9S9n
U
R1                  U R3                  5       5      n
U R5                  U
5      n
[        R6                  " X:5      nUR8                  S:X  a  [        R:                  " X+S9nU$ U R=                  U5        U$ )N==)operatoroperand1operand2r   valuelhsrhsstats	conditionbody)
if_clauseselse_clause)sequencer   )targetiteratorr   r   tempsr   not_inoperand)is_ptr_containsposr   r.   ru   is_subscriptbasetype	base_type
TempHandlerefr   PrimaryCmpNodert   r   StatListNodeSingleAssignmentNodeBoolNodeBreakStatNode
IfStatNodeIfClauseNodeTempsBlockNodeForInStatNodeIteratorNodeanalyse_expressionscurrent_envvisitTempResultFromStatNoders   NotNoderK   )rG   r*   r   
result_refr   target_handler   cmp_nodeif_bodyif_nodefor_loopnew_nodes               r#   visit_PrimaryCmpNode'IterationTransform.visit_PrimaryCmpNode   s   !! ((C"006J}})) MM..33==	 MM..88	%00;M"&&s+F //dT]]VMH((33CYM_M_`cklMmn,,S134G &&!..sWUV "G !//&**!&33DMM4E4EPTP]P]^  % : :3T]TfTfgjrsTt uwxH  33D4D4D4FGHzz(+H 77
MH}}($,,SCO t$Kr%   c                 n    U R                  U5        U R                  XR                  R                  5      $ r'   )rK   _optimise_for_loopr   r   rL   s     r#   visit_ForInStatNode&IterationTransform.visit_ForInStatNode   s+    4 &&t]]-C-CDDr%   c                 $   S nUR                   (       d  UR                  (       ai  UR                  (       aX  UR                  R                  (       a=  UR                  R                  R                  nUR
                  (       a  UR                  n[        R                  UR                  U4;   a  U(       a  U$ U R                  XS SSS9$ [        R                  UR                  U4;   d   [        R                  UR                  U4;   a  U(       a  U$ U R                  X5      $ UR                  R                  (       d  UR                  R                  (       a  U R!                  XUS9$ UR                  [        R"                  L a  U R%                  XUS9$ UR                  [        R&                  L a  U R)                  XUS9$ UR                  [        R*                  L a  U R-                  XSUS9$ [/        U[0        R2                  5      (       a@  UR4                  R                  R6                  (       a  U R-                  XR4                  SUS9$ [/        U[0        R8                  5      (       d  U$ UR:                  c<  UR<                  =(       a    [?        UR<                  R:                  5      =(       d    SnO.[?        UR:                  5      nU(       a  UR@                  b  US-  nURB                  nUR                  (       GaO  U(       GdG  U(       Gd?  UR@                  =(       d    URD                  nURF                  n	U RI                  5       RJ                  RL                  S:  n
U
(       d  U	S	;   az  [/        U[0        RN                  5      (       a[  URB                  nUR                   (       a>  URP                  S
:X  a.  UR                  (       a  UR                  RR                  (       a  Sn
S=pU	S:X  d  U
(       a	  U	S:X  a  SnO,U	S:X  d  U
(       a	  U	S:X  a  SnOU	S:X  d  U
(       a	  U	S:X  a  S=pU(       d  U(       a  U R                  XXU5      $ UR@                  c  UR                   (       a  UR                  (       ao  UR                  RR                  (       aT  URP                  S:X  a  U(       a  U$ U RU                  X5      $ URP                  S:X  a  U(       a  U$ U RW                  X5      $ [X        RZ                  (       Ga  SUs=::  a  S::  Gay  O  U$ UR@                  Gcg  UR                   (       GaU  URP                  S;   GaD  UR                  (       Ga2  UR                  RR                  (       Ga  UR\                  R                  R^                  (       d%  UR\                  R                  R`                  (       a  U Rc                  XUS9$ UR\                  R                  Rd                  (       a  UR:                  c  UR<                  R:                  OUR:                   HT  n[/        U[0        Rf                  5      (       a1  URi                  5       (       a  SURj                  s=::  a  S:  a  O  OMS    U$    U Rc                  XUS9$ U$ )NTF)dict_objmethodkeysvaluesreversed)
is_mutabler   r   r      )r   r   itemsdictiterkeysr   
itervaluesr   	iteritemsr   	enumerater   )rangexrange      @)6is_nameis_attributeentry
annotationrP   r   r   r
   	dict_typer   _transform_dict_iterationset_typefrozenset_type_transform_set_iterationis_ptris_array_transform_carray_iteration
bytes_type_transform_bytes_iterationunicode_type_transform_unicode_iterationbytearray_type_transform_indexable_iterationr(   r   CoerceToPyTypeNoder)   is_memoryviewsliceSimpleCallNodeargs	arg_tuplerg   rG   functionr8   r9   global_scopecontextlanguage_levelCallNoder"   
is_builtin_transform_enumerate_iteration_transform_reversed_iterationr   convert_ranger   is_intis_enum_transform_range_iterationis_pyobjectIntNodehas_constant_resultr=   )rG   r*   iterabler   annotation_typer   	arg_countr   base_objr   is_safe_iterinner_functionr   r   r)   s                  r#   r   %IterationTransform._optimise_for_loop   s    5 58>>hnnNgNg!2277J&&'__
 @@114 2 O O  @@&&8==/*JJ00@@ ==8==#9#933DX3VV==G...224H2UU==G00044Th4WW ==G22266tRVai6jjh	 < <==(,,BSBSBfBf66t\\V[fn6oo (I$<$<==K==  **Ks83E3E3J3J/KPqIHMM*IX]]6Q	$$   )}}4H''F,,.66EEJLF.I$Ih	(:(:;;%-%6%6N&..>3F3F&3P . 4 4 . 4 4 ? ?'+!!D#69I<'LVx=O;&<Fg<M $$v55F&: : == X%5%5~~(..";";}}+K::4JJ*,K99$II    Q)%8q%8   %   X]]6I%I8>>#<#<#<{{&&$++*:*:*B*B66tPX6YY{{++7?}}7LH..33RZR_R__C!#y'8'89922443CVCV9^Y^9^$  `  ::4T\:]]r%   c                    UR                   R                  n[        U5      S:X  a  [        UR                  S5        U$ [        U5      S:  a  [        UR                  S5        U$ US   nUR
                  [        R                  [        R                  4;   a3  UR                  S5      UR                  l        SUR                  l        U$ U R                  XSS9$ )Nr   z(reversed() requires an iterable argumentr   z#reversed() takes exactly 1 argument!'NoneType' object is not iterableTr   )r   r   rg   r   r   r   r
   
tuple_type	list_typeas_none_safe_noder   r   r   r   )rG   r*   reversed_functionr   r)   s        r#   r   0IterationTransform._transform_reversed_iteration$  s     **//t9>#''<>KY]#''79K1g 88**G,=,=>>%(%:%:;^%_DMM"%)DMM"K&&t4&@@r%   c                 .  ^^ [         R                  " UR                  S5      SSS9m[        R                  " TR
                  SS[        R                  S9nUU4S jn[         R                  " U" 5       [        R                  SS	9nUnU(       a  S
u  pXpOSu  p[         R                  " TR
                  [        R                  S9n[        R                  " UR
                  TUS9n[        R                  " TR                  R
                  TR                  US9nU R                  5       n[        R                  " UR                  SSS9n[        R                   " UR
                  UUS9n[        R"                  " TR
                  U/S9nU(       a@  [        R                  " TR
                  UU" 5       S9nUR$                  R'                  U5        [        R(                  " TR
                  XYUXSUTR*                  SS9
n[         R,                  " T[         R,                  " U[        R.                  " TR
                  [         R0                  " UU5      S95      5      R3                  U5      nUR$                  R5                  STR6                  5        U$ )zWIn principle can handle any iterable that Cython has a len() for and knows how to index'NoneType' is not iterableFT)may_hold_noneis_temp0r   rw   r=   r   c                     > [         R                  " TR                  S[        R                  R                  S5      S9n [         R                  " TR                  U T/S9$ )Nrg   )r"   r   r   r   )r   r4   r   r
   builtin_scopelookupr   )builtin_lenr*   unpack_temp_nodes    r#   make_length_callKIterationTransform._transform_indexable_iteration.<locals>.make_length_callA  sS    #,,TXXE3:3H3H3O3OPU3VXK++DHH-8*:);& &r%   )r   r   >>=<=<r   r   )r   indexr   ry   rz   )boundscheck
wraparound)
directivesr   r{   rx   N	bound1	relation1r   	relation2bound2stepr   r   
from_rangerP   r   )r   
LetRefNoder   r   r   r   r	   c_py_ssize_t_type	IndexNoder   r   r   r   r   copy_inherited_directivesr  CompilerDirectivesNoder   r|   rJ   ForFromStatNoder   LetNodeExprStatNoder   r   insertr   )rG   r*   
slice_noder   r   
start_noder  length_tempend_noder  r  counter_reftarget_valuetarget_assignenvnew_directivesr   loop_length_reassign	loop_noderetr   s    `                  @r#   r   1IterationTransform._transform_indexable_iteration8  sD   $//(()EF
 &&HHC9U9UW
	&  **+;+=JD`D`jno#, I#+#, I**txxj>Z>Z[ **:>>@P1<> 22++//++    ::3>>W\ino44%
 !!HH"O% 
 $)#=#=dhh>I>N>P$R  JJ23))HHD((	 $%%# **488!*!A!A$/$-" &%c* 	 	

!TYY'
r%   sNNULLexception_valuec                    UR                   R                  nUR                  (       d  U[        R                  La  U$ [
        R                  " UR                  S5      5      n[        R                  " UR                  SU R                  U/SS9n[        R                  " UR                  SU R                  U/SS9n[
        R                  " UU R                  U[        R                  " UR                  US S UUR                  SS9US95      $ )Nr   __Pyx_PyBytes_AsWritableStringr   r   r   __Pyx_PyBytes_GET_SIZE)r   startr  stopr   r   r   )r   r   r   r
   r   r   r  r   r   PythonCapiCallNoder   PyBytes_AS_STRING_func_typePyBytes_GET_SIZE_func_typer  r   SliceIndexNode)rG   r*   r   r   target_typer   slice_base_nodelen_nodes           r#   r   -IterationTransform._transform_bytes_iteration  s   kk&&!!k9K9K&K K$//(()EFH $66NN<,,$%	 //NN4++$%	   ,,((NN* #*// $ - %& 	&r%   kinddatar
  lengthc                 
   UR                   (       Ga	   [        UR                  R                  S5      S5      n[        R
                  " UR                  [        R                  " UR                  UU[        R                  S9R                  [        R                  U R                  5       5      S [        R                  " UR                  [        [        U5      5      [        U5      [        R                   S9["        R$                  S9nU R'                  XU5      $ [*        R,                  " UR/                  S5      5      n[        R                  " UR                  SS[        R                   S9n[*        R0                  " [        R                   5      nUR3                  UR                  5      n	U(       a  Su  pXpOS	u  p[*        R0                  " [        R4                  5      n[*        R0                  " [        R6                  5      n[*        R0                  " [        R                   5      n[        R8                  " UR                  S
U R:                  UR3                  UR                  5      UR3                  UR                  5      UR3                  UR<                  R                  5      /SS9nUR>                  UR<                  R>                  :w  a4  UR                  UR<                  R>                  U R                  5       5      n[@        RB                  " UR<                  R                  UR<                  US9n[@        RD                  " UR                  UURF                  /S9n[@        RH                  " UR                  XzUR3                  UR<                  R                  5      XS UURJ                  SS9
n[@        RL                  " UR                  [        R8                  " UR                  SU RN                  U[        RP                  " UR                  UR3                  UR                  5      [        RR                  S9[        RP                  " UR                  UR3                  UR                  5      [        RT                  S9[        RP                  " UR                  UR3                  UR                  5      [        RV                  S9/SS[X        RZ                  " SS5      S9S9n[*        R\                  " U[*        R^                  " UR                  XX/[@        RD                  " UR                  UU/S9S95      $ ! [(         a     GN4f = f)Nlatin1z	iso8859-1r   )r   r6  r7  r   r   r   r   r  r  __Pyx_PyUnicode_READFr4  r  r{   Tr  __Pyx_init_unicode_iterationr   r   unicode_iterr    )r   r   result_is_usedutility_coder  r   )0
is_literalr   rw   encoder   r;  r   	BytesNoder	   c_const_char_ptr_type	coerce_toc_const_uchar_ptr_typer   r   strrg   r  r
   r   r   UnicodeEncodeErrorr   r  r   r   r   
c_int_typec_void_ptr_typer8  PyUnicode_READ_func_typer   r   r   r   r   r   r  r   r   init_unicode_iteration_func_typeAmpersandNodec_py_ssize_t_ptr_typec_void_ptr_ptr_typec_int_ptr_typer   r!   r  r   )rG   r*   r   r   bytes_valuebytes_slicer   r!  r"  r#  r  r  	kind_temp	data_tempcounter_tempr%  r&  r   r*  
setup_nodes                       r#   r   /IterationTransform._transform_unicode_iteration  s4      U+J,<,<,C,CH,M{[ (66NN",,"k(3'==? @Iy&==t?O?O?Q@S"**"c#k2B.C(+K(8'99; !-- 778TT$//(()EFH &&HHC9U9UW
**:+G+GH??488,#, I#+#, I(()>)>?	(()C)CD	 ++J,H,HI 33NN2))MM*..1MM*..1 $$T[[__57   0 00'11$++2B2B262B2B2DFL22++//++  !!HH"DII.0 ))HH##DKKOO4D((	 ''HH// >55(!//
XbXfXfHg5?5U5UW!//
	V`VdVdHe5?5S5SU!//
	V`VdVdHe5?5N5NP !&(44^\R
"   $$I Q''Y8OPRS 	Sc & s   %U 
UUc                    Sn[        U[        R                  5      (       at  UR                  n[	        UR
                  5      n[	        UR                  5      nS nU(       d3  UR                  R                  (       d  [        UR                  S5        U$ GOuUR                  (       Ga  [        UR                  [        R                  5      (       d   eUR                  nUR                  n	[	        U	R
                  5      n[	        U	R                  5      n[	        U	R                  5      nU(       a  [        UR                  [         5      (       a>  UR                  S:X  d.  UR                  S:  a  U(       a  UR                  S:  a:  U(       d3  UR                  R                  (       d  [        UR                  S5        U$ UR                  n
U(       a  U
* n
U
S:  n[        R"                  " UR                  [$        R&                  [)        [+        U
5      5      [+        U
5      S9nOUR                  R,                  (       a  UR                  R.                  c  [        UR                  S5        U$ UnS n[        R"                  " UR                  [)        UR                  R.                  5      [$        R&                  UR                  R.                  S9nS nO3UR                  R                  (       d  [        UR                  S5        U$ U(       a.  UR1                  [$        R&                  U R3                  5       5      nU(       a.  UR1                  [$        R&                  U R3                  5       5      nUcO  U(       a0  [        R"                  " UR                  S[$        R&                  SS9nO[        UR                  S5        U$ U(       a8  U(       d/  [        R"                  " UR                  S	S[$        R&                  S
9nXvpvUR                  nUR,                  (       a  UR5                  5       nUR7                  U R3                  5       5      nU(       a3  UR                  S:w  a#  [        R8                  " UR                  USUUS9nOUnU(       ad  UR                  S:w  aT  [        R8                  " UR                  [        R:                  " U5      SUUS9R7                  U R3                  5       5      nO[        R:                  " U5      n[<        R>                  " U5      nURA                  URB                  R                  5      nUR                  RD                  (       Gax  URB                  R                  R                  (       GaR  UR                  [F        RH                  L a  [        RJ                  " [        RL                  " URB                  R                  UURN                  S9[$        RP                  5      R1                  URB                  R                  U R3                  5       5      nGOr[        R                  " URB                  R                  [        R"                  " URB                  R                  S	S[$        RR                  S
9[        R"                  " URB                  R                  SS[$        RR                  S
9U[F        RT                  SS9nOURB                  R                  RV                  (       a7  URB                  R                  RY                  URN                  5      (       d  UnOl[        RZ                  " URB                  R                  [        R"                  " URB                  R                  S	S[$        RR                  S
9UURN                  S9nUR                  URB                  R                  :w  a4  UR1                  URB                  R                  U R3                  5       5      n[\        R^                  " URB                  R                  URB                  US9n[\        R`                  " UR                  UURb                  /S9nU Re                  XC5      u  nn[\        Rf                  " UR                  UUUUUUUURh                  SS9
n[<        Rj                  " UR                  U/US9$ )NFz*C array iteration requires known end indexr   z8C array iteration requires known step size and end indexr   rw   r=   rw   r   r=   -1r1  r   r   +rt   rs   ru   r   rG  1r   )r6  r7  r   r   r   )r
  r   r   r  r{   Tr  r   )6r(   r   r;  r   r>   r6  r7  r   r   r   r   r   r
  	SliceNoder  r=   intr   r	   r  rQ  absr   sizerO  r   element_ptr_typecoerce_to_simpleAddNode	CloneNoder   r   r   r   	is_stringr
   r   CastNodeDereferenceNoder   c_py_ucs4_typerS  r   r   assignable_fromr  r   r   r   r   _find_for_from_node_relationsr  r   r   )rG   r*   r   r   neg_step
slice_baser6  r7  r  r
  
step_valueptr_type
carray_ptrstart_ptr_nodestop_ptr_nodecounterr_  r%  r&  r   r  r  for_nodes                          r#   r   .IterationTransform._transform_carray_iteration,  s   j)":":;;#J$Z%5%56E#JOO4DD!22*..*VW 
 $$$j..	0C0CDDDD#J$$E$U[[1E#EJJ/D#EJJ/D!$"6"6<<..!3..24..25%??66dhh(bcK "&!5!5J&0[
)A~H$,,TXXJ<X<X36s:3G=@_ND __%%##+jnn&RS#JE$$c*//*>*>&?11:??CWCWYD D ??..jnn&RSKOOJ$@$@$BRBRBTUE>>*">">@P@P@RSD< ((NN$Z5Q5Qceg jnn&`a!))*..VW/9/K/KM 4??002H001A1A1CD
U**a/&..		#N (ND((A-%--",,Z8 #"4#3#3#56  &//
;M&&x0{{4;;??3??$$$)9)9)E)E)E'"6"66(11--%//1 --	 / 09y(($*:*:*<0>	   )77KKOO#++DKKOO3<=1;1F1FH #**4;;??#;<0:0E0EG & ++
  [[$$T[[-=-=-M-MhN`N`-a-a'L %..''s89-7-B-BD "'')L  0 00'11$++2B2B262B2B2DFL 22++//++ 
 !!HH"DII.0  $AA(U	9((HH!YD(( ''HHWI 	r%   c                    UR                   R                  n[        U5      S:X  a  [        UR                  S5        U$ [        U5      S:  a  [        UR                  S5        U$ UR
                  R                  (       d  U$ UR
                  R                  n[        U5      S:w  a  U$ Uu  pVUR                  nUR                  (       d  UR                  (       d  U$ [        U5      S:X  a,  [        US   5      R                  XpR                  5       5      nO![        R                  " UR                  SUSS9n[        R                   " U5      n	[        R"                  " UR                  U	[        R                  " UR                  SUSS9S	UUR                  S
9n
[$        R&                  " UR                  UU	S9[$        R&                  " UR                  U	U
S9/n[)        UR*                  [$        R,                  5      (       a(  XR*                  R.                  -   UR*                  l        OIUR1                  UR*                  5        [$        R,                  " UR*                  R                  US9Ul        Xal        UR2                  R                  UR                  U R                  5       5      Ul        US   UR4                  l        [        R8                  " XR;                  XR4                  R6                  5      5      $ )Nr   z)enumerate() requires an iterable argumentr   z%enumerate() takes at most 2 argumentsr   r   rd  rh  rf  )rt   ru   rs   r   r   r  r{   )r   r   rg   r   r   r   is_sequence_constructorr   r   r   r,   rO  r   r   r   r   r  ro  r   r   r(   r   r   r|   rJ   itemr   r   r  r   )rG   r*   enumerate_functionr   targetsenumerate_targetiterable_targetcounter_typer6  tempinc_expression	loop_bodys               r#   r   1IterationTransform._transform_enumerate_iteration  sm   !++00t9>$((=?KY]$((9;K{{22K++""w<1K,3)',,''0C0CKt9>'Q0::<IYIYI[\E%%&8&<&<,/+7679E ##E*"**"" ((.:9:< "..
 &&&**& &&&**$&		 dii!3!344'))//9DIIOTYY'**		!#DI &II''(<(<d>N>N>PQ	!%a   '>'>t]]E[E['\]]r%   c                 4    U(       a	  U(       a  ggU(       a  gg)N)r  r  r  )r  r  r  rT   )rG   neg_step_valuer   s      r#   rv  0IterationTransform._find_for_from_node_relations  s        r%   c                    UR                   R                  n[        U5      S:  a%  UR                  nSn[        R
                  " USSS9nOeUS   nUR                  n[        UR                  [        5      (       d  U$ UR                  nUS:X  a  U$ [        R
                  " U[        U5      US9n[        U5      S:X  aC  [        R
                  " UR                  SSS9nUS   R                  U R                  5       5      n	ODUS   R                  U R                  5       5      nUS   R                  U R                  5       5      n	U R                  US:  U5      u  pS nU(       Ga)  Xp[        U5      nUS:w  Ga  [        UR                  [        5      (       a  [        U	R                  [        5      (       a  US:  a+  U	R                  nUR                  nXX-
  S-
  U-  -  -
  S-
  nO*UR                  nU	R                  nXX-
  S-
  U-  -  -   S-   n[        R
                  " UR                  [        U5      U[        R                  " UR                   U	R                   5      S9nO(["        R$                  " U	5      nU R'                  XXv5      nUS:  a  U* n[        U5      Ul        Xgl        UR                  U R                  5       5      nU	R*                  (       d"  S	nU=(       d    ["        R$                  " U	5      n	OS
n[,        R.                  " UR                  UR0                  XXXqR2                  UR4                  S	S9
nUR7                  U R                  5       5        U(       a  ["        R8                  " U	U5      nU$ )Nr   r   rh  rw   r=   r   r   r   r   TF)	r   r  r  r  r  r  r   r   r  )r   r   rg   r   r   r   r(   r=   rj  rQ  coerce_to_indexr   rv  rk  r	   spanning_typer   r   r  _build_range_step_calculationrw   rK  r   r  r   r   r   set_up_loopr  )rG   r*   range_functionr   r   step_posry  r  r  r  r  r  bound2_ref_nodeabs_stepbegin_value	end_valuebound1_valuebound2_is_tempr  s                      r#   r   -IterationTransform._transform_range_iteration%  s!   '',,t9q=%))HJ$$XS!LD7DxxHd22C88--JQ$$XS_5?AD t9>&&~'9'978:F!W,,T-=-=-?@F!W,,T-=-=-?@F!W,,T-=-=-?@F#AA*q.RZ[	#F:H1}v55s;;"6#9#93??!A~&,&<&<$*$:$:	'2+BY\]B]bjAj5k'kno'o&,&<&<$*$:$:	'0@WZ[@[`h?h3i'ilm'm&..

#l*;\'55fkk6;;OQF
 '0&:&:6&BO!??CF >$J_
)##D$4$4$67  !N$D	(<(<V(DF"N((HH;;II(( 	T--/0 ((:Hr%   c                    [        U5      n[        R                  " UR                  UR                  5      nUR                  R                  (       a,  US:  a&  [        R                  " U[        R
                  5      nO [        R                  " XcR                  5      nUS:  a  UnUn	Sn
OUnUn	Sn
[        R                  " UR                  [        R                  " UR                  UU
[        R                  " UR                  [        R                  " UR                  [        U5      UUS9S[        R                  " UR                  [        R                  " UR                  [        R                  " UR                  USU	US9S[        R                  " UR                  SS	S
9US9S[        R                  " UR                  [        U5      UUS9US9US9US9U
[        R                  " UR                  SS	S
9US9nU$ )Ni  r   -rf  r   *rg  rh  r   r  z//)rk  r	   r  r   r   rS  r   
binop_noder   MulNoder   rQ  DivNodeSubNode)rG   r  r  r  ry  r  r  spanning_step_typer  r  final_opstep_calculation_nodes               r#   r  0IterationTransform._build_range_step_calculationx  s   z?"00o>R>RS996 1!+!9!9-I^I^!_!+!9!9-!S>)KIH K'IH ) 4 4JJ))

(!"**JJ&..

!(m(0/	1
 !&..

!*!2!2"JJ%.%6%6 &

)4),)2%2&4 &)%.%6%6 &

&)01&3 "4"5 "&!*!2!2"JJ"%h-,4!3	"5
 0-1. ,?-@ (I$)J &&

 !# Y,! Z %$r%   c                 	  ^ / n[         R                  " [        R                  5      nUR	                  U5        UR                  UR                  5      n[         R                  " [        R                  5      nUR	                  U5        UR                  TR                  5      n	S =n
=pU(       am  U(       af  TR                  R                  (       a>  [        TR                  R                  5      S:X  a  TR                  R                  u  pO/T$ TR                  nO U(       a  TR                  n
OTR                  n[        TR                  [        R                  5      (       a  TR                  nO4[        R                  " TR                  R                  TR                  /S9n[         R                  " [        R                  5      nUR	                  U5        [         R"                  " TR                  UR                  UR                  5      [        R$                  " UR&                  5      S9n[         R                  " [        R(                  5      nUR	                  U5        UR                  TR                  5      n[         R"                  " TR                  U[        R$                  " UR&                  5      S9n[        R*                  " XR                  UR                  5      U	XUU5      nUR-                  U R/                  5       5      nU/UR0                  SS& U(       aR  [         R2                  " UR                  US9nUR5                  SR7                  [        U5      S::  a  SOS	5      S
U/S9nO1[         R8                  " UR                  5      nUR5                  S5      nU4S jn[        R:                  " TR                  U	[         R<                  " TR                  SSS9S9[        R:                  " UR                  U[         R>                  " UR                  SU R@                  [B        RD                  " SS5      UU" UR&                  [F        RH                  L 5      UUU/SS9S9[        RJ                  " TR                  S UTRL                  S9/n[         RN                  " TR                  U[        R                  " TR                  US9S9$ )Nr   r   r|   rG  r   rv   )'NoneType' object has no attribute '%{}s'   .30 PyExc_AttributeErrorr   format_argsr   c                 ~   > U =(       a    S=(       d    Sn [         R                  " TR                  [        U 5      U S9$ Nr   r   r  r   r   r   rQ  rw   r*   s    r#   	flag_node?IterationTransform._transform_dict_iteration.<locals>.flag_node  /    Ka$1E$$TXXSZQVWWr%   r   r  rx   __Pyx_dict_iterator	dict_iterr    TrJ  r   r   r~   r   r   r{   r   )(r   r   r	   py_object_typerJ   r   r   r  r   r  rg   r   r(   r   r   r   r   rW  
c_ptr_typer   rS  DictIterationNextNoder   r   r|   IdentifierStringNoder   formatNullNoder   r   r8  PyDict_Iterator_func_typer   r!   r
   r   WhileStatNoder   r   )rG   r*   r   r   r   r   r   r  	dict_temppos_temp
key_targetvalue_targettuple_targetr   dict_len_tempdict_len_temp_addris_dict_tempis_dict_temp_addriter_next_nodemethod_noder  result_codes    `                    r#   r   ,IterationTransform._transform_dict_iteration  s   ##J$=$=>THHX\\*	##J$@$@AT88DHH%377
7\F{{22t{{''(A-/3{{/?/?,J  K#{{J;;Ldii!3!34499D%%DIIMM/3yyk;D ",,Z-I-IJ]#&44HHm//=&&}'9'9:< ##J$9$9:Txx)%33HHl&&tyy13 44((6l (;;D<L<L<NO)*

1Q#88VTK11;BBCPVK[]L]5cef.%h 2 (H
 $,,X\\:K112UVH	X
 &&''89;<
 &&22LL)22#.#:#:;#U$iARAR0R&S');=N !	  "..	'6 ''HHE### 	r%   r   is_dictmethod_namep_orig_length	p_is_dictsetis_setp_is_setc                   ^ / n[         R                  " [        R                  5      nUR	                  U5        UR                  UR                  5      n[         R                  " [        R                  5      nUR	                  U5        UR                  TR                  5      n[        TR                  [        R                  5      (       a  TR                  nO4[        R                  " TR                  R                  TR                  /S9n[         R                  " [        R                  5      nUR	                  U5        [        R                  " TR                  UR                  UR                  5      [        R                  " UR                  5      S9n	[         R                  " [        R                   5      nUR	                  U5        UR                  TR                  5      n
[        R                  " TR                  U
[        R                  " UR                  5      S9nTR"                  n[        R$                  " XXR                  UR                  5      XlU
5      nUR'                  U R)                  5       5      nU/UR*                  SS& U4S jn[        R,                  " TR                  U[        R.                  " TR                  SSS9S9[        R,                  " UR                  U[        R0                  " UR                  SU R2                  [4        R6                  " S	S
5      X." UR                  [8        R:                  L 5      X/SS9S9[        R<                  " TR                  S UTR>                  S9/n[         R@                  " TR                  U[        R                  " TR                  US9S9$ )Nr  rG  r   c                 ~   > U =(       a    S=(       d    Sn [         R                  " TR                  [        U 5      U S9$ r  r  r  s    r#   r  >IterationTransform._transform_set_iteration.<locals>.flag_nodeM  r  r%   r   r  rx   __Pyx_set_iteratorset_iterr    Tr  r  r{   r   )!r   r   r	   r  rJ   r   r   r  r(   r   r   r   r   rW  r  r   rS  r   SetIterationNextNoder   r   r|   r   r   r8  PySet_Iterator_func_typer   r!   r
   r   r  r   r   )rG   r*   set_objr   r  set_tempr  r   set_len_tempset_len_temp_addris_set_tempis_set_temp_addrr  r  r  r  s    `              r#   r   +IterationTransform._transform_set_iteration+  s   ##J$=$=>T88GKK(##J$@$@AT88DHH%dii!3!34499D%%DIIMM/3yyk;D !++J,H,HI\"%33HHl..w{{;&&|'8'89; ##J$9$9:Thhtxx($22HHk&&tyy13 {{33&&w{{3X[Z';;D<L<L<NO)*

1Q	X
 &&%%dhhc1MO &&00KK(11!,!8!8\!R!9W\\W=M=M-M#N+ !	  ,,	%4 ''HHE### 	r%   rT   F)(r^   r_   r`   ra   rb   r   r   r   r   r   r	   	CFuncTypec_char_ptr_typeCFuncTypeArgr
   r   r9  r  r:  r   rt  rS  rT  rU  r  rX  rY  rZ  rV  r   r   r   rv  r   r  r   r  r  r   rd   rT   r%   r#   ro   ro   z   s   /bEl\A(Tl #-"6"6""##C););TB%%#'
 ",!5!5$$##C););TB'
 	"%&N  *33!!##FJ,A,A4H##FJ,F,FM##GZ-I-I4P$
  (2';';##C)B)BDI##Hj.N.NPTU##FJ,J,JDQ##FJ,E,EtL	 
 ($ZSxbHG^R
!Qf>%@`D !+ 4 4!!##FZ-F-FM##I
0E0EtL##MJ4M4MtT##Oj6V6VX\]##K*2K2KTR$!  *33!!##EJ,E,EtL##Hz/D/DdK##Oj6V6VX\]##J1J1JDQ	$ Er%   ro   c                       \ 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\R"                  R$                  rSrg)SwitchTransformis  z
This transformation tries to turn long if statements into C switch statements.
The requirement is that every clause be an (or of) var == value, where the var
is common among all clauses and both var and value are ints.
)NNNc                 	    [        U[        R                  [        R                  45      (       a  UR                  nO[        U[        R
                  5      (       a  UR                  R                  nOY[        U[        R                  5      (       a  UR                  nO-[        U[        R                  5      (       a  UR                  nOOM  [        U[        R                  5      (       Ga  UR                  b  U R                  $ UR                  5       (       a  [        UR                  [        R                   [        R"                  45      (       a  UR$                  S:H  nU(       a  U(       d  U R                  $ [        UR                  [        R                   5      (       a+  UR                  R'                  5       (       a  U R                  $ X1R(                  U R+                  UR                  5      4$ UR-                  5       (       Gd  UR$                  S:X  a  SnO&U(       a  UR$                  S:X  a  SnOU R                  $ [/        UR(                  UR(                  5      (       a  UR                  R0                  (       a  X1R(                  UR                  /4$ [3        UR                  SS 5      (       a>  UR                  R4                  R6                  (       a  X1R(                  UR                  /4$ [/        UR                  UR                  5      (       a  UR(                  R0                  (       a  X1R                  UR(                  /4$ [3        UR(                  SS 5      (       a>  UR(                  R4                  R6                  (       a  X1R                  UR(                  /4$ U R                  $ [        U[        R8                  5      (       a  UR$                  S:X  d  U(       a  UR$                  S:X  ay  UR$                  S:H  nU R;                  UR(                  U5      u  pEnU R;                  UR                  U5      u  pxn	Ub)  XG:X  a$  [/        XX5      (       a  U(       a  U(       a  XEXi-   4$ U R                  $ )	NTr   rr   F!=r   orand)r(   r   CoerceToTempNodeCoerceToBooleanNoder)   BoolBinopResultNoder   EvalWithTempExprNodesubexpressionTypecastNoder   r   cascadeNO_MATCHis_c_string_containsru   r   rM  rs   contains_surrogatesrt   extract_in_string_conditionsis_python_comparisonr7   rK  getattrr   is_constBoolBinopNodeextract_conditions)
rG   condallow_not_inr   not_in_1t1c1not_in_2t2c2s
             r#   r  "SwitchTransform.extract_conditions{  s7   $!;!;!*!>!>!@ A AxxD)"?"?@@xx||D)"@"@AA))D)"8"899||  dI4455||'}}$**,,dmmi.C.CYEXEX-YZZ(2,==(dmmY-B-BCC}}88::  ==(}}d.O.OPTP]P].^^^..00==D("F!dmmt&;!F==( #4==$--@@}}//%}}t}}oEE >>!%!4!4!=!=%}}t}}oEE"4==$--@@}}//%}}t}}oEE >>!%!4!4!=!=%}}t}}oEE }} i5566}}$$--5:P $ 6#'#:#:4==,#W b#'#:#:4==,#W b>h&:r?V?V$'RU22}}r%   c           	      H   [        U[        R                  5      (       av  [        [	        [
        [        UR                  5      5      5      nUR                  5         U Vs/ s H,  n[        R                  " UR                  [        U5      US9PM.     sn$ UR                  n[        [        [        U5      5       Vs1 s H	  oTXUS-    iM     sn5      nUR                  5         U Vs/ s H#  n[        R                  " UR                  UUS9PM%     sn$ s  snf s  snf s  snf )Nr  r   )r(   r   r   listmapordr  rw   sortr   r   rQ  r   rg   CharNode)rG   string_literalcharvalscharval
charactersis         r#   r  ,SwitchTransform.extract_in_string_conditions  s   ni&;&;<<CS)=)=%>?@HMMO %-/$, &&~'9'9W7>@$,/ / (--J5Z;QS;Qa1qS 1;QSTJOO %/1$. ''(:(:'8?A$.1 1/ T1s    3D=D(*Dc                    U R                  X#5      u  pEnUc  U R                  $ Ub  [        XQ5      (       d  U R                  $ UR                  R                  (       d  UR                  R
                  (       aV  [        U Vs/ s H:  owR                  R                  =(       d    UR                  R
                  (       + PM<     sn5      (       a  U R                  $ XEU4$ s  snf r'   )r  r  r7   r   r   r   any)rG   
common_varr~   r  r   var
conditionsr  s           r#   extract_common_conditions)SwitchTransform.extract_common_conditions  s    "&"9"9)"RZ;== #OC,L,L== ((//SXX%5%5#ISTii&&;$))*;*;<T;V ;V== J&& Us   ACc                    [        5       nU H  nUR                  5       (       a/  UR                  U;   a    gUR                  UR                  5        MG   UR                  nUR
                  R                  (       d  UR
                  R                  (       a  UR                  b  UR                  nOUR                  n XR;   a    gUR                  U5        M     g! [         a       gf = f)NTF)r  r   r=   addr   r   r   is_cpp_enumenum_int_valuecnameAttributeError)rG   condition_valuesseenrw   value_entryvalue_for_seens         r#   has_duplicate_values$SwitchTransform.has_duplicate_values  s    u%E((**((D0../ "'++K$))11[5E5E5Q5Q + : : F)4)C)C)4):): ")(' &(  &   s   AC1C
C)(C)c           	      .   U R                   R                  S5      (       d  U R                  U5        U$ S n/ nUR                   Hs  nU R	                  X$R
                  S5      u  pRnUc  U R                  U5        Us  $ UR                  [        R                  " UR                  UUR                  S95        Mu     U VVs/ s H  owR                    H  oPM     M     n	nn[        U	5      S:  a  U R                  U5        U$ U R                  U	5      (       a  U R                  U5        U$ U R                  US5        U H  nU R                  US5        M     [        U5      n[        R                  " UR                  UUUR                   S9n
U
$ s  snnf )Noptimize.use_switchFr   r  r   r   r   r   r   testcasesr   )current_directivesgetrK   r   r  r~   rJ   r   SwitchCaseNoder   r   r  rg   r(  r1   SwitchStatNoder   )rG   r*   r  r/  	if_clause_r  caser  r$  switch_nodes              r#   visit_IfStatNode SwitchTransform.visit_IfStatNode  s   &&**+@AAt$K
I(,(F(F//)8%A:!""4(LL--)--9C3<>>C D ) #@"TtDDU 	 @ 1$t$K$$%566t$K 	4/DtV,  !,
**txx0:167;7G7GI '@s    Fc                 n   U R                   R                  S5      (       d  U R                  U5        U$ U R                  S UR                  S5      u  p#nUb%  [        U5      S:  d  U R                  U5      (       a  U R                  U5        U$ U R                  XXBUR                  UR                  5      $ )Nr+  Tr   )
r0  r1  rK   r  r.  rg   r(  build_simple_switch_statementtrue_val	false_valrG   r*   r   r  r  s        r#   visit_CondExprNode"SwitchTransform.visit_CondExprNode  s    &&**+@AAt$K)-)G)G$))T*#&Jz?Q&,,Z88t$K11jMM4>>+ 	+r%   c                    U R                   R                  S5      (       d  U R                  U5        U$ U R                  S US5      u  p#nUb%  [	        U5      S:  d  U R                  U5      (       a2  U R                  U5        UR                  U R                  5       5        U$ U R                  XXB[        R                  " UR                  SSS9[        R                  " UR                  SSS95      $ Nr+  Tr   r  F)r0  r1  rK   r  rg   r(  wrap_operandsr   r;  r   r   r   r>  s        r#   visit_BoolBinopNode#SwitchTransform.visit_BoolBinopNode%  s    &&**+@AAt$K)-)G)G$*&Jz?Q&,,Z88t$t//12K11jtxxtTJtxxueLN 	Nr%   c                    U R                   R                  S5      (       d  U R                  U5        U$ U R                  S US5      u  p#nUb%  [	        U5      S:  d  U R                  U5      (       a  U R                  U5        U$ U R                  XXB[        R                  " UR                  SSS9[        R                  " UR                  SSS95      $ rB  )
r0  r1  rK   r  rg   r(  r;  r   r   r   r>  s        r#   r   $SwitchTransform.visit_PrimaryCmpNode8  s    &&**+@AAt$K)-)G)G$*&Jz?Q&,,Z88t$K11jtxxtTJtxxueLN 	Nr%   c           	      .   [         R                  " U5      n[        R                  " UR                  UUR                  UR                  U R                  5       5      SS9n[        R                  " UR                  UUR                  UR                  U R                  5       5      SS9n	U(       a  Xp[        R                  " UR                  UUS9/n
[        U5      n[        R                  " UR                  UU
U	S9n[         R                  " X{5      nU$ )NTry   rz   firstr,  r-  )r   r.   r   r   r   rO  r   r   r2  r1   r3  r   )rG   r*   r  r  r   r<  r=  r   	true_body
false_bodyr/  r7  replacements                r#   r;  -SwitchTransform.build_simple_switch_statementJ  s    ,,T2
..HH""499d.>.>.@A		
 //HH##DIIt/?/?/AB	
 $.z%%DHH3=-68 9 !,
**2<389CE  66zOr%   c                 @   U R                   R                  S5      (       d  U R                  U5        U$ UR                  nUR                  nU R                  U5        UR                  ULa2  [
        R                  " UR                  U5      (       d  UR                  $ U$ )Nr+  )r0  r1  rK   r  	lazy_tempr   tree_contains)rG   r*   	orig_exprtemp_refs       r#   visit_EvalWithTempExprNode*SwitchTransform.visit_EvalWithTempExprNodeg  s    &&**+@AAt$K &&	>>4 Y.((););XFF)))r%   rT   N)r^   r_   r`   ra   rb   r  r  r  r  r(  r8  r?  rD  r   r;  rT  r   VisitorTransformrecurse_to_childrenrc   rd   rT   r%   r#   r  r  s  sW    
 "H;z1$	'2$L+"N&N$: ))==Jr%   r  c                   J    \ rS rSrSrS r\R                  R                  r	Sr
g)FlattenInListTransformiy  z^
This transformation flattens "x in [val1, ..., valn]" into a sequential list
of comparisons.
c           	        ^^ U R                  T5        TR                  b  T$ TR                  S:X  a  SmSnOTR                  S:X  a  SmSnOT$ [        TR                  [
        R                  [
        R                  [
        R                  45      (       d  T$ TR                  nTR                  R                  n[        U5      S:X  aE  UR                  5       (       a.  TR                  S:H  n[
        R                  " TR                  XUS9$ T$ [        U Vs/ s H  ofR                   PM     sn5      (       a  T$ ["        R$                  " U5      n/ n/ nU H  nUR                  5       (       d'  ["        R&                  " U5      nUR)                  U5        [
        R*                  " TR                  UUUS S	9n	UR)                  [
        R,                  " TR                  U	[.        R0                  S
95        M     UU4S jn
[3        X5      n["        R4                  " X;5      nUS S S2    H  n["        R4                  " X5      nM     U$ s  snf )Ninr  rr   r   r  r  r   r  )r   rt   rs   ru   r  )r   r   r   c                 F   > [         R                  " TR                  TU US9$ )N)r   rs   rt   ru   )r   r   r   )leftrightconjunctionr*   s     r#   concat;FlattenInListTransform.visit_PrimaryCmpNode.<locals>.concat  s&    **&*hh+6+/+0	2 2r%   r1  )rK   r  rs   r(   ru   r   	TupleNodeListNodeSetNodert   r   rg   try_is_simpler   r   r  
is_starredr   r.   r  rJ   r   r  r	   c_bint_typer   r  )rG   r*   	eq_or_neqry   r   r=   r)   condsr   r  r`  r~   r   r  r_  s    `            @r#   r   +FlattenInListTransform.visit_PrimaryCmpNode  s   4 <<#K]]d"KI]]h&KIK$--)*=*=*3*<*<*3*;*;*= > > Kmm}}!!t9>  """&--8"; ))$((/kkK$/$3$/00K%%c*C$$&&**3/S!++&*hh+.+4+.*.0D LL//&*hh*.'1'='=? @  	2 6)	11#A$B$KD 55dEH  G 0s   IrT   N)r^   r_   r`   ra   rb   r   r   rV  rW  rc   rd   rT   r%   r#   rY  rY  y  s     
>@ ))==Jr%   rY  c                   V    \ rS rSrSr\R                  R                  rS r	S r
S rSrg)DropRefcountingTransformi  z&Drop ref-counting in safe places.
    c                    / / p2/ / pT/ nUR                    H  n[        U[        R                  5      (       aN  U R	                  UR
                  UXF5      (       d  Us  $ U R	                  UR                  UXV5      (       d  Us  $ Mp  [        U[        R                  5      (       a  Us  $ Us  $    U(       d  U(       ai  U VV	s/ s H  u  pUPM	     n
nn	U VV	s/ s H  u  pUPM	     nnn	[        U
5      [        U5      :w  a  U$ [        [        U
5      5      [        U5      :w  a  U$ U(       d  U(       a  / nU H0  nU R                  U5      nU(       d  Us  $ UR                  U5        M2     / nU H0  nU R                  U5      nU(       d  Us  $ UR                  U5        M2     [        U5      [        U5      :w  a  U$ [        [        U5      5      [        U5      :w  a  U$ U$ U Vs/ s H  nUR                  PM     nnU H
  nSUl        M     X#-    H  u  nnUU;  d  M  SUl        M     XE-    H
  nSUl        M     U$ s  sn	nf s  sn	nf s  snf )z6
Parallel swap assignments like 'a,b = b,a' are safe.
F)r|   r(   r   r   _extract_operandry   rz   CascadedAssignmentNoder  rg   _extract_index_idrJ   r)   use_managed_ref)rG   r*   
left_namesright_namesleft_indicesright_indicesr   statpathnlnamesrnameslindiceslhs_nodeindex_idrindicesrhs_nodet	temp_argsr  r5  	name_node
index_nodes                          r#   visit_ParallelAssignmentNode5DropRefcountingTransform.visit_ParallelAssignmentNode  s+    #%bK&("mJJD$ : :;;,,TXXz-9B BK,,TXX{-:C CKC D%">">??  +57:t:F7+68;t;F86{c&k)3v;3{#33= H(11(;K)	 )
 H)11(;K)	 * 8}H-3x=!S%77 K$)*EqQUUE	*D#(D   '4LAy	),1	) 5 '6J).J& 7 W 88> +s   H?I&Ic                 R   [        U5      nUR                  R                  (       d  g[        U[        R
                  5      (       a  UR                  U5        UR                  n/ nUnUR                  (       aL  UR                  (       a  gUR                  UR                  5        UR                  nUR                  (       a  ML  UR                  (       aD  UR                  UR                  5        UR                  SR                  US S S2   5      U45        gUR                  (       a}  UR                   R                  ["        R$                  :w  a  gUR&                  R                  R(                  (       d  gUR                   R                  (       d  gUR                  U5        gg)NF.r1  T)r1   r   r   r(   r   r  rJ   r)   r   r6   memberr8   r   r"   joinr   r   r
   r   r
  r   )rG   r*   namesindicesr   	name_pathobj_nodes          r#   rn  )DropRefcountingTransform._extract_operand  s.   4 yy$$dI6677LL88D	##""X__-||H	 ###
 X]]+LL388IddO4d;=  yy~~!2!22::??))99$$NN4   r%   c                     UR                   nUR                  n[        U[        R                  5      (       a  UR
                  nO![        U[        R                  5      (       a  g g UR
                  U4$ r'   )r   r
  r(   r   r4   r"   	ConstNode)rG   r  r   r
  	index_vals        r#   rp  *DropRefcountingTransform._extract_index_id)  sZ      eY//00

Iy2233		9%%r%   rT   N)r^   r_   r`   ra   rb   r   rV  rW  rc   r  rn  rp  rd   rT   r%   r#   rl  rl    s)    ))==JCJ:
&r%   rl  c                   T   \ rS rSrSr\R                  R                  rS r	S r
S rSS jrSS jrSS	 jrS
 rS rS rS rS rS r\R,                  " \R0                  \R2                  " S\R4                  S5      /5      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(g)EarlyReplaceBuiltinCallsi6  a  Optimize some common calls to builtin types *before* the type
analysis phase and *after* the declarations analysis phase.

This transform cannot make use of any argument types, but it can
restructure the tree in a way that the type analysis phase can
respond to.

Introducing C function calls here may not be a good idea.  Move
them to the OptimizeBuiltinCalls transform instead, which runs
after type analysis.
c                     U R                  U5        UR                  nU R                  U5      (       d  U$ U R                  XUR                  5      $ r'   )rK   r   _function_is_builtin_name_dispatch_to_handlerr   )rG   r*   r   s      r#   visit_SimpleCallNode-EarlyReplaceBuiltinCalls.visit_SimpleCallNodeE  sF    4 ==--h77K((CCr%   c                    U R                  U5        UR                  nU R                  U5      (       d  U$ UR                  n[	        U[
        R                  5      (       d  U$ UR                  nU R                  XXAR                  5      $ r'   )
rK   r   r  positional_argsr(   r   rb  r   r  keyword_args)rG   r*   r   r   r   s        r#   visit_GeneralCallNode.EarlyReplaceBuiltinCalls.visit_GeneralCallNodeL  sy    4 ==--h77K((	)Y%8%899K~~((D"3"35 	5r%   c                     UR                   (       d  gU R                  5       nUR                  UR                  5      nX2R	                  5       R                  UR                  5      La  gg)NFT)r   r   r   r"   r   lookup_here)rG   r   r'  r   s       r#   r  2EarlyReplaceBuiltinCalls._function_is_builtin_nameX  sR     

8==)))+77FFr%   Nc                     Uc  SUR                   -  nOSUR                   -  n[        XS 5      nUb  Uc  U" X5      $ U" XU5      $ U$ )Nz_handle_simple_function_%sz_handle_general_function_%s)r"   r  )rG   r*   r   r   kwargshandler_namehandle_calls          r#   r  -EarlyReplaceBuiltinCalls._dispatch_to_handlerb  sW    >7(--GL88==HLd$7"~"4.."4v66r%   c                     [         R                  " UR                  R                  UR                  R                  X#US9Ul        g )NrJ  )r   PythonCapiFunctionNoder   r   r"   )rG   r*   r"  	func_typerJ  s        r#   _inject_capi_function.EarlyReplaceBuiltinCalls._inject_capi_functiono  s2    !88MMt}}115')r%   c           
          U(       d  SnO)[        U[        5      (       d  US:  a  SnOUS:X  a  SnOSnUb  SU-  nOSn[        UR                  SXU[	        U5      4-  5        g Nr  r   z...xzexpected %s, z3%s(%s) called with wrong number of args, %sfound %dr(   rQ  r   r   rg   rG   function_namer*   r   expectedarg_strexpected_strs          r#   _error_wrong_arg_count/EarlyReplaceBuiltinCalls._error_wrong_arg_countt  o    G#&&(Q,G]GG*X5LLdhhML#d)Q= = 	>r%   c                    U(       d  [         R                  " UR                  SS9$ [        U5      S:  a  U R	                  SXS5        [        US   SS 5      nU[        R                  [        R                  4;   a  US   $ U$ )N0.0rv   r   floatr   r   )
r   	FloatNoder   rg   r  r  r	   c_double_typer
   
float_type)rG   r*   pos_argsarg_types       r#   _handle_simple_function_float6EarlyReplaceBuiltinCalls._handle_simple_function_float  st    &&txxu==x=1''C8A;5
00'2D2DEEA;r%   c                 h   [        U5      nS =pEUS:X  a  Uu  nO+US:X  a  Uu  pFO US:X  a  Uu  pFnOU R                  SX5        U$ [        R                  " UR                  U=(       d     [        R
                  " UR                  5      UU=(       d     [        R
                  " UR                  5      S9$ )Nr   r   r   slice)r6  r7  r  )rg   r  r   ri  r   NoneNode)rG   r*   r  r   r6  r  r7  s          r#   _handle_simple_function_slice6EarlyReplaceBuiltinCalls._handle_simple_function_slice  s    M	>ED!^"KE4!^ (E''@K""HH79--dhh75++DHH5	7 	7r%   c           	      ~   [        U5      S:w  a  U$ US   n[        U[        R                  [        R                  45      (       aw  [        UR
                  5      S:X  a^  [        R                  " UR                  [        R                  [        [        UR
                  5      5      [        UR
                  5      S9$ U$ )zUnpack ord('X').
        r   r   rc  )rg   r(   r   r   rM  rw   r   r   r	   c_long_typerQ  r  )rG   r*   r  r)   s       r#   _handle_simple_function_ord4EarlyReplaceBuiltinCalls._handle_simple_function_ord  s     x=AKqkcI1193F3FGHH399~" ((GG*"8"8c#))n-$'		N 
 r%   c                 &    U R                  XS5      $ )zTransform

_result = all(p(x) for L in LL for x in L)

into

for L in LL:
    for x in L:
        if not p(x):
            return False
else:
    return True
F_transform_any_allrG   r*   r  s      r#   _handle_simple_function_all4EarlyReplaceBuiltinCalls._handle_simple_function_all  s     &&tu==r%   c                 &    U R                  XS5      $ )zTransform

_result = any(p(x) for L in LL for x in L)

into

for L in LL:
    for x in L:
        if p(x):
            return True
else:
    return False
Tr  r  s      r#   _handle_simple_function_any4EarlyReplaceBuiltinCalls._handle_simple_function_any  s     &&tt<<r%   c                 <   [        U5      S:w  a  U$ [        US   [        R                  5      (       d  U$ US   nUR                  R
                  nUR                  n[        U5      u  pxUc  U$ U(       a  Un	O[        R                  " UR                  US9n	[        R                  " UR                  S [        R                  " UR                  U	[        R                  " UR                  [        R                  " UR                  X3S9S9S9/S9n
[        R                  " UR                  [        R                  " UR                  U(       + U(       + S9S9Ul        [         R"                  " XHU
5        [        R$                  " UR                  XC(       a  SS
9$ S	S
9$ )Nr   r   r   r  rv   r}   )r   r   r  all)gen	orig_func)rg   r(   r   GeneratorExpressionNodedef_nodegbodyr   ri   r   r   r   r   r   ReturnStatNoder   r   r   recursively_replace_nodeInlinedGeneratorExpressionNode)rG   r*   r  is_anygen_expr_nodegenerator_bodyr*  yield_expressionyield_stat_noder~   	test_nodes              r#   r  +EarlyReplaceBuiltinCalls._transform_any_all  sx   x=AK(1+y'H'HIIK &//55"''	,I),T)#K(I!))*:*>*>HXYI$$  d""$(('--'001A1E1EVln@	
	 !& 4 4HH$$%5%9%9Vag]gh!j	 	((S77=VEX 	XQVX 	Xr%   itc                    [        U5      S:w  a  U$ US   n[        U[        R                  5      (       a!  UR                  [
        R                  L a  UnGON[        U[        R                  5      (       a  Un[        UR                  5      nU(       d  U$ [        R                  " UR                  US[
        R                  S9nU HF  u  px[        R                  " UR                  UUR                  S9n	[        R                  " XXU	5        MH     OUR                   (       a  UR#                  5       nOq[        R$                  " UR                  UR'                  5       (       a0  UR                  [(        R*                  [
        R                  4;   a  SOSU R,                  USS	9n[        R.                  " UR                  U5      $ )
zTransform sorted(genexpr) and sorted([listcomp]) into
[listcomp].sort().  CPython just reads the iterable into a
list and calls .sort() on it.  Expanding the iterable in a
listcomp is still faster and the result can be sorted in
place.
r   r   sortedr  comprehension_typerP   r   __Pyx_PySequence_ListKeepNewPySequence_ListTr4  )rg   r(   r   ComprehensionNoder   r
   r   r  rf   loopr  r   ComprehensionAppendNoder   r   r  r  as_listr8  result_in_tempr	   r  PySequence_List_func_typeSortedListNode)
rG   r*   r  r)   	list_noder  rh   r  r  append_nodes
             r#   _handle_simple_function_sorted7EarlyReplaceBuiltinCalls._handle_simple_function_sorted  sr    x=AKqkc96677CHHHYHY<YIY>>??M5m6H6HI#!@@-8#*#4#46I 6F1 '??$(()$++- 00Q\] 6F (( I
 "44))++Z=V=VX_XiXi<j0j /*..t-I '')<<r%   c                 b   [        U5      S;  a  U$ [        US   [        R                  [        R                  45      (       d  U$ US   nUR
                  n[        U[        R                  5      (       a  [        U5      u  pVSnUc  U$ OHUR                  nUR                  n UR                  (       a  UR                  R                  (       d  U$  [        U5      S:X  a!  [        R                  " UR                  SSS9nOUS   n[        R                   " UR                  ["        R$                  S9n[&        R(                  " UR                  U[        R*                  " UR                  SX5      S	9n	[,        R.                  " X6U	5        [&        R0                  " UR                  [&        R(                  " UR                  [        R                   " UR                  US
9USS9U/S9n
[        R2                  " UR                  XUR4                  SUR6                  S9$ ! [         a    Us $ f = f)zLTransform sum(genexpr) into an equivalent inlined aggregation loop.
        r   r   r   Nr   r   r  r	  rf  rx   )r   r/   TrI  r{   sum)r  result_node
expr_scoper  has_local_scope)rg   r(   r   r  r  r  ri   rJ   rP   rK  r   r   r#  r   r   r   r.   r	   r  r   r   r  r   r  r   r  r  r  )rG   r*   r  r  r*  r  r  r6  r   add_node	exec_codes              r#   __handle_simple_function_sum5EarlyReplaceBuiltinCalls.__handle_simple_function_sum,  s    x=%K(1+	(I(I(1(C(C(E F FK !&&	mY%F%FGG0Mi0X-#' ( ,22O.33'22:J:O:O:V:VK ;W x=A%%dhhc1MEQKE,,
@Y@YZ
--  &&txxjS 	((R&&HH**II#11dhh:V 	"
 		 77i&11u+;;= 	== " s   $-H H.-H.c                 &    U R                  XS5      $ )Nr  _optimise_min_maxr  s      r#   _handle_simple_function_min4EarlyReplaceBuiltinCalls._handle_simple_function_minf      %%dc::r%   c                 &    U R                  XS5      $ )Nr  r  r  s      r#   _handle_simple_function_max4EarlyReplaceBuiltinCalls._handle_simple_function_maxi  r  r%   c                 4   [        U5      S::  aC  [        U5      S:X  a#  US   R                  (       a  US   R                  n[        U5      S::  a  U$ [        [	        [
        R                  USS 5      5      nUS   nU Ho  n[
        R                  " U5      n[        R                  " UR                  UU[        R                  " UR                  UUUS9S9n[
        R                  " Xu5      nMq     USSS2    H  n[
        R                  " X5      nM     U$ )zKReplace min(a,b,...) and max(a,b,...) by explicit comparison code.
        r   r   N)rt   rs   ru   )r<  r=  r.  r1  )rg   r  r   r  r  r   r.   r   CondExprNoder   r   r  )	rG   r*   r   rs   cascaded_nodeslast_resultarg_noder   ref_nodes	            r#   r  *EarlyReplaceBuiltinCalls._optimise_min_maxl  s     t9>4yA~$q'"A"AAw||4yA~c)"9"948DE1g&H"00=J#00#& //LL'')		
K $88QK ' 'tt,H#88OK - r%   c                     U(       d   [         R                  " UR                  / SS9$ U R                  X[        R
                  5      nX1La  [         R                  " UR                  US9$ U$ )NrT   r   r=   )r)   )r   rb  r   _transform_list_set_genexprr
   r   AsTupleNode)rG   r*   r  results       r#   &_DISABLED_handle_simple_function_tuple?EarlyReplaceBuiltinCalls._DISABLED_handle_simple_function_tuple  sZ    &&txxb"MM 11$'BSBST((v>>r%   c                     [        U5      S:w  a  U$ US   R                  (       a  US   R                  (       d  US	 U$ [        US   [        R
                  5      (       a  US   R                  5       US'   U$ )zSReplace frozenset([...]) by frozenset((...)) as tuples are more efficient.
        r   r   )rg   r  r   r(   r   rc  as_tupler  s      r#   !_handle_simple_function_frozenset:EarlyReplaceBuiltinCalls._handle_simple_function_frozenset  sp     x=AKA;..x{7G7G  Y%7%788"1+..0HQKr%   c                     U(       d   [         R                  " UR                  / / S9$ U R                  X[        R
                  5      $ Nr  )r   rc  r   r  r
   r   r  s      r#   _handle_simple_function_list5EarlyReplaceBuiltinCalls._handle_simple_function_list  s7    %%dhhRLL//@Q@QRRr%   c                     U(       d(  [         R                  " UR                  / [        5       S9$ U R	                  X[
        R                  5      $ r  )r   rd  r   r  r  r
   r   r  s      r#   _handle_simple_function_set4EarlyReplaceBuiltinCalls._handle_simple_function_set  s9    $$TXXBNN//@P@PQQr%   c                    [        U5      S:  a  U$ [        US   [        R                  5      (       d  U$ US   nUR                  n[        U5      nU(       d  U$ [        R                  " UR                  UU[        R                  L a  SOSUS9nU HF  u  p[        R                  " UR                  UUR                  S9n
[        R                  " XIU
5        MH     U$ )zLReplace set(genexpr) and list(genexpr) by an inlined comprehension.
        r   r   r  r  r  r  )rg   r(   r   r  r  rf   r  r   r
   r   r  r   r   r  )rG   r*   r  r<  r  r*  rh   r  r  r  r  s              r#   r  4EarlyReplaceBuiltinCalls._transform_list_set_genexpr  s     x=1K(1+y'H'HIIK !&&	1)<K>>HHm*g.>.>>eF*,
 2B-#;; $$%"))+K ,,][Y 2B r%   c                    [        U5      S:X  a   [        R                  " UR                  / 0 S9$ [        U5      S:  a  U$ [	        US   [        R
                  5      (       d  U$ US   nUR                  n[        U5      nU(       d  U$ U HE  u  pg[	        U[        R                  5      (       d  Us  $ [        UR                  5      S:w  d  MC  Us  $    [        R                  " UR                  US[        R                  S9nU Ha  u  pi[        R                  " UR                  UR                  S   UR                  S   UR                  S9n
[        R                   " X9U
5        Mc     U$ )zDReplace dict( (a,b) for ... ) by an inlined { a:b for ... }
        r   key_value_pairsr=   r   r   r   r  )key_expr
value_exprr   )rg   r   DictNoder   r(   r  r  rf   rb  r   r  r
   r   DictComprehensionAppendNoder   r   r  )rG   r*   r  r  r*  rh   r  r5  r  r  r  s              r#   _handle_simple_function_dict5EarlyReplaceBuiltinCalls._handle_simple_function_dict  sN    x=A%%dhhTVWWx=1K(1+y'H'HIIK !&&	1)<K#3.	0C0CDD#(()Q.	 $4  >>HHmv&002 2B-#?? $$)..q1+003"))	+K
 ,,][Y 2B r%   c                 j    [        U5      S:  a  U$ [        U[        R                  5      (       d  U$ U$ )z\Replace dict(a=b,c=d,...) by the underlying keyword dict
construction which is done anyway.
r   )rg   r(   r   r,  )rG   r*   r  r  s       r#   _handle_general_function_dict6EarlyReplaceBuiltinCalls._handle_general_function_dict  s2     x=1K&)"4"455Kr%   rT   r'   ))r^   r_   r`   ra   rb   r   rV  rW  rc   r  r  r  r  r  r  r  r  r  r  r  r  r	   r  r
   r   r  r  r  r  5_EarlyReplaceBuiltinCalls__handle_simple_function_sumr  r
  r  r  r  r   r#  r  r.  r1  rd   rT   r%   r#   r  r  6  s    
 ))==JD
5)
>$7$"> = "XH !+ 4 4		 	 z'@'@$	GH!J/=b8=t;;F	S
R
8"Lr%   r  c                   L    \ rS rSr\R
                  R                  rS rS r	Sr
g)InlineDefNodeCallsi   c                 >   UR                   c  g UR                   R                  (       a  g U R                  5       R                  UR                  5      nU(       a*  UR
                  (       a  [        UR
                  5      S:w  a  g UR
                  S   R                  $ )Nr   r   )cf_state
cf_is_nullr   r   r"   cf_assignmentsrg   rz   )rG   r  r   s      r#   get_constant_value_node*InlineDefNodeCalls.get_constant_value_node  sx    %((  ")))..9U11 4 45:##A&***r%   c                    U R                  U5        U R                  R                  S5      (       d  U$ UR                  nUR                  (       d  U$ U R                  U5      n[        U[        R                  5      (       d  U$ [        R                  " UR                  UX1R                  UR                  S9nUR                  5       (       a  U R                  X5      $ U$ )Nzoptimize.inline_defnode_calls)r  r   r   generator_arg_tag)rK   r0  r1  r   r   r:  r(   r   PyCFunctionNodeInlinedDefNodeCallNoder   r   r=  can_be_inlinedreplace)rG   r*   r  r   inlineds        r#   r  'InlineDefNodeCalls.visit_SimpleCallNode  s    4 &&**+JKKK$$K//>(I$=$=>>K22HHMII"446 !!##<<..r%   rT   N)r^   r_   r`   ra   r   rV  rW  rc   r:  r  rd   rT   r%   r#   r5  r5     s    ))==J
+r%   r5  c                   (   \ rS rSrSrS rS rS rS r\	R                  " \	R                  \	R                  " S\	R                  S5      /5      rS	 rS
 r\	R                  " \	R                   \	R                  " S\R$                  S5      \	R                  " S\	R&                  S5      \	R                  " S\	R(                  S5      /SSS9rS r\	R.                  \	R0                  \	R2                  4 V VVs0 s H2  nU[        R                  " U[        R                  " SUS5      /5      _M4     snnn rS r\	R                  " \	R(                  \	R                  " S\	R8                  S5      /SS9r\	R                  " \	R0                  \	R                  " S\	R8                  S5      /SS9rS rSS jr S r!S r"S r#\	R                  " \RH                  \	R                  " S\	R                  S5      /5      r%S r&\&r'S r(\	R                  " \RR                  \	R                  " S\RR                  S5      /5      r*S  r+\	R                  " \RX                  \	R                  " S!\	R                  S5      /5      r-S" r.\	R                  " \R^                  \	R                  " S#\RX                  S5      /5      r0S$ r1\	R                  " \Rd                  \	R                  " S!\	R                  S5      /5      r3S% r4\	R                  " \Rj                  \	R                  " S!\	R                  S5      /5      r6S& r7\	R                  " \	R0                  \	R                  " S\	R                  S5      /S'SS9r8S( r9\	R                  " \Rt                  \	R                  " S\	R                  S5      /5      r;\	R                  " \Rt                  \	R                  " S)\	R0                  S5      /5      r<S* r=S+ r>\	R                  " \R~                  \	R                  " S)\	R                  S5      /5      r@\	R                  " \R~                  \	R                  " S)\R                  S5      /5      rBS, rC\	R                  " \	R&                  \	R                  " S\	R                  S5      /SS9rE\	R                  " \	R&                  \	R                  " S-\	R                  S5      /SS9rG\	R                  " \	R&                  \	R                  " S\	R                  S5      /SS9rH\RH                  S.\R$                  S/\R                  S0\RX                  S1\R^                  S2\Rd                  S3\Rj                  S3\RR                  S40R                  rKS51rLS6 rM\	R                  " \R                  \	R                  " S7\	R                  S5      /5      rOS8 rP\	R                  " \	R                  \	R                  " S\	R                  S5      /5      rRS9 rSS: rT\	R                  " \	R                  \	R                  " S;\	R                  S5      \	R                  " S<\R^                  S5      /5      rU\	R                  " \	R                  \	R                  " S;\	R                  S5      \	R                  " S<\R^                  S5      \	R                  " S=\RR                  S5      /5      rV SS> jrW SS? jrX\	R                  " \	R                  \	R                  " S#\	R                  S5      \	R                  " S@\	R                  S5      /SS9rZSA r[SB r\\	R                  " \	R                  \	R                  " SC\	R                  S5      \	R                  " S)\	R(                  S5      /SS9r]\	R                  " \	R                  \	R                  " SC\	R                  S5      \	R                  " S)\	R                  S5      /SS9r^SD r_\	R                  " \	R                  \	R                  " S#\	R                  S5      /5      r`\	R                  " \	R                  \	R                  " S#\	R                  S5      \	R                  " SE\	R                  S5      \	R                  " SF\	R&                  S5      \	R                  " SG\	R(                  S5      /SSH9raSI rbSSJ jrc\	R                  " \	R                  \	R                  " S\	R                  S5      /SS9rdSK re\	R                  " \	R                  \	R                  " S\	R                  S5      \	R                  " SL\	R                  S5      \	R                  " SM\	R                  S5      /5      rfSN rg\	R                  " \	R                  \	R                  " S\	R                  S5      \	R                  " SL\	R                  S5      \	R                  " SM\	R                  S5      \	R                  " SO\	R(                  S5      /5      rhSP ri\	R                  " \	R                  \	R                  " S\	R                  S5      \	R                  " SL\	R                  S5      \	R                  " SM\	R                  S5      /5      rj\	R                  " \	R(                  \	R                  " S\	R                  S5      \	R                  " SL\	R                  S5      \	R                  " SM\	R                  S5      /\	R(                  R                  S9rlSQ rm\	R                  \	R0                  4 V VVVs0 s GH  n[        R                  [        R                  4  H  nX44[        R                  " U[        R                  " SR[        R                  S5      [        R                  " SS[        R                  S5      [        R                  " STUS5      [        R                  " SU[        R                  S5      [        R                  " SV[        R                  S5      /UR                  (       a  SOUR                  S9_M     GM     snnnn rpSW rqSX rrSY rsSZ rtS[ ruS\ rvS] rwS^ rxS_ ryS` rzSa r{Sb r|Sc r}Sd r~\qr\rr\sr\tr\ur\vr\wr\xr\yr\zr\{r\|r\}rSe rSf rSg rSh rSi rSj rSk rSl rSm r\	R                  " \	R                  \	R                  " Sn\	R8                  S5      /5      rSo r\r\r\r\r\r\r\r\r\r\r\	R                  " \	R8                  \	R                  " Sn\	R8                  S5      /5      r \	R                  " \RX                  \	R                  " Sp\RH                  S5      \	R                  " Sq\	R                  S5      /5      rSr r\	R                  " \RX                  \	R                  " Sp\RH                  S5      \	R                  " Ss\	R                  S5      \	R                  " St\	R&                  S5      /5      rSu r\	R                  " \RH                  \	R                  " Sp\RH                  S5      \	R                  " Sv\	R                  S5      /5      rSw r\	R                  " \	R                  \	R                  " Sp\	R                  S5      \	R                  " Sx\	R                  S5      \	R                  " Sy\	R&                  S5      \	R                  " Sz\	R&                  S5      \	R                  " S{\	R(                  S5      /SS9rS| rS} rS~ r\	R                  " \	R&                  \	R                  " Sp\RH                  S5      \	R                  " Sx\	R                  S5      \	R                  " Sy\	R&                  S5      \	R                  " Sz\	R&                  S5      \	R                  " S{\	R(                  S5      /SS9rS rS rS r\	R                  " \	R&                  \	R                  " Sp\RH                  S5      \	R                  " Sx\	R                  S5      \	R                  " Sy\	R&                  S5      \	R                  " Sz\	R&                  S5      /SS9rS r\	R                  " \RH                  \	R                  " Sp\RH                  S5      \	R                  " Sx\	R                  S5      \	R                  " S\	R                  S5      \	R                  " S\	R&                  S5      /5      rS r\	R                  " \R$                  \	R                  " S\RH                  S5      \	R                  " S\	R                  S5      \	R                  " S\	R                  S5      /5      r\	R                  " \R$                  \	R                  " S\RH                  S5      /5      r/ SQr\ V VVs/ s H  nUG[n        GRp                  " U5      4PM     snnn rS r\	GRv                  " \	R                  " \RH                  \	R                  " S\	R                  S5      \	R                  " S\	R&                  S5      \	R                  " S\	R                  S5      /5      5      r\	R                  " \RH                  \	R                  " S\	R                  S5      \	R                  " Sy\	R&                  S5      \	R                  " S\	R&                  S5      \	R                  " S\	R                  S5      \	R                  " S\	R                  S5      \	R                  " S\S5      /5      r\	R                  " \RH                  \	R                  " S\	R                  S5      \	R                  " Sy\	R&                  S5      \	R                  " S\	R&                  S5      \	R                  " S\	R                  S5      \	R                  " S\	R                  S5      \	R                  " S\S5      /5      rSrS r\rS rS rS rS rS r SSS\GR                  GR                  S4S jrS r\	R                  " \	R                  \	R                  " S\	R                  S5      /5      rS rS rS rSrgs  snnn f s  snnnn f s  snnn f )OptimizeBuiltinCallsi"  a(  Optimize some common methods calls and instantiation patterns
for builtin types *after* the type analysis phase.

Running after type analysis, this transform can only perform
function replacements that do not alter the function return type
in a way that was not anticipated by the type analysis.
c                 D    U R                  U5        UR                  5       $ )z:Flatten redundant type checks after tree changes.
        )rK   	reanalyserL   s     r#   visit_PyTypeTestNode)OptimizeBuiltinCalls.visit_PyTypeTestNode-  s     	4 ~~r%   c                     U R                  U5        UR                  UR                  R                  :X  a  UR                  $ U$ )z
Drop redundant type casts.
)rK   r   r   rL   s     r#   _visit_TypecastNode(OptimizeBuiltinCalls._visit_TypecastNode3  s7     	4 99)))<<r%   c                    U R                  U5        [        UR                  [        R                  5      (       a  UR                  R
                  Ul        UR                  nUb"  UR                  (       d  UR                  (       a  gUR                  (       aH  UR                  (       a7  UR                  R                  (       d  UR                  R                  (       a  gU$ )z'
Drop dead code and useless coercions.
N)rK   r(   rP   r   r   r)   is_nonerK  r   r   is_localis_arg)rG   r*   rP   s      r#   rQ   'OptimizeBuiltinCalls.visit_ExprStatNode>  s     	4 dii!=!=>>		DIyy<4<<4??<<DJJDJJ,?,?4::CTCTr%   c                    U R                  U5        UR                  n[        U[        R                  5      (       a  UR                  n[        U[        R
                  5      (       aW  UR                  [        R                  [        R                  4;   a)  UR                  R                  U R                  5       5      $ U$ )z<Drop redundant conversion nodes after tree changes.
        )rK   r)   r(   r   PyTypeTestNoder   r   r	   r  r
   	bool_typecoerce_to_booleanr   )rG   r*   r)   s      r#   visit_CoerceToBooleanNode.OptimizeBuiltinCalls.visit_CoerceToBooleanNodeN  s     	4 hhc93344''Cc97788xxJ55w7H7HIIww001A1A1CDDr%   oNc                 $   U R                  U5        UR                  n[        U[        R                  5      (       a  UR                  n[        U[        R
                  5      (       Ga'  UR                  R                  S:X  Ga  [        UR                  5      S:X  a  UR                  S   nUR                  [        R                  L a  UR                  S5      $ UR                  R                  (       a  UR                  R                  S:X  a  [        R
                  " UR                   SU R"                  U/SUR$                  [&        R(                  " SS5      UR*                  S	9R-                  UR                  U R/                  5       5      $ U$ )
z3Drop redundant conversion nodes after tree changes.r  r   r   =float() argument must be a string or a number, not 'NoneType'__Pyx_PyObject_AsDouble__Pyx_PyNumber_Floatpynumber_floatzTypeConversion.c)r   py_namer   rJ  rI  )rK   r)   r(   r   CoerceFromPyTypeNoder8  r   r"   rg   r   r   r
   r  r   r   r"  r   PyNumber_Float_func_typer   r   r!   rI  rO  r   )rG   r*   r)   func_args       r#   visit_CoerceToPyTypeNode-OptimizeBuiltinCalls.visit_CoerceToPyTypeNode_  s*   4 hhc999::''Cc97788||  G+CHH0B88A;==G$6$66#556uvv]]..3<<3E3EIb3b$77"8$:W:W&Z ' $'2'>'>?OQc'd'+':':  i		4+;+;+=>? r%   c                 `   U R                  U5        UR                  nUR                  R                  (       dF  UR                  UR                  :w  a*  UR	                  UR                  U R                  5       5      nU$ [        U[        R                  5      (       a  UR                  nUR                  (       a  UR                  R                  (       a  [        U[        R                  5      (       dt  UR                  R                  (       a  [        U[        R                  5      (       d:  UR                  R                  (       aI  [        U[        R                  5      (       a*  UR	                  UR                  U R                  5       5      $ U$ [        U[        R                  5      (       Ga  UR                  [         R"                  L ak  UR                  R%                  UR                  R                  5      (       a4  UR                  R	                  UR                  U R                  5       5      $  U$ UR                  [&        R(                  L at  UR                  R                  R*                  (       aO  UR                  R*                  (       a4  UR                  R	                  UR                  U R                  5       5      $ U$ [        U[        R,                  5      (       aJ  UR                  R                  (       d  UR                  R                  (       a  U R/                  X5      $  U$ UR0                  (       ad  UR2                  n[        U[        R                  5      (       a  UR                  nUR                  R                  (       a  U R5                  XU5      $ U$ )zDrop redundant conversion nodes after tree changes.

Also, optimise away calls to Python's builtin int() and
float() if the result is going to be coerced back into a C
type anyway.
)rK   r)   r   r   rO  r   r(   r   rS  rK  r   r   is_floatr  r   r   r	   r  ru  r
   r   is_unicode_charr   _optimise_numeric_cast_callr   r
  _optimise_int_indexing)rG   r*   r)   r  s       r#   visit_CoerceFromPyTypeNode/OptimizeBuiltinCalls.visit_CoerceFromPyTypeNodev  so    	4 hhxx##yyCHH$mmDIIt/?/?/ABJc93344''C>>		  ZY5F5F%G%GII&&:c9;N;N+O+OII$$C9K9K)L)L}}TYY0@0@0BCC$ # Y99::xx:44499,,SWW\\::77,,TYY8H8H8JKK ;  W11177<<//DII4M4M77,,TYY8H8H8JKK  Y5566yy499#5#577BB $6  J*i&B&BCC'^^
%%224jIIr%   bytesr
  check_boundsz
((char)-1)T)r0  exception_checkc                    U R                  5       nUR                  S   =(       a    S=(       d    SnUR                  R                  [        R
                  L Ga  UR                  [        R                  [        R                  4;   a  [        R                  " UR                  [        U5      US9n[        R                  " UR                  SU R                  UR                  R                  S5      UR!                  [        R"                  U5      U/S[$        R&                  " SS	5      S
9nUR                  [        R                  La  UR!                  UR                  U5      nU$ U$ )Nr  r   r   r  __Pyx_PyBytes_GetItemIntz&'NoneType' object is not subscriptableTbytes_indexStringTools.cr   r   rJ  )r   r  r   r   r
   r   r	   c_char_typec_uchar_typer   r   r   rQ  r8  PyBytes_GetItemInt_func_typer   rO  r  r   r!   )rG   coerce_noder)   r  r'  bound_check_boolbound_check_noder*   s           r#   rh  +OptimizeBuiltinCalls._optimise_int_indexing  s&    >>-8>QC!88==G...J$:$:J<S<S#TT#,#4#4OO3/?+@$4$6  !33OO%?55223[\",,Z-I-I3O(
 !!,!8!8%"8
9 ##:+A+AA>>+*:*:C@Dr%   r)   c           
      n   UR                   nS n[        U[        R                  5      (       a  UR                  nOy[        U[        R
                  5      (       aZ  UR                  R                  (       a?  [        UR                  [        R                  5      (       a  UR                  R                  nUb  [        U5      S:w  a  U$ US   n[        U[        R                  5      (       a  UR                  nOUR                  R                  (       a  U$ UR                  S:X  Ga  UR                  R                  (       d  UR                  R                  (       a  UR                  UR                  :X  a  U$ UR                  [         R"                  [         R$                  4;   a  U R'                  XR                  U5      $ UR                  R)                  UR                  5      (       d  UR                  R*                  (       a)  [        R,                  " UR.                  XQR                  S9$  U$ UR                  R*                  (       a  UR                  R0                  (       a  UR                  R2                  S:X  a  SnOSUR                  R2                  -   n[        R                  " UR.                  UU R4                  UR                     U/SUR6                  UR8                  S9R;                  UR                  U R=                  5       5      $ U$ UR                  S	:X  Ga
  UR                  R*                  (       d  UR                  R*                  (       a  UR                  UR                  :X  a  U$ UR                  [         R"                  [         R$                  4;   a  U R'                  XR                  U5      $ UR                  R)                  UR                  5      (       d  UR                  R*                  (       a)  [        R,                  " UR.                  XQR                  S9$ U$ )
Nr   r   rj  rG  l__Pyx_truncltrunc)r  r   r^  r   rI  r  )r   r(   r   r8  r   r4   r   is_builtin_typer   rb  rg   r   r)   r   r"   r   r	   rt  c_py_unicode_type_pyucs4_to_numberru  re  r  r   
is_numericmath_h_modifierfloat_float_func_typesr   rI  rO  r   )rG   r*   r)   r   r   ra  truncls          r#   rg  0OptimizeBuiltinCalls._optimise_numeric_cast_call  s   <<c9778888D)"4"455}},,CMM9K^K^1_1_}}))<3t9>K7h	 < <==||H]]&&K==E!}}##tyy'7'7==DII-#O]]z'@'@*B^B^&__11$xPPYY..x}}==AWAW$11$((HS\S\]] BX4 1 ''DII,@,@==00C7+F$x}}'D'DDF 33HHf"99(--H"! LL#'#6#6 )DIIt'7'7'9:;$  ]]g%}}%%););==DII-#O]]z'@'@*B^B^&__11$xPPYY..x}}==AWAW$11(D Dr%   r1  r/  g      c                 X   US;   d   e[         R                  " UR                  US:X  a  SOSUS:X  a  U R                  OU R                  U/UUR
                  UR                  [        R                  " US:X  a  SOSS5      S9R                  UR                  U R                  5       5      $ )	N)rj  r  rj  __Pyx_int_from_UCS4__Pyx_double_from_UCS4
int_pyucs4float_pyucs4
Builtins.c)r  r   r^  r   rI  rJ  )r   r8  r   pyucs4_int_func_typepyucs4_double_func_typer   rI  r   r!   rO  r   r   )rG   r*   py_type_namera  s       r#   r  &OptimizeBuiltinCalls._pyucs4_to_number		  s    ////++HH|u/D+Jb3?53Hd//dNjNj LL..$00QVAV\jlxy
 )DIIt//1
2	3r%   c           
          U(       d  SnO)[        U[        5      (       d  US:  a  SnOUS:X  a  SnOSnUb  SU-  nOSn[        UR                  SXU[	        U5      4-  5        g r  r  r  s          r#   r  +OptimizeBuiltinCalls._error_wrong_arg_count	  r  r%   c                     U$ r'   rT   )rG   r*   r  r   arg_listr  s         r#   _handle_function%OptimizeBuiltinCalls._handle_function'	  s    r%   c           
      X   U(       a  U$ U(       a,  UR                   (       a  UR                  R                  (       d  U$ U R                  5       R	                  U5      nU(       d  U$ [
        R                  " UR                  R                  [
        R                  " UR                  UUUR                  S9USS9R                  U R                  5       5      n	U	c  U R                  XXEU5      $ UR                  n
U
c'  UR                  (       a  UR                  R                  n
[
        R                  " UR                  U	U
S9nU(       d  UR                  Ul        UR#                  U R                  5       5        SUl        UR'                  UR                  U R                  5       5      $ )z
Try to inject C-API calls for unbound method calls to builtin types.
While the method declarations in Builtin.py already handle this, we
can additionally resolve bound and unbound methods here that were
assigned to variables ahead of time.
)r"   r   r   T)r8   r9   	is_calledr   )r   r8   r   r   r   r   r5   r   r   r4   r   analyse_as_type_attribute%_optimise_generic_builtin_method_callr   r   r   rG   analyse_c_function_callanalysedrO  )rG   r*   	type_name	attr_namer   r  is_unbound_methodr  
type_entryr   r   	call_nodes               r#   _handle_method#OptimizeBuiltinCalls._handle_method*	  s^    Kx44HLL<P<P K%%'..y9
K((MM"" __	&
   65d6F6F6HI 	 >==5FH Hyy<DNN>>&&D,,HH	 !%\\IN))$*:*:*<=!	""499d.>.>.@AAr%   c                 \   [        U5      nU(       d(  US:  d"  UR                  (       a  UR                  (       d  U$ UR                  R                  R
                  (       d  U$ UR                  R                  [        R                  L a  U$ [        R                  " XR                  X$5      $ )z
Try to inject an unbound method call for a call to a method of a known builtin type.
This enables caching the underlying C function of the method at runtime.
r   )
rg   r   r6   r8   r   r~  r
   	type_typer   CachedBuiltinMethodCallNode)rG   r*   r  r   r  r  r   s          r#   r  :OptimizeBuiltinCalls._optimise_generic_builtin_method_callV	  s}    
 M		Qx7L7LQYQdQdK||  00K<< 1 11K44,,	5 	5r%   r8   c           
         [        U5      S:w  a8  [        U5      S:X  a'  [        R                  " UR                  [	        5       S9$ U$ US   nUR
                  [        R                  L a1  UR                  5       (       d  U$ Sn[        R                  " SS5      nOSn[        R                  " SS5      n[        R                  " UR                  XPR                  UUR                  US	S
9$ )z5Optimise single argument calls to unicode().
        r   r   rv   __Pyx_PyUnicode_UnicodePyUnicode_Unicoderq  __Pyx_PyObject_UnicodePyObject_Unicodeunicoder   r   rJ  r^  )rg   r   r   r   r   r   r
   r   may_be_noner   r!   r8  PyObject_Unicode_func_typer   )rG   r*   r   r  r)   r"  rJ  s          r#   _handle_simple_function_unicode4OptimizeBuiltinCalls._handle_simple_function_unicodek	  s     x=A8}! ,,TXX]_MMKqk88w+++??$$
-E&223FXL,E&223EWL++HHe<<LL% 	r%   c                 8   U R                  U5        UR                  R                  [        R                  L aa  UR
                  (       dP  UR                  (       d?  UR                  (       a  UR                  S:X  a  U R                  USUR                  /5      $ U$ )zSimplify or avoid plain string formatting of a unicode value.
This seems misplaced here, but plain unicode formatting is essentially
a call to the unicode() builtin, which is optimised right above.
r-  N)	rK   rw   r   r
   r   c_format_specformat_specconversion_charr  rL   s     r#   visit_FormattedValueNode-OptimizeBuiltinCalls.visit_FormattedValueNode	  so    
 	4 ::??g2224;M;MVZVfVf''4+?+?3+F;;D$UUr%   r   c                     [        U5      S:w  a  U$ US   nUR                  [        R                  L aH  UR	                  S5      n[
        R                  " UR                  SU R                  U/UR                  S9$ U$ )z;Replace dict(some_dict) by PyDict_Copy(some_dict).
        r   r   r   PyDict_Copyr4  )
rg   r   r
   r   r   r   r8  r   PyDict_Copy_func_typer   rG   r*   r   r  r)   s        r#   r.  1OptimizeBuiltinCalls._handle_simple_function_dict	  sx     x=AKqk88w(((''(DEC//-)C)Cu,, 
 r%   r  c                 N   [        U5      S:w  a  U$ US   n[        R                  " UR                  UR	                  5       (       aE  UR	                  5       (       a0  UR
                  [        R                  [        R                  4;   a  SOSU R                  UUR                  S9$ )z0Turn list(ob) into PySequence_List(ob).
        r   r   r  r  r4  )rg   r   r8  r   r  r   r	   r  r
   r   r  r   r  s        r#   r   1OptimizeBuiltinCalls._handle_simple_function_list	  s     x=AKqk++HH''))c.@.@.B.BHH!:!:G<M<M NN + '**LL	
 		
r%   r  c                    [        U5      S:w  d  UR                  5       (       d  U$ US   nUR                  [        R                  L a  UR                  5       (       d  U$ UR                  [        R                  L a@  UR                  S5      US'   [        R                  " UR                  SU R                  USS9$ [        R                  " UR                  U[        R                  S9$ )zDReplace tuple([...]) by PyList_AsTuple or PySequence_Tuple.
        r   r   r   PyList_AsTupleTr4  )r)   r   )rg   r  r   r
   r   r  r   r   r   r8  r   PyList_AsTuple_func_typer  r  s        r#   _handle_simple_function_tuple2OptimizeBuiltinCalls._handle_simple_function_tuple	  s     x=AT%8%8%:%:Kqk88w)))#//2C2CJ88w(((//35HQK //*D,I,It- - ((sASASTTr%   c                 X   [        U5      S:w  a  U$ US   R                  (       a  / n/ nUS   R                   HP  nUR                  5       (       d'  [        R
                  " U5      nUR                  U5        UR                  U5        MR     [        R                  " UR                  SUS9nU R                  X5        US S S2    H  n[        R                  " X5      nM     U$ U R                  U[        R                  " UR                  SU R                  UUR                  SS95      $ )Nr   r   )r   r   r1  	PySet_Newr  r   r   r^  )rg   r  r   	is_simpler   r  rJ   r   rd  r   rA  r  r8  PySet_New_func_typer   )	rG   r*   r   r  r   r   r)   r  r  s	            r#   r#  0OptimizeBuiltinCalls._handle_simple_function_set	  s   x=AKA;.. DE{''}}#..s3CLL%C 	 (
 &&txxFFLL&dd"77E $M <<i&B&B+(('    r%   c                    U(       d"  [         R                  " UR                  5      /nON[        U5      S:  a  U$ US   R                  [
        R                  L a  US   R                  5       (       d  US   $ [         R                  " UR                  SU R                  UUR                  [        R                  " SS5      SS9$ )Nr   r   __Pyx_PyFrozenSet_Newpyfrozenset_newr  	frozensetr  )r   r  r   rg   r   r
   r   r  r8  PyFrozenSet_New_func_typer   r   r!   rG   r*   r   r  s       r#   r  6OptimizeBuiltinCalls._handle_simple_function_frozenset	  s    !**48845H]QKa[!7!77@W@W@Y@YA;++HH-**LL$001BLQ! 	!r%   z((double)-1)c           
         [        U5      S:X  aB  [        R                  " USSS9R                  [        R
                  U R                  5       5      $ [        U5      S:w  a  U R                  SXS5        U$ US   n[        U[        R                  5      (       a  UR                  nUR                  [        R                  L a  U$ UR                  [        R                  [        R                  4;   a  U R!                  XR"                  U5      $ UR                  R%                  UR                  5      (       d  UR                  R&                  (       a)  [        R(                  " UR*                  XAR                  S9$ US   R-                  S	5      nUR                  [        R.                  L a  S
nSnOoUR                  [        R0                  L a  SnSnOMUR                  [        R2                  L a  SnSnO+UR                  [        R4                  L a  SnSnO	US   nSnSn[        R6                  " UR*                  UU R8                  U/UR:                  U(       a  [=        U5      SS9$ SSS9$ )zITransform float() into either a C type cast or a faster C
function call.
r   r  g        r  r   r  0 or 1rG  rZ  __Pyx_PyBytes_AsDoublepybytes_as_double__Pyx_PyByteArray_AsDouble__Pyx_PyUnicode_AsDoublepyunicode_as_doublePyLong_AsDoubleNr[  pyobject_as_doubler  )rg   r   r  rO  r
   r  r   r  r(   r   r)   r   r	   r  rt  r  r  r"   ru  r  r  r   r   r   r   r   int_typer8  PyObject_AsDouble_func_typer   r$   )rG   r*   r   r  ra  r)   
cfunc_nameutility_code_names           r#   r  2OptimizeBuiltinCalls._handle_simple_function_float
  s    x=A&&E3)G..0@0@0BCD ]a''JKA;h	 < <==||H==J444O]]z88*:V:VWW))$xHHYY&&x}}559Q9Q))(< < qk++KM ==G...1J 3]]g4445J 3]]g2223J 5]]g...*J $1+C2J 4++HHj,,5ll@Q>*;< 	
 X\ 	r%   rw   c           	      p   [        U5      S:X  a/  [        R                  " UR                  SS[        R
                  S9$ [        U5      S:w  a  U$ US   n[        U[        R                  5      (       a_  UR                  R                  R                  (       a8  [        R                  " UR                  SU R                  UR                  /SSS9$ U$ UR                  R                  (       aH  UR                  R                  (       a-  [        R                  " UR                  S	U R                  USSS9$ U$ )
z7Transform int() into a faster C function call.
        r   r   r   r   PyLong_FromDoubleTrj  r  __Pyx_PyNumber_Int)rg   r   r   r   r
   r  r(   r   r)   r   re  r8  PyLong_FromDouble_func_typer   PyNumber_Int_func_type)rG   r*   r   r  ra  s        r#   _handle_simple_function_int0OptimizeBuiltinCalls._handle_simple_function_intO
  s     x=A$$TXXS!*1*:*:< <]aKA;h	 < <==||  )) 33HH143S3S",,u 
 ==$$)>)>//.0K0KtU< < r%   c                    [        U5      S:X  aL  [        R                  " UR                  SSS9R	                  [
        R                  U R                  5       5      $ [        U5      S:w  a  U R                  SXS5        U$ US   R                  U R                  5       5      n[        R                  " UR                  US9n[        R                  " UR                  US9nUR                  U R                  5       5      $ )z=Transform bool(x) into a type coercion to a boolean.
        r   Fr  r   boolr  r   )rg   r   r   r   rO  r
   rT  r   r  rU  r   coerce_to_pyobject)rG   r*   r   r  r   s        r#   _handle_simple_function_bool1OptimizeBuiltinCalls._handle_simple_function_boolf
  s     x=A%%u)G--t/?/?/ABC ]a''IK qk33D4D4D4FGG''GDG''GDG--d.>.>.@AAr%   c           	         [        U5      S:w  a  U R                  SXS5        U$ US   R                  R                  (       a;  [        R
                  " UR                  SU R                  US   /UR                  SS9$ US   R                  R                  (       a[  US   R                  [        R                  L a;  [        R
                  " UR                  SU R                  US   /UR                  SS9$ U$ )Nr   
memoryviewrh  r   PyMemoryView_FromObjectr  PyMemoryView_FromBuffer)rg   r  r   r   r   r8  r   !PyMemoryView_FromObject_func_typer   r   r   r
   py_buffer_type!PyMemoryView_FromBuffer_func_typer  s       r#   "_handle_simple_function_memoryview7OptimizeBuiltinCalls._handle_simple_function_memoryview
  s    x=A''dcJK{++ 33HH7::$QK="ll*, , !!!((Xa[-B-BgF\F\-\ !33HH7::$QK="ll*, , r%   r  __Pyx_PyUnicode_GET_LENGTHr5  __Pyx_PyByteArray_GET_SIZE__Pyx_PyList_GET_SIZE__Pyx_PyTuple_GET_SIZE__Pyx_PySet_GET_SIZEPyDict_Sizezcpython.array.arrayc                 8   [        U5      S:w  a  U R                  SXS5        U$ US   n[        U[        R                  5      (       a  UR
                  nUR                  R                  (       a9  [        R                  " UR                  SU R                  U/UR                  S9nGOUR                  R                  (       aO  [        R                  " UR                  SU R                  U/UR                  [        R                  " SS5      S	9nGOUR                  R                   (       at  ["        R$                  " ["        R&                  ["        R(                  " S
UR                  S5      /SS9n[        R                  " UR                  SUU/UR                  S9nGO UR                  R*                  (       a  U R-                  UR                  5      nUcW  UR                  nUR.                  (       d  UR0                  (       a'  UR2                  R4                  U R6                  ;   a  SnOU$ UR9                  S5      n[        R                  " UR                  XpR:                  U/UR                  S9nOHUR                  R<                  (       a+  [        R>                  " UR                  SSUR                  S9$ U$ UR                  ["        R@                  ["        R&                  4;  a*  URC                  UR                  U RE                  5       5      nU$ )zReplace len(char*) by the equivalent call to strlen(),
len(Py_UNICODE) by the equivalent Py_UNICODE_strlen() and
len(known_builtin_type) by an equivalent C-API call.
r   rg   r   __Pyx_ssize_strlenr4  __Pyx_Py_UNICODE_ssize_strlenssize_pyunicode_strlenrq  rr  memoryviewsliceNT)nogil__Pyx_MemoryView_LenPy_SIZEz&object of type 'NoneType' has no len()rh  r   )#rg   r  r(   r   r   r)   r   rq  r8  r   Pyx_ssize_strlen_func_typer   is_pyunicode_ptrPyx_Py_UNICODE_strlen_func_typer   r!   r   r	   r  r  r  r   _map_to_capi_len_functionis_extension_typer~  r   qualified_name_ext_types_with_pysizer   PyObject_Size_func_typerf  r   c_size_t_typerO  r   )	rG   r*   r   r  r)   r   r  r  r  s	            r#   _handle_simple_function_len0OptimizeBuiltinCalls._handle_simple_function_len
  sd   
 x=A''tqAKqkc97788''C88 33.0O0Ou,,(H XX&& 3394;_;_u,,*667OQ`a	cH
 XX((",,,,++,=sxxN/I !330)UDLL2H XX!!77AJ!88//83K3K$NN99T=X=XX!*JK''8:C 33*&B&BUDLL2H XX%%$$TXXS!*.))5 5 K99Z55z7S7STT))$))T5E5E5GHHr%   objectc                     [        U5      S:w  a  U$ [        R                  " UR                  SU R                  USS9n[        R
                  " U[        R                  5      $ )z7Replace type(o) by a macro call to Py_TYPE(o).
        r   Py_TYPEFr4  )rg   r   r8  r   Pyx_Type_func_typerr  r	   r  r  s       r#   _handle_simple_function_type1OptimizeBuiltinCalls._handle_simple_function_type
  sW     x=AK++HHi!8!8 !!$
(A(ABBr%   c                 .  ^^ [        U5      S:w  a  T$ Uu  pE/ n[        U[        R                  5      (       a  UR                  n[        U5      S:X  a"  US   R
                  [        R                  La  T$ UR                  (       d  UR                  5       (       d'  [        R                  " U5      nUR                  U5        O#UR
                  [        R                  L a  U/nOT$ / n/ nU R                  5       mU GH  n	Sn
U	R                  (       au  U	R                  (       ad  TR!                  U	R                  R"                  5      nU(       a8  UR
                  (       a'  UR
                  R$                  (       a  UR
                  n
U
[        R                  L a>  WR"                  S:w  d,  UR&                  (       a  UR&                  R(                  (       d  Sn
U
b6  WR
                  R+                  SS9nX;   a  GM  UR                  U5        U/nO`U	R
                  [        R                  L a  SnXI/nO=U	R,                  (       d'  [        R                  " U	5      n	UR                  U	5        S	nXI/nUR                  [        R.                  " U	R0                  XR2                  US
S95        GM     [        R4                  4UU4S jjn[7        X5      R9                  TR
                  T5      nUSSS2    H  n[        R:                  " UU5      nM     U$ )zSReplace isinstance() checks against builtin types by the
corresponding C-API call.
r   r   r   Nr   F)exact__Pyx_TypeCheckPyObject_IsInstanceTr4  c                 |   > U" TR                   SX5      n[        R                  Ul        UR	                  T5        U$ )Nr  )r   r	   rg  r   rC  )r:   r;   make_binop_nodeor_noder'  r*   s       r#   join_with_orMOptimizeBuiltinCalls._handle_simple_function_isinstance.<locals>.join_with_or>  s5    %dhha;G%11GL!!#&Nr%   r1  )rg   r(   r   rb  r   r   r
   r  r   r  r   r.   rJ   r   r   r   r   r"   r~  scopeis_builtin_scopetype_check_functionrK  r8  r   Py_type_check_func_typer  r   rO  r  )rG   r*   r   r  r)   typesr   tests
test_nodestest_type_nodebuiltin_typer   r  type_check_argsr  r  r  r'  s    `               @r#   "_handle_simple_function_isinstance7OptimizeBuiltinCalls._handle_simple_function_isinstance  su    x=AK
eY0011JJE5zQuQx}}8I8I'Is}}--c2S!ZZ7,,,GEK
 #NL%%!''JJ~';';'@'@AE

0J0J',zzw000::'(D(D#'L'&+jj&D&D5&D&Q#&/01#&%$$(9(99&7##&"7%00%.%<%<^%LNLL0&;##&"7,,"&&(;=Y=Y( 7 $D 09/C/C 	 	 <4>>tyy#N	$B$KD!66tYGI  r%   c           	         [        U5      S:w  a  U$ US   n[        U[        R                  5      (       a  UR                  R
                  R                  (       a`  [        R                  " UR                  UR                  [        R                  S9R                  UR
                  U R                  5       5      $  U$ [        U[        R                  [        R                  45      (       a  [        UR                  5      S:X  a  [        R                   " UR                  [        R"                  [%        ['        UR                  5      5      ['        UR                  5      S9R                  UR
                  U R                  5       5      $ U$ )z-Unpack ord(Py_UNICODE) and ord('X').
        r   r   rG  rc  )rg   r(   r   r   r)   r   rf  r  r   r	   r  rO  r   r   rM  rw   r   rS  rQ  r  r  s        r#   r  0OptimizeBuiltinCalls._handle_simple_function_ordI  s    x=AKqkc97788ww||++ --GGSWW:3I3Ii		4+;+;+=>? ,  i33Y5H5HIJJ399~" ((GG*"7"7c#))n-$'		N  i		4+;+;+=>	?
 r%   r   r   r  c           
      v   UR                   nU(       a  [        U5      S:  a  U$ US   nUR                  (       a  UR                  (       d  U$ UR                  [        R
                  :w  d  UR                  [        R
                  :w  a  U$ UR                  (       a  UR                  (       d  UR                  UR                  :w  a  U$ OUR                  UR                  :w  a  U$ [        R                  " UR                  USS S9nUR                  U R                  5       SS9nUR                  (       Ga  UR                  R                  n	U	R                  (       Ga  U	R                  (       Ga  U	R                  R!                  5       U R                  5       R!                  5       :X  Gal  ["        R$                  " SS5      n
["        R&                  " U	R                  U
5      nU(       Ga,  U R(                  R*                  n[,        R.                  " UR1                  S	5      R                  5      n[,        R2                  " U	[,        R4                  " S
US5      [,        R4                  " S[,        R6                  S5      [,        R4                  " S[,        R6                  S5      /5      n[        R8                  " X}5      nU(       d-  [        R:                  " UR                  [,        R6                  S9n[        R<                  " UR                  UUXxU/SSS9$ OUR?                  S5      n[@        RB                  " SS5      nU(       a9  [        R<                  " UR                  SU RD                  XxU/UURF                  S9$ [        R<                  " UR                  SU RH                  Xx/UURF                  S9$ )zOReplace 'exttype.__new__(exttype, ...)' by a call to exttype->tp_new()
        r   r   N)r   T)skip_childrentp_new__new__PyTypeObjectr   r   r  r   F)r   may_return_noner   z4object.__new__(X): X is not a type object (NoneType)zObjectHandling.c__Pyx_tp_new_kwargs)r   rJ  r   __Pyx_tp_new)%r8   rg   r   r   r
   r  r  r"   r   rb  r   analyse_typesr   r  typeobj_cnamer  r   r   ConstructorSlotget_slot_functionr   cython_scoper	   CPtrTyper   r  r  r  rr  r  r8  r   r   r!   Pyx_tp_new_kwargs_func_typer   Pyx_tp_new_func_type)rG   r*   r   r   r  r  r8   type_arg
args_tupleext_typetp_slotslot_func_cnamer7  PyTypeObjectPtrpyx_tp_new_kwargs_func_typerJ  s                   r#   _handle_any_slot__new__,OptimizeBuiltinCalls._handle_any_slot__new__l  s    ll CIMK7{{("2"2K88w(((HMMW=N=N,NK""#..xx8==( )   CNN2K((QRA
--d . 4
 **//H***x/E/E/ENN//1T5E5E5G5T5T5VV#33HiH"+"="=hnng"V"#'<<#<#<L&0&9&9$++N;@@'BO2<2F2F &33FotT&33Fj>W>WY]^&33Hj>W>WY]^#3/  )11(LH!!*!3!3DHH:C\C\!]$77/3&F;(- $& &  11FHH #..x9KL///1Q1QF3)	  //.$*C*C+)	 r%   c                     U$ r'   rT   )rG   r*   r   r   r  r  s         r#   _handle_any_slot__class__.OptimizeBuiltinCalls._handle_any_slot__class__  s	    
 r%   r  c                     [        U5      S:w  d,  UR                  (       d  UR                  R                  (       a  U$ [        R
                  " UR                  SU R                  USUR                  S[        S5      S9$ )zLOptimistic optimisation as X.append() is almost always
referring to a list.
r   __Pyx_PyObject_AppendFrJ   )r   r0  r   rI  rJ  )
rg   rI  r   r   r   r8  r   PyObject_Append_func_typer   r$   rG   r*   r   r   r  s        r#   #_handle_simple_method_object_append8OptimizeBuiltinCalls._handle_simple_method_object_append  se     t9>T00DMM4G4GK++HH-t/M/M!LL '1
 	
r%   c                    [        U5      S:w  a  U$ Uu  pVUR                  (       d  U$ [        UR                  5      nUR                  c  [        U5      S:  a   U$ U R                  XRUS5      n	U(       d  UR                  U	l        U	$ U	=p[        U5      S:  a+  UR                  5       (       d  [         R"                  " U5      n
/ nUS   nUR                  5       (       d'  [         R"                  " U5      nUR%                  U5        [        R&                  " UR(                  SU R*                  X/S[-        S	5      S
9nUSSS2    H  nUR                  5       (       d'  [         R"                  " U5      nUR%                  U5        [        R.                  " UR(                  S[        R&                  " UR(                  SU R*                  X/SS[-        S5      S9U[0        R2                  S9nM     UR                  Ul        XLa  UR%                  U
5        U H*  n[         R4                  " X5      nUR                  Ul        M,     U$ )zReplace list.extend([...]) for short sequence literals values by sequential appends
to avoid creating an intermediate sequence argument.
r   N   r   Textendr1  __Pyx_PyList_Append
ListAppendrr  |__Pyx_ListComp_AppendListCompAppend)r   r^  r   rJ  r/  )rg   r  r  r   mult_factorr(   r   rc  r  r3  r   r   r  _wrap_self_argrI  r  r   r  rJ   r8  r   rI  r$   r  r	   c_returncode_typer  )rG   r*   r   r   r  r8   rw   r   
tuple_nodewrapped_obj
cloned_objr   r)   r   r  s                  r#   !_handle_simple_method_list_extend6OptimizeBuiltinCalls._handle_simple_method_list_extend  s    t9>K
,,KUZZ (CJN  K))#9JHU)-)<)<K&&&
u:>#--//"--c2J Bi}}&&s+CLL//HH+T-K-K"'5	7
 R=C==??**3/S! ++#,,HH5t7U7U$*H !/0@!A	C
 11	H	 ! #'"5"5 LL$D 55dEH&*&9&9H#  r%   	bytearrayc           
         [        U5      S:w  a  U$ SnU R                  n[        US   5      nUR                  R                  (       d  [        U[        R                  5      (       aF  UR                  [        R                  U R                  5       5      n[        R                  " SS5      nOUR                  (       a]  UR                  5       (       d  U$ UR                  [        R                   U R                  5       5      n[        R                  " SS5      nOCUR                  R"                  (       a&  SnU R$                  n[        R                  " SS5      nOU$ [        R&                  " UR(                  XVUS   U/S	UR*                  US
9n	UR,                  (       a*  U	R                  UR                  U R                  5       5      n	U	$ )Nr   __Pyx_PyByteArray_Appendr   ByteArrayAppendrq  __Pyx_PyByteArray_AppendObjectByteArrayAppendObjectr   Fr   r0  r   rJ  )rg   PyByteArray_Append_func_typer,   r   r   r(   r   r   rO  r	   rS  r   r   r!   is_string_literalcan_coerce_to_char_literalrs  r   "PyByteArray_AppendObject_func_typer8  r   r   rI  )
rG   r*   r   r   r  	func_namer  rw   rJ  r   s
             r#   &_handle_simple_method_bytearray_append;OptimizeBuiltinCalls._handle_simple_method_bytearray_append"  sf   t9>K.	55	#DG,::
5)2C2C D DOOJ$9$94;K;K;MNE&223DoVL$$3355OOJ$:$:D<L<L<NOE&223DoVLZZ##8I??I&223JO\LK//HHiq'5!!LL%
 ))$))T5E5E5GHHr%   py_indexc_index	is_signed)has_varargsc                 $    U R                  XX4SS9$ )NT)is_list) _handle_simple_method_object_poprJ  s        r#   _handle_simple_method_list_pop3OptimizeBuiltinCalls._handle_simple_method_list_popQ  s#    44DT 5 C 	Cr%   c                    U(       d  U$ US   nU(       a  SnUR                  SSS/S9nOSn[        U5      S:X  aE  [        R                  " UR                  S	U-  U R
                  U/S
UR                  [        S5      S9$ [        U5      S:X  Ga[  [        US   5      n[        R                  " UR                  5      n	UR                  n
UR                  R                  (       d  [        U[        R                  5      (       aN  UR                  U R                  5       5      n	UR!                  ["        R$                  U R                  5       5      nOU(       a  UR                  R&                  (       a5  UR)                  U R                  5       5      n	[        R*                  " U	5      nUR!                  ["        R$                  U R                  5       5      nOvU$ ["        R,                  " UR                  ["        R$                  5      (       d  U$ [        U[        R                  5      (       a  UR                  U R                  5       5      n	U
R                  (       d  UR                  n
U
R/                  U R                  5       5      (       d  U$ U
R0                  n["        R2                  " ["        R4                  ["        R6                  " SU
S5      /5      n[        R                  " UR                  SU-  U R8                  XiU[        R                  " UR                  [;        U
R<                  =(       a    S=(       d    S5      U
R<                  =(       a    S=(       d    S["        R>                  S9[        R@                  " UR                  ["        RB                  U
RE                  5       5      [        R@                  " UR                  X5      /S
UR                  [        S5      S9$ U$ )zLOptimistic optimisation as X.pop([n]) is almost always
referring to a list.
r   List*'NoneType' object has no attribute '%.30s'r  popr  Objectr   z__Pyx_Py%s_PopTrd  r   intvalNz__Pyx_Py%s_PopIndexr   	pop_index)#r   rg   r   r8  r   PyObject_Pop_func_typer   r$   r,   r  r   r   r(   r   r  r   rO  r	   r  r   rn  rp  numeric_type_fitscreate_to_py_utility_codeto_py_functionr  r  r  PyObject_PopIndex_func_typerQ  signedrS  RawCNameExprNodec_void_typeempty_declaration_code)rG   r*   r   r   r  rq  r8   r  r
  rl  orig_index_typeconvert_funcconversion_types                r#   rr  5OptimizeBuiltinCalls._handle_simple_method_object_popU  s    K1gI''<,"G ( %C
 !It9>//*Y6++U $+E2  Y!^'Q0E ))%))4H#jjO::$$eY%6%677$778H8H8JKH!OOJ,H,H$JZJZJ\]Ezz--#(#9#9$:J:J:L#M ) 3 3H =!OOJ,H,H$JZJZJ\]EK11%**j>Z>Z[[E9#4#455 33D4D4D4FG"))"'**"<<T=M=M=OPP*99L(22))J,C,CHo_c,d+egO///);00U''		_=S=S=YXY=^]^9_8G8N8N8TST8YXY-7-B-BD  00J<R<R1@1W1W1Y[00OZ\ !%+K8  r%   c           	          [        U5      S:w  a  U$ U R                  XSU R                  SXC5      R                  UR                  U R
                  5      $ )z?Call PyList_Sort() instead of the 0-argument l.sort().
        r   PyList_Sortr  )rg   _substitute_method_callsingle_param_func_typerO  r   r   rJ  s        r#   _handle_simple_method_list_sort4OptimizeBuiltinCalls._handle_simple_method_list_sort  sQ     t9>K++M4+F+F%--6Ytyy$BRBR-S	Tr%   keydefaultc                    [        U5      S:X  a0  UR                  [        R                  " UR                  5      5        O$[        U5      S:w  a  U R                  SXS5        U$ U R                  XSU R                  SXCS[        S5      S	9	$ )
z:Replace dict.get() by a call to PyDict_GetItem().
        r   r   zdict.get2 or 3__Pyx_PyDict_GetItemDefaultr1  Tdict_getitem_defaultr0  rJ  )	rg   rJ   r   r  r   r  r  Pyx_PyDict_GetItem_func_typer$   rJ  s        r#   _handle_simple_method_dict_get3OptimizeBuiltinCalls._handle_simple_method_dict_get  s     t9>KK	**48845Y!^''
DIK++)4+L+L$")*@A , C 	Cr%   is_safe_typec                 *   [        U5      S:X  a0  UR                  [        R                  " UR                  5      5        O$[        U5      S:w  a  U R                  SXS5        U$ US   R                  nUR                  (       a  [        UR                  S;   5      nOU[        R                  L a  SnOSnUR                  [        R                  " UR                  [        U5      US	95        U R                  XS
U R                  SXCS[!        S5      S9	$ )zUReplace dict.setdefault() by calls to PyDict_GetItem() and PyDict_SetItem().
        r   r   zdict.setdefaultr  r   z%str bytes unicode float int long boolr1  r   r  __Pyx_PyDict_SetDefault
setdefaultTdict_setdefaultr  )rg   rJ   r   r  r   r  r   r~  rj  r"   r	   r  r   rQ  r  Pyx_PyDict_SetDefault_func_typer$   )rG   r*   r   r   r  key_typer  s          r#   %_handle_simple_method_dict_setdefault:OptimizeBuiltinCalls._handle_simple_method_dict_setdefault  s     t9>KK	**48845Y!^''(94xPK7<<##x}}F G HL222LLI%%HHC-|M 	N ++%t'K'K+ '(9: , < 	<r%   c                 f   SnSnU R                   n[        U5      S:X  a0  UR                  [        R                  " UR
                  5      5        OF[        U5      S:X  a"  UR                  (       d  SnSnU R                  nOU R                  SXS5        U$ U R                  XXWS	XCS
[        U5      S9	$ )z7Replace dict.pop() by a call to _PyDict_Pop().
        __Pyx_PyDict_Poppy_dict_popr   r   __Pyx_PyDict_Pop_ignorepy_dict_pop_ignorezdict.popr  rx  Tr  )PyDict_Pop_func_typerg   rJ   r   r  r   rI  PyDict_Pop_ignore_func_typer  r  r$   )rG   r*   r   r   r  	capi_funcr  r  s           r#   _handle_simple_method_dict_pop3OptimizeBuiltinCalls._handle_simple_method_dict_pop  s     '	)--	t9>KK	**48845Y!^&&5	$8! <<	''
DIK++$ '(9: , < 	<r%   op1op2cvalinplacezerodiv_checkc                 (    U R                  SXX45      $ NAdd_optimise_num_binoprJ  s        r#   $_handle_simple_method_object___add__9OptimizeBuiltinCalls._handle_simple_method_object___add__      ''ttWWr%   c                 (    U R                  SXX45      $ NSubtractr  rJ  s        r#   $_handle_simple_method_object___sub__9OptimizeBuiltinCalls._handle_simple_method_object___sub__      ''
DD\\r%   c                 (    U R                  SXX45      $ )NMultiplyr  rJ  s        r#   $_handle_simple_method_object___mul__9OptimizeBuiltinCalls._handle_simple_method_object___mul__  r  r%   c                 (    U R                  SXX45      $ NEqr  rJ  s        r#   #_handle_simple_method_object___eq__8OptimizeBuiltinCalls._handle_simple_method_object___eq__!      ''ddVVr%   c                 (    U R                  SXX45      $ NNer  rJ  s        r#   #_handle_simple_method_object___ne__8OptimizeBuiltinCalls._handle_simple_method_object___ne__$  r  r%   c                 (    U R                  SXX45      $ )NAndr  rJ  s        r#   $_handle_simple_method_object___and__9OptimizeBuiltinCalls._handle_simple_method_object___and__'  r  r%   c                 (    U R                  SXX45      $ )NOrr  rJ  s        r#   #_handle_simple_method_object___or__8OptimizeBuiltinCalls._handle_simple_method_object___or__*  r  r%   c                 (    U R                  SXX45      $ )NXorr  rJ  s        r#   $_handle_simple_method_object___xor__9OptimizeBuiltinCalls._handle_simple_method_object___xor__-  r  r%   c                     [        U5      S:w  d"  [        US   [        R                  5      (       d  U$ US   R	                  5       (       a  SUS   R
                  s=::  a  S::  d   U$   U$ U R                  SXX45      $ )Nr   r   ?   Rshiftrg   r(   r   r   r   r=   r  rJ  s        r#   '_handle_simple_method_object___rshift__<OptimizeBuiltinCalls._handle_simple_method_object___rshift__0  w    t9>DGY5F5F!G!GKAw**,,Q$q':Q:Q5WUW5WK 6XK''$$ZZr%   c                     [        U5      S:w  d"  [        US   [        R                  5      (       d  U$ US   R	                  5       (       a  SUS   R
                  s=::  a  S::  d   U$   U$ U R                  SXX45      $ )Nr   r   r  Lshiftr  rJ  s        r#   '_handle_simple_method_object___lshift__<OptimizeBuiltinCalls._handle_simple_method_object___lshift__7  r  r%   c                 (    U R                  SXX45      $ N	Remainder_optimise_num_divrJ  s        r#   $_handle_simple_method_object___mod__9OptimizeBuiltinCalls._handle_simple_method_object___mod__>  s    %%k44[[r%   c                 (    U R                  SXX45      $ )NFloorDivider  rJ  s        r#   )_handle_simple_method_object___floordiv__>OptimizeBuiltinCalls._handle_simple_method_object___floordiv__A  s    %%mTT]]r%   c                 (    U R                  SXX45      $ N
TrueDivider  rJ  s        r#   (_handle_simple_method_object___truediv__=OptimizeBuiltinCalls._handle_simple_method_object___truediv__D  s    %%lDD\\r%   c                 (    U R                  SXX45      $ NDivider  rJ  s        r#   $_handle_simple_method_object___div__9OptimizeBuiltinCalls._handle_simple_method_object___div__G  s    %%hXXr%   c                    [        U5      S:w  d+  US   R                  5       (       a  US   R                  S:X  a  U$ [        US   [        R
                  5      (       a!  SUS   R                  s=::  a  S::  d   U$   U$ OE[        US   [        R                  5      (       a!  SUS   R                  s=::  a  S::  d   U$   U$ OU$ U R                  XX4U5      $ )Nr   r   r   r   r   l       l          )rg   r   r=   r(   r   r   r  r  )rG   rs   r*   r   r   r  s         r#   r  &OptimizeBuiltinCalls._optimise_num_divX  s    t9>a!<!<!>!>$q'BYBY]^B^Kd1gy0011d1g55>> ? ?Q!4!455d1g55>> ? ? K''HYZZr%   c                 (    U R                  SXX45      $ r  r  rJ  s        r#   #_handle_simple_method_float___add__8OptimizeBuiltinCalls._handle_simple_method_float___add__e  r  r%   c                 (    U R                  SXX45      $ r  r  rJ  s        r#   #_handle_simple_method_float___sub__8OptimizeBuiltinCalls._handle_simple_method_float___sub__h  r  r%   c                 (    U R                  SXX45      $ r  r  rJ  s        r#   '_handle_simple_method_float___truediv__<OptimizeBuiltinCalls._handle_simple_method_float___truediv__k  s    ''dd^^r%   c                 (    U R                  SXX45      $ r  r  rJ  s        r#   #_handle_simple_method_float___div__8OptimizeBuiltinCalls._handle_simple_method_float___div__n  s    ''$$ZZr%   c                 (    U R                  SXX45      $ r  r  rJ  s        r#   #_handle_simple_method_float___mod__8OptimizeBuiltinCalls._handle_simple_method_float___mod__q  s    ''TT]]r%   c                 (    U R                  SXX45      $ r  r  rJ  s        r#   "_handle_simple_method_float___eq__7OptimizeBuiltinCalls._handle_simple_method_float___eq__t  r  r%   c                 (    U R                  SXX45      $ r  r  rJ  s        r#   "_handle_simple_method_float___ne__7OptimizeBuiltinCalls._handle_simple_method_float___ne__w  r  r%   c                    [        USS5      (       a  U$ [        U5      S:w  a  U$ UR                  R                  (       a  [        R
                  nO6UR                  [        R                  L a  US;   a  [        R                  nOU$ [        XXdS   US   5      nU(       d  U$ Uu  pp[        U Vs/ s H  oR                  R                  PM     sn5      (       d   e[        U5      U
-   nU R                  X#UU R                  X4   SUSS R                  5       -  XTS	S
U	S9
nUR                  R                  (       a@  UR                  (       d/  [        R                  " XR                  5       UR                  5      nU$ s  snf )I
Optimise math operators for (likely) float or small integer operations.
special_bool_cmp_functionNr   r  r  r   r   z__%s__r   TF)r0  with_none_checkrJ  )r  rg   r   r   r	   r  rg  optimise_numeric_binopr  r  r  Pyx_BinopInt_func_typeslowerr   r   r   )rG   rs   r*   r   r   r  ret_typer  
func_cnamerJ  
extra_argsnum_typer)   r  s                 r#   r  (OptimizeBuiltinCalls._optimise_num_binopz  s\    44d;;Kt9>K99  !00HYY*000X5M!--HK'q'4PQ7SK9?6
*D9DSHH((D9::::DzJ&00((()=>x|))++-> !% 1 '	 99  )=)=!44Y@P@P@RTXT]T]^I :s   2Fucharc                    U(       d  [        U5      S:w  a  U$ US   n[        U[        R                  5      (       a%  UR                  R
                  R                  (       d  U$ UR                  nUR                  n[        R                  " SS[        US9S9nSUR                  5       -  n	U R                  XXR                  XtU/US9n
UR
                  R                  (       a  U
R                  U R                   5      n
U
$ )	Nr   r   py_unicode_predicaterq  )r  r   z__Pyx_Py_UNICODE_%sr  )rg   r(   r   r   r)   r   rf  r9   r   r!   r   upperr  #PyUnicode_uchar_predicate_func_typer   r  r   )rG   r*   r   r   r  ustringr  r  rJ  r  	func_calls              r#   _inject_unicode_predicate.OptimizeBuiltinCalls._inject_unicode_predicate  s    D	QKq''9#?#?@@;;##33K(()55"O[1
 .0A0A0CC00CCUG'	 1 )	
 99  !44T5E5EFIr%   rQ  keependsc           	          [        U5      S;  a  U R                  SXS5        U$ U R                  XSS5        U R                  XSU R                  SXC5      $ )zVReplace unicode.splitlines(...) by a direct call to the
corresponding C-API function.
r  zunicode.splitlinesz1 or 2r   FPyUnicode_Splitlines
splitlines)rg   r  _inject_bint_default_argumentr  PyUnicode_Splitlines_func_typerJ  s        r#   (_handle_simple_method_unicode_splitlines=OptimizeBuiltinCalls._handle_simple_method_unicode_splitlines  sa     t9E!''(<d(SK**4q%@++"D$G$G+3 	3r%   sepmaxsplitc           	      n   [        U5      S;  a  U R                  SXS5        U$ [        U5      S:  a0  UR                  [        R                  " UR
                  5      5        OU R                  US5        U R                  XS[        R                  S5        U R                  XSU R                  SXC5      $ )	zQReplace unicode.split(...) by a direct call to the
corresponding C-API function.
)r   r   r   zunicode.split1-3r   r   re  PyUnicode_Splitsplit)rg   r  rJ   r   r  r   _inject_null_for_none_inject_int_default_argumentr	   r  r  PyUnicode_Split_func_typerJ  s        r#   #_handle_simple_method_unicode_split8OptimizeBuiltinCalls._handle_simple_method_unicode_split  s     t9G#''UKKt9q=KK	**48845&&tQ/)):77	? ++t==&. 	.r%   seqc           	         [        U5      S:w  a  U R                  SXS5        U$ [        US   [        R                  5      (       a  US   nUR
                  n[        U5      nU(       a  [        R                  " UR                  US[        R                  S9nU HF  u  p[        R                  " U	R                  U	UR                  S9n[        R                  " XZU5        MH     XS'   U R                  XSU R                   S	XC5      $ )
zN
unicode.join() builds a list first => see if we can do this more efficiently
r   zunicode.join2r   r  r  r  PyUnicode_Joinr  )rg   r  r(   r   r  r  rf   r  r   r
   r   r  r   r   r  r  PyUnicode_Join_func_type)rG   r*   r   r   r  r  r*  rh   inlined_genexprr  r  r  s               r#   "_handle_simple_method_unicode_join7OptimizeBuiltinCalls._handle_simple_method_unicode_join  s     t9>''CHKd1gy@@AA GM%**I5i@"+"J"JHHmv'.'8'8#: :J5$"+"C"C(,,-.55#7K
 44]U`a :J *Q++d;;%- 	-r%   	substringr6  end	directionc           
      6    U R                  XX4SS[        S5      $ )NrQ  endswithr   _inject_tailmatchunicode_tailmatch_utility_coderJ  s        r#   &_handle_simple_method_unicode_endswith;OptimizeBuiltinCalls._handle_simple_method_unicode_endswithF  s#    %%DUJ*B0 	0r%   c           
      6    U R                  XX4SS[        S5      $ )NrQ  
startswithr1  rH  rJ  s        r#   (_handle_simple_method_unicode_startswith=OptimizeBuiltinCalls._handle_simple_method_unicode_startswithK  s#    %%DUL*B0 	0r%   c	                 8   [        U5      S;  a  U R                  U SU 3XS5        U$ U R                  XS[        R                  S5        U R                  XS[        R                  S5        UR                  [        R                  " UR                  [        U5      [        R                  S95        US	:X  a  S
n	OSUR                  5        S3n	U R                  XXR                  XdUUS9n
U
R                  [        R                   U R#                  5       5      $ )zpReplace unicode.startswith(...) and unicode.endswith(...)
by a direct call to the corresponding C-API function.
r   r      r  2-4r   r   r   PY_SSIZE_T_MAXrw   r   rQ  __Pyx_PyUnicode_Tailmatch__Pyx_Py
_Tailmatchr  )rg   r  r7  r	   r  rJ   r   r   r   rQ  rS  
capitalizer  PyString_Tailmatch_func_typerO  r
   rT  r   )rG   r*   r   r   r  r  r  rJ  rE  ri  method_calls              r#   rI  &OptimizeBuiltinCalls._inject_tailmatchP  s   
 t9G#''9+Q{m(DdRWXK)):77	>)):779I	KI%%HHC	N1F1FH 	I 3I"9#7#7#9":*EI2288D'	 3 )
 $$W%6%68H8H8JKKr%   rR  c                 *    U R                  XX4SS5      $ )Nfindr   _inject_unicode_findrJ  s        r#   "_handle_simple_method_unicode_find7OptimizeBuiltinCalls._handle_simple_method_unicode_findu  s     ((DVRA 	Ar%   c                 *    U R                  XX4SS5      $ )Nrfindr1  r`  rJ  s        r#   #_handle_simple_method_unicode_rfind8OptimizeBuiltinCalls._handle_simple_method_unicode_rfindy  s     ((DWbB 	Br%   c           	         [        U5      S;  a  U R                  SU-  XS5        U$ U R                  XS[        R                  S5        U R                  XS[        R                  S5        UR                  [        R                  " UR                  [        U5      [        R                  S95        U R                  XS	U R                  XTU5      nUR                  U R                  5       5      $ )
zgReplace unicode.find(...) and unicode.rfind(...) by a
direct call to the corresponding C-API function.
rR  z
unicode.%srT  r   r   r   rU  rV  PyUnicode_Find)rg   r  r7  r	   r  rJ   r   r   r   rQ  rS  r  PyUnicode_Find_func_typer  r   )rG   r*   r   r   r  r  rE  r\  s           r#   ra  )OptimizeBuiltinCalls._inject_unicode_find}  s    
 t9G#''{(BDPUVK)):77	>)):779I	KI%%HHC	N1F1FH 	I 22,d.K.KD2 --d.>.>.@AAr%   c           	      N   [        U5      S;  a  U R                  SXS5        U$ U R                  XS[        R                  S5        U R                  XS[        R                  S5        U R                  XSU R                  S	XC5      nUR                  U R                  5       5      $ )
zQReplace unicode.count(...) by a direct call to the
corresponding C-API function.
rR  zunicode.countrT  r   r   r   rU  PyUnicode_Countcount)	rg   r  r7  r	   r  r  PyUnicode_Count_func_typer  r   )rG   r*   r   r   r  r\  s         r#   #_handle_simple_method_unicode_count8OptimizeBuiltinCalls._handle_simple_method_unicode_count  s     t9G#''UKK)):77	>)):779I	K 22-t/M/M&. --d.>.>.@AAr%   replstrmaxcountc           	          [        U5      S;  a  U R                  SXS5        U$ U R                  XS[        R                  S5        U R                  XSU R                  SXC5      $ )zSReplace unicode.replace(...) by a direct call to the
corresponding C-API function.
)r   rS  zunicode.replacez3-4r   re  PyUnicode_ReplacerA  )rg   r  r7  r	   r  r  PyUnicode_Replace_func_typerJ  s        r#   %_handle_simple_method_unicode_replace:OptimizeBuiltinCalls._handle_simple_method_unicode_replace  sn     t9E!''(94uMK)):77	? ++/1Q1Q(0 	0r%   encodingerrors)UTF8UTF16UTF-16LEUTF-16BELatin1ASCIIunicode_escaperaw_unicode_escapec                 .   [        U5      S:  d  [        U5      S:  a  U R                  SXS5        U$ US   nU R                  UR                  U5      nUc  U$ Uu  pxpUR	                  5       (       a^   UR
                  R                  Xy5      n[        X=(       d    S5      n[        R                  " UR                  U[        R                  S9$ [        U5      S:X  aA  [        R                  " UR                  5      nU R                  XSU R                  S	XEX/5      $ U(       aE  U	S
:X  a?  U R                  U5      nUb+  SU;  a%  SU-  nU R                  XUU R                   S	XE/5      $ U R                  XSU R                  S	UXXU
/5      $ !    N= f)zOReplace unicode.encode(...) by a direct C-API call to the
corresponding codec.
r   r   zunicode.encoder3  r   zUTF-8rV  PyUnicode_AsEncodedStringrL  strictr  zPyUnicode_As%sString)rg   r  _unpack_encoding_and_error_moder   r   r=   rL  r   r   rM  r
   r   r  r  #PyUnicode_AsEncodedString_func_type_find_special_codec_namePyUnicode_AsXyzString_func_type)rG   r*   r   r   r  string_node
parametersry  encoding_nodeerror_handlingerror_handling_noderw   	null_node
codec_nameencode_functions                  r#   $_handle_simple_method_unicode_encode9OptimizeBuiltinCalls._handle_simple_method_unicode_encode  s    t9q=CIM''(8$eLK1g99$((DI
KGQD**,,b#33::8T
 &e-@A **;??%gN`N`aat9>!**4884I// ;88+9-PR R
 (266x@J%#Z*?"8:"E33O88/@ @
 ++744')<=	? 	?1s   5F Fstringrl  r7  decode_funcc                    S[        U5      s=::  a  S::  d  O  U R                  SXS5        U$ US   nU R                  UR                  U5      nUc  U$ Uu  pxpUR	                  5       (       aD   UR
                  R                  Xy5      n[        UR                  [        U5      UR
                  S9$ S=p[        U[        R                  5      (       a>  UnUR                  nUR                   UR"                  pU(       a  UR
                  S:X  a  Sn[        U[        R$                  5      (       a  UR&                  nUR(                  nU[*        R,                  [*        R.                  4;   a7  U(       a  UR1                  SS	UR2                  /S
9nO7UR1                  SSS	/S9nO$UR4                  (       d  UR6                  (       d  U$ U(       d!  [        R8                  " UR                  SSS9nOIUR(                  R:                  (       d.  UR=                  [>        R@                  U RC                  5       5      nU(       aI  UR(                  R:                  (       d.  UR=                  [>        R@                  U RC                  5       5      nSnUb  U RE                  U5      nUbl  US;   a  SURG                  SS5      -  nOSU-  n[        RH                  " UR                  U RJ                  US9n[        RL                  " UR                  5      nO [        RL                  " UR                  5      n/ nUR4                  (       a|  U(       de  URN                  (       d'  [P        RR                  " U5      nURU                  U5        [        RV                  " UR                  SU RX                  U/SS9nU RZ                  nSnGOUR6                  (       GaT  U(       d.  [        R8                  " UR                  S[        R\                  S9nU R^                  c  [>        R`                  " [*        Rb                  [>        Rd                  " SUS5      [>        Rd                  " S[>        R@                  S5      [>        Rd                  " S[>        R@                  S5      [>        Rd                  " S[>        Rf                  S5      [>        Rd                  " S[>        Rf                  S5      [>        Rd                  " S U RJ                  S5      /5      U l/        U R^                  nS!UR2                   3nOYU(       d.  [        R8                  " UR                  S[        R\                  S9nU Rh                  nU[*        R,                  L a  S"nOS#n[        RV                  " UR                  S$U-  UX\XU
U/URj                  [l        Rn                  " US%5      S&9nUSSS'2    H  n[P        Rp                  " UU5      nM     U$ ! [        [        [        4 a     GNSf = f)(zsReplace char*.decode() by a direct C-API call to the
corresponding codec, possibly resolving a slice on the char*.
r   r   zbytes.decoder3  r   Nrw   r[  @descriptor '%s' requires a '%s' object but received a 'NoneType'decoder  rw  r  r  r   r  )r|  r}  r~  z__Pyx_PyUnicode_Decode%sr  r  zPyUnicode_Decode%s)r   r"  r  Tr4  decode_c_stringrU  r  r6  r7  ry  rz  r  decode_cpp_decode_bytesdecode_bytearrayz__Pyx_%srq  rr  r1  )9rg   r  r  r   r   r=   r  r   r   r#  
ValueErrorUnicodeDecodeErrorr(   r   r;  r   r6  r7  r   r)   r   r
   r   r   r   r"   rq  is_cpp_stringr   r   rO  r	   r  r   r  rA  r  !PyUnicode_DecodeXyz_func_ptr_typer  r   r   r  rJ   r8  r  _decode_c_string_func_typer   _decode_cpp_string_func_typer  r   r  rN  _decode_bytes_func_typer   r   r!   r  )rG   r*   r   r   r  r  r  ry  r  r  r  r=   r6  r7  r  string_typer  codec_cnamedecode_functionr   helper_func_typer  r  s                          r#   "_handle_simple_method_bytes_decode7OptimizeBuiltinCalls._handle_simple_method_bytes_decode!  s    SY#!#''EJK 1g99$((DI
KGQD**,,	"-"="="D"DX"^ #OO'8 + ; ;  k9#;#;<<$J$//K$**JOO4E11Q6k9#?#?@@%//K!&&7--w/E/EFF );;V!);+;+; < < > *;;@0!)
 < , &&{/H/HK%%dhhc1ME""OOJ$@$@$BRBRBTUE		((>>*">">@P@P@RSD 
66x@J!>>8:;M;McSU;VV2Z?'88tEE[ZO%..txx8M'00:O   "**"+"6"6{"CKLL- 33OO%94;Z;Z% 
  $>> 1&&& ((9I9B9Q9QS0084>4H4H(("//+tL"//9U9UW[\"//
8T8TVZ["//
J<\<\^bc"//*:Z:Z\`a"//t?e?egkl+51  $@@"-k.>.>-? @  ((9I9B9Q9QS#;;g000$2!$6!++HHj#446Fd;NP_`LL$001BOT	
 $B$KD11$=D  _ #J0BC s   /W- -XXc                 "    [         R                  " U5      nU R                   HS  u  p4XB:X  d  M  SU;   a?  SR	                  UR                  S5       Vs/ s H  nUR                  5       PM     sn5      nUs  $    g ! [         a     g f = fs  snf )Nr5  r  )r   
getencoderLookupError_special_codecsr  r5  rZ  )rG   ry  requested_codecr"   codecr-  s         r#   r  -OptimizeBuiltinCalls._find_special_codec_name  s    	$//9O  //KD'$;77-1ZZ_$>-< %&LLN-<$> ?D 0   		
$>s   A< B
<
B	B	c                     [         R                  " U5      n[        U5      S:  a  U R                  US   5      u  pEUc  g OS nUn[        U5      S:X  a#  U R                  US   5      u  pgUc  g US:X  a  UnOSnUnXEXg4$ )Nr   r   r   r  )r   r  rg   _unpack_string_and_cstring_node)rG   r   r   r  ry  r  r  r  s           r#   r  4OptimizeBuiltinCalls._unpack_encoding_and_error_mode  s    &&s+	t9>&*&J&J4PQ7&S#H$ % H%Mt9>262V2VW[\]W^2_/N"*)&/#%N"+MMr%   c                    [        U[        R                  5      (       a  UR                  n[        U[        R                  5      (       aK  UR
                  n[        R                  " UR                  UR                  5       [        R                  S9nX!4$ [        U[        R                  5      (       aV  UR
                  R                  S5      n[        R                  " UR                  UR
                  [        R                  S9nX!4$ UR                  [        R                  L a3  S nUR                  [        R                  U R!                  5       5      nX!4$ UR                  R"                  (       a  S nX!4$ S =p!X!4$ )NrV  z
ISO-8859-1)r(   r   r   r)   r   rw   rM  r   as_utf8_stringr	   rN  r  r   r
   r   rO  r   rq  )rG   r*   ry  s      r#   r  4OptimizeBuiltinCalls._unpack_string_and_cstring_node  s:   dI889988DdI1122zzH&& 7 7 9
@`@`bD ~ i1122zz((6H&&

1Q1QSD ~ YY',,,H>>*"B"BDDTDTDVWD
 ~	 YY  H ~ #"H~r%   c           
      6    U R                  XX4SS[        S5      $ )Nrk  rG  r   rI  bytes_tailmatch_utility_coderJ  s        r#   $_handle_simple_method_bytes_endswith9OptimizeBuiltinCalls._handle_simple_method_bytes_endswith  s#    %%DWj(". 	.r%   c           
      6    U R                  XX4SS[        S5      $ )Nrk  rN  r1  r  rJ  s        r#   &_handle_simple_method_bytes_startswith;OptimizeBuiltinCalls._handle_simple_method_bytes_startswith  s#    %%DWl(". 	.r%   rT   c                     [        U5      nU(       a   U(       a  U R                  US   X&U5      US'   U	c  UR                  n	[        R                  " UR
                  X4UU	UU
UR                  S9$ )Nr   )r   r   rJ  r0  rI  )r  rW  r   r   r8  r   rI  )rG   r*   r   r"   r  r  r  r   rJ  r   r0  r  s               r#   r  ,OptimizeBuiltinCalls._substitute_method_call  sn    
 Dzt))$q'8PYZDG?llG++HHd'-!00 	r%   c                     UR                   (       a  U$ U(       a'  UR                  SXAR                  R                  /S9nU$ UR                  SR	                  [        U5      S::  a  SOS5      SU/S9nU$ )	Nr  r  r  r  r  r  r  r  )rK  r   r   r"   r  rg   )rG   self_argr   r  r  s        r#   rW  #OptimizeBuiltinCalls._wrap_self_arg	  s    O11R&(:(:; 2 =H 	  11;BBCPYN^`L`5fhi,&K 2 )H r%   c           	      &   [        U5      U::  a  g X   nUR                  (       a   [        R                  " UR                  5      OI[        R
                  " UR                  SU R                  UR                  U R                  5       5      /SS9X'   g )N__Pyx_NoneAsNullr   r4  )	rg   rN  r   r  r   r8  obj_to_obj_func_typern  r   )rG   r   r
  r)   s       r#   r6  *OptimizeBuiltinCalls._inject_null_for_none  sr    t9k58[[i((1iFbFbGG'%%&&t'7'7'9:;	G
r%   c           	         [        U5      U:  d   e[        U5      U:X  d  X#   R                  (       a9  UR                  [        R                  " UR
                  [        U5      XES95        g X#   R                  X@R                  5       5      n[        U[        R                  5      (       a  [        U5      Ul        XbU'   g )Nrd  )rg   rN  rJ   r   r   r   rQ  rO  r   r(   r_  special_none_cvalue)rG   r*   r   	arg_indexr   default_valuer)   s          r#   r7  1OptimizeBuiltinCalls._inject_int_default_argument'  s     4yI%%%t9	!T_%<%<KK	))$((#m:L/3T U /++D2B2B2DEC#y==>>*-m*<'!Or%   c                     [        U5      U:  d   e[        U5      U:X  a;  [        U5      nUR                  [        R                  " UR
                  UUS95        g X#   R                  U R                  5       5      X#'   g Nr  )rg   r  rJ   r   r   r   rU  r   )rG   r*   r   r  r  s        r#   r,  2OptimizeBuiltinCalls._inject_bint_default_argument5  so    4yI%%%t9	! /MKK	**488=;HJ K #o??@P@P@RSDOr%   )r  r'   r  )r^   r_   r`   ra   rb   rH  rK  rQ   rV  r	   r  r  r  r`  rb  ri  rs  r
   r   r  rS  ru  rh  c_float_typer  c_longdouble_typer  rg  rt  r  r  r  r  r  r  r  r   r  r  _handle_simple_function_strr  r   r  r.  r   r  r   r   r  r  r   r  r#  r   r  r  r  r  r  r  r  r  r  memoryview_typer  r  r  r  rN  r  c_const_py_unicode_ptr_typer  r	  r   r1  r  r  r  r  r  r  rg  r  r&  r  r:  r9  rB  rE  rX  rI  rK  r\  re  rh  rj  r|  r  rs  rr  r  r  r  r  r  r  r  r0  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  !_handle_simple_method_int___add__!_handle_simple_method_int___sub__!_handle_simple_method_int___mul__ _handle_simple_method_int___eq__ _handle_simple_method_int___ne__!_handle_simple_method_int___and__ _handle_simple_method_int___or__!_handle_simple_method_int___xor__$_handle_simple_method_int___rshift__$_handle_simple_method_int___lshift__!_handle_simple_method_int___mod__&_handle_simple_method_int___floordiv__%_handle_simple_method_int___truediv__r  r  r   r  r  r	  r  r  r  r#  r&  %_handle_simple_method_unicode_isalnum%_handle_simple_method_unicode_isalpha'_handle_simple_method_unicode_isdecimal%_handle_simple_method_unicode_isdigit%_handle_simple_method_unicode_islower'_handle_simple_method_unicode_isnumeric%_handle_simple_method_unicode_isspace%_handle_simple_method_unicode_istitle%_handle_simple_method_unicode_isupper)_handle_simple_method_unicode_isprintable$PyUnicode_uchar_conversion_func_typer-  r.  r8  r9  r?  rA  r[  rK  rO  rI  rj  rb  rf  ra  ro  rp  rv  rw  r  r  _special_encodingsr   r  r  r  r8  r  r  r  r  r  &_handle_simple_method_bytearray_decoder  r  r  r  r  r   r8  r0  r  rW  r  r6  r7  r,  rd   ).0r  r	   ctyper  r"   r   s   0000000r#   rE  rE  "  s    	 
  *33!!##C)B)BDI$ 
.&P $.#7#7##GW-?-?F##GZ-I-I4P##NJ4I4I4P!
 '$  < &22J4L4LjNjNjk
 lJ	 	J((''z4@ 	 l3j &//##E:+D+DdK 
 	 )22  ##E:+D+DdK#
 	
3>$(BX5  ",!5!5##E:+D+DdK"
. #B
 '00##FG,=,=tD
 !+ 4 4		 	 z'@'@$	GH!J
"  *33##FG,=,=tD 
U$ %..##D**C*CTJ

 < !+ 4 4##D**C*CTJ!
!
!  #-"6"6  ##E:+D+DdK# )# 4l (11##C)B)BDI
 #-"6"6##GZ-E-EtL#
.B$ )3(<(<##GZ-F-FM")%
 )3(<(<##GW-C-CTJ")%
4 ",!5!5$$##GZ-M-MtT'
 	" '1&:&:$$##Iz/U/UW[\'
 	'# )22$$##E:+D+DdK'
 	 	!=!9!=!8!9!7!7	! 
c  443j $--##Hj.G.GN
	C )22##E:+D+DdK!
BH, &//!!##Fj.G.GN##Fg.@.@$G$ #-"6"6!!##Fj.G.GN##Fg.@.@$G##Hg.?.?F$
# ;?GT ;? !+ 4 4$$##FJ,E,EtL##FJ,E,EtL' !
 =~ $.#7#7$$##K1J1JDQ##GZ-B-BDI' $  *4)=)=$$##K1J1JDQ##GZ-F-FM' *&B (11!!##FJ,E,EtL$
 #-"6"6!!##FJ,E,EtL##J
0I0I4P##Iz/K/KTR##K1F1FM	$
 #CBH (11$$##E:+D+DdK' 	T $.#7#7!!##FJ,E,EtL##E:+D+DdK##Iz/H/H$O$$ C  '1&:&:!!##FJ,E,EtL##E:+D+DdK##Iz/H/H$O##NJ4I4I4P	$'#<4 &//!!##FJ,E,EtL##E:+D+DdK##Iz/H/H$O$ #-"6"6##FJ,E,EtL##E:+D+DdK##Iz/H/H$O 
 '11AA#<F !,,j.F.FG
 HE#22J4J4JKH 
://''z/H/H$O''z/H/H$O''t<''	:3I3I4P''9O9OQUV (0';';tAYAY[ 	[ L 	 H
X]]WWXWX[[\^]Y )M%(L%(L%'J$'J$(L%'J$(L%+R(+R((L%-V*,T)[X]_[^WW#N +5*>*>##GZ-F-FM!+'
0 /H).G).G+.G).G).G+.G).G).G)0I-+5+?+?!!##GZ-F-FM$,(0 &0%9%9##E7+?+?F##J
0F0FM&"3 !+ 4 4##E7+?+?F##E:+D+DdK##J
0L0LdS!
.&  *33##E7+?+?F##E:+D+DdK -@ $.#7#7##E:+D+DdK##K1J1JDQ##GZ-I-I4P##E:+G+GN##K1F1FM! $ 0
0
L6  *33$$##E7+?+?F##K1J1JDQ##GZ-I-I4P##E:+G+GN##K1F1FM'  ABB( !+ 4 4$$##E7+?+?F##K1J1JDQ##GZ-I-I4P##E:+G+GN	' !B" #-"6"6##E7+?+?F##K1J1JDQ##Iz/H/H$O##J
0L0LdS	#0 +5*>*>##E7+?+?F##J
0P0PRVW##Hj.N.NPTU+' '1&:&:##E7+?+?F'#
B %79$6D v0067$69O/?b )3(;(;J<P<P##Hj.N.NPTU##FJ,H,H$O##Hj.N.NPTU
= )% ",!5!5##Hj.N.NPTU##GZ-I-I4P##FJ,H,H$O##J
0P0PRVW##Hj.N.NPTU##M3TVZ[
" )22##Hj.G.GN##GZ-I-I4P##FJ,H,H$O##J
0P0PRVW##Hj.N.NPTU##M3TVZ[
 $( AF .P*N.(.
.

 DF-14090L0L0\0\04	& &//!!##E:+D+DdK$

	
"Tk;V"
J9s   39AP6DAP=
F$AQrE  c           
         [         R                  [         R                  4n[        XE5      (       a@  UR                  [
        R                  La  UR                  [        R                  La  gUnSnOQ[        X55      (       a@  UR                  [
        R                  La  UR                  [        R                  La  gUnSnOgUR                  5       (       d  g[        U[         R                  5      nU(       a  [
        R                  O[
        R                  n	U(       a  U S;  a  gO!U S:X  a  g[        UR                  5      S:  a  gU S;   a  UR                  S:X  a  g/ n
U
R                  U(       a  [         R                  O[         R                  " UR                  UR                   UR                  U	S	95        [        U[         R"                  5      (       a  UR$                  OS
nU
R                  [         R&                  " UR                  XS95        U(       d  U S;  al  US:H  =(       a2    [        U[         R(                  5      (       a  UR*                  (       + OS
nU
R                  [         R&                  " UR                  XS95        [,        R.                  " U(       a  SO	U S;   a  SOSS[1        XUS9S9nSU(       a  SOS< SUR2                  (       a  SOS< U < U< 3nXX4$ )r  NObjCCObj)r  r  r  r  r  r  r  r  r   )r  r  r  r  r   r   Fr  r  PyFloatBinopPyLongComparePyLongBinopr    )oporderr  r!  rX  FloatLongr5  r  Bool)r   r   r  r(   r   r	   r  r
   r  r   r  r  rk  r=   rJ   r   rw   NumBinopNoder  r   r  	cdivisionr   r!   r   r   )rs   r*   r  arg0arg1	num_nodesnumval	arg_orderre  r  r  r  zerodivision_checkrJ  r  s                  r#   r  r  ?  sa    ""I$7$78I$""99J555$))7K[K[:[		D	$	$99J555$))7K[K[:[	%%'' &)"5"56H+3z''9O9OH__ `	X		V##	$u	,GG1$Jhy**I<M<MM

&,,8N8N  )y/E/EFFdllEGi((Z[8</&&0 R",T93D3D"E"E5 	),,TXX=Otu%11"8|;SYfHEGL '"".	J Z99r%   unicode_tailmatchrq  bytes_tailmatchc                     ^  \ rS rSrSrS*U 4S jjrS r\R                  \R                  \R                  \R                  /rS rS rS rS rS	S
SSS.R"                  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-\.R^                  R`                  r1S)r2U =r3$ )+ConstantFoldingi  a  Calculate the result of constant expressions to store it in
``expr_node.constant_result``, and replace trivial cases by their
constant result.

General rules:

- We calculate float constants to make them available to the
  compiler, but we do not aggregate them into a single literal
  node to prevent any loss of precision.

- We recursively calculate constants from non-literal nodes to
  make them available to the compiler, but we only aggregate
  literal nodes at each step.  Non-literal nodes are never merged
  into a single node.
c                 .   > [         TU ]  5         Xl        g)zo
The reevaluate argument specifies whether constant values that were
previously computed should be recomputed.
N)superrD   
reevaluate)rG   r  	__class__s     r#   rD   ConstantFolding.__init__  s    
 	$r%   c                 0   U R                   (       d  UR                  [        R                  La  g [        R                  nX!l        U R                  U5      nUR                  5        HE  n[        U5      [        L a  U H  n[        USU5      UL d  M      g    M3  [        USU5      UL d  ME    g     UR                  5         g ! [        [        [        [        [        [         4 a     g ["         a$    SS KnSS KnUR)                  UR*                  S9   g f = f)Nr=   r   )file)r  r=   r   constant_value_not_setr   rK   r   r   r  r  calculate_constant_resultr  	TypeErrorrk   
IndexErrorr#  ArithmeticError	Exception	tracebacksys	print_excstdout)rG   r*   r   childrenchild_resultchildr  r  s           r#   _calculate_const ConstantFolding._calculate_const  s    $$I,L,LL #11- %%d+$OO-LL!T))Eu&7HNZ * '8.I^[ .
	1**, Ix^_] 	 	1!SZZ0	1s   1C $D(*DDc           
           U R                   [        [        U R                   R                  [        [        U5      5      5         $ ! [
         a     g f = fr'   )NODE_TYPE_ORDERmaxr  r
  r   r  )rG   nodess     r#   _widest_node_class"ConstantFolding._widest_node_class  sP    	''C,,22Ce4DEFH H 		s   AA 
AAc                 V    [        U5      n[        R                  " UR                  X"S9$ r  )r  r   r   r   )rG   r*   rw   s      r#   
_bool_nodeConstantFolding._bool_node  s"    U!!$((%OOr%   c                 (    U R                  U5        U$ r'   )r  rL   s     r#   visit_ExprNodeConstantFolding.visit_ExprNode  s    d#r%   c                    U R                  U5        UR                  5       (       d#  UR                  S:X  a  U R                  U5      $ U$ UR                  R
                  (       d  U$ UR                  S:X  a  U R                  XR                  5      $ [        UR                  [        R                  5      (       a^  [        R                  " UR                  [        [        UR                  5      5      [        R                   [        UR                  5      S9$ UR                  S:X  a  U R#                  U5      $ UR                  S:X  a  U R%                  U5      $ U$ )N!rd  rf  r  )r  r   rs   _handle_NotNoder   rK  r'  r=   r(   r   r   r   r   rQ  rj  r	   rS  _handle_UnaryPlusNode_handle_UnaryMinusNoderL   s     r#   visit_UnopNodeConstantFolding.visit_UnopNode  s   d#''))}}#++D11K||&&K==C??4)=)=>>i&8&899$$TXXST=Q=Q9R5S*4*?*?589M9M5NP P ]]c!--d33]]c!..t44r%   r   r[  is_notis)r[  r   r4  r3  c                     UR                   n[        U[        R                  5      (       aO  U R	                  UR
                  5      nU(       a-  [        R                  " U5      nX1l        U R                  U5      nU$ r'   )r   r(   r   r   _negate_operatorrs   r   r   )rG   r*   r   rs   s       r#   r.  ConstantFolding._handle_NotNode  s_    ,,gy7788,,W-=-=>Hyy) (006r%   c                    S nUR                   R                  n[        UR                   [        R                  5      (       aE  [        R                  " UR
                  U" UR                   R                  5      UUR                  S9$ UR                  (       a  UR                  (       d:  [        UR                   [        R                  5      (       ak  UR                  (       aZ  [        R                  " UR
                  U" UR                   R                  5      UUR                   R                  UR                  S9$ U$ )Nc                 J    U R                  S5      (       a  U SS  n U $ SU -   n U $ )Nr  r   )rN  rv   s    r#   _negate7ConstantFolding._handle_UnaryMinusNode.<locals>._negate  s5    $$ab	 L eLr%   rd  )rw   r   longnessr=   )r   r   r(   r   r  r   rw   r=   r   r  r   r   r<  )rG   r*   r:  	node_types       r#   r0  &ConstantFolding._handle_UnaryMinusNode  s    	 LL%%	dllI$7$788&&txxwt||?Q?Q7R,57;7K7KM M 	 0 04<<):):;;	@U@U$$TXXWT\\=O=O5P*3.2ll.C.C595I5IK K r%   c                     UR                   R                  5       (       a0  UR                  UR                   R                  :X  a  UR                   $ U$ r'   )r   r   r=   rL   s     r#   r/  %ConstantFolding._handle_UnaryPlusNode  s<    LL,,..((DLL,H,HH<<r%   c                 <   U R                  U5        UR                  R                  5       (       d  U$ UR                  R                  (       a(  UR                  S:X  a  UR
                  $ UR                  $ UR                  S:X  a  UR                  $ UR
                  $ )Nr  )r  rt   r   r=   rs   ru   rL   s     r#   rD  #ConstantFolding.visit_BoolBinopNode  su    d#}}0022K==((}}%}}$}}$}}%}}$}}$r%   c                 2   U R                  U5        UR                  [        R                  L a  U$ [	        UR                  [
        5      (       a  U$ UR                  UR                  p2UR                  (       a  UR                  (       d  U$  UR                  UR                  pTUb  Uc  U$  UR                  (       a(  UR                  (       a  [        R                  " XE5      nO[        R                  nU R                  X#5      nUc  U$ U[        R                   L a!  UR"                  S;   a  [        R$                  nO3U[        R&                  L a   UR"                  S;   a  [        R$                  nU[        R$                  L Ga+  [)        USS5      =(       a    [)        USS5      nSS [+        [-        [)        USS5      5      [-        [)        USS5      5      5       n	[/        [1        UR                  5      5      n
[2        R4                  " U
5      n
[        R$                  " UR6                  XU
[1        UR                  5      S9nUR8                  (       d  UR                  R8                  (       a  [        R                  Ul	        U$ [        R                  " XkR                  5      Ul	         U$ U[        R                   L a  UR                  nO[;        UR                  5      nU" UR6                  UUUR                  S9nU$ ! [         a    Us $ f = f)	Nz+-//<<%**>>z+-//<<%**>>&|^unsignedr  LLr<  )r   rD  r<  rw   r=   )r   r   rw   r=   )r  r=   r   r   r(   r  rt   ru   rK  r   r#  r  r	   widest_numeric_typer  r$  r   rs   r   r  r  r"  rg   hexrj  r   strip_py2_long_suffixr   r   rQ  )rG   r*   rt   ru   type1type2widest_typetarget_classrD  r<  rw   r   
node_values                r#   visit_BinopNodeConstantFolding.visit_BinopNode#  s   d#9#;#;;Kd**E22K!]]DMM(""(*=*=K	#==(--5} !.
  0 0$88FK$33K..xBKY///DMM]4R$,,LY///DMMEU4U$,,L9,,,xR8 9xR8  ISWXz2%F!G!$WXz2%F!GI JHD0012E//6E ((TXX2:/49<T=Q=Q9RTH &&(--*C*C * 9 9  !+ > >{MM Z  y111!11
 !5!56
#,66:6J6JLH W  	K	s   L LLc                 V	   U R                  U5        [        UR                  [        5      (       a<  [        R
                  " UR                  R                  [        UR                  5      S9$ UR                  UR                  p2[        U[        R                  5      (       Ga&  [        U[        R                  5      (       aK  UR                  R                  UR                  5        [        R                  Ul        U R                  U5      $ [        UR                  [        5      (       a  UR                  (       d  U$ [        U[        R
                  5      (       d)  [        R
                  " UR                  UR                  S9nUR                  R                  U5        [        R                  Ul        U R                  U5      $ O[        U[        R                  5      (       a  [        UR                  [        5      (       a  UR                  (       d  U$ [        U[        R
                  5      (       d)  [        R
                  " UR                  UR                  S9nUR                  R!                  SU5        [        R                  Ul        U R                  U5      $ UR                  [        R"                  L a  U$ UR$                  (       Ga  UR$                  (       Ga  [        U[        R
                  5      (       a  [        U[        R
                  5      (       a  S nUR&                  br  UR&                  be  UR&                  R(                  UR&                  R(                  :X  a7  [+        UR&                  UR&                  -   UR&                  R(                  5      n[        UR                  5      n[        R
                  " UR                  XTS9$ [        U[        R,                  5      (       a  [        U[        R,                  5      (       a  UR.                  R(                  UR.                  R(                  :X  aS  [+        UR                  UR.                  R(                  5      n[        R,                  " UR                  XAR                  S9$ U R1                  U5      $ )Nrv   r   r  r  )r  r(   r=   rQ  r   r   rt   r   r   ru   JoinedStrNoder   rO  r  simplify_JoinedStrNoderJ   r  r   rf  r[  ry  r   rM  rw   rN  )rG   r*   rt   ru   r[  string_values         r#   visit_AddNodeConstantFolding.visit_AddNode_  sZ   d#d**C00((!!t7K7K)LN N "]]DMM( h	 7 788(I$;$;<<&&x7+4+K+K(228<<(22C88//#O!(I,A,ABB(44 H,D,D FH&&x0+4+K+K(228<< 9 )"9"9::(22C88//#O!(I,A,ABB(44 H,D,D FH&&q(3+4+K+K(228<<9#;#;;K%%%(*D*D*D(I$9$9::z(T]TiTi?j?j"''38L8L8X++448L8L8U8UU&3$0083G3GG$0099';  -T-A-AB ,,X\\ggHi&9&9::z(T]TgTg?h?h>>**hnn.E.EE"/0D0DhnnF]F]"^K$..x||;`t`tuu##D))r%   c                    U R                  U5        UR                  R                  (       a&  U R                  XR                  UR                  5      $ [        UR                  [        R                  5      (       aA  UR                  R                  (       a&  U R                  XR                  UR                  5      $ UR                  R                  (       a&  U R                  XR                  UR                  5      $ UR                  R                  (       a&  U R                  XR                  UR                  5      $ U R                  U5      $ r'   )r  rt   r  _calculate_constant_seqru   r(   r   r   rf  _multiply_stringrN  rL   s     r#   visit_MulNodeConstantFolding.visit_MulNode  s    d#==00//mmT]]SSdmmY%6%67755//mmT]]SS==**((}}dmmLL]],,((}}dmmLL##D))r%   c                    UR                   n[        U[        5      (       d  U$ UR                  5       (       a  [        UR                   [        5      (       d  U$ [        UR                   5      S:  a  U$ [        U[        R                  5      (       a  [        nOx[        U[        R                  5      (       aF  [        nUR                  b2  [        UR                  U-  UR                  R                  5      Ul        O S[        U5      -  5       eU" UR                  U-  UR                  R                  5      Ul        UR                  Ul         U$ )N   zunknown string node type: %s)r=   r(   rj  r   _py_string_typesrg   r   rM  r   r   r   r[  ry  r   rw   )rG   r*   r  multiplier_node
multiplierbuild_strings         r#   rX   ConstantFolding._multiply_string  s   $44
*c**K((**z$:N:NP`/a/aKt##$s*Kk9#6#677(LY%:%:;;)L&&2*7++j8++44+6' M84;LLL5(
*&&( '2&7&7#r%   c                 l   UR                   S:w  Ga"  UR                  (       Ga  [        UR                   [        5      (       a(  UR                   S::  a  UR                  S S 2	 S Ul        U$ UR                  b  [        UR                   [        5      (       a  [        UR                  R                   [        5      (       a]  UR                  R                   UR                   -  n[
        R                  " UR                  R                  [        U5      US9Ul        U$ U R                  U5      $ X2l        U$ r  )
r=   r   r(   rj  rV  r   r   r   rQ  rN  )rG   r*   sequence_nodefactorrw   s        r#   rW  'ConstantFolding._calculate_constant_seq  s   !!Q&=+=+=+=&00#666;Q;QUV;V!&&q),0)  **6v55s;;"=#<#<#L#LcRR)55EEH^H^^E090A0A%1155!%j%1AM-   //55,2)r%   c                    U R                  U5        [        UR                  [        R                  5      (       a  [        UR
                  [        R                  5      (       ao  UR
                  R                  (       dT  U R                  UR                  R                  UR                  R                  UR
                  R                  5      nUb  U$ U R                  U5      $ r'   )rK   r(   rt   r   r   ru   rb  rV  _build_fstringr   rw   r   rN  )rG   r*   fstrings      r#   visit_ModNodeConstantFolding.visit_ModNode  s    4 dmmY%:%:;;
4==ZcZmZm@n@n==,,--dmm.?.?ATATVZVcVcVhVhi&"N##D))r%   z'(%(?:(?:[-0-9]+|[ ])?(?:[.][0-9]+)?)?.)c                 \   [        U5      n/ nSn[        R                  " U R                  U5       GH  nU(       d  M  US:X  a/  UR	                  [
        R                  " U[        S5      S95        MB  US   S:w  aL  US   S:X  a  [        USUSS   S	3S
S9  SnUR	                  [
        R                  " U[        U5      S95        M  US   n [        U5      n	U	R                  (       a  Sn  OUS;   a  US
S  n
S nUS;   a	  SU
;   a  SnO4US;   a&  U
S S n
UnU
R                  S5      (       a  SU
S
S  -   n
OUS:X  a  SnU
R                  S5      (       a  SU
S
S  -   n
UR	                  [
        R                  " U	R                  U	UU
(       a  [
        R                  " U[        U
5      S9OS S95        GM  Sn  O   U(       d  g  [        U5        [        USS
S9  g ! [         a    [        USS
S9  Sn   M;  f = f! [         a     Of = f[
        R                  " XS9nU R!                  U5      $ )NTz%%%rv   r   r1  zIncomplete format: '...'r   )levelFz)Too few arguments for format placeholdersasrfdoxXdoxXr  arsr   r  dr  r  )rw   r  r  z*Too many arguments for format placeholders)r   )iterr   r5  _parse_string_format_regexrJ   r   r   r   r   nextStopIterationrf  rN  FormattedValueNoder   rQ  visit_JoinedStrNode)rG   r   r$  r  r   
substringscan_be_optimisedr-  format_typer)   r  r  r*   s                r#   rg  ConstantFolding._build_fstring  sQ   K 
$997CADy!!)"7"7=QTCU"VWts{R5C<C#:1RS6(!!DAN',$!!)"7"7=QRCS"TUB%K4j
 ~~#( j(e"&&(SK-?',$ E)"-cr"2K&1O"--c22&)KO&; C'&)O))#.."%AB"7K!!)">">GG3$3& !* 5 5c{A[ \,0	#  $) c Df  	J CEQO[ ! HPQR#( T "d"
 &&s>''--s$   GG9 G65G69
HHc                    U R                  U5        UR                  =(       d    SnUR                  b=  UR                  R                  (       a"  UR                  R                  (       d  S Ul        UR                  c  UR                  R                  5       (       az  [        UR                  R                  [        5      (       aQ  [        [        UR                  R                  5      5      n[        R                  " UR                  R                  US9$ UR                  c-  US:X  a'  UR                  R                  (       a  UR                  $ U$ )Nr-  rv   )rK   r  r  rf  rw   r   r(   r=   rj  r   rQ  r   r   r   )rG   r*   r  rw   s       r#   r  (ConstantFolding.visit_FormattedValueNode'  s    4 ..5#'D,<,<,N,NW[WgWgWmWm#D#

(F(F(H(HZX\XbXbXrXrtwMxMx!#djj&@&@"ABE((uEE#3(>zz++zz!r%   c                 F    U R                  U5        U R                  U5      $ r'   )rK   rR  rL   s     r#   ry  #ConstantFolding.visit_JoinedStrNode4  s!    4 **400r%   c                    / n[         R                  " UR                  [        S5      S9 H  u  p4U(       a  [	        U5      nUS   n[        U5      S:  a@  [        SR                  S U 5       5      5      n[        R                  " UR                  US9nUR                  (       a  UR                  U5        M  M  UR                  U5        M     U(       d*  [        R                  " UR                  [        S5      S9nU$ [        U5      S:X  a  US   nU$ [        U5      S:X  a$  [        R                  " UR                  S	/UQ76 nU$ X!l        U$ )
z
Clean up after the parser by discarding empty Unicode strings and merging
substring sequences.  Empty or single-value join lists are not uncommon
because f-string format specs are always parsed into JoinedStrNodes.
rf  )r  r   r   r  c              3   8   #    U  H  oR                   v   M     g 7fr'   rv   )r  rw   s     r#   	<genexpr>9ConstantFolding.simplify_JoinedStrNode.<locals>.<genexpr>D  s     1V:%++:s   rv   r   rf  )r   groupbyr   r   r  rg   r   r  r   r   r   rw   rJ   rO  r  )rG   r*   r   is_unode_grouprz  unoderw   s          r#   rR  &ConstantFolding.simplify_JoinedStrNode8  s&    *3*;*;DKKZXkMl*m&N!*-
"1z?Q&)"''1V:1V*VWE%11%))5IE;;MM%(  j) +n ((r9JKD  [A!9D  [A''#??D  !Kr%   c                 x  ^^^ U R                  U5        / m/ mUUU4S jmUR                   H  nT" X5        M     T(       a  TR                  T5        [        T5      S:X  a7  TS   nUR                  (       d  [        U[        R                  5      (       a  U$ TUR                  SS& U R                  U5        U$ )z!Unpack **args in place if we can.c                   > UR                   (       a_  T(       aF  TS   R                  UR                  :X  a)  TS   R                  R                  UR                  5        g TR	                  U5        g [        U[        R                  5      (       a6  U R                  UR                  :X  a  UR                   H  nT" X5        M     g T(       a  TR                  T5        TS S 2	 TR	                  U5        g )Nr1  )	is_dict_literalreject_duplicatesr)  rO  rJ   r(   r   MergedDictNoder  )parentr)   	child_argr  r   r   s      r#   r  1ConstantFolding.visit_MergedDictNode.<locals>.add]  s    ""U2Y88C<Q<QQ"I--44S5H5HILL%C!9!9::v?W?W[^[p[p?p!$!1!1I' "2 KK&aC r%   r   r   N)	rK   r  rO  rg   r  r(   r   r  r  )rG   r*   r)   r  r   r   s      @@@r#   visit_MergedDictNode$ConstantFolding.visit_MergedDictNodeW  s    4 	! $$CN %KKt9>q'C""ji6N6N&O&O
#!d#r%   c                   ^^^^ U R                  U5        UR                  [        R                  L m/ m/ mUUUU4S jmUR                   H  nT" U5        M     T(       a  TR                  TS   5        [        T5      S:X  ah  TS   nT(       a  UR                  (       dI  UR                  (       a  UR                  UR                  L d  [        U[        R                  5      (       a  U$ TUR                  SS& U R                  U5        U$ ) Unpack *args in place if we can.c                   > T(       a  U R                   (       d"  U R                  (       aS  U R                  (       dB  T(       a)  TS   R                  R	                  U R                  5        g TR                  U 5        g [        U [        R                  5      (       a  U R                   H  nT" U5        M     g T(       a  TR                  TS   5        TS S 2	 TR                  U 5        g )Nr   )	is_set_literalr  rV  r   rO  rJ   r(   r   MergedSequenceNode)r)   r  r  r   r  r   s     r#   r  5ConstantFolding.visit_MergedSequenceNode.<locals>.add  s    3--33N3NWZWfWf1INN))#((3MM#&C!=!=>>!$I	N "* KKq	*q	C r%   r   r   N)rK   r   r
   r   r   rJ   rg   r  r  r(   r   r  r  )rG   r*   r)   r  r   r  r   s      @@@@r#   visit_MergedSequenceNode(ConstantFolding.visit_MergedSequenceNodey  s    4 g...	! 	! 99CH KKq	"t9>q'CC..00SXX5JsI$@$@AA
		!d#r%   c                    U R                  U5        / nUR                   H  nUR                  (       d  UR                  U5        M'  UR                  R
                  (       aB  UR                  R                  (       d'  UR                  UR                  R                  5        M  UR                  U5        M     X!R                  SS& U R                  U5        U$ )r  N)	rK   r   rf  rJ   r   r  rV  rO  r  )rG   r*   r   r)   s       r#   visit_SequenceNode"ConstantFolding.visit_SequenceNode  s    4 99C>>C 33CJJ<R<RCJJOO,C   		!d#r%   c           	         U R                  US/5        UR                  nUnUb  U R                  US/5        UR                  n[        Ul        UR                  5       (       a1  UR                  5       (       a   UR                  UR                  5        UnUR                  nUb  M  UR                  (       d2  UR                  5       (       a  U R                  XR                  5      $ U$ UR                  //n/ nUnUb  UR                  5       (       aP  UR                  (       d"  UR                  U R                  US5      5        OBUR                  UR                  /5        OUS   R                  U5        UR                  nUb  M  / nU H  n[!        U5      S:  a  M  US   n["        R$                  " UR&                  US   UR(                  UR                  [        S9n	UR                  U	5        U	n
USS   H  nX:l        Un
M     S U
l        M     U(       a  UR                  US   5        OU(       d  U R                  US	5      $ US   n[!        U5      S:X  a3  UR                  5       (       a  U R                  XR                  5      $  U$ USS   H)  n["        R*                  " UR&                  US
U[        S9nM+     U$ ! [        [        [        [        [        [        4 a     GNXf = f)Nrt   ru   Fr1  r   r   r   )rt   rs   ru   r=   Tr  )rK   rt   ru   r   r=   r   "calculate_cascaded_constant_resultr  r  rk   r  r#  r  r  r'  rJ   rg   r   r   r   rs   r   )rG   r*   	left_noder   
right_nodecascadesfinal_false_result	cmp_nodesr  	pcmp_nodelast_cmp_nodes              r#   r   $ConstantFolding.visit_PrimaryCmpNode  s   4*.MM	"x*6!**J'5H$,,..:3Q3Q3S3S??	@Y@YZ #I''H " ||''))t-A-ABBK ]]O$"++--//&--dooh.NO OOX%6%6$78 ##H-''H " 	G7|aqzH!00 !**!** .0I Y'%M#ABK(0% ( ( %)M!!  $ /23??4..|y>Q''))t-A-ABB *  &abM ..HH!"%$24 * E #Ix^Ude s   :K $K.-K.c                     U R                  U5        UR                  R                  5       (       d  U$ UR                  R                  (       a  UR                  $ UR
                  $ r'   )r  r.  r   r=   r<  r=  rL   s     r#   r?  "ConstantFolding.visit_CondExprNode  sI    d#yy,,..K99$$== >>!r%   c                    U R                  U5        / nUR                   H[  nUR                  nUR                  5       (       a&  UR                  (       a  UR
                  Ul          OMJ  UR                  U5        M]     U(       a  X!l        U$ UR                  (       a  UR                  $ [        R                  " UR                  / S9$ Nr{   )rK   r   r~   r   r=   r   r   rJ   r   r   r   )rG   r*   r   r4  r~   s        r#   r8   ConstantFolding.visit_IfStatNode  s    4 
I!++I,,..,,'0~~D$ - !!), ) (OK###%%dhhb99r%   c                 &   U R                  U5        UR                  b  UR                  R                  c	  S =o!l        OUR                  R                  nUR                  b  UR                  R                  c	  S =o1l        OUR                  R                  nUR                  [        Laf  UR
                  nUR                  (       a"  UR                  c  UR                  X# Ul        U$ UR                  (       a  UR                  X#5      nUb  U$ U$ r'   )r  r6  r=   r7  r   r   r  rV  r   rf  as_sliced_node)rG   r*   r6  r7  r   s        r#   visit_SliceIndexNode$ConstantFolding.visit_SliceIndexNode  s    d#::!;!;!C!%%EJJJ..E99		 9 9 A##D999,,D~599D++0@0@0H IIe1	''**57#Kr%   c                 .   U R                  U5        [        UR                  [        R                  5      (       a  UR                  R
                  (       d  UR                  [        R                  L a   [        R                  " UR                  / / S9$ UR                  [        R                  L a(  [        R                  " UR                  / [        5       S9$ UR                  [        R                  L a   [        R                   " UR                  / 0 S9$ U$ )Nr  r(  )rK   r(   r  r   r   r|   r   r
   r   r   rc  r   r   rd  r  r   r,  rL   s     r#   visit_ComprehensionNode'ConstantFolding.visit_ComprehensionNode5  s    4 dii!3!344TYY__yyG--- ))HH2r; ;g... ((HH2su> >g/// ))HHb"F Fr%   c                    U R                  U5        UR                  R                  n[        U[        R
                  5      (       a  UR                  (       d<  UR                  (       a  UR                  $ [        R                  " UR                  / S9$ [        U[        R                  5      (       a  UR                  5       UR                  l        U$ r  )rK   r   r   r(   r   SequenceNoder   r   r   r   r   rc  r  )rG   r*   r   s      r#   r   #ConstantFolding.visit_ForInStatNodeD  s    4 ==))h	 6 677==##+++ !--dhhbAA(I$6$677)1):):)<&r%   c                     U R                  U5        UR                  (       aV  UR                  R                  5       (       a7  UR                  R                  (       a  S Ul        S Ul        U$ UR                  $ U$ r'   )rK   r~   r   r=   r   rL   s     r#   visit_WhileStatNode#ConstantFolding.visit_WhileStatNodeS  s_    4 >>dnn@@BB~~--!%#'   '''r%   c                     U R                  U5        [        UR                  [        R                  5      (       d  U$ UR                  R                  5       (       a  g U$ r'   )rK   r(   rP   r   ExprNoder   rL   s     r#   rQ   "ConstantFolding.visit_ExprStatNode]  sG    4 $))Y%7%788K99((**r%   c                     U R                  U5        UR                  c  U$ UR                  R                  5       (       a0  UR                  R                  (       a	  S Ul        U$ UR                  $ U$ r'   )rK   r~   r   r=   r   rL   s     r#   visit_GILStatNode!ConstantFolding.visit_GILStatNodeg  sb    4 >>!K>>--// ~~--!%  yy  r%   )r  r  )4r^   r_   r`   ra   rb   rD   r  r   r   r  r   r  r!  r$  r'  r*  r1  r1  r6  r.  r0  r/  rD  rN  rT  rY  rX  rW  ri  ru  rg  r  ry  rR  r  r  r  r   r?  r8  r  r  r   r  rQ   r  r   rV  rW  rc   rd   __classcell__)r  s   @r#   r	  r	    s    %1@ !))9+=+= (()*=*=?OP* 	
 
c ,%:x5*n*6&*	 D.L1> D$LN`":..6 ))==Jr%   r	  c                   ~    \ 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S jrS\R"                  4S jrSrg)FinalOptimizePhasei  a  
This visitor handles several commuting optimizations, and is run
just before the C code generation phase.

The optimizations currently implemented in this class are:
    - eliminate None assignment and refcounting for first assignment.
    - isinstance -> typecheck for cdef types
    - eliminate checks for None and/or types that became redundant after tree changes
    - eliminate useless string formatting steps
    - inject branch hints for unlikely if-cases that only raise exceptions
    - replace Python function calls that look like method calls by a faster PyMethodCallNode
    - replace duplicate FormattedValueNodes in f-strings with CloneNodes
Fc                 p    U R                  U5        UR                  (       a  UR                  nSUl        U$ )zQAvoid redundant initialisation of local variables before their
first assignment.
T)rK   rJ  ry   lhs_of_first_assignment)rG   r*   ry   s      r#   visit_SingleAssignmentNode-FinalOptimizePhase.visit_SingleAssignmentNode  s/     	4 ::((C*.C'r%   c                    UR                   nUR                  nUR                  (       d  UR                  (       a  UR                  OS nU R                  5       nUR                  =(       d<    UR                  =(       d)    UR                  =(       a    UR                  R                  nUR                  5       =(       a    UR                  =(       ao    U[        R                  L=(       aV    U=(       a    UR                  (       + =(       a5    U R                  R!                  U R"                  (       d	  U(       a  SOS5      $ )Nz&optimize.unpack_method_calls_in_pyinitzoptimize.unpack_method_calls)r   r   r   r   r   r   is_module_scopeis_c_class_scopeis_py_class_scopeouter_scoper  r   r
   r  r   r0  r1  in_loop)rG   r*   r   function_typer   r'  in_global_scopes          r#   _check_optimize_method_calls/FinalOptimizePhase._check_optimize_method_calls  s    == "*"2"2h6K6KQU  H  H""Fs'F'F 	 ! 5%%5!2!225 +5++,5 ##''|| 935		
r%   c                 &   U R                  U5        UR                  nUR                  R                  (       Ga)  UR                  (       Ga  UR
                  S:X  Ga  [        UR                  5      S:X  a  UR                  S   nUR                  R                  (       a  UR                  R
                  S:X  a  U R                  R                  nUR                  S5      Ul        UR                  R                  Ul        [        R                  " UR                  S5      R                  5      n[        R                   " UR                  S   U5      UR                  S'   U$ [        R"                  R%                  UR&                  SS9(       Ga   [        R"                  R)                  U5      (       a  UR*                  (       ax  UR,                  (       ag  [/        UR0                  [        R2                  5      (       a>  UR0                  R4                  UR*                  L a  UR0                  R4                  Ul        U R7                  U[        R"                  R9                  XUR&                  UR                  U R;                  U5      S	95      nU$ )
z
Replace generic calls to isinstance(x, type) by a more efficient type check.
Replace likely Python method calls by a specialised PyMethodCallNode.
r(   r   r   r   PyObject_TypeCheckr.  F)
has_kwargs)r   r   r   unpack)rK   r   r   is_cfunctionr   r"   rg   r   r~  r   r7  r   r   r	   r8  r   rr  PyMethodCallNodecan_be_used_for_posargsr   can_be_used_for_functionrG   r   r(   r8   rp  r)   rA  	from_noder  )rG   r*   r   r;  r7  r@  s         r#   r  'FinalOptimizePhase.visit_SimpleCallNode  s   
 	4 ====%%%(*:*:*:}},TYY11D99Q<==00X]]5G5G65Q#'<<#<#<L%1%8%89M%NHN$,NN$7$7HM&0&9&9,:M:Mn:]:b:b&cO#,#5#5diilO#TDIIaL  ))AA$..]bAc--FFxPP		h&;&;&x||Y5H5HIIhllN^N^bfbkbkNk'/||'7'7<<i.H.H.R.R4>>PTPYPY#@@F /S /H ID r%   c                    U R                  U5        [        UR                  5      n[        UR                  [        R
                  5      n[        R                  R                  UR                  X#S9(       d  U$ UR                  n[        R                  R                  U5      (       d  U$ U R                  U[        R                  R                  XUR                  UR                  UR                  U R                  U5      S95      nU$ )zG
Replace likely Python method calls by a specialised PyMethodCallNode.
)r  has_explicit_kwargs)r   r   kwdictr   r  )rK   r  r  r(   r   r,  r  r  r  r   r  rA  r  r   r  )rG   r*   r  r  r   s        r#   r  (FinalOptimizePhase.visit_GeneralCallNode  s     	4 $++,
():):I<N<NO))AA$$ B fK==))BB8LLK||D)"<"<"F"Ft/C/CDL]L]4#D#DT#J #G #L M r%   c                 (    U R                  U5        U$ r'   )rK   rL   s     r#   visit_NumPyMethodCallNode,FinalOptimizePhase.visit_NumPyMethodCallNode  s    4 r%   c                     U R                  U5        UR                  (       d&  UR                  R                  5       (       d  SUl        U$ )zyRemove tests for alternatively allowed None values from
type tests when we know that the argument cannot be None
anyway.
T)rK   notnoner)   r  rL   s     r#   rH  'FinalOptimizePhase.visit_PyTypeTestNode  s8    
 	4 ||88''))#r%   c                 ~    U R                  U5        UR                  R                  5       (       d  UR                  $ U$ )zORemove None checks from expressions that definitely do not
carry a None value.
)rK   r)   r  rL   s     r#   visit_NoneCheckNode&FinalOptimizePhase.visit_NoneCheckNode  s3     	4 xx##%%88Or%   c                 Z    U R                   nSU l         U R                  U5        X l         U$ )zeRemember when we enter a loop as some expensive optimisations might still be worth it there.
        T)r  rK   )rG   r*   old_vals      r#   visit_LoopNode!FinalOptimizePhase.visit_LoopNode  s,     ,,4 r%   c                 ,   U R                  U5        Sn[        UR                  5       H5  u  p4U R                  XDR                  5        UR
                  (       a  M3  UnM7     UR                  (       a!  U(       a  U R                  X!R                  SS9  U$ )zQAssign 'unlikely' branch hints to if-clauses that only raise exceptions.
        NT)inverse)rK   r   r   _set_ifclause_branch_hintr   branch_hintr   )rG   r*   last_non_unlikely_clauser  r4  s        r#   r8  #FinalOptimizePhase.visit_IfStatNode  s     	4 #' %doo6LA**9nnE(((+4( 7  8**+CEUEU_c*dr%   c                    UR                   (       d  g[        R                  [        R                  [        R                  [        R
                  [        R                  [        R                  4nU/n[        US5       H  u  pg[        U[        R                  5      (       a  UR                  XgR                  5        MA  [        U[        R                  5      (       a  UR                  XVU& Mp  [        Xt5      (       a  M  U[        U5      :X  a?  [        U[        R                   [        R"                  45      (       a  U(       a  SOSUl          g   g)z\Inject a branch hint if the if-clause unconditionally leads to a 'raise' statement.
        Nr   likelyunlikely)is_terminatorr   r  AssignmentNodeAssertStatNodeDelStatNode
GlobalNodeNonlocalNoder   r(   GILStatNoder  r   r   r|   rg   RaiseStatNodeReraiseStatNoder  )rG   clausestatements_noder  non_branch_nodes
statementsnext_node_posr*   s           r#   r  ,FinalOptimizePhase._set_ifclause_branch_hint  s     ,,     
 &&
#,Z#;M$ 1 122!!-;$ 2 233:>**
7d55 C
O3
4%J]J]_d_t_tIu8v8v5<*F& $<r%   r*   c                    [         R                  n[         R                  n0 nUR                  SS n[	        UR                  5       GH  u  pg[        Xr5      (       d  M  UR                  n[        UR                  U5      (       a  UR                  nO,UR                  b  OUR                  R                  (       a  OMx  UR                  (       a  UR                  5       (       d  M  UR                  UR                  UR                  UR                  =(       d    S4n	UR!                  X5      n
XL a  M  [         R"                  " U
5      nUR$                  Ul        XU'   GM     XQR                  SS& U$ )a  
Deduplicate repeatedly formatted (C) values by replacing them with CloneNodes.
It's not uncommon for a formatting expression to appear multiple times in an f-string.

Note that this is somewhat handwavy since it's potentially possible even for simple
expressions to change their value while processing an f-string, e.g. by modifying the
world in a ".__format__" method.  However, this seems unlikely enough to appear in
real-world code that we ignore the case here.
Nr-  )r   rx  r   r   r   r(   rw   r)   r  r   r~  r   r  r"   r  r  r  rp  r   )rG   r*   rx  r   r%  r   r  fnodefnode_value_noder  
seen_fnodededup_fnodes               r#   ry  &FinalOptimizePhase.visit_JoinedStrNode1  s8    '99&99Q!$++.HAe88${{%++'9::#3#7#7 $$0!&&66  $,,1A1K1K1M1M
 #((%*=*=u?P?PRWRgRgRnknoC4J"#--j9K#iiKO#1IE /H  Ar%   )r  Nr  )r^   r_   r`   ra   rb   r  r  r  r  r  r  rH  r  r  r8  r  r   rQ  ry  rd   rT   r%   r#   r  r    sR     G
*<&
	84	(?(? 4r%   r  c                   (    \ rS rSrSrSrS rS rSrg)ConsolidateOverflowCheckih  a!  
This class facilitates the sharing of overflow checking among all nodes
of a nested arithmetic expression.  For example, given the expression
a*b + c, where a, b, and x are all possibly overflowing ints, the entire
sequence will be evaluated and the overflow bit checked only at the end.
Nc                     U R                   b,  U R                   nS U l         U R                  U5        X l         U$ U R                  U5        U$ r'   )overflow_bit_noderK   )rG   r*   saveds      r#   rc   #ConsolidateOverflowCheck.visit_Nodeq  sQ    !!-**E%)D"t$%*"  t$r%   c                    UR                   (       af  UR                  (       aU  U R                  S L nU(       a  Xl        OU R                  Ul        SUl         U R                  U5        U(       a  S U l        U$ U R                  U5        U$ r3   )overflow_checkoverflow_foldr  rK   )rG   r*   top_level_overflows      r#   visit_NumBinopNode+ConsolidateOverflowCheck.visit_NumBinopNode{  sx    4#5#5!%!7!74!?!)-&)-)?)?&&+#t$!)-&  t$r%   )r  )	r^   r_   r`   ra   rb   r  rc   r  rd   rT   r%   r#   r  r  h  s     r%   r  )Dcythondeclarer  r   r   r   r   rs   r   r  r   r   r   r   rk  rQ  r]  r   r	   r   r
   r   r   Coder   r   StringEncodingr   r   r   Errorsr   r   ParseTreeTransformsr   r   	functoolsr   r$   r   r_  r,   r1   r7   r>   rC   r@   ri   rf   EnvTransformro   r  rV  rY  rl  r  NodeRefCleanupMixinr5  MethodDispatcherTransformrE  r  r!   rJ  r  r	  r  CythonTransformr  rT   r%   r#   <module>r"     s    6v^dv&&vvfSY[ 
      23<         1 H H " 1  7 /8.J.JILjLj-k '-- @v-- vrC>g** C>LF>W557G F>Rq&w77 q&hGw33 GT44g6J6J DZ T766"<<Z Tz@B:J "-!8!89Lo!^ *667H/Z z>g..0@ z>z`--w/J/J `F w66  r%   