Skip to content

Commit 1463132

Browse files
Apply review suggestions on type checking
1 parent 158a4c4 commit 1463132

File tree

6 files changed

+52
-48
lines changed

6 files changed

+52
-48
lines changed

Python/generated_tail_call_handlers.c.h

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Tools/cases_generator/analyzer.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ def is_super(self) -> bool:
262262
class Label:
263263
name: str
264264
body: list[lexer.Token]
265+
instruction_size: int | None = None
265266

266267

267268
@dataclass

Tools/cases_generator/generators_common.py

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@
44
from analyzer import (
55
Instruction,
66
Uop,
7+
Label,
78
Properties,
89
StackItem,
910
analysis_error,
1011
)
1112
from cwriter import CWriter
1213
from typing import Callable, TextIO, Iterator, Iterable
1314
from lexer import Token
14-
from stack import Storage, StackError
15+
from stack import Storage, StackError, Stack
1516

1617
# Set this to true for voluminous output showing state of stack and locals
1718
PRINT_STACKS = False
@@ -90,7 +91,7 @@ def emit_to(out: CWriter, tkn_iter: TokenIterator, end: str) -> Token:
9091

9192

9293
ReplacementFunctionType = Callable[
93-
[Token, TokenIterator, Uop, Storage, Instruction | None], bool
94+
[Token, TokenIterator, Uop | Label, Storage, Instruction | None], bool
9495
]
9596

9697
def always_true(tkn: Token | None) -> bool:
@@ -135,7 +136,7 @@ def dispatch(
135136
self,
136137
tkn: Token,
137138
tkn_iter: TokenIterator,
138-
uop: Uop,
139+
uop: Uop | Label,
139140
storage: Storage,
140141
inst: Instruction | None,
141142
) -> bool:
@@ -146,7 +147,7 @@ def deopt_if(
146147
self,
147148
tkn: Token,
148149
tkn_iter: TokenIterator,
149-
uop: Uop,
150+
uop: Uop | Label,
150151
storage: Storage,
151152
inst: Instruction | None,
152153
) -> bool:
@@ -173,7 +174,7 @@ def error_if(
173174
self,
174175
tkn: Token,
175176
tkn_iter: TokenIterator,
176-
uop: Uop,
177+
uop: Uop | Label,
177178
storage: Storage,
178179
inst: Instruction | None,
179180
) -> bool:
@@ -222,7 +223,7 @@ def error_no_pop(
222223
self,
223224
tkn: Token,
224225
tkn_iter: TokenIterator,
225-
uop: Uop,
226+
uop: Uop | Label,
226227
storage: Storage,
227228
inst: Instruction | None,
228229
) -> bool:
@@ -236,7 +237,7 @@ def decref_inputs(
236237
self,
237238
tkn: Token,
238239
tkn_iter: TokenIterator,
239-
uop: Uop,
240+
uop: Uop | Label,
240241
storage: Storage,
241242
inst: Instruction | None,
242243
) -> bool:
@@ -272,7 +273,7 @@ def kill_inputs(
272273
self,
273274
tkn: Token,
274275
tkn_iter: TokenIterator,
275-
uop: Uop,
276+
uop: Uop | Label,
276277
storage: Storage,
277278
inst: Instruction | None,
278279
) -> bool:
@@ -287,7 +288,7 @@ def kill(
287288
self,
288289
tkn: Token,
289290
tkn_iter: TokenIterator,
290-
uop: Uop,
291+
uop: Uop | Label,
291292
storage: Storage,
292293
inst: Instruction | None,
293294
) -> bool:
@@ -327,7 +328,7 @@ def stackref_close(
327328
self,
328329
tkn: Token,
329330
tkn_iter: TokenIterator,
330-
uop: Uop,
331+
uop: Uop | Label,
331332
storage: Storage,
332333
inst: Instruction | None,
333334
) -> bool:
@@ -347,7 +348,7 @@ def stackref_close_specialized(
347348
self,
348349
tkn: Token,
349350
tkn_iter: TokenIterator,
350-
uop: Uop,
351+
uop: Uop | Label,
351352
storage: Storage,
352353
inst: Instruction | None,
353354
) -> bool:
@@ -377,7 +378,7 @@ def stackref_steal(
377378
self,
378379
tkn: Token,
379380
tkn_iter: TokenIterator,
380-
uop: Uop,
381+
uop: Uop | Label,
381382
storage: Storage,
382383
inst: Instruction | None,
383384
) -> bool:
@@ -397,7 +398,7 @@ def sync_sp(
397398
self,
398399
tkn: Token,
399400
tkn_iter: TokenIterator,
400-
uop: Uop,
401+
uop: Uop | Label,
401402
storage: Storage,
402403
inst: Instruction | None,
403404
) -> bool:
@@ -413,7 +414,7 @@ def go_to_instruction(
413414
self,
414415
tkn: Token,
415416
tkn_iter: TokenIterator,
416-
uop: Uop,
417+
uop: Uop | Label,
417418
storage: Storage,
418419
inst: Instruction | None,
419420
) -> bool:
@@ -434,7 +435,7 @@ def save_stack(
434435
self,
435436
tkn: Token,
436437
tkn_iter: TokenIterator,
437-
uop: Uop,
438+
uop: Uop | Label,
438439
storage: Storage,
439440
inst: Instruction | None,
440441
) -> bool:
@@ -448,7 +449,7 @@ def pop_input(
448449
self,
449450
tkn: Token,
450451
tkn_iter: TokenIterator,
451-
uop: Uop,
452+
uop: Uop | Label,
452453
storage: Storage,
453454
inst: Instruction | None,
454455
) -> bool:
@@ -475,7 +476,7 @@ def reload_stack(
475476
self,
476477
tkn: Token,
477478
tkn_iter: TokenIterator,
478-
uop: Uop,
479+
uop: Uop | Label,
479480
storage: Storage,
480481
inst: Instruction | None,
481482
) -> bool:
@@ -488,7 +489,7 @@ def reload_stack(
488489
def instruction_size(self,
489490
tkn: Token,
490491
tkn_iter: TokenIterator,
491-
uop: Uop,
492+
uop: Uop | Label,
492493
storage: Storage,
493494
inst: Instruction | None,
494495
) -> bool:
@@ -655,15 +656,16 @@ def emit_tokens(
655656
raise analysis_error(ex.args[0], rbrace) from None
656657
return storage
657658

658-
def emit_tokens_simple(
659+
def emit_label(
659660
self,
660-
tokens: list[Token]
661+
label: Label
661662
) -> None:
662-
tkn_iter = TokenIterator(tokens)
663+
tkn_iter = TokenIterator(label.body)
663664
self.out.start_line()
664665
for tkn in tkn_iter:
665666
if tkn.text in self._replacers:
666-
self._replacers[tkn.text](tkn, tkn_iter, None, None, None) # type: ignore[arg-type]
667+
storage = Storage(Stack(), [],[], [])
668+
self._replacers[tkn.text](tkn, tkn_iter, label, storage, None)
667669
continue
668670
self.out.emit(tkn)
669671

Tools/cases_generator/tier1_generator.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,13 @@ def uses_this(inst: Instruction) -> bool:
132132
return False
133133

134134

135-
def write_single_inst(out: CWriter, emitter: Emitter, name: str, inst: Instruction, uses_this: Callable[Instruction, bool]) -> None:
135+
def write_single_inst(
136+
out: CWriter,
137+
emitter: Emitter,
138+
name: str,
139+
inst: Instruction,
140+
uses_this: Callable[[Instruction], bool]
141+
) -> None:
136142
needs_this = uses_this(inst)
137143
unused_guard = "(void)this_instr;\n"
138144
if inst.properties.needs_prev:

Tools/cases_generator/tier1_tail_call_generator.py

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
Instruction,
2323
analyze_files,
2424
Uop,
25+
Label,
2526
)
2627

2728
from tier1_generator import (
@@ -47,7 +48,7 @@ def go_to_instruction(
4748
self,
4849
tkn: Token,
4950
tkn_iter: TokenIterator,
50-
uop: Uop,
51+
uop: Uop | Label,
5152
storage: Storage,
5253
inst: Instruction | None,
5354
) -> bool:
@@ -56,23 +57,15 @@ def go_to_instruction(
5657
next(tkn_iter)
5758
next(tkn_iter)
5859
assert name.kind == "IDENTIFIER"
59-
self.emit("\n")
60-
inst = self.analysis.instructions[name.text]
61-
fam = None
62-
# Search for the family (if any)
63-
for family_name, family in self.analysis.families.items():
64-
if inst.name == family_name:
65-
fam = family
66-
break
67-
size = fam.size if fam is not None else 0
68-
self.emit(f"Py_MUSTTAIL return (INSTRUCTION_TABLE[{name.text}])(frame, stack_pointer, tstate, next_instr - 1 - {size}, opcode, oparg);\n")
60+
self.out.start_line()
61+
self.emit(f"Py_MUSTTAIL return (INSTRUCTION_TABLE[{name.text}])(frame, stack_pointer, tstate, this_instr, opcode, oparg);\n")
6962
return True
7063

7164
def deopt_if(
7265
self,
7366
tkn: Token,
7467
tkn_iter: TokenIterator,
75-
uop: Uop,
68+
uop: Uop | Label,
7669
storage: Storage,
7770
inst: Instruction | None,
7871
) -> bool:
@@ -107,7 +100,7 @@ def goto(
107100
self,
108101
tkn: Token,
109102
tkn_iter: TokenIterator,
110-
uop: Uop,
103+
uop: Uop | Label,
111104
storage: Storage,
112105
inst: Instruction | None,
113106
) -> bool:
@@ -137,7 +130,7 @@ def generate_label_handlers(
137130
emitter.emit("\n")
138131
for name, label in analysis.labels.items():
139132
emitter.emit(f"{function_proto(name)}\n")
140-
emitter.emit_tokens_simple(label.body)
133+
emitter.emit_label(label)
141134

142135
emitter.emit("\n")
143136
emitter.emit("\n")
@@ -153,7 +146,8 @@ def uses_this(inst: Instruction) -> bool:
153146
if cache.name != "unused":
154147
return True
155148
for tkn in uop.body:
156-
if tkn.kind == "IDENTIFIER" and (tkn.text == "DEOPT_IF" or tkn.text == "EXIT_IF"):
149+
if (tkn.kind == "IDENTIFIER"
150+
and (tkn.text in {"DEOPT_IF", "EXIT_IF", "GO_TO_INSTRUCTION"})):
157151
return True
158152
return False
159153

Tools/cases_generator/tier2_generator.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
analyze_files,
1313
StackItem,
1414
analysis_error,
15+
Label,
1516
)
1617
from generators_common import (
1718
DEFAULT_INPUT,
@@ -73,7 +74,7 @@ def error_if(
7374
self,
7475
tkn: Token,
7576
tkn_iter: TokenIterator,
76-
uop: Uop,
77+
uop: Uop | Label,
7778
storage: Storage,
7879
inst: Instruction | None,
7980
) -> bool:
@@ -95,7 +96,7 @@ def error_no_pop(
9596
self,
9697
tkn: Token,
9798
tkn_iter: TokenIterator,
98-
uop: Uop,
99+
uop: Uop | Label,
99100
storage: Storage,
100101
inst: Instruction | None,
101102
) -> bool:
@@ -109,7 +110,7 @@ def deopt_if(
109110
self,
110111
tkn: Token,
111112
tkn_iter: TokenIterator,
112-
uop: Uop,
113+
uop: Uop | Label,
113114
storage: Storage,
114115
inst: Instruction | None,
115116
) -> bool:
@@ -130,7 +131,7 @@ def exit_if( # type: ignore[override]
130131
self,
131132
tkn: Token,
132133
tkn_iter: TokenIterator,
133-
uop: Uop,
134+
uop: Uop | Label,
134135
storage: Storage,
135136
inst: Instruction | None,
136137
) -> bool:
@@ -150,7 +151,7 @@ def oparg(
150151
self,
151152
tkn: Token,
152153
tkn_iter: TokenIterator,
153-
uop: Uop,
154+
uop: Uop | Label,
154155
storage: Storage,
155156
inst: Instruction | None,
156157
) -> bool:

0 commit comments

Comments
 (0)