Bytecode uint varlen encoding: support arbitrary values.
This commit is contained in:
parent
46239413d0
commit
0f96ec8268
24
py/emitbc.c
24
py/emitbc.c
|
@ -108,19 +108,19 @@ STATIC void emit_write_byte_code_byte_byte(emit_t* emit, byte b1, uint b2) {
|
|||
}
|
||||
|
||||
STATIC void emit_write_byte_code_uint(emit_t* emit, uint num) {
|
||||
if (num <= 127) { // fits in 0x7f
|
||||
// fit argument in single byte
|
||||
byte* c = emit_get_cur_to_write_byte_code(emit, 1);
|
||||
c[0] = num;
|
||||
} else if (num <= 16383) { // fits in 0x3fff
|
||||
// fit argument in two bytes
|
||||
byte* c = emit_get_cur_to_write_byte_code(emit, 2);
|
||||
c[0] = (num >> 8) | 0x80;
|
||||
c[1] = num;
|
||||
} else {
|
||||
// larger numbers not implemented/supported
|
||||
assert(0);
|
||||
// We store each 7 bits in a separate byte, and that's how many bytes needed
|
||||
byte buf[(BYTES_PER_WORD * 8 + 7) / 7];
|
||||
byte *p = buf + sizeof(buf);
|
||||
// We encode in little-ending order, but store in big-endian, to help decoding
|
||||
do {
|
||||
*--p = num & 0x7f;
|
||||
num >>= 7;
|
||||
} while (num != 0);
|
||||
byte* c = emit_get_cur_to_write_byte_code(emit, buf + sizeof(buf) - p);
|
||||
while (p != buf + sizeof(buf) - 1) {
|
||||
*c++ = *p++ | 0x80;
|
||||
}
|
||||
*c = *p;
|
||||
}
|
||||
|
||||
// integers (for small ints) are stored as 24 bits, in excess
|
||||
|
|
14
py/vm.c
14
py/vm.c
|
@ -38,10 +38,20 @@ typedef enum {
|
|||
UNWIND_JUMP,
|
||||
} mp_unwind_reason_t;
|
||||
|
||||
#define DECODE_UINT do { unum = *ip++; if (unum > 127) { unum = ((unum & 0x3f) << 8) | (*ip++); } } while (0)
|
||||
#define DECODE_UINT { \
|
||||
unum = 0; \
|
||||
do { \
|
||||
unum = (unum << 7) + (*ip & 0x7f); \
|
||||
} while ((*ip++ & 0x80) != 0); \
|
||||
}
|
||||
#define DECODE_ULABEL do { unum = (ip[0] | (ip[1] << 8)); ip += 2; } while (0)
|
||||
#define DECODE_SLABEL do { unum = (ip[0] | (ip[1] << 8)) - 0x8000; ip += 2; } while (0)
|
||||
#define DECODE_QSTR do { qst = *ip++; if (qst > 127) { qst = ((qst & 0x3f) << 8) | (*ip++); } } while (0)
|
||||
#define DECODE_QSTR { \
|
||||
qst = 0; \
|
||||
do { \
|
||||
qst = (qst << 7) + (*ip & 0x7f); \
|
||||
} while ((*ip++ & 0x80) != 0); \
|
||||
}
|
||||
#define PUSH(val) *++sp = (val)
|
||||
#define POP() (*sp--)
|
||||
#define TOP() (*sp)
|
||||
|
|
Loading…
Reference in New Issue