File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -308,25 +308,35 @@ static inline void mp_module_context_alloc_tables(mp_module_context_t *context,
308308 #endif
309309}
310310
311+ typedef struct _mp_code_lineinfo_t {
312+ size_t bc_increment ;
313+ size_t line_increment ;
314+ } mp_code_lineinfo_t ;
315+
316+ static inline mp_code_lineinfo_t mp_bytecode_decode_lineinfo (const byte * * line_info ) {
317+ mp_code_lineinfo_t result ;
318+ size_t c = (* line_info )[0 ];
319+ if ((c & 0x80 ) == 0 ) {
320+ // 0b0LLBBBBB encoding
321+ result .bc_increment = c & 0x1f ;
322+ result .line_increment = c >> 5 ;
323+ * line_info += 1 ;
324+ } else {
325+ // 0b1LLLBBBB 0bLLLLLLLL encoding (l's LSB in second byte)
326+ result .bc_increment = c & 0xf ;
327+ result .line_increment = ((c << 4 ) & 0x700 ) | (* line_info )[1 ];
328+ * line_info += 2 ;
329+ }
330+ return result ;
331+ }
332+
311333static inline size_t mp_bytecode_get_source_line (const byte * line_info , const byte * line_info_top , size_t bc_offset ) {
312334 size_t source_line = 1 ;
313335 while (line_info < line_info_top ) {
314- size_t c = * line_info ;
315- size_t b , l ;
316- if ((c & 0x80 ) == 0 ) {
317- // 0b0LLBBBBB encoding
318- b = c & 0x1f ;
319- l = c >> 5 ;
320- line_info += 1 ;
321- } else {
322- // 0b1LLLBBBB 0bLLLLLLLL encoding (l's LSB in second byte)
323- b = c & 0xf ;
324- l = ((c << 4 ) & 0x700 ) | line_info [1 ];
325- line_info += 2 ;
326- }
327- if (bc_offset >= b ) {
328- bc_offset -= b ;
329- source_line += l ;
336+ mp_code_lineinfo_t decoded = mp_bytecode_decode_lineinfo (& line_info );
337+ if (bc_offset >= decoded .bc_increment ) {
338+ bc_offset -= decoded .bc_increment ;
339+ source_line += decoded .line_increment ;
330340 } else {
331341 // found source line corresponding to bytecode offset
332342 break ;
You can’t perform that action at this time.
0 commit comments