@@ -3953,22 +3953,45 @@ maybe_optimize_function_call(compiler *c, expr_ty e, jump_target_label end)
39533953
39543954 if (! (func -> kind == Name_kind &&
39553955 asdl_seq_LEN (args ) == 1 &&
3956- asdl_seq_LEN (kwds ) == 0 &&
3957- asdl_seq_GET (args , 0 )-> kind == GeneratorExp_kind ))
3956+ asdl_seq_LEN (kwds ) == 0 ))
39583957 {
39593958 return 0 ;
39603959 }
39613960
3962- expr_ty generator_exp = asdl_seq_GET (args , 0 );
3963- PySTEntryObject * generator_entry = _PySymtable_Lookup (SYMTABLE (c ), (void * )generator_exp );
3961+ location loc = LOC (func );
3962+
3963+ expr_ty arg_expr = asdl_seq_GET (args , 0 );
3964+
3965+ if (_PyUnicode_EqualToASCIIString (func -> v .Name .id , "frozenset" )
3966+ && (arg_expr -> kind == Set_kind || arg_expr -> kind == SetComp_kind )) {
3967+ NEW_JUMP_TARGET_LABEL (c , skip_optimization );
3968+
3969+ ADDOP_I (c , loc , COPY , 1 );
3970+ ADDOP_I (c , loc , LOAD_COMMON_CONSTANT , CONSTANT_BUILTIN_FROZENSET );
3971+ ADDOP_COMPARE (c , loc , Is );
3972+ ADDOP_JUMP (c , loc , POP_JUMP_IF_FALSE , skip_optimization );
3973+ ADDOP (c , loc , POP_TOP );
3974+
3975+ VISIT (c , expr , arg_expr );
3976+ ADDOP_I (c , loc , CALL_INTRINSIC_1 , INTRINSIC_BUILD_FROZENSET );
3977+
3978+ ADDOP_JUMP (c , loc , JUMP , end );
3979+
3980+ USE_LABEL (c , skip_optimization );
3981+ return 1 ;
3982+ }
3983+
3984+ if (arg_expr -> kind != GeneratorExp_kind ) {
3985+ return 0 ;
3986+ }
3987+
3988+ PySTEntryObject * generator_entry = _PySymtable_Lookup (SYMTABLE (c ), (void * )arg_expr );
39643989 if (generator_entry -> ste_coroutine ) {
39653990 Py_DECREF (generator_entry );
39663991 return 0 ;
39673992 }
39683993 Py_DECREF (generator_entry );
39693994
3970- location loc = LOC (func );
3971-
39723995 int optimized = 0 ;
39733996 NEW_JUMP_TARGET_LABEL (c , skip_optimization );
39743997
@@ -3994,6 +4017,9 @@ maybe_optimize_function_call(compiler *c, expr_ty e, jump_target_label end)
39944017 else if (_PyUnicode_EqualToASCIIString (func -> v .Name .id , "set" )) {
39954018 const_oparg = CONSTANT_BUILTIN_SET ;
39964019 }
4020+ else if (_PyUnicode_EqualToASCIIString (func -> v .Name .id , "frozenset" )) {
4021+ const_oparg = CONSTANT_BUILTIN_FROZENSET ;
4022+ }
39974023 if (const_oparg != -1 ) {
39984024 ADDOP_I (c , loc , COPY , 1 ); // the function
39994025 ADDOP_I (c , loc , LOAD_COMMON_CONSTANT , const_oparg );
@@ -4003,10 +4029,10 @@ maybe_optimize_function_call(compiler *c, expr_ty e, jump_target_label end)
40034029
40044030 if (const_oparg == CONSTANT_BUILTIN_TUPLE || const_oparg == CONSTANT_BUILTIN_LIST ) {
40054031 ADDOP_I (c , loc , BUILD_LIST , 0 );
4006- } else if (const_oparg == CONSTANT_BUILTIN_SET ) {
4032+ } else if (const_oparg == CONSTANT_BUILTIN_SET || const_oparg == CONSTANT_BUILTIN_FROZENSET ) {
40074033 ADDOP_I (c , loc , BUILD_SET , 0 );
40084034 }
4009- VISIT (c , expr , generator_exp );
4035+ VISIT (c , expr , arg_expr );
40104036
40114037 NEW_JUMP_TARGET_LABEL (c , loop );
40124038 NEW_JUMP_TARGET_LABEL (c , cleanup );
@@ -4017,7 +4043,7 @@ maybe_optimize_function_call(compiler *c, expr_ty e, jump_target_label end)
40174043 if (const_oparg == CONSTANT_BUILTIN_TUPLE || const_oparg == CONSTANT_BUILTIN_LIST ) {
40184044 ADDOP_I (c , loc , LIST_APPEND , 3 );
40194045 ADDOP_JUMP (c , loc , JUMP , loop );
4020- } else if (const_oparg == CONSTANT_BUILTIN_SET ) {
4046+ } else if (const_oparg == CONSTANT_BUILTIN_SET || const_oparg == CONSTANT_BUILTIN_FROZENSET ) {
40214047 ADDOP_I (c , loc , SET_ADD , 3 );
40224048 ADDOP_JUMP (c , loc , JUMP , loop );
40234049 }
@@ -4029,7 +4055,8 @@ maybe_optimize_function_call(compiler *c, expr_ty e, jump_target_label end)
40294055 ADDOP (c , NO_LOCATION , POP_ITER );
40304056 if (const_oparg != CONSTANT_BUILTIN_TUPLE &&
40314057 const_oparg != CONSTANT_BUILTIN_LIST &&
4032- const_oparg != CONSTANT_BUILTIN_SET ) {
4058+ const_oparg != CONSTANT_BUILTIN_SET &&
4059+ const_oparg != CONSTANT_BUILTIN_FROZENSET ) {
40334060 ADDOP_LOAD_CONST (c , loc , initial_res == Py_True ? Py_False : Py_True );
40344061 }
40354062 ADDOP_JUMP (c , loc , JUMP , end );
@@ -4044,6 +4071,9 @@ maybe_optimize_function_call(compiler *c, expr_ty e, jump_target_label end)
40444071 } else if (const_oparg == CONSTANT_BUILTIN_SET ) {
40454072 // result is already a set
40464073 }
4074+ else if (const_oparg == CONSTANT_BUILTIN_FROZENSET ) {
4075+ ADDOP_I (c , loc , CALL_INTRINSIC_1 , INTRINSIC_BUILD_FROZENSET );
4076+ }
40474077 else {
40484078 ADDOP_LOAD_CONST (c , loc , initial_res );
40494079 }
0 commit comments