Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TASTE
uPython-mirror
Commits
0f96ec82
Commit
0f96ec82
authored
Feb 18, 2014
by
Paul Sokolovsky
Browse files
Bytecode uint varlen encoding: support arbitrary values.
parent
46239413
Changes
2
Hide whitespace changes
Inline
Side-by-side
py/emitbc.c
View file @
0f96ec82
...
...
@@ -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
...
...
py/vm.c
View file @
0f96ec82
...
...
@@ -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)
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment