diff options
author | Mark Shannon <mark@hotpy.org> | 2023-12-20 14:27:25 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-20 14:27:25 (GMT) |
commit | e96f26083bff31e86c068aa22542e91f38293ea3 (patch) | |
tree | 3b351f4fc54eff3c08caf811edbcd7c9fcb40c5d /Tools/cases_generator/cwriter.py | |
parent | a545a86ec64fbab325db101bdd8964f524a89790 (diff) | |
download | cpython-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.py | 35 |
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(":") |