@@ -707,6 +707,8 @@ opcode_stack_effect(int opcode, int oparg)
707707
708708 case SET_ADD :
709709 case LIST_APPEND :
710+ return -1 ;
711+ case MAP_ADD :
710712 return -2 ;
711713
712714 case BINARY_POWER :
@@ -2823,7 +2825,7 @@ compiler_call_helper(struct compiler *c,
28232825*/
28242826
28252827static int
2826- compiler_comprehension_generator (struct compiler * c , PyObject * tmpname ,
2828+ compiler_comprehension_generator (struct compiler * c ,
28272829 asdl_seq * generators , int gen_index ,
28282830 expr_ty elt , expr_ty val , int type )
28292831{
@@ -2871,7 +2873,7 @@ compiler_comprehension_generator(struct compiler *c, PyObject *tmpname,
28712873 }
28722874
28732875 if (++ gen_index < asdl_seq_LEN (generators ))
2874- if (!compiler_comprehension_generator (c , tmpname ,
2876+ if (!compiler_comprehension_generator (c ,
28752877 generators , gen_index ,
28762878 elt , val , type ))
28772879 return 0 ;
@@ -2886,27 +2888,19 @@ compiler_comprehension_generator(struct compiler *c, PyObject *tmpname,
28862888 ADDOP (c , POP_TOP );
28872889 break ;
28882890 case COMP_LISTCOMP :
2889- if (!compiler_nameop (c , tmpname , Load ))
2890- return 0 ;
28912891 VISIT (c , expr , elt );
2892- ADDOP (c , LIST_APPEND );
2892+ ADDOP_I (c , LIST_APPEND , gen_index + 1 );
28932893 break ;
28942894 case COMP_SETCOMP :
2895- if (!compiler_nameop (c , tmpname , Load ))
2896- return 0 ;
28972895 VISIT (c , expr , elt );
2898- ADDOP (c , SET_ADD );
2896+ ADDOP_I (c , SET_ADD , gen_index + 1 );
28992897 break ;
29002898 case COMP_DICTCOMP :
2901- if (!compiler_nameop (c , tmpname , Load ))
2902- return 0 ;
29032899 /* With 'd[k] = v', v is evaluated before k, so we do
2904- the same. STORE_SUBSCR requires (item, map, key),
2905- so we still end up ROTing once. */
2900+ the same. */
29062901 VISIT (c , expr , val );
2907- ADDOP (c , ROT_TWO );
29082902 VISIT (c , expr , elt );
2909- ADDOP (c , STORE_SUBSCR );
2903+ ADDOP_I (c , MAP_ADD , gen_index + 1 );
29102904 break ;
29112905 default :
29122906 return 0 ;
@@ -2932,7 +2926,6 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
29322926 asdl_seq * generators , expr_ty elt , expr_ty val )
29332927{
29342928 PyCodeObject * co = NULL ;
2935- identifier tmp = NULL ;
29362929 expr_ty outermost_iter ;
29372930
29382931 outermost_iter = ((comprehension_ty )
@@ -2943,9 +2936,6 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
29432936
29442937 if (type != COMP_GENEXP ) {
29452938 int op ;
2946- tmp = compiler_new_tmpname (c );
2947- if (!tmp )
2948- goto error_in_scope ;
29492939 switch (type ) {
29502940 case COMP_LISTCOMP :
29512941 op = BUILD_LIST ;
@@ -2963,12 +2953,9 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
29632953 }
29642954
29652955 ADDOP_I (c , op , 0 );
2966- ADDOP (c , DUP_TOP );
2967- if (!compiler_nameop (c , tmp , Store ))
2968- goto error_in_scope ;
29692956 }
29702957
2971- if (!compiler_comprehension_generator (c , tmp , generators , 0 , elt ,
2958+ if (!compiler_comprehension_generator (c , generators , 0 , elt ,
29722959 val , type ))
29732960 goto error_in_scope ;
29742961
@@ -2984,7 +2971,6 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
29842971 if (!compiler_make_closure (c , co , 0 ))
29852972 goto error ;
29862973 Py_DECREF (co );
2987- Py_XDECREF (tmp );
29882974
29892975 VISIT (c , expr , outermost_iter );
29902976 ADDOP (c , GET_ITER );
@@ -2994,7 +2980,6 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
29942980 compiler_exit_scope (c );
29952981error :
29962982 Py_XDECREF (co );
2997- Py_XDECREF (tmp );
29982983 return 0 ;
29992984}
30002985
0 commit comments