diff --git a/py/bc.h b/py/bc.h index 476942fb96bae31ec9cd811d0db16453c4541fa6..ad16f9c9dfeaa05f292d90090f2ad4e0e2a360f0 100644 --- a/py/bc.h +++ b/py/bc.h @@ -53,6 +53,8 @@ mp_vm_return_kind_t mp_execute_bytecode(mp_code_state *code_state, volatile mp_o void mp_setup_code_state(mp_code_state *code_state, mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args); void mp_bytecode_print(const void *descr, mp_uint_t n_total_args, const byte *code, mp_uint_t len); void mp_bytecode_print2(const byte *code, mp_uint_t len); +const byte *mp_bytecode_print_str(const byte *ip); +#define mp_bytecode_print_inst(code) mp_bytecode_print2(code, 1) // Helper macros to access pointer with least significant bits holding flags #define MP_TAGPTR_PTR(x) ((void*)((mp_uint_t)(x) & ~((mp_uint_t)3))) diff --git a/py/showbc.c b/py/showbc.c index 5ae05432aa92cbe18e5d1e1e5e1dae7900f5ec51..b99ba822c3abcce8a67b65296079ada958cef6ea 100644 --- a/py/showbc.c +++ b/py/showbc.c @@ -57,8 +57,10 @@ ip += sizeof(mp_uint_t); \ } while (0) +static const byte *ip_start; + void mp_bytecode_print(const void *descr, mp_uint_t n_total_args, const byte *ip, mp_uint_t len) { - const byte *ip_start = ip; + ip_start = ip; // get code info size const byte *code_info = ip; @@ -130,393 +132,400 @@ void mp_bytecode_print(const void *descr, mp_uint_t n_total_args, const byte *ip mp_bytecode_print2(ip, len - 0); } -void mp_bytecode_print2(const byte *ip, mp_uint_t len) { - const byte *ip_start = ip; +const byte *mp_bytecode_print_str(const byte *ip) { mp_uint_t unum; qstr qstr; - while (ip - ip_start < len) { - printf("%02u ", (uint)(ip - ip_start)); - switch (*ip++) { - case MP_BC_LOAD_CONST_FALSE: - printf("LOAD_CONST_FALSE"); - break; - - case MP_BC_LOAD_CONST_NONE: - printf("LOAD_CONST_NONE"); - break; - - case MP_BC_LOAD_CONST_TRUE: - printf("LOAD_CONST_TRUE"); - break; - - case MP_BC_LOAD_CONST_ELLIPSIS: - printf("LOAD_CONST_ELLIPSIS"); - break; - - case MP_BC_LOAD_CONST_SMALL_INT: { - mp_int_t 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 " INT_FMT, num); - break; + + switch (*ip++) { + case MP_BC_LOAD_CONST_FALSE: + printf("LOAD_CONST_FALSE"); + break; + + case MP_BC_LOAD_CONST_NONE: + printf("LOAD_CONST_NONE"); + break; + + case MP_BC_LOAD_CONST_TRUE: + printf("LOAD_CONST_TRUE"); + break; + + case MP_BC_LOAD_CONST_ELLIPSIS: + printf("LOAD_CONST_ELLIPSIS"); + break; + + case MP_BC_LOAD_CONST_SMALL_INT: { + mp_int_t 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 " INT_FMT, num); + break; + } - case MP_BC_LOAD_CONST_INT: - DECODE_QSTR; - printf("LOAD_CONST_INT %s", qstr_str(qstr)); - break; - - case MP_BC_LOAD_CONST_DEC: - DECODE_QSTR; - printf("LOAD_CONST_DEC %s", qstr_str(qstr)); - break; - - case MP_BC_LOAD_CONST_BYTES: - DECODE_QSTR; - printf("LOAD_CONST_BYTES %s", qstr_str(qstr)); - break; - - case MP_BC_LOAD_CONST_STRING: - DECODE_QSTR; - printf("LOAD_CONST_STRING '%s'", qstr_str(qstr)); - break; - - case MP_BC_LOAD_NULL: - printf("LOAD_NULL"); - break; - - case MP_BC_LOAD_FAST_N: - DECODE_UINT; - printf("LOAD_FAST_N " UINT_FMT, unum); - break; - - case MP_BC_LOAD_DEREF: - DECODE_UINT; - printf("LOAD_DEREF " UINT_FMT, unum); - break; - - case MP_BC_LOAD_NAME: - DECODE_QSTR; - printf("LOAD_NAME %s", qstr_str(qstr)); - break; - - case MP_BC_LOAD_GLOBAL: - DECODE_QSTR; - printf("LOAD_GLOBAL %s", qstr_str(qstr)); - break; - - case MP_BC_LOAD_ATTR: - DECODE_QSTR; - printf("LOAD_ATTR %s", qstr_str(qstr)); - break; - - case MP_BC_LOAD_METHOD: - DECODE_QSTR; - printf("LOAD_METHOD %s", qstr_str(qstr)); - break; - - case MP_BC_LOAD_BUILD_CLASS: - printf("LOAD_BUILD_CLASS"); - break; - - case MP_BC_LOAD_SUBSCR: - printf("LOAD_SUBSCR"); - break; - - case MP_BC_STORE_FAST_N: - DECODE_UINT; - printf("STORE_FAST_N " UINT_FMT, unum); - break; - - case MP_BC_STORE_DEREF: - DECODE_UINT; - printf("STORE_DEREF " UINT_FMT, unum); - break; - - case MP_BC_STORE_NAME: - DECODE_QSTR; - printf("STORE_NAME %s", qstr_str(qstr)); - break; - - case MP_BC_STORE_GLOBAL: - DECODE_QSTR; - printf("STORE_GLOBAL %s", qstr_str(qstr)); - break; - - case MP_BC_STORE_ATTR: - DECODE_QSTR; - printf("STORE_ATTR %s", qstr_str(qstr)); - break; - - case MP_BC_STORE_SUBSCR: - printf("STORE_SUBSCR"); - break; - - case MP_BC_DELETE_FAST: - DECODE_UINT; - printf("DELETE_FAST " UINT_FMT, unum); - break; - - case MP_BC_DELETE_DEREF: - DECODE_UINT; - printf("DELETE_DEREF " UINT_FMT, unum); - break; - - case MP_BC_DELETE_NAME: - DECODE_QSTR; - printf("DELETE_NAME %s", qstr_str(qstr)); - break; - - case MP_BC_DUP_TOP: - printf("DUP_TOP"); - break; - - case MP_BC_DUP_TOP_TWO: - printf("DUP_TOP_TWO"); - break; - - case MP_BC_POP_TOP: - printf("POP_TOP"); - break; - - case MP_BC_ROT_TWO: - printf("ROT_TWO"); - break; - - case MP_BC_ROT_THREE: - printf("ROT_THREE"); - break; - - case MP_BC_JUMP: - DECODE_SLABEL; - printf("JUMP " UINT_FMT, ip + unum - ip_start); - break; - - case MP_BC_POP_JUMP_IF_TRUE: - DECODE_SLABEL; - printf("POP_JUMP_IF_TRUE " INT_FMT, ip + unum - ip_start); - break; - - case MP_BC_POP_JUMP_IF_FALSE: - DECODE_SLABEL; - printf("POP_JUMP_IF_FALSE " INT_FMT, ip + unum - ip_start); - break; - - case MP_BC_JUMP_IF_TRUE_OR_POP: - DECODE_SLABEL; - printf("JUMP_IF_TRUE_OR_POP " INT_FMT, ip + unum - ip_start); - break; - - case MP_BC_JUMP_IF_FALSE_OR_POP: - DECODE_SLABEL; - printf("JUMP_IF_FALSE_OR_POP " INT_FMT, ip + unum - ip_start); - break; - - case MP_BC_SETUP_WITH: - DECODE_ULABEL; // loop-like labels are always forward - printf("SETUP_WITH " UINT_FMT, ip + unum - ip_start); - break; - - case MP_BC_WITH_CLEANUP: - printf("WITH_CLEANUP"); - break; - - case MP_BC_UNWIND_JUMP: - DECODE_SLABEL; - printf("UNWIND_JUMP " UINT_FMT " %d", ip + unum - ip_start, *ip); - ip += 1; - break; - - case MP_BC_SETUP_EXCEPT: - DECODE_ULABEL; // except labels are always forward - printf("SETUP_EXCEPT " UINT_FMT, ip + unum - ip_start); - break; - - case MP_BC_SETUP_FINALLY: - DECODE_ULABEL; // except labels are always forward - printf("SETUP_FINALLY " UINT_FMT, ip + unum - ip_start); - break; - - case MP_BC_END_FINALLY: - // if TOS is an exception, reraises the exception (3 values on TOS) - // if TOS is an integer, does something else - // if TOS is None, just pops it and continues - // else error - printf("END_FINALLY"); - break; - - case MP_BC_GET_ITER: - printf("GET_ITER"); - break; - - case MP_BC_FOR_ITER: - DECODE_ULABEL; // the jump offset if iteration finishes; for labels are always forward - printf("FOR_ITER " UINT_FMT, ip + unum - ip_start); - break; - - case MP_BC_POP_BLOCK: - // pops block and restores the stack - printf("POP_BLOCK"); - break; - - case MP_BC_POP_EXCEPT: - // pops block, checks it's an exception block, and restores the stack, saving the 3 exception values to local threadstate - printf("POP_EXCEPT"); - break; - - case MP_BC_NOT: - printf("NOT"); - break; - - case MP_BC_BUILD_TUPLE: - DECODE_UINT; - printf("BUILD_TUPLE " UINT_FMT, unum); - break; - - case MP_BC_BUILD_LIST: - DECODE_UINT; - printf("BUILD_LIST " UINT_FMT, unum); - break; - - case MP_BC_LIST_APPEND: - DECODE_UINT; - printf("LIST_APPEND " UINT_FMT, unum); - break; - - case MP_BC_BUILD_MAP: - DECODE_UINT; - printf("BUILD_MAP " UINT_FMT, unum); - break; - - case MP_BC_STORE_MAP: - printf("STORE_MAP"); - break; - - case MP_BC_MAP_ADD: - DECODE_UINT; - printf("MAP_ADD " UINT_FMT, unum); - break; - - case MP_BC_BUILD_SET: - DECODE_UINT; - printf("BUILD_SET " UINT_FMT, unum); - break; - - case MP_BC_SET_ADD: - DECODE_UINT; - printf("SET_ADD " UINT_FMT, unum); - break; + case MP_BC_LOAD_CONST_INT: + DECODE_QSTR; + printf("LOAD_CONST_INT %s", qstr_str(qstr)); + break; + + case MP_BC_LOAD_CONST_DEC: + DECODE_QSTR; + printf("LOAD_CONST_DEC %s", qstr_str(qstr)); + break; + + case MP_BC_LOAD_CONST_BYTES: + DECODE_QSTR; + printf("LOAD_CONST_BYTES %s", qstr_str(qstr)); + break; + + case MP_BC_LOAD_CONST_STRING: + DECODE_QSTR; + printf("LOAD_CONST_STRING '%s'", qstr_str(qstr)); + break; + + case MP_BC_LOAD_NULL: + printf("LOAD_NULL"); + break; + + case MP_BC_LOAD_FAST_N: + DECODE_UINT; + printf("LOAD_FAST_N " UINT_FMT, unum); + break; + + case MP_BC_LOAD_DEREF: + DECODE_UINT; + printf("LOAD_DEREF " UINT_FMT, unum); + break; + + case MP_BC_LOAD_NAME: + DECODE_QSTR; + printf("LOAD_NAME %s", qstr_str(qstr)); + break; + + case MP_BC_LOAD_GLOBAL: + DECODE_QSTR; + printf("LOAD_GLOBAL %s", qstr_str(qstr)); + break; + + case MP_BC_LOAD_ATTR: + DECODE_QSTR; + printf("LOAD_ATTR %s", qstr_str(qstr)); + break; + + case MP_BC_LOAD_METHOD: + DECODE_QSTR; + printf("LOAD_METHOD %s", qstr_str(qstr)); + break; + + case MP_BC_LOAD_BUILD_CLASS: + printf("LOAD_BUILD_CLASS"); + break; + + case MP_BC_LOAD_SUBSCR: + printf("LOAD_SUBSCR"); + break; + + case MP_BC_STORE_FAST_N: + DECODE_UINT; + printf("STORE_FAST_N " UINT_FMT, unum); + break; + + case MP_BC_STORE_DEREF: + DECODE_UINT; + printf("STORE_DEREF " UINT_FMT, unum); + break; + + case MP_BC_STORE_NAME: + DECODE_QSTR; + printf("STORE_NAME %s", qstr_str(qstr)); + break; + + case MP_BC_STORE_GLOBAL: + DECODE_QSTR; + printf("STORE_GLOBAL %s", qstr_str(qstr)); + break; + + case MP_BC_STORE_ATTR: + DECODE_QSTR; + printf("STORE_ATTR %s", qstr_str(qstr)); + break; + + case MP_BC_STORE_SUBSCR: + printf("STORE_SUBSCR"); + break; + + case MP_BC_DELETE_FAST: + DECODE_UINT; + printf("DELETE_FAST " UINT_FMT, unum); + break; + + case MP_BC_DELETE_DEREF: + DECODE_UINT; + printf("DELETE_DEREF " UINT_FMT, unum); + break; + + case MP_BC_DELETE_NAME: + DECODE_QSTR; + printf("DELETE_NAME %s", qstr_str(qstr)); + break; + + case MP_BC_DUP_TOP: + printf("DUP_TOP"); + break; + + case MP_BC_DUP_TOP_TWO: + printf("DUP_TOP_TWO"); + break; + + case MP_BC_POP_TOP: + printf("POP_TOP"); + break; + + case MP_BC_ROT_TWO: + printf("ROT_TWO"); + break; + + case MP_BC_ROT_THREE: + printf("ROT_THREE"); + break; + + case MP_BC_JUMP: + DECODE_SLABEL; + printf("JUMP " UINT_FMT, ip + unum - ip_start); + break; + + case MP_BC_POP_JUMP_IF_TRUE: + DECODE_SLABEL; + printf("POP_JUMP_IF_TRUE " INT_FMT, ip + unum - ip_start); + break; + + case MP_BC_POP_JUMP_IF_FALSE: + DECODE_SLABEL; + printf("POP_JUMP_IF_FALSE " INT_FMT, ip + unum - ip_start); + break; + + case MP_BC_JUMP_IF_TRUE_OR_POP: + DECODE_SLABEL; + printf("JUMP_IF_TRUE_OR_POP " INT_FMT, ip + unum - ip_start); + break; + + case MP_BC_JUMP_IF_FALSE_OR_POP: + DECODE_SLABEL; + printf("JUMP_IF_FALSE_OR_POP " INT_FMT, ip + unum - ip_start); + break; + + case MP_BC_SETUP_WITH: + DECODE_ULABEL; // loop-like labels are always forward + printf("SETUP_WITH " UINT_FMT, ip + unum - ip_start); + break; + + case MP_BC_WITH_CLEANUP: + printf("WITH_CLEANUP"); + break; + + case MP_BC_UNWIND_JUMP: + DECODE_SLABEL; + printf("UNWIND_JUMP " UINT_FMT " %d", ip + unum - ip_start, *ip); + ip += 1; + break; + + case MP_BC_SETUP_EXCEPT: + DECODE_ULABEL; // except labels are always forward + printf("SETUP_EXCEPT " UINT_FMT, ip + unum - ip_start); + break; + + case MP_BC_SETUP_FINALLY: + DECODE_ULABEL; // except labels are always forward + printf("SETUP_FINALLY " UINT_FMT, ip + unum - ip_start); + break; + + case MP_BC_END_FINALLY: + // if TOS is an exception, reraises the exception (3 values on TOS) + // if TOS is an integer, does something else + // if TOS is None, just pops it and continues + // else error + printf("END_FINALLY"); + break; + + case MP_BC_GET_ITER: + printf("GET_ITER"); + break; + + case MP_BC_FOR_ITER: + DECODE_ULABEL; // the jump offset if iteration finishes; for labels are always forward + printf("FOR_ITER " UINT_FMT, ip + unum - ip_start); + break; + + case MP_BC_POP_BLOCK: + // pops block and restores the stack + printf("POP_BLOCK"); + break; + + case MP_BC_POP_EXCEPT: + // pops block, checks it's an exception block, and restores the stack, saving the 3 exception values to local threadstate + printf("POP_EXCEPT"); + break; + + case MP_BC_NOT: + printf("NOT"); + break; + + case MP_BC_BUILD_TUPLE: + DECODE_UINT; + printf("BUILD_TUPLE " UINT_FMT, unum); + break; + + case MP_BC_BUILD_LIST: + DECODE_UINT; + printf("BUILD_LIST " UINT_FMT, unum); + break; + + case MP_BC_LIST_APPEND: + DECODE_UINT; + printf("LIST_APPEND " UINT_FMT, unum); + break; + + case MP_BC_BUILD_MAP: + DECODE_UINT; + printf("BUILD_MAP " UINT_FMT, unum); + break; + + case MP_BC_STORE_MAP: + printf("STORE_MAP"); + break; + + case MP_BC_MAP_ADD: + DECODE_UINT; + printf("MAP_ADD " UINT_FMT, unum); + break; + + case MP_BC_BUILD_SET: + DECODE_UINT; + printf("BUILD_SET " UINT_FMT, unum); + break; + + case MP_BC_SET_ADD: + DECODE_UINT; + printf("SET_ADD " UINT_FMT, unum); + break; #if MICROPY_PY_BUILTINS_SLICE - case MP_BC_BUILD_SLICE: - DECODE_UINT; - printf("BUILD_SLICE " UINT_FMT, unum); - break; + case MP_BC_BUILD_SLICE: + DECODE_UINT; + printf("BUILD_SLICE " UINT_FMT, unum); + break; #endif - case MP_BC_UNPACK_SEQUENCE: - DECODE_UINT; - printf("UNPACK_SEQUENCE " UINT_FMT, unum); - break; - - case MP_BC_MAKE_FUNCTION: - DECODE_PTR; - printf("MAKE_FUNCTION %p", (void*)unum); - break; - - case MP_BC_MAKE_FUNCTION_DEFARGS: - DECODE_PTR; - printf("MAKE_FUNCTION_DEFARGS %p", (void*)unum); - break; - - case MP_BC_MAKE_CLOSURE: { - DECODE_PTR; - mp_uint_t n_closed_over = *ip++; - printf("MAKE_CLOSURE %p " UINT_FMT, (void*)unum, n_closed_over); - break; - } + case MP_BC_UNPACK_SEQUENCE: + DECODE_UINT; + printf("UNPACK_SEQUENCE " UINT_FMT, unum); + break; + + case MP_BC_MAKE_FUNCTION: + DECODE_PTR; + printf("MAKE_FUNCTION %p", (void*)unum); + break; + + case MP_BC_MAKE_FUNCTION_DEFARGS: + DECODE_PTR; + printf("MAKE_FUNCTION_DEFARGS %p", (void*)unum); + break; + + case MP_BC_MAKE_CLOSURE: { + DECODE_PTR; + mp_uint_t n_closed_over = *ip++; + printf("MAKE_CLOSURE %p " UINT_FMT, (void*)unum, n_closed_over); + break; + } + + case MP_BC_MAKE_CLOSURE_DEFARGS: { + DECODE_PTR; + mp_uint_t n_closed_over = *ip++; + printf("MAKE_CLOSURE_DEFARGS %p " UINT_FMT, (void*)unum, n_closed_over); + break; + } - case MP_BC_MAKE_CLOSURE_DEFARGS: { - DECODE_PTR; - mp_uint_t n_closed_over = *ip++; - printf("MAKE_CLOSURE_DEFARGS %p " UINT_FMT, (void*)unum, n_closed_over); - break; + case MP_BC_CALL_FUNCTION: + DECODE_UINT; + printf("CALL_FUNCTION n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff); + break; + + case MP_BC_CALL_FUNCTION_VAR_KW: + DECODE_UINT; + printf("CALL_FUNCTION_VAR_KW n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff); + break; + + case MP_BC_CALL_METHOD: + DECODE_UINT; + printf("CALL_METHOD n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff); + break; + + case MP_BC_CALL_METHOD_VAR_KW: + DECODE_UINT; + printf("CALL_METHOD_VAR_KW n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff); + break; + + case MP_BC_RETURN_VALUE: + printf("RETURN_VALUE"); + break; + + case MP_BC_RAISE_VARARGS: + unum = *ip++; + printf("RAISE_VARARGS " UINT_FMT, unum); + break; + + case MP_BC_YIELD_VALUE: + printf("YIELD_VALUE"); + break; + + case MP_BC_YIELD_FROM: + printf("YIELD_FROM"); + break; + + case MP_BC_IMPORT_NAME: + DECODE_QSTR; + printf("IMPORT_NAME '%s'", qstr_str(qstr)); + break; + + case MP_BC_IMPORT_FROM: + DECODE_QSTR; + printf("IMPORT_FROM '%s'", qstr_str(qstr)); + break; + + case MP_BC_IMPORT_STAR: + printf("IMPORT_STAR"); + break; + + default: + if (ip[-1] < MP_BC_LOAD_CONST_SMALL_INT_MULTI + 64) { + printf("LOAD_CONST_SMALL_INT " INT_FMT, (mp_int_t)ip[-1] - MP_BC_LOAD_CONST_SMALL_INT_MULTI - 16); + } else if (ip[-1] < MP_BC_LOAD_FAST_MULTI + 16) { + printf("LOAD_FAST " UINT_FMT, (mp_uint_t)ip[-1] - MP_BC_LOAD_FAST_MULTI); + } else if (ip[-1] < MP_BC_STORE_FAST_MULTI + 16) { + printf("STORE_FAST " UINT_FMT, (mp_uint_t)ip[-1] - MP_BC_STORE_FAST_MULTI); + } else if (ip[-1] < MP_BC_UNARY_OP_MULTI + 5) { + printf("UNARY_OP " UINT_FMT, (mp_uint_t)ip[-1] - MP_BC_UNARY_OP_MULTI); + } else if (ip[-1] < MP_BC_BINARY_OP_MULTI + 35) { + printf("BINARY_OP " UINT_FMT, (mp_uint_t)ip[-1] - MP_BC_BINARY_OP_MULTI); + } else { + printf("code %p, byte code 0x%02x not implemented\n", ip, ip[-1]); + assert(0); + return ip; } + break; + } - case MP_BC_CALL_FUNCTION: - DECODE_UINT; - printf("CALL_FUNCTION n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff); - break; - - case MP_BC_CALL_FUNCTION_VAR_KW: - DECODE_UINT; - printf("CALL_FUNCTION_VAR_KW n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff); - break; - - case MP_BC_CALL_METHOD: - DECODE_UINT; - printf("CALL_METHOD n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff); - break; - - case MP_BC_CALL_METHOD_VAR_KW: - DECODE_UINT; - printf("CALL_METHOD_VAR_KW n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff); - break; - - case MP_BC_RETURN_VALUE: - printf("RETURN_VALUE"); - break; - - case MP_BC_RAISE_VARARGS: - unum = *ip++; - printf("RAISE_VARARGS " UINT_FMT, unum); - break; - - case MP_BC_YIELD_VALUE: - printf("YIELD_VALUE"); - break; - - case MP_BC_YIELD_FROM: - printf("YIELD_FROM"); - break; - - case MP_BC_IMPORT_NAME: - DECODE_QSTR; - printf("IMPORT_NAME '%s'", qstr_str(qstr)); - break; - - case MP_BC_IMPORT_FROM: - DECODE_QSTR; - printf("IMPORT_FROM '%s'", qstr_str(qstr)); - break; - - case MP_BC_IMPORT_STAR: - printf("IMPORT_STAR"); - break; - - default: - if (ip[-1] < MP_BC_LOAD_CONST_SMALL_INT_MULTI + 64) { - printf("LOAD_CONST_SMALL_INT " INT_FMT, (mp_int_t)ip[-1] - MP_BC_LOAD_CONST_SMALL_INT_MULTI - 16); - } else if (ip[-1] < MP_BC_LOAD_FAST_MULTI + 16) { - printf("LOAD_FAST " UINT_FMT, (mp_uint_t)ip[-1] - MP_BC_LOAD_FAST_MULTI); - } else if (ip[-1] < MP_BC_STORE_FAST_MULTI + 16) { - printf("STORE_FAST " UINT_FMT, (mp_uint_t)ip[-1] - MP_BC_STORE_FAST_MULTI); - } else if (ip[-1] < MP_BC_UNARY_OP_MULTI + 5) { - printf("UNARY_OP " UINT_FMT, (mp_uint_t)ip[-1] - MP_BC_UNARY_OP_MULTI); - } else if (ip[-1] < MP_BC_BINARY_OP_MULTI + 35) { - printf("BINARY_OP " UINT_FMT, (mp_uint_t)ip[-1] - MP_BC_BINARY_OP_MULTI); - } else { - printf("code %p, byte code 0x%02x not implemented\n", ip, ip[-1]); - assert(0); - return; - } - break; - } + return ip; +} + +void mp_bytecode_print2(const byte *ip, mp_uint_t len) { + ip_start = ip; + while (ip - ip_start < len) { + printf("%02u ", (uint)(ip - ip_start)); + ip = mp_bytecode_print_str(ip); printf("\n"); } }