|
21 | 21 | DEFAULT_INPUT, |
22 | 22 | ROOT, |
23 | 23 | write_header, |
| 24 | + emit_tokens, |
24 | 25 | ) |
25 | 26 | from cwriter import CWriter |
26 | 27 | from typing import TextIO, Iterator |
@@ -56,145 +57,6 @@ def declare_variables(inst: Instruction, out: CWriter) -> None: |
56 | 57 | out.emit(f"{type}{var.name};\n") |
57 | 58 |
|
58 | 59 |
|
59 | | -def emit_to(out: CWriter, tkn_iter: Iterator[Token], end: str) -> None: |
60 | | - parens = 0 |
61 | | - for tkn in tkn_iter: |
62 | | - if tkn.kind == end and parens == 0: |
63 | | - return |
64 | | - if tkn.kind == "LPAREN": |
65 | | - parens += 1 |
66 | | - if tkn.kind == "RPAREN": |
67 | | - parens -= 1 |
68 | | - out.emit(tkn) |
69 | | - |
70 | | - |
71 | | -def replace_deopt( |
72 | | - out: CWriter, |
73 | | - tkn: Token, |
74 | | - tkn_iter: Iterator[Token], |
75 | | - uop: Uop, |
76 | | - unused: Stack, |
77 | | - inst: Instruction, |
78 | | -) -> None: |
79 | | - out.emit_at("DEOPT_IF", tkn) |
80 | | - out.emit(next(tkn_iter)) |
81 | | - emit_to(out, tkn_iter, "RPAREN") |
82 | | - next(tkn_iter) # Semi colon |
83 | | - out.emit(", ") |
84 | | - assert inst.family is not None |
85 | | - out.emit(inst.family.name) |
86 | | - out.emit(");\n") |
87 | | - |
88 | | - |
89 | | -def replace_error( |
90 | | - out: CWriter, |
91 | | - tkn: Token, |
92 | | - tkn_iter: Iterator[Token], |
93 | | - uop: Uop, |
94 | | - stack: Stack, |
95 | | - inst: Instruction, |
96 | | -) -> None: |
97 | | - out.emit_at("if ", tkn) |
98 | | - out.emit(next(tkn_iter)) |
99 | | - emit_to(out, tkn_iter, "COMMA") |
100 | | - label = next(tkn_iter).text |
101 | | - next(tkn_iter) # RPAREN |
102 | | - next(tkn_iter) # Semi colon |
103 | | - out.emit(") ") |
104 | | - c_offset = stack.peek_offset.to_c() |
105 | | - try: |
106 | | - offset = -int(c_offset) |
107 | | - close = ";\n" |
108 | | - except ValueError: |
109 | | - offset = None |
110 | | - out.emit(f"{{ stack_pointer += {c_offset}; ") |
111 | | - close = "; }\n" |
112 | | - out.emit("goto ") |
113 | | - if offset: |
114 | | - out.emit(f"pop_{offset}_") |
115 | | - out.emit(label) |
116 | | - out.emit(close) |
117 | | - |
118 | | - |
119 | | -def replace_decrefs( |
120 | | - out: CWriter, |
121 | | - tkn: Token, |
122 | | - tkn_iter: Iterator[Token], |
123 | | - uop: Uop, |
124 | | - stack: Stack, |
125 | | - inst: Instruction, |
126 | | -) -> None: |
127 | | - next(tkn_iter) |
128 | | - next(tkn_iter) |
129 | | - next(tkn_iter) |
130 | | - out.emit_at("", tkn) |
131 | | - for var in uop.stack.inputs: |
132 | | - if var.name == "unused" or var.name == "null" or var.peek: |
133 | | - continue |
134 | | - if var.size != "1": |
135 | | - out.emit(f"for (int _i = {var.size}; --_i >= 0;) {{\n") |
136 | | - out.emit(f"Py_DECREF({var.name}[_i]);\n") |
137 | | - out.emit("}\n") |
138 | | - elif var.condition: |
139 | | - out.emit(f"Py_XDECREF({var.name});\n") |
140 | | - else: |
141 | | - out.emit(f"Py_DECREF({var.name});\n") |
142 | | - |
143 | | - |
144 | | -def replace_store_sp( |
145 | | - out: CWriter, |
146 | | - tkn: Token, |
147 | | - tkn_iter: Iterator[Token], |
148 | | - uop: Uop, |
149 | | - stack: Stack, |
150 | | - inst: Instruction, |
151 | | -) -> None: |
152 | | - next(tkn_iter) |
153 | | - next(tkn_iter) |
154 | | - next(tkn_iter) |
155 | | - out.emit_at("", tkn) |
156 | | - stack.flush(out) |
157 | | - out.emit("_PyFrame_SetStackPointer(frame, stack_pointer);\n") |
158 | | - |
159 | | - |
160 | | -def replace_check_eval_breaker( |
161 | | - out: CWriter, |
162 | | - tkn: Token, |
163 | | - tkn_iter: Iterator[Token], |
164 | | - uop: Uop, |
165 | | - stack: Stack, |
166 | | - inst: Instruction, |
167 | | -) -> None: |
168 | | - next(tkn_iter) |
169 | | - next(tkn_iter) |
170 | | - next(tkn_iter) |
171 | | - if not uop.properties.ends_with_eval_breaker: |
172 | | - out.emit_at("CHECK_EVAL_BREAKER();", tkn) |
173 | | - |
174 | | - |
175 | | -REPLACEMENT_FUNCTIONS = { |
176 | | - "DEOPT_IF": replace_deopt, |
177 | | - "ERROR_IF": replace_error, |
178 | | - "DECREF_INPUTS": replace_decrefs, |
179 | | - "CHECK_EVAL_BREAKER": replace_check_eval_breaker, |
180 | | - "STORE_SP": replace_store_sp, |
181 | | -} |
182 | | - |
183 | | - |
184 | | -# Move this to formatter |
185 | | -def emit_tokens(out: CWriter, uop: Uop, stack: Stack, inst: Instruction) -> None: |
186 | | - tkns = uop.body[1:-1] |
187 | | - if not tkns: |
188 | | - return |
189 | | - tkn_iter = iter(tkns) |
190 | | - out.start_line() |
191 | | - for tkn in tkn_iter: |
192 | | - if tkn.kind == "IDENTIFIER" and tkn.text in REPLACEMENT_FUNCTIONS: |
193 | | - REPLACEMENT_FUNCTIONS[tkn.text](out, tkn, tkn_iter, uop, stack, inst) |
194 | | - else: |
195 | | - out.emit(tkn) |
196 | | - |
197 | | - |
198 | 60 | def write_uop( |
199 | 61 | uop: Part, out: CWriter, offset: int, stack: Stack, inst: Instruction, braces: bool |
200 | 62 | ) -> int: |
|
0 commit comments