@@ -966,6 +966,25 @@ basicblock_next_instr(basicblock *b)
966
966
(new).i_end_lineno = (old).i_end_lineno; \
967
967
(new).i_end_col_offset = (old).i_end_col_offset;
968
968
969
+
970
+ struct location {
971
+ int lineno ;
972
+ int end_lineno ;
973
+ int col_offset ;
974
+ int end_col_offset ;
975
+ };
976
+
977
+ #define NO_LOCATION ((struct location){-1, 0, 0, 0})
978
+
979
+ /* current compiler unit's location */
980
+ #define CU_LOCATION (CU ) \
981
+ ((struct location){ \
982
+ (CU)->u_lineno, \
983
+ (CU)->u_end_lineno, \
984
+ (CU)->u_col_offset, \
985
+ (CU)->u_end_col_offset, \
986
+ })
987
+
969
988
/* Return the stack effect of opcode with argument oparg.
970
989
971
990
Some opcodes have different stack effect when jump to the target and
@@ -1268,8 +1287,7 @@ compiler_use_new_implicit_block_if_needed(struct compiler *c)
1268
1287
*/
1269
1288
1270
1289
static int
1271
- basicblock_addop (basicblock * b , int opcode , int lineno ,
1272
- int end_lineno , int col_offset , int end_col_offset )
1290
+ basicblock_addop (basicblock * b , int opcode , struct location loc )
1273
1291
{
1274
1292
assert (IS_WITHIN_OPCODE_RANGE (opcode ));
1275
1293
assert (!IS_ASSEMBLER_OPCODE (opcode ));
@@ -1282,10 +1300,10 @@ basicblock_addop(basicblock *b, int opcode, int lineno,
1282
1300
struct instr * i = & b -> b_instr [off ];
1283
1301
i -> i_opcode = opcode ;
1284
1302
i -> i_oparg = 0 ;
1285
- i -> i_lineno = lineno ;
1286
- i -> i_end_lineno = end_lineno ;
1287
- i -> i_col_offset = col_offset ;
1288
- i -> i_end_col_offset = end_col_offset ;
1303
+ i -> i_lineno = loc . lineno ;
1304
+ i -> i_end_lineno = loc . end_lineno ;
1305
+ i -> i_col_offset = loc . col_offset ;
1306
+ i -> i_end_col_offset = loc . end_col_offset ;
1289
1307
1290
1308
return 1 ;
1291
1309
}
@@ -1296,13 +1314,9 @@ compiler_addop(struct compiler *c, int opcode, bool line)
1296
1314
if (compiler_use_new_implicit_block_if_needed (c ) < 0 ) {
1297
1315
return -1 ;
1298
1316
}
1299
- int lineno = line ? c -> u -> u_lineno : -1 ;
1300
- int end_lineno = line ? c -> u -> u_end_lineno : 0 ;
1301
- int col_offset = line ? c -> u -> u_col_offset : 0 ;
1302
- int end_col_offset = line ? c -> u -> u_end_col_offset : 0 ;
1303
1317
1304
- return basicblock_addop (c -> u -> u_curblock , opcode ,
1305
- lineno , end_lineno , col_offset , end_col_offset );
1318
+ struct location loc = line ? CU_LOCATION (c -> u ) : NO_LOCATION ;
1319
+ return basicblock_addop ( c -> u -> u_curblock , opcode , loc );
1306
1320
}
1307
1321
1308
1322
static Py_ssize_t
@@ -1496,8 +1510,7 @@ compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
1496
1510
1497
1511
static int
1498
1512
basicblock_addop_i (basicblock * b , int opcode , Py_ssize_t oparg ,
1499
- int lineno , int end_lineno ,
1500
- int col_offset , int end_col_offset )
1513
+ struct location loc )
1501
1514
{
1502
1515
/* oparg value is unsigned, but a signed C int is usually used to store
1503
1516
it in the C code (like Python/ceval.c).
@@ -1518,10 +1531,10 @@ basicblock_addop_i(basicblock *b, int opcode, Py_ssize_t oparg,
1518
1531
struct instr * i = & b -> b_instr [off ];
1519
1532
i -> i_opcode = opcode ;
1520
1533
i -> i_oparg = Py_SAFE_DOWNCAST (oparg , Py_ssize_t , int );
1521
- i -> i_lineno = lineno ;
1522
- i -> i_end_lineno = end_lineno ;
1523
- i -> i_col_offset = col_offset ;
1524
- i -> i_end_col_offset = end_col_offset ;
1534
+ i -> i_lineno = loc . lineno ;
1535
+ i -> i_end_lineno = loc . end_lineno ;
1536
+ i -> i_col_offset = loc . col_offset ;
1537
+ i -> i_end_col_offset = loc . end_col_offset ;
1525
1538
1526
1539
return 1 ;
1527
1540
}
@@ -1532,20 +1545,13 @@ compiler_addop_i(struct compiler *c, int opcode, Py_ssize_t oparg, bool line)
1532
1545
if (compiler_use_new_implicit_block_if_needed (c ) < 0 ) {
1533
1546
return -1 ;
1534
1547
}
1535
- int lineno = line ? c -> u -> u_lineno : -1 ;
1536
- int end_lineno = line ? c -> u -> u_end_lineno : 0 ;
1537
- int col_offset = line ? c -> u -> u_col_offset : 0 ;
1538
- int end_col_offset = line ? c -> u -> u_end_col_offset : 0 ;
1539
-
1540
- return basicblock_addop_i (c -> u -> u_curblock , opcode , oparg ,
1541
- lineno , end_lineno , col_offset , end_col_offset );
1548
+ struct location loc = line ? CU_LOCATION (c -> u ) : NO_LOCATION ;
1549
+ return basicblock_addop_i (c -> u -> u_curblock , opcode , oparg , loc );
1542
1550
}
1543
1551
1544
1552
static int
1545
1553
basicblock_add_jump (basicblock * b , int opcode ,
1546
- int lineno , int end_lineno ,
1547
- int col_offset , int end_col_offset ,
1548
- basicblock * target )
1554
+ struct location loc , basicblock * target )
1549
1555
{
1550
1556
assert (IS_WITHIN_OPCODE_RANGE (opcode ));
1551
1557
assert (!IS_ASSEMBLER_OPCODE (opcode ));
@@ -1559,10 +1565,10 @@ basicblock_add_jump(basicblock *b, int opcode,
1559
1565
}
1560
1566
i -> i_opcode = opcode ;
1561
1567
i -> i_target = target ;
1562
- i -> i_lineno = lineno ;
1563
- i -> i_end_lineno = end_lineno ;
1564
- i -> i_col_offset = col_offset ;
1565
- i -> i_end_col_offset = end_col_offset ;
1568
+ i -> i_lineno = loc . lineno ;
1569
+ i -> i_end_lineno = loc . end_lineno ;
1570
+ i -> i_col_offset = loc . col_offset ;
1571
+ i -> i_end_col_offset = loc . end_col_offset ;
1566
1572
1567
1573
return 1 ;
1568
1574
}
@@ -1573,14 +1579,8 @@ compiler_addop_j(struct compiler *c, int opcode, basicblock *target, bool line)
1573
1579
if (compiler_use_new_implicit_block_if_needed (c ) < 0 ) {
1574
1580
return -1 ;
1575
1581
}
1576
- int lineno = line ? c -> u -> u_lineno : -1 ;
1577
- int end_lineno = line ? c -> u -> u_end_lineno : 0 ;
1578
- int col_offset = line ? c -> u -> u_col_offset : 0 ;
1579
- int end_col_offset = line ? c -> u -> u_end_col_offset : 0 ;
1580
-
1581
- return basicblock_add_jump (c -> u -> u_curblock , opcode ,
1582
- lineno , end_lineno , col_offset , end_col_offset ,
1583
- target );
1582
+ struct location loc = line ? CU_LOCATION (c -> u ) : NO_LOCATION ;
1583
+ return basicblock_add_jump (c -> u -> u_curblock , opcode , loc , target );
1584
1584
}
1585
1585
1586
1586
#define ADDOP (C , OP ) { \
@@ -7455,7 +7455,7 @@ push_cold_blocks_to_end(struct compiler *c, basicblock *entry, int code_flags) {
7455
7455
if (explicit_jump == NULL ) {
7456
7456
return -1 ;
7457
7457
}
7458
- basicblock_add_jump (explicit_jump , JUMP , -1 , 0 , 0 , 0 , b -> b_next );
7458
+ basicblock_add_jump (explicit_jump , JUMP , NO_LOCATION , b -> b_next );
7459
7459
7460
7460
explicit_jump -> b_cold = 1 ;
7461
7461
explicit_jump -> b_next = b -> b_next ;
0 commit comments