MCPcopy Index your code
hub / github.com/python/cpython / CWriter

Class CWriter

Tools/cases_generator/cwriter.py:6–175  ·  view source on GitHub ↗

A writer that understands tokens and how to format C code

Source from the content-addressed store, hash-verified

4from io import StringIO
5
6class CWriter:
7 "A writer that understands tokens and how to format C code"
8
9 last_token: Token | None
10
11 def __init__(self, out: TextIO, indent: int, line_directives: bool):
12 self.out = out
13 self.base_column = indent * 4
14 self.indents = [i * 4 for i in range(indent + 1)]
15 self.line_directives = line_directives
16 self.last_token = None
17 self.newline = True
18 self.pending_spill = False
19 self.pending_reload = False
20
21 @staticmethod
22 def null() -> "CWriter":
23 return CWriter(StringIO(), 0, False)
24
25 def set_position(self, tkn: Token) -> None:
26 if self.last_token is not None:
27 if self.last_token.end_line < tkn.line:
28 self.out.write("\n")
29 if self.last_token.line < tkn.line:
30 if self.line_directives:
31 self.out.write(f'#line {tkn.line} "{tkn.filename}"\n')
32 self.out.write(" " * self.indents[-1])
33 else:
34 gap = tkn.column - self.last_token.end_column
35 self.out.write(" " * gap)
36 elif self.newline:
37 self.out.write(" " * self.indents[-1])
38 self.last_token = tkn
39 self.newline = False
40
41 def emit_at(self, txt: str, where: Token) -> None:
42 self.maybe_write_spill()
43 self.set_position(where)
44 self.out.write(txt)
45
46 def maybe_dedent(self, txt: str) -> None:
47 parens = txt.count("(") - txt.count(")")
48 if parens < 0:
49 self.indents.pop()
50 braces = txt.count("{") - txt.count("}")
51 if braces < 0 or is_label(txt):
52 self.indents.pop()
53
54 def maybe_indent(self, txt: str) -> None:
55 parens = txt.count("(") - txt.count(")")
56 if parens > 0:
57 if self.last_token:
58 offset = self.last_token.end_column - 1
59 if offset <= self.indents[-1] or offset > 40:
60 offset = self.indents[-1] + 4
61 else:
62 offset = self.indents[-1] + 4
63 self.indents.append(offset)

Callers 13

generate_opcode_headerFunction · 0.90
generate_uop_metadataFunction · 0.90
generate_opcode_metadataFunction · 0.90
generate_py_metadataFunction · 0.90
generate_uop_idsFunction · 0.90
__repr__Method · 0.90
generate_tier2Function · 0.90
generate_tier1Function · 0.90
generate_tier1_casesFunction · 0.90

Calls

no outgoing calls

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…