blob: ba7c309b31b6f163ed5cc390ae42b2a2c2c6c8de [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 Georged3ebe482014-01-07 15:20:33 +000011#if MICROPY_SHOW_BC
12
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
Damiend99b0522013-12-21 18:17:45 +000018void mp_show_byte_code(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
Damienff099f32013-11-26 15:14:50 +0000209 /*
Damiend99b0522013-12-21 18:17:45 +0000210 case MP_BC_JUMP_IF_TRUE_OR_POP:
Damienf03001f2013-11-17 13:19:33 +0000211 DECODE_SLABEL;
212 if (rt_is_true(*sp)) {
213 ip += unum;
214 } else {
215 sp++;
216 }
217 break;
218
Damiend99b0522013-12-21 18:17:45 +0000219 case MP_BC_JUMP_IF_FALSE_OR_POP:
Damienf03001f2013-11-17 13:19:33 +0000220 DECODE_SLABEL;
221 if (rt_is_true(*sp)) {
222 sp++;
223 } else {
224 ip += unum;
225 }
226 break;
Damien8f9e2ee2013-12-29 16:54:59 +0000227 */
Damienf03001f2013-11-17 13:19:33 +0000228
Damiend99b0522013-12-21 18:17:45 +0000229 case MP_BC_SETUP_EXCEPT:
Damienf03001f2013-11-17 13:19:33 +0000230 DECODE_ULABEL; // except labels are always forward
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200231 printf("SETUP_EXCEPT " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000232 break;
233
Damiend99b0522013-12-21 18:17:45 +0000234 case MP_BC_END_FINALLY:
Damienf03001f2013-11-17 13:19:33 +0000235 // if TOS is an exception, reraises the exception (3 values on TOS)
236 // if TOS is an integer, does something else
237 // if TOS is None, just pops it and continues
238 // else error
Damien8f9e2ee2013-12-29 16:54:59 +0000239 printf("END_FINALLY");
Damienf03001f2013-11-17 13:19:33 +0000240 break;
241
Damiend99b0522013-12-21 18:17:45 +0000242 case MP_BC_GET_ITER:
Damienff099f32013-11-26 15:14:50 +0000243 printf("GET_ITER");
Damienf03001f2013-11-17 13:19:33 +0000244 break;
245
Damiend99b0522013-12-21 18:17:45 +0000246 case MP_BC_FOR_ITER:
Damienf03001f2013-11-17 13:19:33 +0000247 DECODE_ULABEL; // the jump offset if iteration finishes; for labels are always forward
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200248 printf("FOR_ITER " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000249 break;
250
Damiend99b0522013-12-21 18:17:45 +0000251 case MP_BC_POP_BLOCK:
Damienf03001f2013-11-17 13:19:33 +0000252 // pops block and restores the stack
Damien8f9e2ee2013-12-29 16:54:59 +0000253 printf("POP_BLOCK");
Damienf03001f2013-11-17 13:19:33 +0000254 break;
255
Damiend99b0522013-12-21 18:17:45 +0000256 case MP_BC_POP_EXCEPT:
Damienf03001f2013-11-17 13:19:33 +0000257 // 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 +0000258 printf("POP_EXCEPT");
Damienf03001f2013-11-17 13:19:33 +0000259 break;
260
Damien8f9e2ee2013-12-29 16:54:59 +0000261 /*
Damiend99b0522013-12-21 18:17:45 +0000262 case MP_BC_UNARY_OP:
Damienf03001f2013-11-17 13:19:33 +0000263 unum = *ip++;
264 *sp = rt_unary_op(unum, *sp);
265 break;
266 */
267
Damiend99b0522013-12-21 18:17:45 +0000268 case MP_BC_BINARY_OP:
Damienf03001f2013-11-17 13:19:33 +0000269 unum = *ip++;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200270 printf("BINARY_OP " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000271 break;
272
Damiend99b0522013-12-21 18:17:45 +0000273 case MP_BC_BUILD_TUPLE:
Damienf03001f2013-11-17 13:19:33 +0000274 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200275 printf("BUILD_TUPLE " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000276 break;
277
Damiend99b0522013-12-21 18:17:45 +0000278 case MP_BC_BUILD_LIST:
Damienf03001f2013-11-17 13:19:33 +0000279 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200280 printf("BUILD_LIST " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000281 break;
282
Damiend99b0522013-12-21 18:17:45 +0000283 case MP_BC_LIST_APPEND:
Damienf03001f2013-11-17 13:19:33 +0000284 DECODE_UINT;
Damien George27bf5b82014-01-02 18:15:33 +0000285 printf("LIST_APPEND " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000286 break;
287
Damiend99b0522013-12-21 18:17:45 +0000288 case MP_BC_BUILD_MAP:
Damienf03001f2013-11-17 13:19:33 +0000289 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200290 printf("BUILD_MAP " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000291 break;
292
Damiend99b0522013-12-21 18:17:45 +0000293 case MP_BC_STORE_MAP:
Damien George20006db2014-01-18 14:10:48 +0000294 printf("STORE_MAP");
Damienf03001f2013-11-17 13:19:33 +0000295 break;
296
Damien George20006db2014-01-18 14:10:48 +0000297 /*
Damiend99b0522013-12-21 18:17:45 +0000298 case MP_BC_MAP_ADD:
Damienf03001f2013-11-17 13:19:33 +0000299 DECODE_UINT;
300 // I think it's guaranteed by the compiler that sp[unum + 1] is a map
301 rt_store_map(sp[unum + 1], sp[0], sp[1]);
302 sp += 2;
303 break;
Damiendae7eb72013-12-29 22:32:51 +0000304 */
Damienf03001f2013-11-17 13:19:33 +0000305
Damiend99b0522013-12-21 18:17:45 +0000306 case MP_BC_BUILD_SET:
Damienf03001f2013-11-17 13:19:33 +0000307 DECODE_UINT;
Damien George212c2962013-12-30 12:52:32 +0000308 printf("BUILD_SET " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000309 break;
310
Damiend99b0522013-12-21 18:17:45 +0000311 case MP_BC_SET_ADD:
Damienf03001f2013-11-17 13:19:33 +0000312 DECODE_UINT;
Damien George212c2962013-12-30 12:52:32 +0000313 printf("SET_ADD " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000314 break;
Damienf03001f2013-11-17 13:19:33 +0000315
Damien George20006db2014-01-18 14:10:48 +0000316#if MICROPY_ENABLE_SLICE
317 case MP_BC_BUILD_SLICE:
318 DECODE_UINT;
319 printf("BUILD_SLICE " UINT_FMT, unum);
320 break;
321#endif
322
Damiend99b0522013-12-21 18:17:45 +0000323 case MP_BC_UNPACK_SEQUENCE:
Damienff099f32013-11-26 15:14:50 +0000324 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200325 printf("UNPACK_SEQUENCE " UINT_FMT, unum);
Damienff099f32013-11-26 15:14:50 +0000326 break;
327
Damiend99b0522013-12-21 18:17:45 +0000328 case MP_BC_MAKE_FUNCTION:
Damienf03001f2013-11-17 13:19:33 +0000329 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200330 printf("MAKE_FUNCTION " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000331 break;
332
Damien George6baf76e2013-12-30 22:32:17 +0000333 case MP_BC_MAKE_CLOSURE:
334 DECODE_UINT;
335 printf("MAKE_CLOSURE " UINT_FMT, unum);
336 break;
337
Damiend99b0522013-12-21 18:17:45 +0000338 case MP_BC_CALL_FUNCTION:
Damienf03001f2013-11-17 13:19:33 +0000339 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200340 printf("CALL_FUNCTION n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff);
Damienf03001f2013-11-17 13:19:33 +0000341 break;
342
Damiend99b0522013-12-21 18:17:45 +0000343 case MP_BC_CALL_METHOD:
Damienf03001f2013-11-17 13:19:33 +0000344 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200345 printf("CALL_METHOD n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff);
Damienf03001f2013-11-17 13:19:33 +0000346 break;
347
Damiend99b0522013-12-21 18:17:45 +0000348 case MP_BC_RETURN_VALUE:
Damienf03001f2013-11-17 13:19:33 +0000349 printf("RETURN_VALUE");
350 break;
351
Paul Sokolovsky4b919d02014-01-10 04:16:50 +0200352 case MP_BC_RAISE_VARARGS:
353 unum = *ip++;
354 printf("RAISE_VARARGS " UINT_FMT, unum);
355 break;
356
Damiend99b0522013-12-21 18:17:45 +0000357 case MP_BC_YIELD_VALUE:
Damien George27bf5b82014-01-02 18:15:33 +0000358 printf("YIELD_VALUE");
359 break;
Damienf03001f2013-11-17 13:19:33 +0000360
Damien George66028ab2014-01-03 14:03:48 +0000361 case MP_BC_IMPORT_NAME:
362 DECODE_QSTR;
363 printf("IMPORT NAME %s", qstr_str(qstr));
364 break;
365
366 case MP_BC_IMPORT_FROM:
367 DECODE_QSTR;
368 printf("IMPORT NAME %s", qstr_str(qstr));
369 break;
370
Damienf03001f2013-11-17 13:19:33 +0000371 default:
372 printf("code %p, byte code 0x%02x not implemented\n", ip, op);
373 assert(0);
374 return;
375 }
376 printf("\n");
377 }
378}
Damien Georged3ebe482014-01-07 15:20:33 +0000379
380#endif // MICROPY_SHOW_BC