https://github.com/python/cpython/commit/821759d63101334fa8a1863135429c341ca0b234
commit: 821759d63101334fa8a1863135429c341ca0b234
branch: main
author: mpage <mp...@cs.stanford.edu>
committer: mpage <mp...@cs.stanford.edu>
date: 2024-11-01T08:53:03-07:00
summary:

gh-126211: Exclude preprocessor directives from statements containing escaping 
calls (#126213)

The cases generator inserts code to save and restore the stack pointer around
statements that contain escaping calls. To find the beginning of such 
statements,
we would walk backwards from the escaping call until we encountered a token that
was treated as a statement terminator. This set of terminators should include
preprocessor directives.

files:
M Lib/test/test_generated_cases.py
M Tools/cases_generator/analyzer.py

diff --git a/Lib/test/test_generated_cases.py b/Lib/test/test_generated_cases.py
index 173e405b785ddc..ff9a52b7adac8a 100644
--- a/Lib/test/test_generated_cases.py
+++ b/Lib/test/test_generated_cases.py
@@ -1429,6 +1429,39 @@ def test_instruction_size_macro(self):
         with self.assertRaisesRegex(SyntaxError, "All instructions containing 
a uop"):
             self.run_cases_test(input, output)
 
+    def test_escaping_call_next_to_cmacro(self):
+        input = """
+        inst(OP, (--)) {
+            #ifdef Py_GIL_DISABLED
+            escaping_call();
+            #else
+            another_escaping_call();
+            #endif
+            yet_another_escaping_call();
+        }
+        """
+        output = """
+        TARGET(OP) {
+            frame->instr_ptr = next_instr;
+            next_instr += 1;
+            INSTRUCTION_STATS(OP);
+            #ifdef Py_GIL_DISABLED
+            _PyFrame_SetStackPointer(frame, stack_pointer);
+            escaping_call();
+            stack_pointer = _PyFrame_GetStackPointer(frame);
+            #else
+            _PyFrame_SetStackPointer(frame, stack_pointer);
+            another_escaping_call();
+            stack_pointer = _PyFrame_GetStackPointer(frame);
+            #endif
+            _PyFrame_SetStackPointer(frame, stack_pointer);
+            yet_another_escaping_call();
+            stack_pointer = _PyFrame_GetStackPointer(frame);
+            DISPATCH();
+        }
+        """
+        self.run_cases_test(input, output)
+
 
 class TestGeneratedAbstractCases(unittest.TestCase):
     def setUp(self) -> None:
diff --git a/Tools/cases_generator/analyzer.py 
b/Tools/cases_generator/analyzer.py
index 66ead741b87a2b..a725ec10d4e52a 100644
--- a/Tools/cases_generator/analyzer.py
+++ b/Tools/cases_generator/analyzer.py
@@ -637,7 +637,7 @@ def find_stmt_start(node: parser.InstDef, idx: int) -> 
lexer.Token:
     assert idx < len(node.block.tokens)
     while True:
         tkn = node.block.tokens[idx-1]
-        if tkn.kind in {"SEMI", "LBRACE", "RBRACE"}:
+        if tkn.kind in {"SEMI", "LBRACE", "RBRACE", "CMACRO"}:
             break
         idx -= 1
         assert idx > 0

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to