summaryrefslogtreecommitdiffstatshomepage
path: root/py/vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'py/vm.c')
-rw-r--r--py/vm.c46
1 files changed, 21 insertions, 25 deletions
diff --git a/py/vm.c b/py/vm.c
index c0116bbeb9..8c59b9c3aa 100644
--- a/py/vm.c
+++ b/py/vm.c
@@ -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);