summaryrefslogtreecommitdiffstats
path: root/Tools/cases_generator/cwriter.py
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2023-12-20 14:27:25 (GMT)
committerGitHub <noreply@github.com>2023-12-20 14:27:25 (GMT)
commite96f26083bff31e86c068aa22542e91f38293ea3 (patch)
tree3b351f4fc54eff3c08caf811edbcd7c9fcb40c5d /Tools/cases_generator/cwriter.py
parenta545a86ec64fbab325db101bdd8964f524a89790 (diff)
downloadcpython-e96f26083bff31e86c068aa22542e91f38293ea3.zip
cpython-e96f26083bff31e86c068aa22542e91f38293ea3.tar.gz
cpython-e96f26083bff31e86c068aa22542e91f38293ea3.tar.bz2
GH-111485: Generate instruction and uop metadata (GH-113287)
Diffstat (limited to 'Tools/cases_generator/cwriter.py')
-rw-r--r--Tools/cases_generator/cwriter.py35
1 files changed, 31 insertions, 4 deletions
diff --git a/Tools/cases_generator/cwriter.py b/Tools/cases_generator/cwriter.py
index 67b1c9a..069f017 100644
--- a/Tools/cases_generator/cwriter.py
+++ b/Tools/cases_generator/cwriter.py
@@ -1,5 +1,6 @@
+import contextlib
from lexer import Token
-from typing import TextIO
+from typing import TextIO, Iterator
class CWriter:
@@ -44,9 +45,12 @@ class CWriter:
def maybe_indent(self, txt: str) -> None:
parens = txt.count("(") - txt.count(")")
- if parens > 0 and self.last_token:
- offset = self.last_token.end_column - 1
- if offset <= self.indents[-1] or offset > 40:
+ if parens > 0:
+ if self.last_token:
+ offset = self.last_token.end_column - 1
+ if offset <= self.indents[-1] or offset > 40:
+ offset = self.indents[-1] + 4
+ else:
offset = self.indents[-1] + 4
self.indents.append(offset)
if is_label(txt):
@@ -54,6 +58,7 @@ class CWriter:
else:
braces = txt.count("{") - txt.count("}")
if braces > 0:
+ assert braces == 1
if 'extern "C"' in txt:
self.indents.append(self.indents[-1])
else:
@@ -114,6 +119,28 @@ class CWriter:
self.newline = True
self.last_token = None
+ @contextlib.contextmanager
+ def header_guard(self, name: str) -> Iterator[None]:
+ self.out.write(
+ f"""
+#ifndef {name}
+#define {name}
+#ifdef __cplusplus
+extern "C" {{
+#endif
+
+"""
+ )
+ yield
+ self.out.write(
+ f"""
+#ifdef __cplusplus
+}}
+#endif
+#endif /* !{name} */
+"""
+ )
+
def is_label(txt: str) -> bool:
return not txt.startswith("//") and txt.endswith(":")