Skip to content

Commit a4a5fd6

Browse files
authored
[mypyc] Recognize 'six.moves.xrange' as an alias of 'range' (#9896)
This stopped working because of typeshed changes in b884a39. This fixes a performance regression in the hexiom benchmark.
1 parent f491f35 commit a4a5fd6

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

mypyc/irbuild/for_helpers.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from typing_extensions import Type, ClassVar
1010

1111
from mypy.nodes import (
12-
Lvalue, Expression, TupleExpr, CallExpr, RefExpr, GeneratorExpr, ARG_POS, MemberExpr
12+
Lvalue, Expression, TupleExpr, CallExpr, RefExpr, GeneratorExpr, ARG_POS, MemberExpr, TypeAlias
1313
)
1414
from mypyc.ir.ops import (
1515
Value, BasicBlock, Integer, Branch, Register, TupleGet, TupleSet, IntOp
@@ -156,6 +156,11 @@ def loop_contents(
156156
handle_loop(loop_params)
157157

158158

159+
def is_range_ref(expr: RefExpr) -> bool:
160+
return (expr.fullname == 'builtins.range'
161+
or isinstance(expr.node, TypeAlias) and expr.fullname == 'six.moves.xrange')
162+
163+
159164
def make_for_loop_generator(builder: IRBuilder,
160165
index: Lvalue,
161166
expr: Expression,
@@ -189,7 +194,7 @@ def make_for_loop_generator(builder: IRBuilder,
189194

190195
if (isinstance(expr, CallExpr)
191196
and isinstance(expr.callee, RefExpr)):
192-
if (expr.callee.fullname == 'builtins.range'
197+
if (is_range_ref(expr.callee)
193198
and (len(expr.args) <= 2
194199
or (len(expr.args) == 3
195200
and builder.extract_int(expr.args[2]) is not None))

0 commit comments

Comments
 (0)