@@ -572,3 +572,232 @@ def sort_iterable(a):
572572L0:
573573 r0 = CPySequence_Sort(a)
574574 return 1
575+
576+ [case testListBuiltFromStr]
577+ def f2(val: str) -> str:
578+ return val + "f2"
579+
580+ def test() -> None:
581+ source = "abc"
582+ a = [f2(x) for x in source]
583+ [out]
584+ def f2(val):
585+ val, r0, r1 :: str
586+ L0:
587+ r0 = 'f2'
588+ r1 = PyUnicode_Concat(val, r0)
589+ return r1
590+ def test():
591+ r0, source :: str
592+ r1 :: native_int
593+ r2 :: bit
594+ r3 :: list
595+ r4 :: native_int
596+ r5 :: bit
597+ r6, x, r7 :: str
598+ r8 :: native_int
599+ a :: list
600+ L0:
601+ r0 = 'abc'
602+ source = r0
603+ r1 = CPyStr_Size_size_t(source)
604+ r2 = r1 >= 0 :: signed
605+ r3 = PyList_New(r1)
606+ r4 = 0
607+ L1:
608+ r5 = r4 < r1 :: signed
609+ if r5 goto L2 else goto L4 :: bool
610+ L2:
611+ r6 = CPyStr_GetItemUnsafe(source, r4)
612+ x = r6
613+ r7 = f2(x)
614+ CPyList_SetItemUnsafe(r3, r4, r7)
615+ L3:
616+ r8 = r4 + 1
617+ r4 = r8
618+ goto L1
619+ L4:
620+ a = r3
621+ return 1
622+
623+ [case testListBuiltFromFinalStr]
624+ from typing import Final
625+
626+ source: Final = "abc"
627+
628+ def f2(val: str) -> str:
629+ return val + "f2"
630+
631+ def test() -> None:
632+ a = [f2(x) for x in source]
633+ [out]
634+ def f2(val):
635+ val, r0, r1 :: str
636+ L0:
637+ r0 = 'f2'
638+ r1 = PyUnicode_Concat(val, r0)
639+ return r1
640+ def test():
641+ r0 :: str
642+ r1 :: list
643+ r2 :: native_int
644+ r3 :: bit
645+ r4, x, r5 :: str
646+ r6 :: native_int
647+ a :: list
648+ L0:
649+ r0 = 'abc'
650+ r1 = PyList_New(3)
651+ r2 = 0
652+ L1:
653+ r3 = r2 < 3 :: signed
654+ if r3 goto L2 else goto L4 :: bool
655+ L2:
656+ r4 = CPyStr_GetItemUnsafe(r0, r2)
657+ x = r4
658+ r5 = f2(x)
659+ CPyList_SetItemUnsafe(r1, r2, r5)
660+ L3:
661+ r6 = r2 + 1
662+ r2 = r6
663+ goto L1
664+ L4:
665+ a = r1
666+ return 1
667+
668+ [case testListBuiltFromBytes_64bit]
669+ def f2(val: int) -> int:
670+ return val + 2
671+
672+ def test() -> None:
673+ source = b"abc"
674+ a = [f2(x) for x in source]
675+
676+ [out]
677+ def f2(val):
678+ val, r0 :: int
679+ L0:
680+ r0 = CPyTagged_Add(val, 4)
681+ return r0
682+ def test():
683+ r0, source :: bytes
684+ r1 :: native_int
685+ r2 :: list
686+ r3 :: native_int
687+ r4, r5, r6 :: bit
688+ r7, r8, r9, r10 :: int
689+ r11 :: object
690+ r12, x, r13 :: int
691+ r14 :: object
692+ r15 :: native_int
693+ a :: list
694+ L0:
695+ r0 = b'abc'
696+ source = r0
697+ r1 = var_object_size source
698+ r2 = PyList_New(r1)
699+ r3 = 0
700+ L1:
701+ r4 = r3 < r1 :: signed
702+ if r4 goto L2 else goto L8 :: bool
703+ L2:
704+ r5 = r3 <= 4611686018427387903 :: signed
705+ if r5 goto L3 else goto L4 :: bool
706+ L3:
707+ r6 = r3 >= -4611686018427387904 :: signed
708+ if r6 goto L5 else goto L4 :: bool
709+ L4:
710+ r7 = CPyTagged_FromInt64(r3)
711+ r8 = r7
712+ goto L6
713+ L5:
714+ r9 = r3 << 1
715+ r8 = r9
716+ L6:
717+ r10 = CPyBytes_GetItem(source, r8)
718+ r11 = box(int, r10)
719+ r12 = unbox(int, r11)
720+ x = r12
721+ r13 = f2(x)
722+ r14 = box(int, r13)
723+ CPyList_SetItemUnsafe(r2, r3, r14)
724+ L7:
725+ r15 = r3 + 1
726+ r3 = r15
727+ goto L1
728+ L8:
729+ a = r2
730+ return 1
731+
732+ [case testListBuiltFromFinalBytes_64bit]
733+ from typing import Final
734+
735+ source: Final = b"abc"
736+
737+ def f2(val: int) -> int:
738+ return val + 2
739+
740+ def test() -> None:
741+ a = [f2(x) for x in source]
742+
743+ [out]
744+ def f2(val):
745+ val, r0 :: int
746+ L0:
747+ r0 = CPyTagged_Add(val, 4)
748+ return r0
749+ def test():
750+ r0 :: bytes
751+ r1 :: bool
752+ r2 :: native_int
753+ r3 :: list
754+ r4 :: native_int
755+ r5, r6, r7 :: bit
756+ r8, r9, r10, r11 :: int
757+ r12 :: object
758+ r13, x, r14 :: int
759+ r15 :: object
760+ r16 :: native_int
761+ a :: list
762+ L0:
763+ r0 = __main__.source :: static
764+ if is_error(r0) goto L1 else goto L2
765+ L1:
766+ r1 = raise NameError('value for final name "source" was not set')
767+ unreachable
768+ L2:
769+ r2 = var_object_size r0
770+ r3 = PyList_New(r2)
771+ r4 = 0
772+ L3:
773+ r5 = r4 < r2 :: signed
774+ if r5 goto L4 else goto L10 :: bool
775+ L4:
776+ r6 = r4 <= 4611686018427387903 :: signed
777+ if r6 goto L5 else goto L6 :: bool
778+ L5:
779+ r7 = r4 >= -4611686018427387904 :: signed
780+ if r7 goto L7 else goto L6 :: bool
781+ L6:
782+ r8 = CPyTagged_FromInt64(r4)
783+ r9 = r8
784+ goto L8
785+ L7:
786+ r10 = r4 << 1
787+ r9 = r10
788+ L8:
789+ r11 = CPyBytes_GetItem(r0, r9)
790+ r12 = box(int, r11)
791+ r13 = unbox(int, r12)
792+ x = r13
793+ r14 = f2(x)
794+ r15 = box(int, r14)
795+ CPyList_SetItemUnsafe(r3, r4, r15)
796+ L9:
797+ r16 = r4 + 1
798+ r4 = r16
799+ goto L3
800+ L10:
801+ a = r3
802+ return 1
803+
0 commit comments