tools/mpy-tool.py: Fix calc of opcode size for opcodes with map caching.
Following an equivalent fix to py/bc.c. The reason the incorrect values for the opcode constants were not previously causing a bug is because they were never being used: these opcodes always have qstr arguments so the part of the code that was comparing them would never be reached. Thanks to @malinah for finding the problem and providing the initial patch.
This commit is contained in:
parent
6bf8ecfe3a
commit
814d580a15
|
@ -73,9 +73,9 @@ MP_BC_MAKE_CLOSURE = 0x62
|
||||||
MP_BC_MAKE_CLOSURE_DEFARGS = 0x63
|
MP_BC_MAKE_CLOSURE_DEFARGS = 0x63
|
||||||
MP_BC_RAISE_VARARGS = 0x5c
|
MP_BC_RAISE_VARARGS = 0x5c
|
||||||
# extra byte if caching enabled:
|
# extra byte if caching enabled:
|
||||||
MP_BC_LOAD_NAME = 0x1c
|
MP_BC_LOAD_NAME = 0x1b
|
||||||
MP_BC_LOAD_GLOBAL = 0x1d
|
MP_BC_LOAD_GLOBAL = 0x1c
|
||||||
MP_BC_LOAD_ATTR = 0x1e
|
MP_BC_LOAD_ATTR = 0x1d
|
||||||
MP_BC_STORE_ATTR = 0x26
|
MP_BC_STORE_ATTR = 0x26
|
||||||
|
|
||||||
def make_opcode_format():
|
def make_opcode_format():
|
||||||
|
@ -166,18 +166,18 @@ def mp_opcode_format(bytecode, ip, opcode_format=make_opcode_format()):
|
||||||
ip_start = ip
|
ip_start = ip
|
||||||
f = (opcode_format[opcode >> 2] >> (2 * (opcode & 3))) & 3
|
f = (opcode_format[opcode >> 2] >> (2 * (opcode & 3))) & 3
|
||||||
if f == MP_OPCODE_QSTR:
|
if f == MP_OPCODE_QSTR:
|
||||||
|
if config.MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE:
|
||||||
|
if (opcode == MP_BC_LOAD_NAME
|
||||||
|
or opcode == MP_BC_LOAD_GLOBAL
|
||||||
|
or opcode == MP_BC_LOAD_ATTR
|
||||||
|
or opcode == MP_BC_STORE_ATTR):
|
||||||
|
ip += 1
|
||||||
ip += 3
|
ip += 3
|
||||||
else:
|
else:
|
||||||
extra_byte = (
|
extra_byte = (
|
||||||
opcode == MP_BC_RAISE_VARARGS
|
opcode == MP_BC_RAISE_VARARGS
|
||||||
or opcode == MP_BC_MAKE_CLOSURE
|
or opcode == MP_BC_MAKE_CLOSURE
|
||||||
or opcode == MP_BC_MAKE_CLOSURE_DEFARGS
|
or opcode == MP_BC_MAKE_CLOSURE_DEFARGS
|
||||||
or config.MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE and (
|
|
||||||
opcode == MP_BC_LOAD_NAME
|
|
||||||
or opcode == MP_BC_LOAD_GLOBAL
|
|
||||||
or opcode == MP_BC_LOAD_ATTR
|
|
||||||
or opcode == MP_BC_STORE_ATTR
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
ip += 1
|
ip += 1
|
||||||
if f == MP_OPCODE_VAR_UINT:
|
if f == MP_OPCODE_VAR_UINT:
|
||||||
|
@ -278,7 +278,8 @@ class RawCode:
|
||||||
f, sz = mp_opcode_format(self.bytecode, ip)
|
f, sz = mp_opcode_format(self.bytecode, ip)
|
||||||
if f == 1:
|
if f == 1:
|
||||||
qst = self._unpack_qstr(ip + 1).qstr_id
|
qst = self._unpack_qstr(ip + 1).qstr_id
|
||||||
print(' ', '0x%02x,' % self.bytecode[ip], qst, '& 0xff,', qst, '>> 8,')
|
extra = '' if sz == 3 else ' 0x%02x,' % self.bytecode[ip + 3]
|
||||||
|
print(' ', '0x%02x,' % self.bytecode[ip], qst, '& 0xff,', qst, '>> 8,', extra)
|
||||||
else:
|
else:
|
||||||
print(' ', ''.join('0x%02x, ' % self.bytecode[ip + i] for i in range(sz)))
|
print(' ', ''.join('0x%02x, ' % self.bytecode[ip + i] for i in range(sz)))
|
||||||
ip += sz
|
ip += sz
|
||||||
|
|
Loading…
Reference in New Issue