@@ -3892,15 +3892,23 @@ maybe_optimize_function_call(compiler *c, expr_ty e, jump_target_label end)
38923892 else if (_PyUnicode_EqualToASCIIString (func -> v .Name .id , "tuple" )) {
38933893 const_oparg = CONSTANT_BUILTIN_TUPLE ;
38943894 }
3895+ else if (_PyUnicode_EqualToASCIIString (func -> v .Name .id , "list" )) {
3896+ const_oparg = CONSTANT_BUILTIN_LIST ;
3897+ }
3898+ else if (_PyUnicode_EqualToASCIIString (func -> v .Name .id , "set" )) {
3899+ const_oparg = CONSTANT_BUILTIN_SET ;
3900+ }
38953901 if (const_oparg != -1 ) {
38963902 ADDOP_I (c , loc , COPY , 1 ); // the function
38973903 ADDOP_I (c , loc , LOAD_COMMON_CONSTANT , const_oparg );
38983904 ADDOP_COMPARE (c , loc , Is );
38993905 ADDOP_JUMP (c , loc , POP_JUMP_IF_FALSE , skip_optimization );
39003906 ADDOP (c , loc , POP_TOP );
39013907
3902- if (const_oparg == CONSTANT_BUILTIN_TUPLE ) {
3908+ if (const_oparg == CONSTANT_BUILTIN_TUPLE || const_oparg == CONSTANT_BUILTIN_LIST ) {
39033909 ADDOP_I (c , loc , BUILD_LIST , 0 );
3910+ } else if (const_oparg == CONSTANT_BUILTIN_SET ) {
3911+ ADDOP_I (c , loc , BUILD_SET , 0 );
39043912 }
39053913 expr_ty generator_exp = asdl_seq_GET (args , 0 );
39063914 VISIT (c , expr , generator_exp );
@@ -3911,17 +3919,22 @@ maybe_optimize_function_call(compiler *c, expr_ty e, jump_target_label end)
39113919 ADDOP (c , loc , PUSH_NULL ); // Push NULL index for loop
39123920 USE_LABEL (c , loop );
39133921 ADDOP_JUMP (c , loc , FOR_ITER , cleanup );
3914- if (const_oparg == CONSTANT_BUILTIN_TUPLE ) {
3922+ if (const_oparg == CONSTANT_BUILTIN_TUPLE || const_oparg == CONSTANT_BUILTIN_LIST ) {
39153923 ADDOP_I (c , loc , LIST_APPEND , 3 );
39163924 ADDOP_JUMP (c , loc , JUMP , loop );
3925+ } else if (const_oparg == CONSTANT_BUILTIN_SET ) {
3926+ ADDOP_I (c , loc , SET_ADD , 3 );
3927+ ADDOP_JUMP (c , loc , JUMP , loop );
39173928 }
39183929 else {
39193930 ADDOP (c , loc , TO_BOOL );
39203931 ADDOP_JUMP (c , loc , continue_jump_opcode , loop );
39213932 }
39223933
39233934 ADDOP (c , NO_LOCATION , POP_ITER );
3924- if (const_oparg != CONSTANT_BUILTIN_TUPLE ) {
3935+ if (const_oparg != CONSTANT_BUILTIN_TUPLE &&
3936+ const_oparg != CONSTANT_BUILTIN_LIST &&
3937+ const_oparg != CONSTANT_BUILTIN_SET ) {
39253938 ADDOP_LOAD_CONST (c , loc , initial_res == Py_True ? Py_False : Py_True );
39263939 }
39273940 ADDOP_JUMP (c , loc , JUMP , end );
@@ -3931,6 +3944,10 @@ maybe_optimize_function_call(compiler *c, expr_ty e, jump_target_label end)
39313944 ADDOP (c , NO_LOCATION , POP_ITER );
39323945 if (const_oparg == CONSTANT_BUILTIN_TUPLE ) {
39333946 ADDOP_I (c , loc , CALL_INTRINSIC_1 , INTRINSIC_LIST_TO_TUPLE );
3947+ } else if (const_oparg == CONSTANT_BUILTIN_LIST ) {
3948+ // result is already a list
3949+ } else if (const_oparg == CONSTANT_BUILTIN_SET ) {
3950+ // result is already a set
39343951 }
39353952 else {
39363953 ADDOP_LOAD_CONST (c , loc , initial_res );
0 commit comments