aboutsummaryrefslogtreecommitdiff
path: root/py/showbc.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-12-27 05:00:08 +0200
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-12-27 05:01:21 +0200
commit343266ea519927a7f1bc0a27f9c8af768d1125f7 (patch)
tree8c57cf11e0e285de00c427478878ae8ab623dd87 /py/showbc.c
parentc55a4d82cf03d22933028bd9db4031ef349fdc1f (diff)
showbc: Refactor to allow inline instruction printing.
Diffstat (limited to 'py/showbc.c')
-rw-r--r--py/showbc.c763
1 files changed, 386 insertions, 377 deletions
diff --git a/py/showbc.c b/py/showbc.c
index 5ae05432a..b99ba822c 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");
}
}