From 1c41ab7da9062a7676c8a6ccbb8c054e60011d38 Mon Sep 17 00:00:00 2001 From: BobTheBuidler Date: Wed, 1 Oct 2025 23:52:46 +0000 Subject: [PATCH 1/4] [mypyc] feat: support constant folding in `translate_str_format` --- mypyc/irbuild/specialize.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mypyc/irbuild/specialize.py b/mypyc/irbuild/specialize.py index 84807a7fdb53..f5879ddb5828 100644 --- a/mypyc/irbuild/specialize.py +++ b/mypyc/irbuild/specialize.py @@ -718,10 +718,9 @@ def translate_dict_setdefault(builder: IRBuilder, expr: CallExpr, callee: RefExp def translate_str_format(builder: IRBuilder, expr: CallExpr, callee: RefExpr) -> Value | None: if ( isinstance(callee, MemberExpr) - and isinstance(callee.expr, StrExpr) + and isinstance(format_str := constant_fold_expr(builder, callee.expr), str) and expr.arg_kinds.count(ARG_POS) == len(expr.arg_kinds) ): - format_str = callee.expr.value tokens = tokenizer_format_call(format_str) if tokens is None: return None From 7c8856779fa344b2af7415e65d3175baf6ca736e Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Wed, 1 Oct 2025 20:06:54 -0400 Subject: [PATCH 2/4] Update specialize.py --- mypyc/irbuild/specialize.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mypyc/irbuild/specialize.py b/mypyc/irbuild/specialize.py index f5879ddb5828..36a760dfa564 100644 --- a/mypyc/irbuild/specialize.py +++ b/mypyc/irbuild/specialize.py @@ -78,6 +78,7 @@ uint8_rprimitive, ) from mypyc.irbuild.builder import IRBuilder +from mypyc.irbuild.constant_fold import constant_fold_expr from mypyc.irbuild.for_helpers import ( comprehension_helper, sequence_from_generator_preallocate_helper, From cf1a9b8e374ab367007083d1440ab968fde93961 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Wed, 1 Oct 2025 20:32:11 -0400 Subject: [PATCH 3/4] refactor --- mypyc/irbuild/specialize.py | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/mypyc/irbuild/specialize.py b/mypyc/irbuild/specialize.py index 36a760dfa564..651e5cf8b9a8 100644 --- a/mypyc/irbuild/specialize.py +++ b/mypyc/irbuild/specialize.py @@ -717,20 +717,18 @@ def translate_dict_setdefault(builder: IRBuilder, expr: CallExpr, callee: RefExp @specialize_function("format", str_rprimitive) def translate_str_format(builder: IRBuilder, expr: CallExpr, callee: RefExpr) -> Value | None: - if ( - isinstance(callee, MemberExpr) - and isinstance(format_str := constant_fold_expr(builder, callee.expr), str) - and expr.arg_kinds.count(ARG_POS) == len(expr.arg_kinds) - ): - tokens = tokenizer_format_call(format_str) - if tokens is None: - return None - literals, format_ops = tokens - # Convert variables to strings - substitutions = convert_format_expr_to_str(builder, format_ops, expr.args, expr.line) - if substitutions is None: - return None - return join_formatted_strings(builder, literals, substitutions, expr.line) + if isinstance(callee, MemberExpr): + format_str = constant_fold_expr(builder, callee.expr) + if isinstance(format_str, str) and expr.arg_kinds.count(ARG_POS) == len(expr.arg_kinds): + tokens = tokenizer_format_call(format_str) + if tokens is None: + return None + literals, format_ops = tokens + # Convert variables to strings + substitutions = convert_format_expr_to_str(builder, format_ops, expr.args, expr.line) + if substitutions is None: + return None + return join_formatted_strings(builder, literals, substitutions, expr.line) return None From a3f1a85ebce50919c8da980b4098523ddb02a96e Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Wed, 1 Oct 2025 20:37:45 -0400 Subject: [PATCH 4/4] Update specialize.py --- mypyc/irbuild/specialize.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mypyc/irbuild/specialize.py b/mypyc/irbuild/specialize.py index 651e5cf8b9a8..a099e97390ea 100644 --- a/mypyc/irbuild/specialize.py +++ b/mypyc/irbuild/specialize.py @@ -718,9 +718,9 @@ def translate_dict_setdefault(builder: IRBuilder, expr: CallExpr, callee: RefExp @specialize_function("format", str_rprimitive) def translate_str_format(builder: IRBuilder, expr: CallExpr, callee: RefExpr) -> Value | None: if isinstance(callee, MemberExpr): - format_str = constant_fold_expr(builder, callee.expr) - if isinstance(format_str, str) and expr.arg_kinds.count(ARG_POS) == len(expr.arg_kinds): - tokens = tokenizer_format_call(format_str) + folded_callee = constant_fold_expr(builder, callee.expr) + if isinstance(folded_callee, str) and expr.arg_kinds.count(ARG_POS) == len(expr.arg_kinds): + tokens = tokenizer_format_call(folded_callee) if tokens is None: return None literals, format_ops = tokens