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