@@ -126,29 +126,40 @@ static mp_obj_t code_colines_iter(mp_obj_t self_in) {
126
126
iter -> bc = 0 ;
127
127
iter -> source_line = 1 ;
128
128
iter -> ci = self -> rc -> prelude .line_info ;
129
- code_colines_next (MP_OBJ_FROM_PTR (iter ));
130
129
return MP_OBJ_FROM_PTR (iter );
131
130
}
132
131
static MP_DEFINE_CONST_FUN_OBJ_1 (code_colines_obj , code_colines_iter ) ;
133
132
134
133
static mp_obj_t code_colines_next (mp_obj_t iter_in ) {
135
134
mp_obj_colines_iter_t * iter = MP_OBJ_TO_PTR (iter_in );
135
+ const byte * ci_end = iter -> rc -> prelude .line_info_top ;
136
136
137
137
mp_uint_t start = iter -> bc ;
138
138
mp_uint_t line_no = iter -> source_line ;
139
+ bool another = true;
139
140
140
- if (iter -> ci >= iter -> rc -> prelude .line_info_top ) {
141
+ while (another && iter -> ci < ci_end ) {
142
+ another = false;
143
+ mp_code_lineinfo_t decoded = mp_bytecode_decode_lineinfo (& iter -> ci );
144
+ iter -> bc += decoded .bc_increment ;
145
+ iter -> source_line += decoded .line_increment ;
146
+
147
+ if (decoded .bc_increment == 0 ) {
148
+ line_no = iter -> source_line ;
149
+ another = true;
150
+ } else if (decoded .line_increment == 0 ) {
151
+ another = true;
152
+ }
153
+ }
154
+
155
+ if (another ) {
141
156
mp_uint_t prelude_size = (iter -> rc -> prelude .opcodes - (const byte * )iter -> rc -> fun_data );
142
157
mp_uint_t bc_end = iter -> rc -> fun_data_len - prelude_size ;
143
158
if (iter -> bc >= bc_end ) {
144
159
return MP_OBJ_STOP_ITERATION ;
145
160
} else {
146
161
iter -> bc = bc_end ;
147
162
}
148
- } else {
149
- mp_code_lineinfo_t decoded = mp_bytecode_decode_lineinfo (& iter -> ci );
150
- iter -> bc += decoded .bc_increment ;
151
- iter -> source_line += decoded .line_increment ;
152
163
}
153
164
154
165
mp_uint_t end = iter -> bc ;
0 commit comments