@@ -150,6 +150,15 @@ location_is_after(location loc1, location loc2) {
150150 (loc1 .col_offset > loc2 .end_col_offset ));
151151}
152152
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+
153162#define LOC (x ) SRC_LOCATION_FROM_AST(x)
154163
155164typedef struct jump_target_label_ {
@@ -7722,15 +7731,15 @@ write_location_info_oneline_form(struct assembler* a, int length, int line_delta
77227731}
77237732
77247733static 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 )
77267735{
77277736 assert (length > 0 && length <= 8 );
77287737 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 );
77347743}
77357744
77367745static void
@@ -7749,7 +7758,7 @@ write_location_info_no_column(struct assembler* a, int length, int line_delta)
77497758#define THEORETICAL_MAX_ENTRY_SIZE 25 /* 1 + 6 + 6 + 6 + 6 */
77507759
77517760static 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 )
77537762{
77547763 Py_ssize_t len = PyBytes_GET_SIZE (a -> a_linetable );
77557764 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)
77587767 return -1 ;
77597768 }
77607769 }
7761- if (i -> i_loc .lineno < 0 ) {
7770+ if (loc .lineno < 0 ) {
77627771 write_location_info_none (a , isize );
77637772 return 0 ;
77647773 }
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 ;
77687777 assert (column >= -1 );
77697778 assert (end_column >= -1 );
77707779 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 ) {
77727781 write_location_info_no_column (a , isize , line_delta );
7773- a -> a_lineno = i -> i_loc .lineno ;
7782+ a -> a_lineno = loc .lineno ;
77747783 return 0 ;
77757784 }
77767785 }
7777- else if (i -> i_loc .end_lineno == i -> i_loc .lineno ) {
7786+ else if (loc .end_lineno == loc .lineno ) {
77787787 if (line_delta == 0 && column < 80 && end_column - column < 16 && end_column >= column ) {
77797788 write_location_info_short_form (a , isize , column , end_column );
77807789 return 0 ;
77817790 }
77827791 if (line_delta >= 0 && line_delta < 3 && column < 128 && end_column < 128 ) {
77837792 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 ;
77857794 return 0 ;
77867795 }
77877796 }
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 ;
77907799 return 0 ;
77917800}
77927801
77937802static int
7794- assemble_emit_location (struct assembler * a , struct instr * i )
7803+ assemble_emit_location (struct assembler * a , location loc , int isize )
77957804{
7796- int isize = instr_size (i );
7805+ if (isize == 0 ) {
7806+ return 0 ;
7807+ }
77977808 while (isize > 8 ) {
7798- if (write_location_info_entry (a , i , 8 ) < 0 ) {
7809+ if (write_location_info_entry (a , loc , 8 )) {
77997810 return -1 ;
78007811 }
78017812 isize -= 8 ;
78027813 }
7803- return write_location_info_entry (a , i , isize );
7814+ return write_location_info_entry (a , loc , isize );
78047815}
78057816
78067817/* assemble_emit()
@@ -8860,13 +8871,23 @@ assemble(struct compiler *c, int addNone)
88608871
88618872 /* Emit location info */
88628873 a .a_lineno = c -> u -> u_firstlineno ;
8874+ location loc = NO_LOCATION ;
8875+ int size = 0 ;
88638876 for (basicblock * b = g -> g_entryblock ; b != NULL ; b = b -> b_next ) {
88648877 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 ;
88678884 }
8885+ size += instr_size (& b -> b_instr [j ]);
88688886 }
88698887 }
8888+ if (assemble_emit_location (& a , loc , size )) {
8889+ goto error ;
8890+ }
88708891
88718892 if (assemble_exception_table (& a , g -> g_entryblock ) < 0 ) {
88728893 goto error ;
0 commit comments