Skip to content

Commit 8750faa

Browse files
committed
[mypyc] feat: support constant folding in convert_format_expr_to_str
1 parent 053c054 commit 8750faa

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

mypyc/irbuild/format_str_tokenizer.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
is_str_rprimitive,
2424
)
2525
from mypyc.irbuild.builder import IRBuilder
26+
from mypyc.irbuild.constant_fold import constant_fold_expr
2627
from mypyc.primitives.bytes_ops import bytes_build_op
2728
from mypyc.primitives.int_ops import int_to_str_op
2829
from mypyc.primitives.str_ops import str_build_op, str_op
@@ -143,16 +144,18 @@ def convert_format_expr_to_str(
143144
for x, format_op in zip(exprs, format_ops):
144145
node_type = builder.node_type(x)
145146
if format_op == FormatOp.STR:
146-
if is_str_rprimitive(node_type) or isinstance(
147-
x, StrExpr
148-
): # NOTE: why does mypyc think our fake StrExprs are not str rprimitives?
147+
if isinstance(folded := constant_fold_expr(builder, x), str):
148+
var_str = builder.load_literal_value(folded)
149+
elif is_str_rprimitive(node_type):
149150
var_str = builder.accept(x)
150151
elif is_int_rprimitive(node_type) or is_short_int_rprimitive(node_type):
151152
var_str = builder.primitive_op(int_to_str_op, [builder.accept(x)], line)
152153
else:
153154
var_str = builder.primitive_op(str_op, [builder.accept(x)], line)
154155
elif format_op == FormatOp.INT:
155-
if is_int_rprimitive(node_type) or is_short_int_rprimitive(node_type):
156+
if isinstance(folded := constant_fold_expr(builder, x), int):
157+
var_str = builder.load_literal_value(str(folded))
158+
elif is_int_rprimitive(node_type) or is_short_int_rprimitive(node_type):
156159
var_str = builder.primitive_op(int_to_str_op, [builder.accept(x)], line)
157160
else:
158161
return None

0 commit comments

Comments
 (0)