Skip to content

Commit 3ea6d17

Browse files
committed
Merge branch 'isinstance-tuple-of-primitives' of https://github.com/BobTheBuidler/mypy into isinstance-tuple-of-primitives
2 parents 0d51ead + 628294d commit 3ea6d17

File tree

1 file changed

+18
-14
lines changed

1 file changed

+18
-14
lines changed

mypyc/irbuild/specialize.py

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
RefExpr,
3232
StrExpr,
3333
SuperExpr,
34-
SymbolNode,
3534
TupleExpr,
3635
Var,
3736
)
@@ -590,11 +589,11 @@ def translate_isinstance(builder: IRBuilder, expr: CallExpr, callee: RefExpr) ->
590589

591590
obj_expr = expr.args[0]
592591
type_expr = expr.args[1]
593-
592+
594593
if isinstance(type_expr, TupleExpr) and not type_expr.items:
595594
# we can compile this case to a noop
596595
return builder.false()
597-
596+
598597
if isinstance(type_expr, (RefExpr, TupleExpr)):
599598
builder.types[obj_expr] = AnyType(TypeOfAny.from_error)
600599

@@ -608,18 +607,21 @@ def translate_isinstance(builder: IRBuilder, expr: CallExpr, callee: RefExpr) ->
608607
return builder.builder.isinstance_helper(obj, irs, expr.line)
609608

610609
if isinstance(type_expr, TupleExpr):
611-
nodes: list[SymbolNode | None] = []
610+
node_names: list[str] = []
612611
for item in type_expr.items:
613612
if not isinstance(item, RefExpr):
614613
return None
615614
if item.node is None:
616615
return None
617-
if item.node.fullname not in nodes:
618-
nodes.append(item.node.fullname)
616+
if item.node.fullname not in node_names:
617+
node_names.append(item.node.fullname)
619618

620-
descs = [isinstance_primitives.get(fullname) for fullname in nodes]
621-
622-
obj = builder.accept(expr.args[0])
619+
descs = [isinstance_primitives.get(fullname) for fullname in node_names]
620+
if None in descs:
621+
# not all types are primitive types, abort
622+
return None
623+
624+
obj = builder.accept(obj_expr)
623625

624626
retval = Register(bool_rprimitive)
625627
pass_block = BasicBlock()
@@ -628,9 +630,11 @@ def translate_isinstance(builder: IRBuilder, expr: CallExpr, callee: RefExpr) ->
628630

629631
# Chain the checks: if any succeed, jump to pass_block; else, continue
630632
for i, desc in enumerate(descs):
631-
is_last = (i == len(descs) - 1)
633+
is_last = i == len(descs) - 1
632634
next_block = fail_block if is_last else BasicBlock()
633-
builder.add_bool_branch(builder.primitive_op(desc, [obj], expr.line), pass_block, next_block)
635+
builder.add_bool_branch(
636+
builder.primitive_op(desc, [obj], expr.line), pass_block, next_block
637+
)
634638
if not is_last:
635639
builder.activate_block(next_block)
636640

@@ -648,12 +652,12 @@ def translate_isinstance(builder: IRBuilder, expr: CallExpr, callee: RefExpr) ->
648652
builder.activate_block(exit_block)
649653
return retval
650654

651-
if isinstance(expr.args[1], RefExpr):
652-
node = expr.args[1].node
655+
if isinstance(type_expr, RefExpr):
656+
node = type_expr.node
653657
if node:
654658
desc = isinstance_primitives.get(node.fullname)
655659
if desc:
656-
obj = builder.accept(expr.args[0])
660+
obj = builder.accept(obj_expr)
657661
return builder.primitive_op(desc, [obj], expr.line)
658662

659663
return None

0 commit comments

Comments
 (0)