@@ -150,6 +150,15 @@ location_is_after(location loc1, location loc2) {
150
150
(loc1 .col_offset > loc2 .end_col_offset ));
151
151
}
152
152
153
+ static inline bool
154
+ same_location (location a , location b )
155
+ {
156
+ return a .lineno == b .lineno &&
157
+ a .end_lineno == b .end_lineno &&
158
+ a .col_offset == b .col_offset &&
159
+ a .end_col_offset == b .end_col_offset ;
160
+ }
161
+
153
162
#define LOC (x ) SRC_LOCATION_FROM_AST(x)
154
163
155
164
typedef struct jump_target_label_ {
@@ -7722,15 +7731,15 @@ write_location_info_oneline_form(struct assembler* a, int length, int line_delta
7722
7731
}
7723
7732
7724
7733
static void
7725
- write_location_info_long_form (struct assembler * a , struct instr * i , int length )
7734
+ write_location_info_long_form (struct assembler * a , location loc , int length )
7726
7735
{
7727
7736
assert (length > 0 && length <= 8 );
7728
7737
write_location_first_byte (a , PY_CODE_LOCATION_INFO_LONG , length );
7729
- write_location_signed_varint (a , i -> i_loc .lineno - a -> a_lineno );
7730
- assert (i -> i_loc .end_lineno >= i -> i_loc .lineno );
7731
- write_location_varint (a , i -> i_loc .end_lineno - i -> i_loc .lineno );
7732
- write_location_varint (a , i -> i_loc .col_offset + 1 );
7733
- write_location_varint (a , i -> i_loc .end_col_offset + 1 );
7738
+ write_location_signed_varint (a , loc .lineno - a -> a_lineno );
7739
+ assert (loc .end_lineno >= loc .lineno );
7740
+ write_location_varint (a , loc .end_lineno - loc .lineno );
7741
+ write_location_varint (a , loc .col_offset + 1 );
7742
+ write_location_varint (a , loc .end_col_offset + 1 );
7734
7743
}
7735
7744
7736
7745
static void
@@ -7749,7 +7758,7 @@ write_location_info_no_column(struct assembler* a, int length, int line_delta)
7749
7758
#define THEORETICAL_MAX_ENTRY_SIZE 25 /* 1 + 6 + 6 + 6 + 6 */
7750
7759
7751
7760
static int
7752
- write_location_info_entry (struct assembler * a , struct instr * i , int isize )
7761
+ write_location_info_entry (struct assembler * a , location loc , int isize )
7753
7762
{
7754
7763
Py_ssize_t len = PyBytes_GET_SIZE (a -> a_linetable );
7755
7764
if (a -> a_location_off + THEORETICAL_MAX_ENTRY_SIZE >= len ) {
@@ -7758,49 +7767,51 @@ write_location_info_entry(struct assembler* a, struct instr* i, int isize)
7758
7767
return -1 ;
7759
7768
}
7760
7769
}
7761
- if (i -> i_loc .lineno < 0 ) {
7770
+ if (loc .lineno < 0 ) {
7762
7771
write_location_info_none (a , isize );
7763
7772
return 0 ;
7764
7773
}
7765
- int line_delta = i -> i_loc .lineno - a -> a_lineno ;
7766
- int column = i -> i_loc .col_offset ;
7767
- int end_column = i -> i_loc .end_col_offset ;
7774
+ int line_delta = loc .lineno - a -> a_lineno ;
7775
+ int column = loc .col_offset ;
7776
+ int end_column = loc .end_col_offset ;
7768
7777
assert (column >= -1 );
7769
7778
assert (end_column >= -1 );
7770
7779
if (column < 0 || end_column < 0 ) {
7771
- if (i -> i_loc .end_lineno == i -> i_loc .lineno || i -> i_loc .end_lineno == -1 ) {
7780
+ if (loc .end_lineno == loc .lineno || loc .end_lineno == -1 ) {
7772
7781
write_location_info_no_column (a , isize , line_delta );
7773
- a -> a_lineno = i -> i_loc .lineno ;
7782
+ a -> a_lineno = loc .lineno ;
7774
7783
return 0 ;
7775
7784
}
7776
7785
}
7777
- else if (i -> i_loc .end_lineno == i -> i_loc .lineno ) {
7786
+ else if (loc .end_lineno == loc .lineno ) {
7778
7787
if (line_delta == 0 && column < 80 && end_column - column < 16 && end_column >= column ) {
7779
7788
write_location_info_short_form (a , isize , column , end_column );
7780
7789
return 0 ;
7781
7790
}
7782
7791
if (line_delta >= 0 && line_delta < 3 && column < 128 && end_column < 128 ) {
7783
7792
write_location_info_oneline_form (a , isize , line_delta , column , end_column );
7784
- a -> a_lineno = i -> i_loc .lineno ;
7793
+ a -> a_lineno = loc .lineno ;
7785
7794
return 0 ;
7786
7795
}
7787
7796
}
7788
- write_location_info_long_form (a , i , isize );
7789
- a -> a_lineno = i -> i_loc .lineno ;
7797
+ write_location_info_long_form (a , loc , isize );
7798
+ a -> a_lineno = loc .lineno ;
7790
7799
return 0 ;
7791
7800
}
7792
7801
7793
7802
static int
7794
- assemble_emit_location (struct assembler * a , struct instr * i )
7803
+ assemble_emit_location (struct assembler * a , location loc , int isize )
7795
7804
{
7796
- int isize = instr_size (i );
7805
+ if (isize == 0 ) {
7806
+ return 0 ;
7807
+ }
7797
7808
while (isize > 8 ) {
7798
- if (write_location_info_entry (a , i , 8 ) < 0 ) {
7809
+ if (write_location_info_entry (a , loc , 8 )) {
7799
7810
return -1 ;
7800
7811
}
7801
7812
isize -= 8 ;
7802
7813
}
7803
- return write_location_info_entry (a , i , isize );
7814
+ return write_location_info_entry (a , loc , isize );
7804
7815
}
7805
7816
7806
7817
/* assemble_emit()
@@ -8860,13 +8871,23 @@ assemble(struct compiler *c, int addNone)
8860
8871
8861
8872
/* Emit location info */
8862
8873
a .a_lineno = c -> u -> u_firstlineno ;
8874
+ location loc = NO_LOCATION ;
8875
+ int size = 0 ;
8863
8876
for (basicblock * b = g -> g_entryblock ; b != NULL ; b = b -> b_next ) {
8864
8877
for (int j = 0 ; j < b -> b_iused ; j ++ ) {
8865
- if (assemble_emit_location (& a , & b -> b_instr [j ]) < 0 ) {
8866
- goto error ;
8878
+ if (!same_location (loc , b -> b_instr [j ].i_loc )) {
8879
+ if (assemble_emit_location (& a , loc , size )) {
8880
+ goto error ;
8881
+ }
8882
+ loc = b -> b_instr [j ].i_loc ;
8883
+ size = 0 ;
8867
8884
}
8885
+ size += instr_size (& b -> b_instr [j ]);
8868
8886
}
8869
8887
}
8888
+ if (assemble_emit_location (& a , loc , size )) {
8889
+ goto error ;
8890
+ }
8870
8891
8871
8892
if (assemble_exception_table (& a , g -> g_entryblock ) < 0 ) {
8872
8893
goto error ;
0 commit comments