From 10765b29fba80f440785ccfa77df3d329d305f7e Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sun, 6 Aug 2023 11:55:10 -0700 Subject: [PATCH 1/2] Allow 'FooType*' as effect type --- Tools/cases_generator/interpreter_definition.md | 2 +- Tools/cases_generator/parsing.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Tools/cases_generator/interpreter_definition.md b/Tools/cases_generator/interpreter_definition.md index f141848631d04a..5c4238756748a7 100644 --- a/Tools/cases_generator/interpreter_definition.md +++ b/Tools/cases_generator/interpreter_definition.md @@ -108,7 +108,7 @@ and a piece of C code describing its semantics:: NAME [":" type] [ "if" "(" C-expression ")" ] type: - NAME + NAME ["*"] stream: NAME "/" size diff --git a/Tools/cases_generator/parsing.py b/Tools/cases_generator/parsing.py index 5610ac661a8945..cdd20d7a0b3f59 100644 --- a/Tools/cases_generator/parsing.py +++ b/Tools/cases_generator/parsing.py @@ -252,12 +252,14 @@ def cache_effect(self) -> CacheEffect | None: @contextual def stack_effect(self) -> StackEffect | None: - # IDENTIFIER [':' IDENTIFIER] ['if' '(' expression ')'] + # IDENTIFIER [':' IDENTIFIER [TIMES]] ['if' '(' expression ')'] # | IDENTIFIER '[' expression ']' if tkn := self.expect(lx.IDENTIFIER): type_text = "" if self.expect(lx.COLON): type_text = self.require(lx.IDENTIFIER).text.strip() + if self.expect(lx.TIMES): + type_text += " *" cond_text = "" if self.expect(lx.IF): self.require(lx.LPAREN) From db232f178f892de70a6014fd9421757d86fa07d1 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sun, 6 Aug 2023 11:56:33 -0700 Subject: [PATCH 2/2] The type of a synthetic stack entry is complicated --- Tools/cases_generator/stacking.py | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/Tools/cases_generator/stacking.py b/Tools/cases_generator/stacking.py index 23eca3037f896d..d457ce01a8f438 100644 --- a/Tools/cases_generator/stacking.py +++ b/Tools/cases_generator/stacking.py @@ -120,6 +120,14 @@ def as_variable(self, lax: bool = False) -> str: ), f"Push or pop above current stack level: {res}" return res + def as_stack_effect(self, lax: bool = False) -> StackEffect: + return StackEffect( + self.as_variable(lax=lax), + self.effect.type if self.effect.size else "", + self.effect.cond, + self.effect.size, + ) + @dataclasses.dataclass class CopyEffect: @@ -356,24 +364,14 @@ def write_components( for peek in mgr.peeks: out.assign( peek.effect, - StackEffect( - peek.as_variable(), - peek.effect.type, - peek.effect.cond, - peek.effect.size, - ), + peek.as_stack_effect(), ) # Initialize array outputs for poke in mgr.pokes: if poke.effect.size and poke.effect.name not in mgr.instr.unmoved_names: out.assign( poke.effect, - StackEffect( - poke.as_variable(lax=True), - poke.effect.type, - poke.effect.cond, - poke.effect.size, - ), + poke.as_stack_effect(lax=True), ) if len(parts) == 1: @@ -390,11 +388,6 @@ def write_components( for poke in mgr.pokes: if not poke.effect.size and poke.effect.name not in mgr.instr.unmoved_names: out.assign( - StackEffect( - poke.as_variable(), - poke.effect.type, - poke.effect.cond, - poke.effect.size, - ), + poke.as_stack_effect(), poke.effect, )