blob: f34449ed10da6b29e6b4e6aeee9380dc070dea6f [file] [log] [blame]
Damienf03001f2013-11-17 13:19:33 +00001#include <stdint.h>
2#include <stdlib.h>
3#include <stdio.h>
4#include <string.h>
5#include <assert.h>
6
7#include "misc.h"
Damiend99b0522013-12-21 18:17:45 +00008#include "mpconfig.h"
9#include "bc0.h"
Damienf03001f2013-11-17 13:19:33 +000010
Damien Georgecbd2f742014-01-19 11:48:48 +000011#if MICROPY_DEBUG_PRINTERS
Damien Georged3ebe482014-01-07 15:20:33 +000012
Damienf03001f2013-11-17 13:19:33 +000013#define DECODE_UINT do { unum = *ip++; if (unum > 127) { unum = ((unum & 0x3f) << 8) | (*ip++); } } while (0)
14#define DECODE_ULABEL do { unum = (ip[0] | (ip[1] << 8)); ip += 2; } while (0)
15#define DECODE_SLABEL do { unum = (ip[0] | (ip[1] << 8)) - 0x8000; ip += 2; } while (0)
16#define DECODE_QSTR do { qstr = *ip++; if (qstr > 127) { qstr = ((qstr & 0x3f) << 8) | (*ip++); } } while (0)
17
Damien Georgecbd2f742014-01-19 11:48:48 +000018void mp_byte_code_print(const byte *ip, int len) {
Damienf03001f2013-11-17 13:19:33 +000019 const byte *ip_start = ip;
Damien George6baf76e2013-12-30 22:32:17 +000020
Damien George08335002014-01-18 23:24:36 +000021 // get code info size
22 machine_uint_t code_info_size = ip[0] | (ip[1] << 8) | (ip[2] << 16) | (ip[3] << 24);
23 ip += code_info_size;
24
Damien George6baf76e2013-12-30 22:32:17 +000025 // decode prelude
26 {
27 uint n_local = *ip++;
28 printf("(NUM_LOCAL %u)\n", n_local);
29 for (; n_local > 0; n_local--) {
30 uint local_num = *ip++;
31 printf("(INIT_CELL %u)\n", local_num);
32 }
33 len -= ip - ip_start;
34 ip_start = ip;
35 }
36
Damienf03001f2013-11-17 13:19:33 +000037 machine_uint_t unum;
38 qstr qstr;
39 while (ip - ip_start < len) {
40 printf("%02u ", (uint)(ip - ip_start));
41 int op = *ip++;
42 switch (op) {
Damiend99b0522013-12-21 18:17:45 +000043 case MP_BC_LOAD_CONST_FALSE:
Damienf03001f2013-11-17 13:19:33 +000044 printf("LOAD_CONST_FALSE");
45 break;
46
Damiend99b0522013-12-21 18:17:45 +000047 case MP_BC_LOAD_CONST_NONE:
Damienf03001f2013-11-17 13:19:33 +000048 printf("LOAD_CONST_NONE");
49 break;
50
Damiend99b0522013-12-21 18:17:45 +000051 case MP_BC_LOAD_CONST_TRUE:
Damienf03001f2013-11-17 13:19:33 +000052 printf("LOAD_CONST_TRUE");
53 break;
54
Damien Georgee9906ac2014-01-04 18:44:46 +000055 case MP_BC_LOAD_CONST_ELLIPSIS:
56 printf("LOAD_CONST_ELLIPSIS");
57 break;
58
Damiend99b0522013-12-21 18:17:45 +000059 case MP_BC_LOAD_CONST_SMALL_INT:
Damienf03001f2013-11-17 13:19:33 +000060 unum = (ip[0] | (ip[1] << 8) | (ip[2] << 16)) - 0x800000;
61 ip += 3;
62 printf("LOAD_CONST_SMALL_INT %d", (int)unum);
63 break;
64
Paul Sokolovsky4b919d02014-01-10 04:16:50 +020065 case MP_BC_LOAD_CONST_INT:
66 DECODE_QSTR;
67 printf("LOAD_CONST_INT %s", qstr_str(qstr));
68 break;
69
Damienf03001f2013-11-17 13:19:33 +000070 /*
Damiend99b0522013-12-21 18:17:45 +000071 case MP_BC_LOAD_CONST_DEC:
Damienf03001f2013-11-17 13:19:33 +000072 DECODE_QSTR;
73 PUSH(rt_load_const_dec(qstr));
74 break;
Damienc1075dd2013-11-25 23:39:36 +000075 */
Damienf03001f2013-11-17 13:19:33 +000076
Damiend99b0522013-12-21 18:17:45 +000077 case MP_BC_LOAD_CONST_ID:
Damienf03001f2013-11-17 13:19:33 +000078 DECODE_QSTR;
Damienc1075dd2013-11-25 23:39:36 +000079 printf("LOAD_CONST_ID %s", qstr_str(qstr));
Damienf03001f2013-11-17 13:19:33 +000080 break;
81
Damiend99b0522013-12-21 18:17:45 +000082 case MP_BC_LOAD_CONST_STRING:
Damienf03001f2013-11-17 13:19:33 +000083 DECODE_QSTR;
Damienff099f32013-11-26 15:14:50 +000084 printf("LOAD_CONST_STRING %s", qstr_str(qstr));
Damienf03001f2013-11-17 13:19:33 +000085 break;
Damienf03001f2013-11-17 13:19:33 +000086
Damiend99b0522013-12-21 18:17:45 +000087 case MP_BC_LOAD_FAST_0:
Damienf03001f2013-11-17 13:19:33 +000088 printf("LOAD_FAST_0");
89 break;
90
Damiend99b0522013-12-21 18:17:45 +000091 case MP_BC_LOAD_FAST_1:
Damienf03001f2013-11-17 13:19:33 +000092 printf("LOAD_FAST_1");
93 break;
94
Damiend99b0522013-12-21 18:17:45 +000095 case MP_BC_LOAD_FAST_2:
Damienf03001f2013-11-17 13:19:33 +000096 printf("LOAD_FAST_2");
97 break;
98
Damiend99b0522013-12-21 18:17:45 +000099 case MP_BC_LOAD_FAST_N:
Damienf03001f2013-11-17 13:19:33 +0000100 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200101 printf("LOAD_FAST_N " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000102 break;
Damienf03001f2013-11-17 13:19:33 +0000103
Damien George6baf76e2013-12-30 22:32:17 +0000104 case MP_BC_LOAD_DEREF:
105 DECODE_UINT;
106 printf("LOAD_DEREF " UINT_FMT, unum);
107 break;
108
Damiend99b0522013-12-21 18:17:45 +0000109 case MP_BC_LOAD_NAME:
Damienf03001f2013-11-17 13:19:33 +0000110 DECODE_QSTR;
111 printf("LOAD_NAME %s", qstr_str(qstr));
112 break;
113
Damiend99b0522013-12-21 18:17:45 +0000114 case MP_BC_LOAD_GLOBAL:
Damienf03001f2013-11-17 13:19:33 +0000115 DECODE_QSTR;
116 printf("LOAD_GLOBAL %s", qstr_str(qstr));
117 break;
118
Damiend99b0522013-12-21 18:17:45 +0000119 case MP_BC_LOAD_ATTR:
Damienf03001f2013-11-17 13:19:33 +0000120 DECODE_QSTR;
Damienc1075dd2013-11-25 23:39:36 +0000121 printf("LOAD_ATTR %s", qstr_str(qstr));
Damienf03001f2013-11-17 13:19:33 +0000122 break;
Damienf03001f2013-11-17 13:19:33 +0000123
Damiend99b0522013-12-21 18:17:45 +0000124 case MP_BC_LOAD_METHOD:
Damienf03001f2013-11-17 13:19:33 +0000125 DECODE_QSTR;
126 printf("LOAD_METHOD %s", qstr_str(qstr));
127 break;
128
Damiend99b0522013-12-21 18:17:45 +0000129 case MP_BC_LOAD_BUILD_CLASS:
Damienc1075dd2013-11-25 23:39:36 +0000130 printf("LOAD_BUILD_CLASS");
Damienf03001f2013-11-17 13:19:33 +0000131 break;
Damienf03001f2013-11-17 13:19:33 +0000132
Damiend99b0522013-12-21 18:17:45 +0000133 case MP_BC_STORE_FAST_0:
Damienf03001f2013-11-17 13:19:33 +0000134 printf("STORE_FAST_0");
135 break;
136
Damiend99b0522013-12-21 18:17:45 +0000137 case MP_BC_STORE_FAST_1:
Damienf03001f2013-11-17 13:19:33 +0000138 printf("STORE_FAST_1");
139 break;
140
Damiend99b0522013-12-21 18:17:45 +0000141 case MP_BC_STORE_FAST_2:
Damienf03001f2013-11-17 13:19:33 +0000142 printf("STORE_FAST_2");
143 break;
144
Damiend99b0522013-12-21 18:17:45 +0000145 case MP_BC_STORE_FAST_N:
Damienf03001f2013-11-17 13:19:33 +0000146 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200147 printf("STORE_FAST_N " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000148 break;
Damienf03001f2013-11-17 13:19:33 +0000149
Damien George6baf76e2013-12-30 22:32:17 +0000150 case MP_BC_STORE_DEREF:
151 DECODE_UINT;
152 printf("STORE_DEREF " UINT_FMT, unum);
153 break;
154
Damiend99b0522013-12-21 18:17:45 +0000155 case MP_BC_STORE_NAME:
Damienf03001f2013-11-17 13:19:33 +0000156 DECODE_QSTR;
157 printf("STORE_NAME %s", qstr_str(qstr));
158 break;
159
Damiend99b0522013-12-21 18:17:45 +0000160 case MP_BC_STORE_GLOBAL:
Damienf03001f2013-11-17 13:19:33 +0000161 DECODE_QSTR;
Damien George66028ab2014-01-03 14:03:48 +0000162 printf("STORE_GLOBAL %s", qstr_str(qstr));
Damienf03001f2013-11-17 13:19:33 +0000163 break;
164
Damiend99b0522013-12-21 18:17:45 +0000165 case MP_BC_STORE_ATTR:
Damienf03001f2013-11-17 13:19:33 +0000166 DECODE_QSTR;
Damienc1075dd2013-11-25 23:39:36 +0000167 printf("STORE_ATTR %s", qstr_str(qstr));
Damienf03001f2013-11-17 13:19:33 +0000168 break;
169
Damiend99b0522013-12-21 18:17:45 +0000170 case MP_BC_STORE_SUBSCR:
Damienff099f32013-11-26 15:14:50 +0000171 printf("STORE_SUBSCR");
Damienf03001f2013-11-17 13:19:33 +0000172 break;
173
Damiend99b0522013-12-21 18:17:45 +0000174 case MP_BC_DUP_TOP:
Damien8f9e2ee2013-12-29 16:54:59 +0000175 printf("DUP_TOP");
Damienf03001f2013-11-17 13:19:33 +0000176 break;
177
Damiend99b0522013-12-21 18:17:45 +0000178 case MP_BC_DUP_TOP_TWO:
Damienff099f32013-11-26 15:14:50 +0000179 printf("DUP_TOP_TWO");
Damienf03001f2013-11-17 13:19:33 +0000180 break;
Damienf03001f2013-11-17 13:19:33 +0000181
Damiend99b0522013-12-21 18:17:45 +0000182 case MP_BC_POP_TOP:
Damienf03001f2013-11-17 13:19:33 +0000183 printf("POP_TOP");
184 break;
185
Damiend99b0522013-12-21 18:17:45 +0000186 case MP_BC_ROT_TWO:
Paul Sokolovsky4b919d02014-01-10 04:16:50 +0200187 printf("ROT_TWO");
Damienf03001f2013-11-17 13:19:33 +0000188 break;
189
Damiend99b0522013-12-21 18:17:45 +0000190 case MP_BC_ROT_THREE:
Damienff099f32013-11-26 15:14:50 +0000191 printf("ROT_THREE");
Damienf03001f2013-11-17 13:19:33 +0000192 break;
Damienf03001f2013-11-17 13:19:33 +0000193
Damiend99b0522013-12-21 18:17:45 +0000194 case MP_BC_JUMP:
Damienf03001f2013-11-17 13:19:33 +0000195 DECODE_SLABEL;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200196 printf("JUMP " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000197 break;
198
Damiend99b0522013-12-21 18:17:45 +0000199 case MP_BC_POP_JUMP_IF_TRUE:
Damienf03001f2013-11-17 13:19:33 +0000200 DECODE_SLABEL;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200201 printf("POP_JUMP_IF_TRUE " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000202 break;
203
Damiend99b0522013-12-21 18:17:45 +0000204 case MP_BC_POP_JUMP_IF_FALSE:
Damienf03001f2013-11-17 13:19:33 +0000205 DECODE_SLABEL;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200206 printf("POP_JUMP_IF_FALSE " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000207 break;
208
Damiend99b0522013-12-21 18:17:45 +0000209 case MP_BC_JUMP_IF_TRUE_OR_POP:
Damienf03001f2013-11-17 13:19:33 +0000210 DECODE_SLABEL;
Damien Georgee02b2d42014-01-19 01:14:37 +0000211 printf("JUMP_IF_TRUE_OR_POP " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000212 break;
213
Damiend99b0522013-12-21 18:17:45 +0000214 case MP_BC_JUMP_IF_FALSE_OR_POP:
Damienf03001f2013-11-17 13:19:33 +0000215 DECODE_SLABEL;
Damien Georgee02b2d42014-01-19 01:14:37 +0000216 printf("JUMP_IF_FALSE_OR_POP " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000217 break;
218
Damiend99b0522013-12-21 18:17:45 +0000219 case MP_BC_SETUP_EXCEPT:
Damienf03001f2013-11-17 13:19:33 +0000220 DECODE_ULABEL; // except labels are always forward
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200221 printf("SETUP_EXCEPT " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000222 break;
223
Damiend99b0522013-12-21 18:17:45 +0000224 case MP_BC_END_FINALLY:
Damienf03001f2013-11-17 13:19:33 +0000225 // if TOS is an exception, reraises the exception (3 values on TOS)
226 // if TOS is an integer, does something else
227 // if TOS is None, just pops it and continues
228 // else error
Damien8f9e2ee2013-12-29 16:54:59 +0000229 printf("END_FINALLY");
Damienf03001f2013-11-17 13:19:33 +0000230 break;
231
Damiend99b0522013-12-21 18:17:45 +0000232 case MP_BC_GET_ITER:
Damienff099f32013-11-26 15:14:50 +0000233 printf("GET_ITER");
Damienf03001f2013-11-17 13:19:33 +0000234 break;
235
Damiend99b0522013-12-21 18:17:45 +0000236 case MP_BC_FOR_ITER:
Damienf03001f2013-11-17 13:19:33 +0000237 DECODE_ULABEL; // the jump offset if iteration finishes; for labels are always forward
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200238 printf("FOR_ITER " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000239 break;
240
Damiend99b0522013-12-21 18:17:45 +0000241 case MP_BC_POP_BLOCK:
Damienf03001f2013-11-17 13:19:33 +0000242 // pops block and restores the stack
Damien8f9e2ee2013-12-29 16:54:59 +0000243 printf("POP_BLOCK");
Damienf03001f2013-11-17 13:19:33 +0000244 break;
245
Damiend99b0522013-12-21 18:17:45 +0000246 case MP_BC_POP_EXCEPT:
Damienf03001f2013-11-17 13:19:33 +0000247 // pops block, checks it's an exception block, and restores the stack, saving the 3 exception values to local threadstate
Damien8f9e2ee2013-12-29 16:54:59 +0000248 printf("POP_EXCEPT");
Damienf03001f2013-11-17 13:19:33 +0000249 break;
250
Damien8f9e2ee2013-12-29 16:54:59 +0000251 /*
Damiend99b0522013-12-21 18:17:45 +0000252 case MP_BC_UNARY_OP:
Damienf03001f2013-11-17 13:19:33 +0000253 unum = *ip++;
254 *sp = rt_unary_op(unum, *sp);
255 break;
256 */
257
Damiend99b0522013-12-21 18:17:45 +0000258 case MP_BC_BINARY_OP:
Damienf03001f2013-11-17 13:19:33 +0000259 unum = *ip++;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200260 printf("BINARY_OP " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000261 break;
262
Damiend99b0522013-12-21 18:17:45 +0000263 case MP_BC_BUILD_TUPLE:
Damienf03001f2013-11-17 13:19:33 +0000264 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200265 printf("BUILD_TUPLE " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000266 break;
267
Damiend99b0522013-12-21 18:17:45 +0000268 case MP_BC_BUILD_LIST:
Damienf03001f2013-11-17 13:19:33 +0000269 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200270 printf("BUILD_LIST " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000271 break;
272
Damiend99b0522013-12-21 18:17:45 +0000273 case MP_BC_LIST_APPEND:
Damienf03001f2013-11-17 13:19:33 +0000274 DECODE_UINT;
Damien George27bf5b82014-01-02 18:15:33 +0000275 printf("LIST_APPEND " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000276 break;
277
Damiend99b0522013-12-21 18:17:45 +0000278 case MP_BC_BUILD_MAP:
Damienf03001f2013-11-17 13:19:33 +0000279 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200280 printf("BUILD_MAP " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000281 break;
282
Damiend99b0522013-12-21 18:17:45 +0000283 case MP_BC_STORE_MAP:
Damien George20006db2014-01-18 14:10:48 +0000284 printf("STORE_MAP");
Damienf03001f2013-11-17 13:19:33 +0000285 break;
286
Damien George20006db2014-01-18 14:10:48 +0000287 /*
Damiend99b0522013-12-21 18:17:45 +0000288 case MP_BC_MAP_ADD:
Damienf03001f2013-11-17 13:19:33 +0000289 DECODE_UINT;
290 // I think it's guaranteed by the compiler that sp[unum + 1] is a map
291 rt_store_map(sp[unum + 1], sp[0], sp[1]);
292 sp += 2;
293 break;
Damiendae7eb72013-12-29 22:32:51 +0000294 */
Damienf03001f2013-11-17 13:19:33 +0000295
Damiend99b0522013-12-21 18:17:45 +0000296 case MP_BC_BUILD_SET:
Damienf03001f2013-11-17 13:19:33 +0000297 DECODE_UINT;
Damien George212c2962013-12-30 12:52:32 +0000298 printf("BUILD_SET " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000299 break;
300
Damiend99b0522013-12-21 18:17:45 +0000301 case MP_BC_SET_ADD:
Damienf03001f2013-11-17 13:19:33 +0000302 DECODE_UINT;
Damien George212c2962013-12-30 12:52:32 +0000303 printf("SET_ADD " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000304 break;
Damienf03001f2013-11-17 13:19:33 +0000305
Damien George20006db2014-01-18 14:10:48 +0000306#if MICROPY_ENABLE_SLICE
307 case MP_BC_BUILD_SLICE:
308 DECODE_UINT;
309 printf("BUILD_SLICE " UINT_FMT, unum);
310 break;
311#endif
312
Damiend99b0522013-12-21 18:17:45 +0000313 case MP_BC_UNPACK_SEQUENCE:
Damienff099f32013-11-26 15:14:50 +0000314 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200315 printf("UNPACK_SEQUENCE " UINT_FMT, unum);
Damienff099f32013-11-26 15:14:50 +0000316 break;
317
Damiend99b0522013-12-21 18:17:45 +0000318 case MP_BC_MAKE_FUNCTION:
Damienf03001f2013-11-17 13:19:33 +0000319 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200320 printf("MAKE_FUNCTION " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000321 break;
322
Damien George6baf76e2013-12-30 22:32:17 +0000323 case MP_BC_MAKE_CLOSURE:
324 DECODE_UINT;
325 printf("MAKE_CLOSURE " UINT_FMT, unum);
326 break;
327
Damiend99b0522013-12-21 18:17:45 +0000328 case MP_BC_CALL_FUNCTION:
Damienf03001f2013-11-17 13:19:33 +0000329 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200330 printf("CALL_FUNCTION n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff);
Damienf03001f2013-11-17 13:19:33 +0000331 break;
332
Damiend99b0522013-12-21 18:17:45 +0000333 case MP_BC_CALL_METHOD:
Damienf03001f2013-11-17 13:19:33 +0000334 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200335 printf("CALL_METHOD n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff);
Damienf03001f2013-11-17 13:19:33 +0000336 break;
337
Damiend99b0522013-12-21 18:17:45 +0000338 case MP_BC_RETURN_VALUE:
Damienf03001f2013-11-17 13:19:33 +0000339 printf("RETURN_VALUE");
340 break;
341
Paul Sokolovsky4b919d02014-01-10 04:16:50 +0200342 case MP_BC_RAISE_VARARGS:
343 unum = *ip++;
344 printf("RAISE_VARARGS " UINT_FMT, unum);
345 break;
346
Damiend99b0522013-12-21 18:17:45 +0000347 case MP_BC_YIELD_VALUE:
Damien George27bf5b82014-01-02 18:15:33 +0000348 printf("YIELD_VALUE");
349 break;
Damienf03001f2013-11-17 13:19:33 +0000350
Damien George66028ab2014-01-03 14:03:48 +0000351 case MP_BC_IMPORT_NAME:
352 DECODE_QSTR;
353 printf("IMPORT NAME %s", qstr_str(qstr));
354 break;
355
356 case MP_BC_IMPORT_FROM:
357 DECODE_QSTR;
358 printf("IMPORT NAME %s", qstr_str(qstr));
359 break;
360
Damienf03001f2013-11-17 13:19:33 +0000361 default:
362 printf("code %p, byte code 0x%02x not implemented\n", ip, op);
363 assert(0);
364 return;
365 }
366 printf("\n");
367 }
368}
Damien Georged3ebe482014-01-07 15:20:33 +0000369
Damien Georgecbd2f742014-01-19 11:48:48 +0000370#endif // MICROPY_DEBUG_PRINTERS