From 047cd40313e39b662650bbf6c8059ab0910e5986 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Wed, 19 Feb 2014 15:47:59 +0200 Subject: Bytecode int varlen encoding: support arbitrary values for signed ints too. --- py/showbc.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'py/showbc.c') diff --git a/py/showbc.c b/py/showbc.c index e3387dbe2..837ee7611 100644 --- a/py/showbc.c +++ b/py/showbc.c @@ -57,11 +57,18 @@ void mp_byte_code_print(const byte *ip, int len) { printf("LOAD_CONST_ELLIPSIS"); break; - case MP_BC_LOAD_CONST_SMALL_INT: - unum = (ip[0] | (ip[1] << 8) | (ip[2] << 16)) - 0x800000; - ip += 3; - printf("LOAD_CONST_SMALL_INT %d", (int)unum); - break; + case MP_BC_LOAD_CONST_SMALL_INT: { + int num = 0; + if ((ip[0] & 0x40) != 0) { + // Number is negative + num--; + } + do { + num = (num << 7) | (*ip & 0x7f); + } while ((*ip++ & 0x80) != 0); + printf("LOAD_CONST_SMALL_INT %d", num); + break; + } case MP_BC_LOAD_CONST_INT: DECODE_QSTR; -- cgit v1.2.3