From 638d489d30e20d0ecb982383ab9319fe2e08583b Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Thu, 9 Oct 2025 03:17:51 -0400 Subject: [PATCH 1/4] [mypyc] feat: implement try_getting_literal in `in` rtuple helper [1/1] --- mypyc/irbuild/expression.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mypyc/irbuild/expression.py b/mypyc/irbuild/expression.py index 59ecc4ac2c5c..b8d411070bc4 100644 --- a/mypyc/irbuild/expression.py +++ b/mypyc/irbuild/expression.py @@ -10,6 +10,7 @@ from collections.abc import Sequence from typing import Callable +from mypy.checkexpr import try_getting_literal from mypy.nodes import ( ARG_NAMED, ARG_POS, @@ -50,7 +51,7 @@ UnaryExpr, Var, ) -from mypy.types import Instance, ProperType, TupleType, TypeType, get_proper_type +from mypy.types import Instance, LiteralType, ProperType, TupleType, TypeType, get_proper_type from mypyc.common import MAX_SHORT_INT from mypyc.ir.class_ir import ClassIR from mypyc.ir.func_ir import FUNC_CLASSMETHOD, FUNC_STATICMETHOD @@ -786,7 +787,12 @@ def try_specialize_in_expr( left = builder.accept(lhs) tuple_val = builder.accept(rhs) assert isinstance(tuple_val.type, RTuple) - items = [builder.add(TupleGet(tuple_val, i)) for i in range(len(tuple_val.type.types))] + proper_type = get_proper_type(builder.types[rhs]) + assert isinstance(proper_type, TupleType) + items = [ + LoadLiteral(typ.value, object_rprimitive) if isinstance(typ, LiteralType) else builder.add(TupleGet(tuple_val, i)) + for i, typ in enumerate(map(try_getting_literal, proper_type.items)) + ] if items is not None: assert left is not None From afe5f2f61a68dfaae48fc2ed9022d1c53ca73932 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 9 Oct 2025 07:22:05 +0000 Subject: [PATCH 2/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- mypyc/irbuild/expression.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mypyc/irbuild/expression.py b/mypyc/irbuild/expression.py index b8d411070bc4..db6f9d7dba75 100644 --- a/mypyc/irbuild/expression.py +++ b/mypyc/irbuild/expression.py @@ -790,7 +790,11 @@ def try_specialize_in_expr( proper_type = get_proper_type(builder.types[rhs]) assert isinstance(proper_type, TupleType) items = [ - LoadLiteral(typ.value, object_rprimitive) if isinstance(typ, LiteralType) else builder.add(TupleGet(tuple_val, i)) + ( + LoadLiteral(typ.value, object_rprimitive) + if isinstance(typ, LiteralType) + else builder.add(TupleGet(tuple_val, i)) + ) for i, typ in enumerate(map(try_getting_literal, proper_type.items)) ] From 2a961fdb454a5db8741987f9d79a7268ffd25897 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Thu, 9 Oct 2025 03:26:41 -0400 Subject: [PATCH 3/4] Update expression.py --- mypyc/irbuild/expression.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/mypyc/irbuild/expression.py b/mypyc/irbuild/expression.py index db6f9d7dba75..f53893b6e6f3 100644 --- a/mypyc/irbuild/expression.py +++ b/mypyc/irbuild/expression.py @@ -785,18 +785,22 @@ def try_specialize_in_expr( items = [builder.accept(item) for item in rhs.items] elif isinstance(builder.node_type(rhs), RTuple): left = builder.accept(lhs) - tuple_val = builder.accept(rhs) - assert isinstance(tuple_val.type, RTuple) proper_type = get_proper_type(builder.types[rhs]) assert isinstance(proper_type, TupleType) - items = [ - ( - LoadLiteral(typ.value, object_rprimitive) - if isinstance(typ, LiteralType) - else builder.add(TupleGet(tuple_val, i)) - ) - for i, typ in enumerate(map(try_getting_literal, proper_type.items)) - ] + literal_items = list(map(try_getting_literal, proper_type.items)) + if None not in literal_items: + # If all tuple items are literals we don't even need to accept the tuple + # TODO: should we use object_rprimitive? prob not, what do? + items = [LoadLiteral(literal.value, object_rprimitive) for literal in literal_items] + else: + tuple_val = builder.accept(rhs) + assert isinstance(tuple_val.type, RTuple) + proper_type = get_proper_type(builder.types[rhs]) + items = [ + # TODO: should we use object_rprimitive? prob not, what do? + LoadLiteral(typ.value, object_rprimitive) if isinstance(typ, LiteralType) else builder.add(TupleGet(tuple_val, i)) + for i, typ in enumerate(map(try_getting_literal, proper_type.items)) + ] if items is not None: assert left is not None From fa21d278824cfa1b1833353b8481a154dd528036 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 9 Oct 2025 07:28:00 +0000 Subject: [PATCH 4/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- mypyc/irbuild/expression.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mypyc/irbuild/expression.py b/mypyc/irbuild/expression.py index f53893b6e6f3..d881bd017fc9 100644 --- a/mypyc/irbuild/expression.py +++ b/mypyc/irbuild/expression.py @@ -798,7 +798,11 @@ def try_specialize_in_expr( proper_type = get_proper_type(builder.types[rhs]) items = [ # TODO: should we use object_rprimitive? prob not, what do? - LoadLiteral(typ.value, object_rprimitive) if isinstance(typ, LiteralType) else builder.add(TupleGet(tuple_val, i)) + ( + LoadLiteral(typ.value, object_rprimitive) + if isinstance(typ, LiteralType) + else builder.add(TupleGet(tuple_val, i)) + ) for i, typ in enumerate(map(try_getting_literal, proper_type.items)) ]