7
7
import importlib .machinery
8
8
import importlib .util
9
9
import json
10
+ import opcode
10
11
import os
11
12
import pickle
12
13
import queue
@@ -2352,6 +2353,7 @@ def temporary_optimizer(opt):
2352
2353
finally :
2353
2354
_testinternalcapi .set_optimizer (None )
2354
2355
2356
+
2355
2357
@contextlib .contextmanager
2356
2358
def clear_executors (func ):
2357
2359
# Clear executors in func before and after running a block
@@ -2418,6 +2420,19 @@ def long_loop():
2418
2420
self .assertEqual (opt .get_count (), 10 )
2419
2421
2420
2422
2423
+
2424
+ def get_first_executor (code ):
2425
+ co_code = code .co_code
2426
+ JUMP_BACKWARD = opcode .opmap ["JUMP_BACKWARD" ]
2427
+ for i in range (0 , len (co_code ), 2 ):
2428
+ if co_code [i ] == JUMP_BACKWARD or 1 :
2429
+ try :
2430
+ return _testinternalcapi .get_executor (code , i )
2431
+ except ValueError :
2432
+ pass
2433
+ return None
2434
+
2435
+
2421
2436
class TestUops (unittest .TestCase ):
2422
2437
2423
2438
def test_basic_loop (self ):
@@ -2443,6 +2458,47 @@ def testfunc(x):
2443
2458
self .assertIn ("SAVE_IP" , uops )
2444
2459
self .assertIn ("LOAD_FAST" , uops )
2445
2460
2461
+ def test_extended_arg (self ):
2462
+ "Check EXTENDED_ARG handling in superblock creation"
2463
+ def many_vars ():
2464
+ # 260 vars, so z9 should have index 259
2465
+ a0 = a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = 42
2466
+ b0 = b1 = b2 = b3 = b4 = b5 = b6 = b7 = b8 = b9 = 42
2467
+ c0 = c1 = c2 = c3 = c4 = c5 = c6 = c7 = c8 = c9 = 42
2468
+ d0 = d1 = d2 = d3 = d4 = d5 = d6 = d7 = d8 = d9 = 42
2469
+ e0 = e1 = e2 = e3 = e4 = e5 = e6 = e7 = e8 = e9 = 42
2470
+ f0 = f1 = f2 = f3 = f4 = f5 = f6 = f7 = f8 = f9 = 42
2471
+ g0 = g1 = g2 = g3 = g4 = g5 = g6 = g7 = g8 = g9 = 42
2472
+ h0 = h1 = h2 = h3 = h4 = h5 = h6 = h7 = h8 = h9 = 42
2473
+ i0 = i1 = i2 = i3 = i4 = i5 = i6 = i7 = i8 = i9 = 42
2474
+ j0 = j1 = j2 = j3 = j4 = j5 = j6 = j7 = j8 = j9 = 42
2475
+ k0 = k1 = k2 = k3 = k4 = k5 = k6 = k7 = k8 = k9 = 42
2476
+ l0 = l1 = l2 = l3 = l4 = l5 = l6 = l7 = l8 = l9 = 42
2477
+ m0 = m1 = m2 = m3 = m4 = m5 = m6 = m7 = m8 = m9 = 42
2478
+ n0 = n1 = n2 = n3 = n4 = n5 = n6 = n7 = n8 = n9 = 42
2479
+ o0 = o1 = o2 = o3 = o4 = o5 = o6 = o7 = o8 = o9 = 42
2480
+ p0 = p1 = p2 = p3 = p4 = p5 = p6 = p7 = p8 = p9 = 42
2481
+ q0 = q1 = q2 = q3 = q4 = q5 = q6 = q7 = q8 = q9 = 42
2482
+ r0 = r1 = r2 = r3 = r4 = r5 = r6 = r7 = r8 = r9 = 42
2483
+ s0 = s1 = s2 = s3 = s4 = s5 = s6 = s7 = s8 = s9 = 42
2484
+ t0 = t1 = t2 = t3 = t4 = t5 = t6 = t7 = t8 = t9 = 42
2485
+ u0 = u1 = u2 = u3 = u4 = u5 = u6 = u7 = u8 = u9 = 42
2486
+ v0 = v1 = v2 = v3 = v4 = v5 = v6 = v7 = v8 = v9 = 42
2487
+ w0 = w1 = w2 = w3 = w4 = w5 = w6 = w7 = w8 = w9 = 42
2488
+ x0 = x1 = x2 = x3 = x4 = x5 = x6 = x7 = x8 = x9 = 42
2489
+ y0 = y1 = y2 = y3 = y4 = y5 = y6 = y7 = y8 = y9 = 42
2490
+ z0 = z1 = z2 = z3 = z4 = z5 = z6 = z7 = z8 = z9 = 42
2491
+ while z9 > 0 :
2492
+ z9 = z9 - 1
2493
+
2494
+ opt = _testinternalcapi .get_uop_optimizer ()
2495
+ with temporary_optimizer (opt ):
2496
+ ex = get_first_executor (many_vars .__code__ )
2497
+ self .assertIsNone (ex )
2498
+ many_vars ()
2499
+ ex = get_first_executor (many_vars .__code__ )
2500
+ self .assertIn (("LOAD_FAST" , 259 ), list (ex ))
2501
+
2446
2502
2447
2503
if __name__ == "__main__" :
2448
2504
unittest .main ()
0 commit comments