diff options
Diffstat (limited to 'py/vm.c')
-rw-r--r-- | py/vm.c | 46 |
1 files changed, 21 insertions, 25 deletions
@@ -925,33 +925,29 @@ exception_handler: mp_uint_t code_info_size = code_info[0] | (code_info[1] << 8) | (code_info[2] << 16) | (code_info[3] << 24); qstr source_file = code_info[4] | (code_info[5] << 8) | (code_info[6] << 16) | (code_info[7] << 24); qstr block_name = code_info[8] | (code_info[9] << 8) | (code_info[10] << 16) | (code_info[11] << 24); - mp_uint_t source_line = 0; mp_uint_t bc = code_state->ip - code_info - code_info_size; //printf("find %lu %d %d\n", bc, code_info[12], code_info[13]); - const byte* ci = code_info + 12; - if (*ci) { - source_line = 1; - mp_uint_t c; - while ((c = *ci)) { - mp_uint_t b, l; - if ((c & 0x80) == 0) { - // 0b0LLBBBBB encoding - b = c & 0x1f; - l = c >> 5; - ci += 1; - } else { - // 0b1LLLBBBB 0bLLLLLLLL encoding (l's LSB in second byte) - b = c & 0xf; - l = ((c << 4) & 0x700) | ci[1]; - ci += 2; - } - if (bc >= b) { - bc -= b; - source_line += l; - } else { - // found source line corresponding to bytecode offset - break; - } + mp_uint_t source_line = 1; + mp_uint_t c; + for (const byte *ci = code_info + 12; (c = *ci);) { + mp_uint_t b, l; + if ((c & 0x80) == 0) { + // 0b0LLBBBBB encoding + b = c & 0x1f; + l = c >> 5; + ci += 1; + } else { + // 0b1LLLBBBB 0bLLLLLLLL encoding (l's LSB in second byte) + b = c & 0xf; + l = ((c << 4) & 0x700) | ci[1]; + ci += 2; + } + if (bc >= b) { + bc -= b; + source_line += l; + } else { + // found source line corresponding to bytecode offset + break; } } mp_obj_exception_add_traceback(nlr.ret_val, source_file, source_line, block_name); |