@@ -369,8 +369,9 @@ def test_sync_sp(self):
369369 stack_pointer += -1;
370370 ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
371371 _PyFrame_SetStackPointer(frame, stack_pointer);
372+ _PyFrame_StackPointerValidate(frame);
372373 escaping_call();
373- stack_pointer = _PyFrame_GetStackPointer (frame);
374+ _PyFrame_StackPointerInvalidate (frame);
374375 res = Py_None;
375376 stack_pointer[0] = res;
376377 stack_pointer += 1;
@@ -392,8 +393,9 @@ def test_sync_sp(self):
392393 res = Py_None;
393394 stack_pointer[-1] = res;
394395 _PyFrame_SetStackPointer(frame, stack_pointer);
396+ _PyFrame_StackPointerValidate(frame);
395397 escaping_call();
396- stack_pointer = _PyFrame_GetStackPointer (frame);
398+ _PyFrame_StackPointerInvalidate (frame);
397399 DISPATCH();
398400 }
399401 """
@@ -626,18 +628,20 @@ def test_macro_instruction(self):
626628 uint16_t counter = read_u16(&this_instr[1].cache);
627629 (void)counter;
628630 _PyFrame_SetStackPointer(frame, stack_pointer);
631+ _PyFrame_StackPointerValidate(frame);
629632 op1(left, right);
630- stack_pointer = _PyFrame_GetStackPointer (frame);
633+ _PyFrame_StackPointerInvalidate (frame);
631634 }
632635 /* Skip 2 cache entries */
633636 // OP2
634637 {
635638 arg2 = stack_pointer[-3];
636639 uint32_t extra = read_u32(&this_instr[4].cache);
637640 (void)extra;
638- _PyFrame_SetStackPointer(frame, stack_pointer);
641+ assert(stack_pointer == _PyFrame_GetStackPointer(frame));
642+ _PyFrame_StackPointerValidate(frame);
639643 res = op2(arg2, left, right);
640- stack_pointer = _PyFrame_GetStackPointer (frame);
644+ _PyFrame_StackPointerInvalidate (frame);
641645 }
642646 stack_pointer[-3] = res;
643647 stack_pointer += -2;
@@ -662,8 +666,9 @@ def test_macro_instruction(self):
662666 uint16_t counter = read_u16(&this_instr[1].cache);
663667 (void)counter;
664668 _PyFrame_SetStackPointer(frame, stack_pointer);
669+ _PyFrame_StackPointerValidate(frame);
665670 op1(left, right);
666- stack_pointer = _PyFrame_GetStackPointer (frame);
671+ _PyFrame_StackPointerInvalidate (frame);
667672 DISPATCH();
668673 }
669674
@@ -685,8 +690,9 @@ def test_macro_instruction(self):
685690 left = stack_pointer[-2];
686691 arg2 = stack_pointer[-3];
687692 _PyFrame_SetStackPointer(frame, stack_pointer);
693+ _PyFrame_StackPointerValidate(frame);
688694 res = op3(arg2, left, right);
689- stack_pointer = _PyFrame_GetStackPointer (frame);
695+ _PyFrame_StackPointerInvalidate (frame);
690696 stack_pointer[-3] = res;
691697 stack_pointer += -2;
692698 ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
@@ -1475,8 +1481,10 @@ def test_stack_save_reload(self):
14751481 next_instr += 1;
14761482 INSTRUCTION_STATS(BALANCED);
14771483 _PyFrame_SetStackPointer(frame, stack_pointer);
1484+ _PyFrame_StackPointerValidate(frame);
14781485 code();
14791486 stack_pointer = _PyFrame_GetStackPointer(frame);
1487+ _PyFrame_StackPointerInvalidate(frame);
14801488 DISPATCH();
14811489 }
14821490 """
@@ -1500,6 +1508,10 @@ def test_stack_save_reload_paired(self):
15001508 frame->instr_ptr = next_instr;
15011509 next_instr += 1;
15021510 INSTRUCTION_STATS(BALANCED);
1511+ _PyFrame_SetStackPointer(frame, stack_pointer);
1512+ _PyFrame_StackPointerValidate(frame);
1513+ stack_pointer = _PyFrame_GetStackPointer(frame);
1514+ _PyFrame_StackPointerInvalidate(frame);
15031515 DISPATCH();
15041516 }
15051517 """
@@ -1522,13 +1534,13 @@ def test_stack_reload_only(self):
15221534 frame->instr_ptr = next_instr;
15231535 next_instr += 1;
15241536 INSTRUCTION_STATS(BALANCED);
1525- _PyFrame_SetStackPointer(frame, stack_pointer);
1537+ // Explicit stack reload
15261538 stack_pointer = _PyFrame_GetStackPointer(frame);
1539+ assert(frame->stackpointer_valid == 0);
15271540 DISPATCH();
15281541 }
15291542 """
1530- with self .assertRaises (SyntaxError ):
1531- self .run_cases_test (input , output )
1543+ self .run_cases_test (input , output )
15321544
15331545 def test_stack_save_only (self ):
15341546
@@ -1614,16 +1626,19 @@ def test_escaping_call_next_to_cmacro(self):
16141626 INSTRUCTION_STATS(OP);
16151627 #ifdef Py_GIL_DISABLED
16161628 _PyFrame_SetStackPointer(frame, stack_pointer);
1629+ _PyFrame_StackPointerValidate(frame);
16171630 escaping_call();
1618- stack_pointer = _PyFrame_GetStackPointer (frame);
1631+ _PyFrame_StackPointerInvalidate (frame);
16191632 #else
16201633 _PyFrame_SetStackPointer(frame, stack_pointer);
1634+ _PyFrame_StackPointerValidate(frame);
16211635 another_escaping_call();
1622- stack_pointer = _PyFrame_GetStackPointer (frame);
1636+ _PyFrame_StackPointerInvalidate (frame);
16231637 #endif
1624- _PyFrame_SetStackPointer(frame, stack_pointer);
1638+ assert(stack_pointer == _PyFrame_GetStackPointer(frame));
1639+ _PyFrame_StackPointerValidate(frame);
16251640 yet_another_escaping_call();
1626- stack_pointer = _PyFrame_GetStackPointer (frame);
1641+ _PyFrame_StackPointerInvalidate (frame);
16271642 DISPATCH();
16281643 }
16291644 """
@@ -1735,8 +1750,9 @@ def test_complex_label(self):
17351750 LABEL(my_label)
17361751 {
17371752 _PyFrame_SetStackPointer(frame, stack_pointer);
1753+ _PyFrame_StackPointerValidate(frame);
17381754 do_thing();
1739- stack_pointer = _PyFrame_GetStackPointer (frame);
1755+ _PyFrame_StackPointerInvalidate (frame);
17401756 if (complex) {
17411757 JUMP_TO_LABEL(other_label);
17421758 }
@@ -1762,12 +1778,14 @@ def test_spilled_label(self):
17621778 LABEL(one)
17631779 {
17641780 stack_pointer = _PyFrame_GetStackPointer(frame);
1781+ _PyFrame_StackPointerInvalidate(frame);
17651782 JUMP_TO_LABEL(two);
17661783 }
17671784
17681785 LABEL(two)
17691786 {
17701787 _PyFrame_SetStackPointer(frame, stack_pointer);
1788+ _PyFrame_StackPointerValidate(frame);
17711789 JUMP_TO_LABEL(one);
17721790 }
17731791 """
@@ -1817,16 +1835,18 @@ def test_multiple_labels(self):
18171835 LABEL(my_label_1)
18181836 {
18191837 _PyFrame_SetStackPointer(frame, stack_pointer);
1838+ _PyFrame_StackPointerValidate(frame);
18201839 do_thing1();
1821- stack_pointer = _PyFrame_GetStackPointer (frame);
1840+ _PyFrame_StackPointerInvalidate (frame);
18221841 JUMP_TO_LABEL(my_label_2);
18231842 }
18241843
18251844 LABEL(my_label_2)
18261845 {
18271846 _PyFrame_SetStackPointer(frame, stack_pointer);
1847+ _PyFrame_StackPointerValidate(frame);
18281848 do_thing2();
1829- stack_pointer = _PyFrame_GetStackPointer (frame);
1849+ _PyFrame_StackPointerInvalidate (frame);
18301850 JUMP_TO_LABEL(my_label_1);
18311851 }
18321852 """
@@ -1878,14 +1898,16 @@ def test_reassigning_dead_inputs(self):
18781898 _PyStackRef in;
18791899 in = stack_pointer[-1];
18801900 _PyFrame_SetStackPointer(frame, stack_pointer);
1901+ _PyFrame_StackPointerValidate(frame);
18811902 temp = use(in);
1882- stack_pointer = _PyFrame_GetStackPointer (frame);
1903+ _PyFrame_StackPointerInvalidate (frame);
18831904 in = temp;
18841905 stack_pointer += -1;
18851906 ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
18861907 _PyFrame_SetStackPointer(frame, stack_pointer);
1908+ _PyFrame_StackPointerValidate(frame);
18871909 PyStackRef_CLOSE(in);
1888- stack_pointer = _PyFrame_GetStackPointer (frame);
1910+ _PyFrame_StackPointerInvalidate (frame);
18891911 DISPATCH();
18901912 }
18911913 """
0 commit comments