Repository navigation
0.1.3
Immutable
release. Only release title and notes can be modified.
Released on 2026-10-11.
Serc 0.1.3 expands CPython bytecode compatibility, especially for Python 3.14
optimized control flow, exception cleanup, and source locations.
Bug fixes
- Match CPython loop backedges when optimization erases final coroutine-loop
branches, including loops inside context managers (#1031;
#1031) (#1038;
#1038) (#1040;
#1040) (#1041;
#1041) (#1042;
#1042) - Match CPython loop exits when optimization erases prefixes, nested-finalizer
branches, completed manager work, or coroutinefor/elsearms
(#1043; #1043)
(#1044; #1044)
(#1047; #1047)
(#1054; #1054)
(#1055; #1055) - Preserve optimized branch exits after erased iterator work, completed managed
branches, and discarded constants (#1188;
#1188) (#1198;
#1198) (#1220;
#1220) - Preserve loop and async-cleanup boundaries when optimization removes
assertions or loop tails (#1102;
#1102) (#1104;
#1104) (#1107;
#1107) (#1114;
#1114) - Preserve exits when optimization erases comprehension, context-manager,
structured-cleanup, or finalizer work (#1106;
#1106) (#1108;
#1108) (#1112;
#1112) (#1118;
#1118) - Preserve coroutine, loop, and finalizer exits when optimization erases
recovery paths, assertions, or awaited alternatives (#1162;
#1162) (#1204;
#1204) (#1205;
#1205) (#1207;
#1207) - Match CPython exception ownership when copied loop exits cross finalizers,
backedges, or guarded handlers (#1032;
#1032) (#1048;
#1048) (#1052;
#1052) - Preserve control-flow and borrowing boundaries for nested
while/elseloops
and runtime loops in finalizers (#1064;
#1064) (#1068;
#1068) (#1069;
#1069) (#1078;
#1078) - Preserve loop and retry cleanup after recovery breaks, linear
elsesuites,
and nested context managers (#1080;
#1080) (#1085;
#1085) (#1086;
#1086) - Match CPython iterator-loop cleanup boundaries for chained comparisons, async
breaks, and abrupt asyncelsesuites (#1046;
#1046) (#1049;
#1049) (#1088;
#1088) (#1089;
#1089) - Preserve async-iterator exits into nested cleanup, outer-loop cleanup, and
assertion cleanup (#1093;
#1093) (#1097;
#1097) (#1120;
#1120) (#1127;
#1127) - Preserve iterator cleanup when runtime breaks, conditional loads, or guarded
cleanup are involved (#1144;
#1144) (#1161;
#1161) (#1164;
#1164) - Preserve natural loop and iterator exits into structured, managed, nested, and
Boolean-guarded cleanup (#1094;
#1094) (#1095;
#1095) (#1096;
#1096) (#1098;
#1098) - Preserve coroutine-loop recovery entries and cold continuations around nested
cleanup and asyncelsebreaks (#1131;
#1131) (#1135;
#1135) (#1138;
#1138) (#1139;
#1139) - Preserve
breakpaths into conditional, guarded, and awaited cleanup
(#1137; #1137)
(#1140; #1140)
(#1146; #1146)
(#1147; #1147) - Preserve loop and managed-recovery exits through handler cleanup, context
managers, and runtime finalizers (#1155;
#1155) (#1187;
#1187) (#1200;
#1200) (#1214;
#1214) - Match CPython ordering for folded breaks, coroutine loop-
elsebreaks, direct
loop exits, and finalizer entry after loops (#1202;
#1202) (#1203;
#1203) (#1212;
#1212) (#1217;
#1217) (#1223;
#1223) - Preserve exception ownership when guarded finalizers and conditional
context-manager cleanup are copied (#1035;
#1035) (#1036;
#1036) (#1050;
#1050) (#1053;
#1053) - Preserve finalizer ownership, condition slots, and empty exits around
terminating handlers and conditional branches (#1058;
#1058) (#1062;
#1062) (#1065;
#1065) (#1066;
#1066) - Match CPython exception tables after erased
try/elseassertions and
compactedNonechecks in nested context managers (#1072;
#1072) (#1087;
#1087) - Preserve recovery cleanup after conditional stores,
elifbranches, and
awaited branches in coroutines (#1057;
#1057) (#1059;
#1059) (#1063;
#1063) - Preserve borrowed continuations after assertion recovery in functions,
coroutines, and context managers (#1067;
#1067) (#1070;
#1070) (#1073;
#1073) (#1074;
#1074) - Preserve normal cleanup after terminating, guarded, reraising, or named
exception recovery (#1071;
#1071) (#1075;
#1075) (#1076;
#1076) (#1077;
#1077) - Preserve normal-cleanup reachability after terminal protected bodies, nested
guards, and guarded recovery (#1081;
#1081) (#1082;
#1082) (#1083;
#1083) (#1084;
#1084) - Preserve nested cleanup entries after guarded raises and awaited reraises
(#1091; #1091)
(#1092; #1092) - Preserve cleanup after awaited
try/elseassertions, nested recovery
alternatives, and asserted coroutine exits (#1099;
#1099) (#1100;
#1100) (#1101;
#1101) - Preserve cleanup reachability, boundaries, and ownership across abrupt
branches and nested loops (#1109;
#1109) (#1110;
#1110) (#1111;
#1111) (#1113;
#1113) - Preserve live cleanup continuations around iterator recovery, raising cleanup,
completed handler values, and nested recovery (#1117;
#1117) (#1119;
#1119) (#1121;
#1121) (#1122;
#1122) (#1123;
#1123) - Preserve async-manager and coroutine cleanup entries through nested,
returning, and guarded recovery (#1116;
#1116) (#1124;
#1124) (#1125;
#1125) (#1126;
#1126) - Preserve cleanup joins after async-manager recovery and managed async retries
(#1130; #1130)
(#1133; #1133)
(#1136; #1136) - Preserve coroutine cleanup around raising guards and calls followed by nested
elseexits (#1141;
#1141) (#1149;
#1149) - Preserve context-manager cleanup around outer iterators, conditional call
arguments, and guarded async iterators (#1142;
#1142) (#1143;
#1143) (#1152;
#1152) - Preserve manager cleanup after awaited or conditional stores and across
suspension (#1151; #1151)
(#1154; #1154)
(#1157; #1157)
(#1168; #1168) - Preserve normal cleanup entries and copied recovery exits around stored calls
and raises (#1145; #1145)
(#1148; #1148)
(#1150; #1150) - Preserve conditional exits and cleanup around stored reraises, guarded
recovery, and nested repair paths (#1159;
#1159) (#1163;
#1163) (#1165;
#1165) - Preserve coroutine success and recovery paths through awaited, nested, and
elsecleanup (#1153;
#1153) (#1156;
#1156) (#1158;
#1158) (#1160;
#1160) (#1166;
#1166) - Preserve cleanup ownership after tuple unpacking, deletion, and comprehension
work (#1115; #1115)
(#1128; #1128)
(#1132; #1132)
(#1134; #1134)
(#1167; #1167) - Preserve guarded and nested recovery continuations through completed work and
finalizers (#1185; #1185)
(#1206; #1206)
(#1208; #1208)
(#1210; #1210) - Preserve copied and coroutine recovery entries into normal and nested
finalizers (#1211; #1211)
(#1215; #1215)
(#1216; #1216)
(#1218; #1218) - Preserve finalizer entries after completed work, context-manager cleanup, and
raising recovery (#1221;
#1221) (#1222;
#1222) (#1224;
#1224) - Preserve cleanup joins and continuations across erased branches, awaited
finalizers, and guarded coroutine recovery (#1193;
#1193) (#1196;
#1196) (#1209;
#1209) (#1213;
#1213) - Preserve enclosing exception owners when returns copy nested finalizers
(#1029; #1029)
(#1051; #1051)
(#1177; #1177)
(#1181; #1181)
(#1191; #1191) - Preserve cleanup ownership when handler returns unwind nested finalizers and
context managers (#1061;
#1061) (#1178;
#1178) (#1225;
#1225) (#1226;
#1226) - End inner
tryregions at the CPython-compatible point before iterator and
context-manager cleanup (#1060;
#1060) (#1175;
#1175) (#1180;
#1180) - Preserve iterator ownership and cleanup ordering through returns and
named-handler cleanup (#1182;
#1182) (#1183;
#1183) (#1190;
#1190) - Preserve shared subscript, conditional, and tuple return paths through cleanup
(#1033; #1033)
(#1034; #1034)
(#1039; #1039) - Preserve return-copy paths after managed comprehensions and copied finalizers
(#1179; #1179)
(#1186; #1186)
(#1195; #1195)
(#1197; #1197) - Preserve local-load borrowing boundaries when returns cross handler,
finalizer, or branching call cleanup (#1030;
#1030) (#1037;
#1037) (#1045;
#1045) (#1090;
#1090) - Match CPython constant folding and local-load fusion after copied exits and
exception handlers (#1171;
#1171) (#1174;
#1174) (#1176;
#1176) (#1184;
#1184) - Match CPython cleanup rotations and boundaries for sequence and mapping
patterns (#1172; #1172)
(#1173; #1173)
(#1192; #1192) - Preserve module cell ordering when optimization removes assertions
(#1169; #1169) - Preserve interrupt and monitoring checks through async-match exhaustion and
handler cleanup (#1170;
#1170) (#1194;
#1194) (#1232;
#1232) - Match CPython bytecode for terminal conditional name stores
(#1201; #1201) - Preserve return source locations after removed assertions and completed
prefixes (#1103; #1103)
(#1228; #1228)
(#1229; #1229)
(#1230; #1230) - Preserve return source locations after managed branches, erased coroutine
assertions, and async cleanup (#1238;
#1238) (#1239;
#1239) (#1240;
#1240) - Preserve authored break lines, unlocated manager joins, and line markers
through nested finalizers (#1079;
#1079) (#1105;
#1105) (#1129;
#1129) - Preserve original guard, exit, scope-footer, and copied-match source locations
(#1219; #1219)
(#1227; #1227)
(#1233; #1233)
(#1237; #1237) - Avoid a debug-build assertion failure when legacy return blocks receive a late
leading source location (#1056;
#1056)