@@ -2143,13 +2143,13 @@ def testfunc(n):
21432143 self .assertIn ("_BUILD_TUPLE" , uops )
21442144 self .assertIn ("_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW" , uops )
21452145
2146- def test_call_isinstance_tuple_of_classes_true_unknown (self ):
2146+ def test_call_isinstance_tuple_of_classes_true_unknown_1 (self ):
21472147 def testfunc (n ):
21482148 x = 0
21492149 for _ in range (n ):
2150- # One of the classes is unknown, but we can still
2151- # narrow to True
2152- y = isinstance (42 , (eval ('str' ), int ))
2150+ # One of the classes is unknown, but it comes
2151+ # after a known class, so we can narrow to True
2152+ y = isinstance (42 , (int , eval ('str' )))
21532153 if y :
21542154 x += 1
21552155 return x
@@ -2160,11 +2160,30 @@ def testfunc(n):
21602160 uops = get_opnames (ex )
21612161 self .assertNotIn ("_CALL_ISINSTANCE" , uops )
21622162 self .assertNotIn ("_TO_BOOL_BOOL" , uops )
2163- self .assertNotIn ("_GUARD_IS_TRUE_POP " , uops )
2163+ self .assertNotIn ("_GUARD_IS_FALSE_POP " , uops )
21642164 self .assertIn ("_BUILD_TUPLE" , uops )
21652165 self .assertIn ("_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW" , uops )
21662166
2167- def test_call_isinstance_tuple_of_classes_unknown_not_narrowed (self ):
2167+ def test_call_isinstance_tuple_of_classes_true_unknown_2 (self ):
2168+ def testfunc (n ):
2169+ x = 0
2170+ for _ in range (n ):
2171+ # One of the classes is unknown, so we can't narrow
2172+ # to True or False, only bool
2173+ y = isinstance (42 , (eval ('str' ), int ))
2174+ if y :
2175+ x += 1
2176+ return x
2177+
2178+ res , ex = self ._run_with_optimizer (testfunc , TIER2_THRESHOLD )
2179+ self .assertEqual (res , TIER2_THRESHOLD )
2180+ self .assertIsNotNone (ex )
2181+ uops = get_opnames (ex )
2182+ self .assertIn ("_CALL_ISINSTANCE" , uops )
2183+ self .assertNotIn ("_TO_BOOL_BOOL" , uops )
2184+ self .assertIn ("_GUARD_IS_TRUE_POP" , uops )
2185+
2186+ def test_call_isinstance_tuple_of_classes_true_unknown_3 (self ):
21682187 def testfunc (n ):
21692188 x = 0
21702189 for _ in range (n ):
@@ -2183,6 +2202,25 @@ def testfunc(n):
21832202 self .assertNotIn ("_TO_BOOL_BOOL" , uops )
21842203 self .assertIn ("_GUARD_IS_TRUE_POP" , uops )
21852204
2205+ def test_call_isinstance_tuple_of_classes_true_unknown_4 (self ):
2206+ def testfunc (n ):
2207+ x = 0
2208+ for _ in range (n ):
2209+ # One of the classes is unknown, so we can't narrow
2210+ # to True or False, only bool
2211+ y = isinstance (42 , (eval ('int' ), str ))
2212+ if y :
2213+ x += 1
2214+ return x
2215+
2216+ res , ex = self ._run_with_optimizer (testfunc , TIER2_THRESHOLD )
2217+ self .assertEqual (res , TIER2_THRESHOLD )
2218+ self .assertIsNotNone (ex )
2219+ uops = get_opnames (ex )
2220+ self .assertIn ("_CALL_ISINSTANCE" , uops )
2221+ self .assertNotIn ("_TO_BOOL_BOOL" , uops )
2222+ self .assertIn ("_GUARD_IS_TRUE_POP" , uops )
2223+
21862224 def test_call_isinstance_empty_tuple (self ):
21872225 def testfunc (n ):
21882226 x = 0
@@ -2248,6 +2286,36 @@ def testfunc(n):
22482286 self .assertNotIn ("_TO_BOOL_BOOL" , uops )
22492287 self .assertIn ("_GUARD_IS_TRUE_POP" , uops )
22502288
2289+ def test_call_isinstance_tuple_metaclass (self ):
2290+ calls = 0
2291+
2292+ class Meta (type ):
2293+ def __instancecheck__ (self , _ ):
2294+ nonlocal calls
2295+ calls += 1
2296+ return False
2297+
2298+ class Unknown (metaclass = Meta ):
2299+ pass
2300+
2301+ def testfunc (n ):
2302+ x = 0
2303+ for _ in range (n ):
2304+ # Only narrowed to bool
2305+ y = isinstance (42 , (Unknown , int ))
2306+ if y :
2307+ x += 1
2308+ return x , calls
2309+
2310+ (res , calls ), ex = self ._run_with_optimizer (testfunc , TIER2_THRESHOLD )
2311+ self .assertEqual (res , TIER2_THRESHOLD )
2312+ self .assertEqual (calls , TIER2_THRESHOLD )
2313+ self .assertIsNotNone (ex )
2314+ uops = get_opnames (ex )
2315+ self .assertIn ("_CALL_ISINSTANCE" , uops )
2316+ self .assertNotIn ("_TO_BOOL_BOOL" , uops )
2317+ self .assertIn ("_GUARD_IS_TRUE_POP" , uops )
2318+
22512319 def test_set_type_version_sets_type (self ):
22522320 class C :
22532321 A = 1
0 commit comments