summaryrefslogtreecommitdiffstatshomepage
path: root/py/vm.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-02-19 15:47:59 +0200
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-02-19 15:53:41 +0200
commit047cd40313e39b662650bbf6c8059ab0910e5986 (patch)
treed883b3da1a95adba26be031b6a462847539f39b9 /py/vm.c
parent0f96ec826811e3cec3703141684445bea639e2bc (diff)
downloadmicropython-047cd40313e39b662650bbf6c8059ab0910e5986.tar.gz
micropython-047cd40313e39b662650bbf6c8059ab0910e5986.zip
Bytecode int varlen encoding: support arbitrary values for signed ints too.
Diffstat (limited to 'py/vm.c')
-rw-r--r--py/vm.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/py/vm.c b/py/vm.c
index 0fdf5d4e31..cab340ff38 100644
--- a/py/vm.c
+++ b/py/vm.c
@@ -156,11 +156,18 @@ dispatch_loop:
PUSH(mp_const_ellipsis);
break;
- case MP_BC_LOAD_CONST_SMALL_INT:
- unum = (ip[0] | (ip[1] << 8) | (ip[2] << 16)) - 0x800000;
- ip += 3;
- PUSH(MP_OBJ_NEW_SMALL_INT(unum));
+ 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);
+ PUSH(MP_OBJ_NEW_SMALL_INT(num));
break;
+ }
case MP_BC_LOAD_CONST_INT:
DECODE_QSTR;