@@ -2614,6 +2614,90 @@ def test_send(self):
26142614 ]
26152615 self .cfg_optimization_test (insts , expected , consts = [None ])
26162616
2617+ def test_format_simple (self ):
2618+ # FORMAT_SIMPLE will leave its operand on the stack if it's a unicode
2619+ # object. We treat it conservatively and assume that it always leaves
2620+ # its operand on the stack.
2621+ insts = [
2622+ ("LOAD_FAST" , 0 , 1 ),
2623+ ("FORMAT_SIMPLE" , None , 2 ),
2624+ ("STORE_FAST" , 1 , 3 ),
2625+ ]
2626+ self .check (insts , insts )
2627+
2628+ insts = [
2629+ ("LOAD_FAST" , 0 , 1 ),
2630+ ("FORMAT_SIMPLE" , None , 2 ),
2631+ ("POP_TOP" , None , 3 ),
2632+ ]
2633+ expected = [
2634+ ("LOAD_FAST_BORROW" , 0 , 1 ),
2635+ ("FORMAT_SIMPLE" , None , 2 ),
2636+ ("POP_TOP" , None , 3 ),
2637+ ]
2638+ self .check (insts , expected )
2639+
2640+ def test_set_function_attribute (self ):
2641+ # SET_FUNCTION_ATTRIBUTE leaves the function on the stack
2642+ insts = [
2643+ ("LOAD_CONST" , 0 , 1 ),
2644+ ("LOAD_FAST" , 0 , 2 ),
2645+ ("SET_FUNCTION_ATTRIBUTE" , 2 , 3 ),
2646+ ("STORE_FAST" , 1 , 4 ),
2647+ ("LOAD_CONST" , 0 , 5 ),
2648+ ("RETURN_VALUE" , None , 6 )
2649+ ]
2650+ self .cfg_optimization_test (insts , insts , consts = [None ])
2651+
2652+ insts = [
2653+ ("LOAD_CONST" , 0 , 1 ),
2654+ ("LOAD_FAST" , 0 , 2 ),
2655+ ("SET_FUNCTION_ATTRIBUTE" , 2 , 3 ),
2656+ ("RETURN_VALUE" , None , 4 )
2657+ ]
2658+ expected = [
2659+ ("LOAD_CONST" , 0 , 1 ),
2660+ ("LOAD_FAST_BORROW" , 0 , 2 ),
2661+ ("SET_FUNCTION_ATTRIBUTE" , 2 , 3 ),
2662+ ("RETURN_VALUE" , None , 4 )
2663+ ]
2664+ self .cfg_optimization_test (insts , expected , consts = [None ])
2665+
2666+ def test_get_yield_from_iter (self ):
2667+ # GET_YIELD_FROM_ITER may leave its operand on the stack
2668+ insts = [
2669+ ("LOAD_FAST" , 0 , 1 ),
2670+ ("GET_YIELD_FROM_ITER" , None , 2 ),
2671+ ("LOAD_CONST" , 0 , 3 ),
2672+ send := self .Label (),
2673+ ("SEND" , end := self .Label (), 5 ),
2674+ ("YIELD_VALUE" , 1 , 6 ),
2675+ ("RESUME" , 2 , 7 ),
2676+ ("JUMP" , send , 8 ),
2677+ end ,
2678+ ("END_SEND" , None , 9 ),
2679+ ("LOAD_CONST" , 0 , 10 ),
2680+ ("RETURN_VALUE" , None , 11 ),
2681+ ]
2682+ self .cfg_optimization_test (insts , insts , consts = [None ])
2683+
2684+ def test_push_exc_info (self ):
2685+ insts = [
2686+ ("LOAD_FAST" , 0 , 1 ),
2687+ ("PUSH_EXC_INFO" , None , 2 ),
2688+ ]
2689+ self .check (insts , insts )
2690+
2691+ def test_load_special (self ):
2692+ # LOAD_SPECIAL may leave self on the stack
2693+ insts = [
2694+ ("LOAD_FAST" , 0 , 1 ),
2695+ ("LOAD_SPECIAL" , 0 , 2 ),
2696+ ("STORE_FAST" , 1 , 3 ),
2697+ ]
2698+ self .check (insts , insts )
2699+
2700+
26172701 def test_del_in_finally (self ):
26182702 # This loads `obj` onto the stack, executes `del obj`, then returns the
26192703 # `obj` from the stack. See gh-133371 for more details.
@@ -2630,6 +2714,14 @@ def create_obj():
26302714 gc .collect ()
26312715 self .assertEqual (obj , [42 ])
26322716
2717+ def test_format_simple_unicode (self ):
2718+ # Repro from gh-134889
2719+ def f ():
2720+ var = f"{ 1 } "
2721+ var = f"{ var } "
2722+ return var
2723+ self .assertEqual (f (), "1" )
2724+
26332725
26342726
26352727if __name__ == "__main__" :
0 commit comments