Skip to content

Commit e57b40e

Browse files
ambvmeta-codesync[bot]
authored andcommitted
Sync pre-release CPython main branch from GitHub (2026-07-02)
Summary: Imported python/cpython `3.16.0a0` from upstream rev [`384abb7`](https://www.github.com/python/cpython/commit/384abb71445a5a37dfb4dbc5e3020ea6c0c307f7) (committed 2026-07-02 02:54:30+00:00). # Commit Info - Base: (`3.16.0a0`) - [`5717518`](https://www.github.com/python/cpython/commit/5717518fb3ed6f34716683e08ec372267d871d21) (commit date: 2026-06-30 00:05:02+00:00) - Imported: (`3.16.0a0`) - [`384abb7`](https://www.github.com/python/cpython/commit/384abb71445a5a37dfb4dbc5e3020ea6c0c307f7) (commit date: 2026-07-02 02:54:30+00:00) # Noteworthy file changes - Low-signal files (25 added) (NEWS.d, docs, .github) Complete list of added/removed files: https://www.internalfb.com/intern/everpaste/?color=0&handle=GFtD-yQaJ09ROTYDABwAb23cbGgjbr0LAAAz Reviewed By: yoney Differential Revision: D110429260 fbshipit-source-id: 8dd1adb4769c96e2721d166160c0afce912aa15a
1 parent 355562d commit e57b40e

6 files changed

Lines changed: 103 additions & 136 deletions

File tree

cinderx/Interpreter/3.16/Includes/Python/ceval_macros.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,22 @@ check_periodics(PyThreadState *tstate) {
528528
return 0;
529529
}
530530

531+
static inline int
532+
check_periodics_at_end(PyThreadState *tstate, _PyInterpreterFrame *frame) {
533+
_Py_CHECK_EMSCRIPTEN_SIGNALS_PERIODICALLY();
534+
QSBR_QUIESCENT_STATE(tstate);
535+
if (_Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) {
536+
// Do not handle pending interrupts if the previous instruction was LOAD_SPECIAL
537+
// This may also not handle interrupts if a cache looks like LOAD_SPECIAL,
538+
// but this is benign as we won't skip periodic checks indefinitely.
539+
if (frame->instr_ptr[-1].op.code == LOAD_SPECIAL) {
540+
return 0;
541+
}
542+
return _Py_HandlePending(tstate);
543+
}
544+
return 0;
545+
}
546+
531547
// Mark the generator as executing. Returns true if the state was changed,
532548
// false if it was already executing or finished.
533549
static inline bool

cinderx/Interpreter/3.16/Includes/generated_cases.c.h

Lines changed: 59 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -1925,7 +1925,7 @@
19251925
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
19261926
_PyFrame_SetStackPointer(frame, stack_pointer);
19271927
_PyFrame_StackPointerValidate(frame);
1928-
int err = check_periodics(tstate);
1928+
int err = check_periodics_at_end(tstate, frame);
19291929
_PyFrame_StackPointerInvalidate(frame);
19301930
if (err != 0) {
19311931
JUMP_TO_LABEL(error);
@@ -2442,7 +2442,7 @@
24422442
{
24432443
assert(stack_pointer == _PyFrame_GetStackPointer(frame));
24442444
_PyFrame_StackPointerValidate(frame);
2445-
int err = check_periodics(tstate);
2445+
int err = check_periodics_at_end(tstate, frame);
24462446
_PyFrame_StackPointerInvalidate(frame);
24472447
if (err != 0) {
24482448
JUMP_TO_LABEL(error);
@@ -2535,7 +2535,7 @@
25352535
{
25362536
assert(stack_pointer == _PyFrame_GetStackPointer(frame));
25372537
_PyFrame_StackPointerValidate(frame);
2538-
int err = check_periodics(tstate);
2538+
int err = check_periodics_at_end(tstate, frame);
25392539
_PyFrame_StackPointerInvalidate(frame);
25402540
if (err != 0) {
25412541
JUMP_TO_LABEL(error);
@@ -2624,7 +2624,7 @@
26242624
{
26252625
assert(stack_pointer == _PyFrame_GetStackPointer(frame));
26262626
_PyFrame_StackPointerValidate(frame);
2627-
int err = check_periodics(tstate);
2627+
int err = check_periodics_at_end(tstate, frame);
26282628
_PyFrame_StackPointerInvalidate(frame);
26292629
if (err != 0) {
26302630
JUMP_TO_LABEL(error);
@@ -2735,7 +2735,7 @@
27352735
{
27362736
assert(stack_pointer == _PyFrame_GetStackPointer(frame));
27372737
_PyFrame_StackPointerValidate(frame);
2738-
int err = check_periodics(tstate);
2738+
int err = check_periodics_at_end(tstate, frame);
27392739
_PyFrame_StackPointerInvalidate(frame);
27402740
if (err != 0) {
27412741
JUMP_TO_LABEL(error);
@@ -2849,7 +2849,7 @@
28492849
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
28502850
_PyFrame_SetStackPointer(frame, stack_pointer);
28512851
_PyFrame_StackPointerValidate(frame);
2852-
int err = check_periodics(tstate);
2852+
int err = check_periodics_at_end(tstate, frame);
28532853
_PyFrame_StackPointerInvalidate(frame);
28542854
if (err != 0) {
28552855
JUMP_TO_LABEL(error);
@@ -3177,7 +3177,7 @@
31773177
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
31783178
_PyFrame_SetStackPointer(frame, stack_pointer);
31793179
_PyFrame_StackPointerValidate(frame);
3180-
int err = check_periodics(tstate);
3180+
int err = check_periodics_at_end(tstate, frame);
31813181
_PyFrame_StackPointerInvalidate(frame);
31823182
if (err != 0) {
31833183
JUMP_TO_LABEL(error);
@@ -3686,7 +3686,7 @@
36863686
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
36873687
_PyFrame_SetStackPointer(frame, stack_pointer);
36883688
_PyFrame_StackPointerValidate(frame);
3689-
int err = check_periodics(tstate);
3689+
int err = check_periodics_at_end(tstate, frame);
36903690
_PyFrame_StackPointerInvalidate(frame);
36913691
if (err != 0) {
36923692
JUMP_TO_LABEL(error);
@@ -4102,7 +4102,7 @@
41024102
{
41034103
assert(stack_pointer == _PyFrame_GetStackPointer(frame));
41044104
_PyFrame_StackPointerValidate(frame);
4105-
int err = check_periodics(tstate);
4105+
int err = check_periodics_at_end(tstate, frame);
41064106
_PyFrame_StackPointerInvalidate(frame);
41074107
if (err != 0) {
41084108
JUMP_TO_LABEL(error);
@@ -4222,7 +4222,7 @@
42224222
{
42234223
assert(stack_pointer == _PyFrame_GetStackPointer(frame));
42244224
_PyFrame_StackPointerValidate(frame);
4225-
int err = check_periodics(tstate);
4225+
int err = check_periodics_at_end(tstate, frame);
42264226
_PyFrame_StackPointerInvalidate(frame);
42274227
if (err != 0) {
42284228
JUMP_TO_LABEL(error);
@@ -4344,7 +4344,7 @@
43444344
{
43454345
assert(stack_pointer == _PyFrame_GetStackPointer(frame));
43464346
_PyFrame_StackPointerValidate(frame);
4347-
int err = check_periodics(tstate);
4347+
int err = check_periodics_at_end(tstate, frame);
43484348
_PyFrame_StackPointerInvalidate(frame);
43494349
if (err != 0) {
43504350
JUMP_TO_LABEL(error);
@@ -4479,7 +4479,7 @@
44794479
{
44804480
assert(stack_pointer == _PyFrame_GetStackPointer(frame));
44814481
_PyFrame_StackPointerValidate(frame);
4482-
int err = check_periodics(tstate);
4482+
int err = check_periodics_at_end(tstate, frame);
44834483
_PyFrame_StackPointerInvalidate(frame);
44844484
if (err != 0) {
44854485
JUMP_TO_LABEL(error);
@@ -4556,7 +4556,7 @@
45564556
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
45574557
_PyFrame_SetStackPointer(frame, stack_pointer);
45584558
_PyFrame_StackPointerValidate(frame);
4559-
int err = check_periodics(tstate);
4559+
int err = check_periodics_at_end(tstate, frame);
45604560
_PyFrame_StackPointerInvalidate(frame);
45614561
if (err != 0) {
45624562
JUMP_TO_LABEL(error);
@@ -4854,7 +4854,7 @@
48544854
{
48554855
assert(stack_pointer == _PyFrame_GetStackPointer(frame));
48564856
_PyFrame_StackPointerValidate(frame);
4857-
int err = check_periodics(tstate);
4857+
int err = check_periodics_at_end(tstate, frame);
48584858
_PyFrame_StackPointerInvalidate(frame);
48594859
if (err != 0) {
48604860
JUMP_TO_LABEL(error);
@@ -4932,7 +4932,7 @@
49324932
{
49334933
assert(stack_pointer == _PyFrame_GetStackPointer(frame));
49344934
_PyFrame_StackPointerValidate(frame);
4935-
int err = check_periodics(tstate);
4935+
int err = check_periodics_at_end(tstate, frame);
49364936
_PyFrame_StackPointerInvalidate(frame);
49374937
if (err != 0) {
49384938
JUMP_TO_LABEL(error);
@@ -5880,68 +5880,6 @@
58805880
DISPATCH();
58815881
}
58825882

5883-
TARGET(DELETE_GLOBAL) {
5884-
#if _Py_TAIL_CALL_INTERP
5885-
int opcode = DELETE_GLOBAL;
5886-
(void)(opcode);
5887-
#endif
5888-
frame->instr_ptr = next_instr;
5889-
next_instr += 1;
5890-
INSTRUCTION_STATS(DELETE_GLOBAL);
5891-
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
5892-
_PyFrame_SetStackPointer(frame, stack_pointer);
5893-
_PyFrame_StackPointerValidate(frame);
5894-
int err = PyDict_Pop(GLOBALS(), name, NULL);
5895-
_PyFrame_StackPointerInvalidate(frame);
5896-
if (err < 0) {
5897-
JUMP_TO_LABEL(error);
5898-
}
5899-
if (err == 0) {
5900-
assert(stack_pointer == _PyFrame_GetStackPointer(frame));
5901-
_PyFrame_StackPointerValidate(frame);
5902-
_PyEval_FormatExcCheckArg(tstate, PyExc_NameError,
5903-
NAME_ERROR_MSG, name);
5904-
_PyFrame_StackPointerInvalidate(frame);
5905-
JUMP_TO_LABEL(error);
5906-
}
5907-
DISPATCH();
5908-
}
5909-
5910-
TARGET(DELETE_NAME) {
5911-
#if _Py_TAIL_CALL_INTERP
5912-
int opcode = DELETE_NAME;
5913-
(void)(opcode);
5914-
#endif
5915-
frame->instr_ptr = next_instr;
5916-
next_instr += 1;
5917-
INSTRUCTION_STATS(DELETE_NAME);
5918-
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
5919-
PyObject *ns = LOCALS();
5920-
int err;
5921-
if (ns == NULL) {
5922-
_PyFrame_SetStackPointer(frame, stack_pointer);
5923-
_PyFrame_StackPointerValidate(frame);
5924-
_PyErr_Format(tstate, PyExc_SystemError,
5925-
"no locals when deleting %R", name);
5926-
_PyFrame_StackPointerInvalidate(frame);
5927-
JUMP_TO_LABEL(error);
5928-
}
5929-
_PyFrame_SetStackPointer(frame, stack_pointer);
5930-
_PyFrame_StackPointerValidate(frame);
5931-
err = PyObject_DelItem(ns, name);
5932-
_PyFrame_StackPointerInvalidate(frame);
5933-
if (err != 0) {
5934-
assert(stack_pointer == _PyFrame_GetStackPointer(frame));
5935-
_PyFrame_StackPointerValidate(frame);
5936-
_PyEval_FormatExcCheckArg(tstate, PyExc_NameError,
5937-
NAME_ERROR_MSG,
5938-
name);
5939-
_PyFrame_StackPointerInvalidate(frame);
5940-
JUMP_TO_LABEL(error);
5941-
}
5942-
DISPATCH();
5943-
}
5944-
59455883
TARGET(DELETE_SUBSCR) {
59465884
#if _Py_TAIL_CALL_INTERP
59475885
int opcode = DELETE_SUBSCR;
@@ -8894,7 +8832,7 @@
88948832
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
88958833
_PyFrame_SetStackPointer(frame, stack_pointer);
88968834
_PyFrame_StackPointerValidate(frame);
8897-
int err = check_periodics(tstate);
8835+
int err = check_periodics_at_end(tstate, frame);
88988836
_PyFrame_StackPointerInvalidate(frame);
88998837
if (err != 0) {
89008838
JUMP_TO_LABEL(error);
@@ -9076,7 +9014,7 @@
90769014
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
90779015
_PyFrame_SetStackPointer(frame, stack_pointer);
90789016
_PyFrame_StackPointerValidate(frame);
9079-
int err = check_periodics(tstate);
9017+
int err = check_periodics_at_end(tstate, frame);
90809018
_PyFrame_StackPointerInvalidate(frame);
90819019
if (err != 0) {
90829020
JUMP_TO_LABEL(error);
@@ -10192,8 +10130,7 @@
1019210130
(this_instr->op.code == JUMP_BACKWARD_JIT || is_resume)) &&
1019310131
next_instr->op.code != ENTER_EXECUTOR) {
1019410132
_Py_CODEUNIT *insert_exec_at = this_instr;
10195-
while (oparg > 255) {
10196-
oparg >>= 8;
10133+
for (int tmp = oparg; tmp > 255; tmp >>= 8) {
1019710134
insert_exec_at--;
1019810135
}
1019910136
int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at,
@@ -13193,8 +13130,7 @@
1319313130
(this_instr->op.code == JUMP_BACKWARD_JIT || is_resume)) &&
1319413131
next_instr->op.code != ENTER_EXECUTOR) {
1319513132
_Py_CODEUNIT *insert_exec_at = this_instr;
13196-
while (oparg > 255) {
13197-
oparg >>= 8;
13133+
for (int tmp = oparg; tmp > 255; tmp >>= 8) {
1319813134
insert_exec_at--;
1319913135
}
1320013136
int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at,
@@ -14187,17 +14123,36 @@
1418714123
_PyStackRef v;
1418814124
v = stack_pointer[-1];
1418914125
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
14190-
_PyFrame_SetStackPointer(frame, stack_pointer);
14191-
_PyFrame_StackPointerValidate(frame);
14192-
int err = PyDict_SetItem(GLOBALS(), name, PyStackRef_AsPyObjectBorrow(v));
14193-
_PyFrame_StackPointerInvalidate(frame);
14194-
stack_pointer += -1;
14195-
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
14196-
_PyFrame_SetStackPointer(frame, stack_pointer);
14197-
_PyFrame_StackPointerValidate(frame);
14198-
PyStackRef_CLOSE(v);
14199-
_PyFrame_StackPointerInvalidate(frame);
14200-
if (err) {
14126+
int err;
14127+
if (PyStackRef_IsNull(v)) {
14128+
stack_pointer += -1;
14129+
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
14130+
_PyFrame_SetStackPointer(frame, stack_pointer);
14131+
_PyFrame_StackPointerValidate(frame);
14132+
err = PyDict_Pop(GLOBALS(), name, NULL);
14133+
_PyFrame_StackPointerInvalidate(frame);
14134+
if (err == 0) {
14135+
err = -1;
14136+
assert(stack_pointer == _PyFrame_GetStackPointer(frame));
14137+
_PyFrame_StackPointerValidate(frame);
14138+
_PyEval_FormatExcCheckArg(tstate, PyExc_NameError,
14139+
NAME_ERROR_MSG, name);
14140+
_PyFrame_StackPointerInvalidate(frame);
14141+
}
14142+
}
14143+
else {
14144+
_PyFrame_SetStackPointer(frame, stack_pointer);
14145+
_PyFrame_StackPointerValidate(frame);
14146+
err = PyDict_SetItem(GLOBALS(), name, PyStackRef_AsPyObjectBorrow(v));
14147+
_PyFrame_StackPointerInvalidate(frame);
14148+
stack_pointer += -1;
14149+
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
14150+
_PyFrame_SetStackPointer(frame, stack_pointer);
14151+
_PyFrame_StackPointerValidate(frame);
14152+
PyStackRef_CLOSE(v);
14153+
_PyFrame_StackPointerInvalidate(frame);
14154+
}
14155+
if (err < 0) {
1420114156
JUMP_TO_LABEL(error);
1420214157
}
1420314158
DISPATCH();
@@ -14215,42 +14170,26 @@
1421514170
v = stack_pointer[-1];
1421614171
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
1421714172
PyObject *ns = LOCALS();
14218-
int err;
14219-
if (ns == NULL) {
14220-
_PyFrame_SetStackPointer(frame, stack_pointer);
14221-
_PyFrame_StackPointerValidate(frame);
14222-
_PyErr_Format(tstate, PyExc_SystemError,
14223-
"no locals found when storing %R", name);
14224-
_PyFrame_StackPointerInvalidate(frame);
14173+
_PyFrame_SetStackPointer(frame, stack_pointer);
14174+
_PyFrame_StackPointerValidate(frame);
14175+
int error = _PyEval_StoreName(tstate, v, name, ns);
14176+
_PyFrame_StackPointerInvalidate(frame);
14177+
if (PyStackRef_IsNull(v)) {
14178+
}
14179+
else {
1422514180
stack_pointer += -1;
1422614181
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
1422714182
_PyFrame_SetStackPointer(frame, stack_pointer);
1422814183
_PyFrame_StackPointerValidate(frame);
1422914184
PyStackRef_CLOSE(v);
1423014185
_PyFrame_StackPointerInvalidate(frame);
14231-
JUMP_TO_LABEL(error);
14232-
}
14233-
if (PyDict_CheckExact(ns)) {
14234-
_PyFrame_SetStackPointer(frame, stack_pointer);
14235-
_PyFrame_StackPointerValidate(frame);
14236-
err = PyDict_SetItem(ns, name, PyStackRef_AsPyObjectBorrow(v));
14237-
_PyFrame_StackPointerInvalidate(frame);
14186+
stack_pointer += 1;
1423814187
}
14239-
else {
14240-
_PyFrame_SetStackPointer(frame, stack_pointer);
14241-
_PyFrame_StackPointerValidate(frame);
14242-
err = PyObject_SetItem(ns, name, PyStackRef_AsPyObjectBorrow(v));
14243-
_PyFrame_StackPointerInvalidate(frame);
14188+
if (error) {
14189+
JUMP_TO_LABEL(pop_1_error);
1424414190
}
1424514191
stack_pointer += -1;
1424614192
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
14247-
_PyFrame_SetStackPointer(frame, stack_pointer);
14248-
_PyFrame_StackPointerValidate(frame);
14249-
PyStackRef_CLOSE(v);
14250-
_PyFrame_StackPointerInvalidate(frame);
14251-
if (err) {
14252-
JUMP_TO_LABEL(error);
14253-
}
1425414193
DISPATCH();
1425514194
}
1425614195

cinderx/Interpreter/3.16/cinder_opcode_ids.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
#define STORE_LOCAL (16 | EXTENDED_OPCODE_FLAG)
2626
#define STORE_LOCAL_CACHED (17 | EXTENDED_OPCODE_FLAG)
2727
#define PRIMITIVE_BOX (18 | EXTENDED_OPCODE_FLAG)
28-
#define POP_JUMP_IF_ZERO (99 | EXTENDED_OPCODE_FLAG)
29-
#define POP_JUMP_IF_NONZERO (102 | EXTENDED_OPCODE_FLAG)
28+
#define POP_JUMP_IF_ZERO (97 | EXTENDED_OPCODE_FLAG)
29+
#define POP_JUMP_IF_NONZERO (100 | EXTENDED_OPCODE_FLAG)
3030
#define PRIMITIVE_UNBOX (19 | EXTENDED_OPCODE_FLAG)
3131
#define PRIMITIVE_BINARY_OP (20 | EXTENDED_OPCODE_FLAG)
3232
#define PRIMITIVE_UNARY_OP (21 | EXTENDED_OPCODE_FLAG)

0 commit comments

Comments
 (0)