@@ -744,73 +744,114 @@ L4:
744744[case testTupleBuiltFromFinalFixedLengthTuple]
745745from typing import Final
746746
747- source: Final = (1, 2, 3)
747+ def varint() -> int:
748+ # this helper lets us break constant folding for this test
749+ return 2
750+
751+ source_final: Final = (1, varint(), 3)
752+ source_var = (1, varint(), 3)
748753
749754def f(val: int) -> bool:
750755 return val % 2 == 0
751756
752- def test() -> None:
753- a = tuple(f(x) for x in source)
757+ def test_final_can_fold() -> None:
758+ a = tuple(f(x) for x in source_final)
759+ def test_var_can_not_fold() -> None:
760+ a = tuple(f(x) for x in source_var)
754761[out]
762+ def varint():
763+ L0:
764+ return 4
755765def f(val):
756766 val, r0 :: int
757767 r1 :: bit
758768L0:
759769 r0 = CPyTagged_Remainder(val, 4)
760770 r1 = int_eq r0, 0
761771 return r1
762- def test ():
772+ def test_final_can_fold ():
763773 r0 :: tuple[int, int, int]
764774 r1 :: bool
765775 r2 :: object
766776 r3 :: native_int
767777 r4 :: bit
768- r5, r6, r7 :: int
769- r8, r9, r10 :: object
770- r11, r12 :: tuple
771- r13 :: native_int
772- r14 :: bit
773- r15 :: object
774- r16, x :: int
775- r17 :: bool
776- r18 :: object
777- r19 :: native_int
778+ r5 :: object
779+ r6 :: int
780+ r7, r8 :: object
781+ r9, r10 :: tuple
782+ r11 :: native_int
783+ r12 :: bit
784+ r13 :: object
785+ r14, x :: int
786+ r15 :: bool
787+ r16 :: object
788+ r17 :: native_int
778789 a :: tuple
779790L0:
780- r0 = __main__.source :: static
791+ r0 = __main__.source_final :: static
781792 if is_error(r0) goto L1 else goto L2
782793L1:
783- r1 = raise NameError('value for final name "source " was not set')
794+ r1 = raise NameError('value for final name "source_final " was not set')
784795 unreachable
785796L2:
786797 r2 = box(tuple[int, int, int], r0)
787798 r3 = PyObject_Size(r2)
788799 r4 = r3 >= 0 :: signed
789- r5 = r0[0]
800+ r5 = object 1
790801 r6 = r0[1]
791- r7 = r0[2]
792- r8 = box(int, r5)
793- r9 = box(int, r6)
794- r10 = box(int, r7)
795- r11 = PyTuple_Pack(3, r8, r9, r10)
796- r12 = PyTuple_New(r3)
797- r13 = 0
802+ r7 = object 3
803+ r8 = box(int, r6)
804+ r9 = PyTuple_Pack(3, r5, r8, r7)
805+ r10 = PyTuple_New(r3)
806+ r11 = 0
798807L3:
799- r14 = r13 < r3 :: signed
800- if r14 goto L4 else goto L6 :: bool
808+ r12 = r11 < r3 :: signed
809+ if r12 goto L4 else goto L6 :: bool
801810L4:
802- r15 = CPySequenceTuple_GetItemUnsafe(r11, r13 )
803- r16 = unbox(int, r15 )
804- x = r16
805- r17 = f(x)
806- r18 = box(bool, r17 )
807- CPySequenceTuple_SetItemUnsafe(r12, r13, r18 )
811+ r13 = CPySequenceTuple_GetItemUnsafe(r9, r11 )
812+ r14 = unbox(int, r13 )
813+ x = r14
814+ r15 = f(x)
815+ r16 = box(bool, r15 )
816+ CPySequenceTuple_SetItemUnsafe(r10, r11, r16 )
808817L5:
809- r19 = r13 + 1
810- r13 = r19
818+ r17 = r11 + 1
819+ r11 = r17
811820 goto L3
812821L6:
813- a = r12
822+ a = r10
823+ return 1
824+ def test_var_can_not_fold():
825+ source :: tuple
826+ r0 :: native_int
827+ r1 :: tuple
828+ r2 :: native_int
829+ r3 :: bit
830+ r4 :: object
831+ r5, x, r6 :: bool
832+ r7 :: object
833+ r8 :: native_int
834+ a :: tuple
835+ L0:
836+ r0 = var_object_size source
837+ r1 = PyTuple_New(r0)
838+ r2 = 0
839+ L1:
840+ r3 = r2 < r0 :: signed
841+ if r3 goto L2 else goto L4 :: bool
842+ L2:
843+ r4 = CPySequenceTuple_GetItemUnsafe(source, r2)
844+ r5 = unbox(bool, r4)
845+ x = r5
846+ r6 = f(x)
847+ r7 = box(bool, r6)
848+ CPySequenceTuple_SetItemUnsafe(r1, r2, r7)
849+ L3:
850+ r8 = r2 + 1
851+ r2 = r8
852+ goto L1
853+ L4:
854+ a = r1
814855 return 1
815856
816857[case testTupleBuiltFromVariableLengthTuple]
0 commit comments