@@ -3738,7 +3738,7 @@ maybe_optimize_function_call(compiler *c, expr_ty e, jump_target_label end)
37383738 asdl_keyword_seq * kwds = e -> v .Call .keywords ;
37393739 expr_ty func = e -> v .Call .func ;
37403740
3741- // if (! PyUnicode_Contains(_PyCompile_Filename(c), PyUnicode_FromString("cc.py"))) return 0;
3741+ // if (! PyUnicode_Contains(_PyCompile_Filename(c), PyUnicode_FromString("cc.py"))) return 0;
37423742
37433743 if (! (func -> kind == Name_kind &&
37443744 asdl_seq_LEN (args ) == 1 &&
@@ -3754,63 +3754,70 @@ maybe_optimize_function_call(compiler *c, expr_ty e, jump_target_label end)
37543754 return 0 ;
37553755 }
37563756
3757- if (0 && generator_exp -> v .GeneratorExp .elt -> kind != Name_kind ) {
3758- // _PyObject_Dump(_PyCompile_Filename(c));
3759- // fprintf(stderr, "location: %d", LOC(func).lineno);
3760- return 0 ;
3761- }
3762-
37633757 location loc = LOC (func );
37643758
37653759 int optimized = 0 ;
37663760 NEW_JUMP_TARGET_LABEL (c , skip_optimization );
3761+
3762+ int const_oparg = -1 ;
3763+ PyObject * initial_res ;
3764+ int continue_jump_oparg = -1 ;
37673765 if (_PyUnicode_EqualToASCIIString (func -> v .Name .id , "all" )) {
3766+ const_oparg = CONSTANT_BUILTIN_ALL ;
3767+ initial_res = Py_True ;
3768+ continue_jump_oparg = POP_JUMP_IF_TRUE ;
3769+ }
3770+ else if (_PyUnicode_EqualToASCIIString (func -> v .Name .id , "any" )) {
3771+ const_oparg = CONSTANT_BUILTIN_ANY ;
3772+ initial_res = Py_False ;
3773+ continue_jump_oparg = POP_JUMP_IF_FALSE ;
3774+ }
3775+ else if (_PyUnicode_EqualToASCIIString (func -> v .Name .id , "tuple" )) {
3776+ const_oparg = CONSTANT_BUILTIN_TUPLE ;
3777+ }
3778+ if (const_oparg != -1 ) {
37683779 RETURN_IF_ERROR (codegen_nameop (c , loc , func -> v .Name .id , Load ));
3769- ADDOP_I (c , loc , LOAD_COMMON_CONSTANT , CONSTANT_BUILTIN_ALL );
3780+ ADDOP_I (c , loc , LOAD_COMMON_CONSTANT , const_oparg );
37703781 ADDOP_COMPARE (c , loc , Is );
37713782 ADDOP_JUMP (c , loc , POP_JUMP_IF_FALSE , skip_optimization );
37723783
3784+ if (const_oparg == CONSTANT_BUILTIN_TUPLE ) {
3785+ ADDOP_I (c , loc , BUILD_LIST , 0 );
3786+ }
3787+ else {
3788+ ADDOP_LOAD_CONST (c , loc , initial_res );
3789+ }
3790+ VISIT (c , expr , generator_exp );
37733791
3774- _PyCompile_InlinedComprehensionState inline_state = {NULL , NULL , NULL , NO_LABEL };
3775-
3776- PySTEntryObject * entry = _PySymtable_Lookup (SYMTABLE (c ), (void * )generator_exp );
3777-
3778- comprehension_ty gen = (comprehension_ty )asdl_seq_GET (
3779- generator_exp -> v .GeneratorExp .generators , 0 );
3780-
3781- VISIT (c , expr , gen -> iter );
3782- ADDOP (c , LOC (gen -> iter ), GET_ITER );
3783-
3784- RETURN_IF_ERROR (push_inlined_comprehension_state (c , loc , entry , & inline_state ));
37853792 NEW_JUMP_TARGET_LABEL (c , loop );
3786- NEW_JUMP_TARGET_LABEL (c , proceed );
3787- NEW_JUMP_TARGET_LABEL (c , finish );
37883793 NEW_JUMP_TARGET_LABEL (c , cleanup );
37893794
3790- ADDOP_LOAD_CONST (c , loc , Py_True ); // result
3791- ADDOP_I (c , loc , SWAP , 2 );
3792-
37933795 USE_LABEL (c , loop );
37943796 ADDOP_JUMP (c , loc , FOR_ITER , cleanup );
3795- VISIT (c , expr , gen -> target );
3796- VISIT (c , expr , generator_exp -> v .GeneratorExp .elt );
3797- ADDOP (c , loc , TO_BOOL );
3798- ADDOP_I (c , loc , COPY , 1 );
3799- ADDOP_JUMP (c , loc , POP_JUMP_IF_TRUE , proceed );
3800-
3801- ADDOP_I (c , loc , SWAP , 3 );
3802- ADDOP (c , loc , POP_TOP );
3803- ADDOP_JUMP (c , loc , JUMP , finish );
3797+ if (const_oparg == CONSTANT_BUILTIN_TUPLE ) {
3798+ ADDOP_I (c , loc , LIST_APPEND , 2 );
3799+ ADDOP_JUMP (c , loc , JUMP , loop );
3800+ }
3801+ else {
3802+ ADDOP (c , loc , TO_BOOL );
3803+ ADDOP_JUMP (c , loc , continue_jump_oparg , loop );
3804+ }
38043805
3805- USE_LABEL (c , proceed );
3806- ADDOP (c , loc , POP_TOP );
3807- ADDOP_JUMP (c , loc , JUMP , loop );
3806+ ADDOP (c , NO_LOCATION , POP_ITER );
3807+ if (const_oparg == CONSTANT_BUILTIN_TUPLE ) {
3808+ ADDOP_I (c , loc , LOAD_COMMON_CONSTANT , CONSTANT_BUILTIN_TUPLE );
3809+ ADDOP_I (c , loc , SWAP , 2 );
3810+ ADDOP_I (c , loc , CALL , 1 );
3811+ }
3812+ else {
3813+ ADDOP (c , loc , POP_TOP );
3814+ ADDOP_LOAD_CONST (c , loc , initial_res == Py_True ? Py_False : Py_True );
3815+ }
3816+ ADDOP_JUMP (c , loc , JUMP , end );
38083817
38093818 USE_LABEL (c , cleanup );
38103819 ADDOP (c , NO_LOCATION , END_FOR );
3811- USE_LABEL (c , finish );
38123820 ADDOP (c , NO_LOCATION , POP_ITER );
3813- RETURN_IF_ERROR (pop_inlined_comprehension_state (c , loc , & inline_state ));
38143821
38153822 optimized = 1 ;
38163823 ADDOP_JUMP (c , loc , JUMP , end );
@@ -3925,21 +3932,18 @@ codegen_call(compiler *c, expr_ty e)
39253932 if (ret == 1 ) {
39263933 return SUCCESS ;
39273934 }
3928- NEW_JUMP_TARGET_LABEL (c , end );
3929- ret = maybe_optimize_function_call (c , e , end );
3930- if (ret < 0 ) {
3931- return ERROR ;
3932- }
3935+ NEW_JUMP_TARGET_LABEL (c , skip_normal_call );
3936+ RETURN_IF_ERROR (maybe_optimize_function_call (c , e , skip_normal_call ));
39333937 RETURN_IF_ERROR (check_caller (c , e -> v .Call .func ));
39343938 VISIT (c , expr , e -> v .Call .func );
39353939 location loc = LOC (e -> v .Call .func );
39363940 ADDOP (c , loc , PUSH_NULL );
39373941 loc = LOC (e );
3938- RETURN_IF_ERROR ( codegen_call_helper (c , loc , 0 ,
3939- e -> v .Call .args ,
3940- e -> v .Call .keywords ) );
3941- USE_LABEL (c , end );
3942- return SUCCESS ;
3942+ ret = codegen_call_helper (c , loc , 0 ,
3943+ e -> v .Call .args ,
3944+ e -> v .Call .keywords );
3945+ USE_LABEL (c , skip_normal_call );
3946+ return ret ;
39433947}
39443948
39453949static int
0 commit comments