blob: aea0aff67a0399e45b441cb380eaea75f2f11fb6 [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
21 // decode prelude
22 {
23 uint n_local = *ip++;
24 printf("(NUM_LOCAL %u)\n", n_local);
25 for (; n_local > 0; n_local--) {
26 uint local_num = *ip++;
27 printf("(INIT_CELL %u)\n", local_num);
28 }
29 len -= ip - ip_start;
30 ip_start = ip;
31 }
32
Damienf03001f2013-11-17 13:19:33 +000033 machine_uint_t unum;
34 qstr qstr;
35 while (ip - ip_start < len) {
36 printf("%02u ", (uint)(ip - ip_start));
37 int op = *ip++;
38 switch (op) {
Damiend99b0522013-12-21 18:17:45 +000039 case MP_BC_LOAD_CONST_FALSE:
Damienf03001f2013-11-17 13:19:33 +000040 printf("LOAD_CONST_FALSE");
41 break;
42
Damiend99b0522013-12-21 18:17:45 +000043 case MP_BC_LOAD_CONST_NONE:
Damienf03001f2013-11-17 13:19:33 +000044 printf("LOAD_CONST_NONE");
45 break;
46
Damiend99b0522013-12-21 18:17:45 +000047 case MP_BC_LOAD_CONST_TRUE:
Damienf03001f2013-11-17 13:19:33 +000048 printf("LOAD_CONST_TRUE");
49 break;
50
Damien Georgee9906ac2014-01-04 18:44:46 +000051 case MP_BC_LOAD_CONST_ELLIPSIS:
52 printf("LOAD_CONST_ELLIPSIS");
53 break;
54
Damiend99b0522013-12-21 18:17:45 +000055 case MP_BC_LOAD_CONST_SMALL_INT:
Damienf03001f2013-11-17 13:19:33 +000056 unum = (ip[0] | (ip[1] << 8) | (ip[2] << 16)) - 0x800000;
57 ip += 3;
58 printf("LOAD_CONST_SMALL_INT %d", (int)unum);
59 break;
60
61 /*
Damiend99b0522013-12-21 18:17:45 +000062 case MP_BC_LOAD_CONST_DEC:
Damienf03001f2013-11-17 13:19:33 +000063 DECODE_QSTR;
64 PUSH(rt_load_const_dec(qstr));
65 break;
Damienc1075dd2013-11-25 23:39:36 +000066 */
Damienf03001f2013-11-17 13:19:33 +000067
Damiend99b0522013-12-21 18:17:45 +000068 case MP_BC_LOAD_CONST_ID:
Damienf03001f2013-11-17 13:19:33 +000069 DECODE_QSTR;
Damienc1075dd2013-11-25 23:39:36 +000070 printf("LOAD_CONST_ID %s", qstr_str(qstr));
Damienf03001f2013-11-17 13:19:33 +000071 break;
72
Damiend99b0522013-12-21 18:17:45 +000073 case MP_BC_LOAD_CONST_STRING:
Damienf03001f2013-11-17 13:19:33 +000074 DECODE_QSTR;
Damienff099f32013-11-26 15:14:50 +000075 printf("LOAD_CONST_STRING %s", qstr_str(qstr));
Damienf03001f2013-11-17 13:19:33 +000076 break;
Damienf03001f2013-11-17 13:19:33 +000077
Damiend99b0522013-12-21 18:17:45 +000078 case MP_BC_LOAD_FAST_0:
Damienf03001f2013-11-17 13:19:33 +000079 printf("LOAD_FAST_0");
80 break;
81
Damiend99b0522013-12-21 18:17:45 +000082 case MP_BC_LOAD_FAST_1:
Damienf03001f2013-11-17 13:19:33 +000083 printf("LOAD_FAST_1");
84 break;
85
Damiend99b0522013-12-21 18:17:45 +000086 case MP_BC_LOAD_FAST_2:
Damienf03001f2013-11-17 13:19:33 +000087 printf("LOAD_FAST_2");
88 break;
89
Damiend99b0522013-12-21 18:17:45 +000090 case MP_BC_LOAD_FAST_N:
Damienf03001f2013-11-17 13:19:33 +000091 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +020092 printf("LOAD_FAST_N " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +000093 break;
Damienf03001f2013-11-17 13:19:33 +000094
Damien George6baf76e2013-12-30 22:32:17 +000095 case MP_BC_LOAD_DEREF:
96 DECODE_UINT;
97 printf("LOAD_DEREF " UINT_FMT, unum);
98 break;
99
Damiend99b0522013-12-21 18:17:45 +0000100 case MP_BC_LOAD_NAME:
Damienf03001f2013-11-17 13:19:33 +0000101 DECODE_QSTR;
102 printf("LOAD_NAME %s", qstr_str(qstr));
103 break;
104
Damiend99b0522013-12-21 18:17:45 +0000105 case MP_BC_LOAD_GLOBAL:
Damienf03001f2013-11-17 13:19:33 +0000106 DECODE_QSTR;
107 printf("LOAD_GLOBAL %s", qstr_str(qstr));
108 break;
109
Damiend99b0522013-12-21 18:17:45 +0000110 case MP_BC_LOAD_ATTR:
Damienf03001f2013-11-17 13:19:33 +0000111 DECODE_QSTR;
Damienc1075dd2013-11-25 23:39:36 +0000112 printf("LOAD_ATTR %s", qstr_str(qstr));
Damienf03001f2013-11-17 13:19:33 +0000113 break;
Damienf03001f2013-11-17 13:19:33 +0000114
Damiend99b0522013-12-21 18:17:45 +0000115 case MP_BC_LOAD_METHOD:
Damienf03001f2013-11-17 13:19:33 +0000116 DECODE_QSTR;
117 printf("LOAD_METHOD %s", qstr_str(qstr));
118 break;
119
Damiend99b0522013-12-21 18:17:45 +0000120 case MP_BC_LOAD_BUILD_CLASS:
Damienc1075dd2013-11-25 23:39:36 +0000121 printf("LOAD_BUILD_CLASS");
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_STORE_FAST_0:
Damienf03001f2013-11-17 13:19:33 +0000125 printf("STORE_FAST_0");
126 break;
127
Damiend99b0522013-12-21 18:17:45 +0000128 case MP_BC_STORE_FAST_1:
Damienf03001f2013-11-17 13:19:33 +0000129 printf("STORE_FAST_1");
130 break;
131
Damiend99b0522013-12-21 18:17:45 +0000132 case MP_BC_STORE_FAST_2:
Damienf03001f2013-11-17 13:19:33 +0000133 printf("STORE_FAST_2");
134 break;
135
Damiend99b0522013-12-21 18:17:45 +0000136 case MP_BC_STORE_FAST_N:
Damienf03001f2013-11-17 13:19:33 +0000137 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200138 printf("STORE_FAST_N " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000139 break;
Damienf03001f2013-11-17 13:19:33 +0000140
Damien George6baf76e2013-12-30 22:32:17 +0000141 case MP_BC_STORE_DEREF:
142 DECODE_UINT;
143 printf("STORE_DEREF " UINT_FMT, unum);
144 break;
145
Damiend99b0522013-12-21 18:17:45 +0000146 case MP_BC_STORE_NAME:
Damienf03001f2013-11-17 13:19:33 +0000147 DECODE_QSTR;
148 printf("STORE_NAME %s", qstr_str(qstr));
149 break;
150
Damiend99b0522013-12-21 18:17:45 +0000151 case MP_BC_STORE_GLOBAL:
Damienf03001f2013-11-17 13:19:33 +0000152 DECODE_QSTR;
Damien George66028ab2014-01-03 14:03:48 +0000153 printf("STORE_GLOBAL %s", qstr_str(qstr));
Damienf03001f2013-11-17 13:19:33 +0000154 break;
155
Damiend99b0522013-12-21 18:17:45 +0000156 case MP_BC_STORE_ATTR:
Damienf03001f2013-11-17 13:19:33 +0000157 DECODE_QSTR;
Damienc1075dd2013-11-25 23:39:36 +0000158 printf("STORE_ATTR %s", qstr_str(qstr));
Damienf03001f2013-11-17 13:19:33 +0000159 break;
160
Damiend99b0522013-12-21 18:17:45 +0000161 case MP_BC_STORE_SUBSCR:
Damienff099f32013-11-26 15:14:50 +0000162 printf("STORE_SUBSCR");
Damienf03001f2013-11-17 13:19:33 +0000163 break;
164
Damiend99b0522013-12-21 18:17:45 +0000165 case MP_BC_DUP_TOP:
Damien8f9e2ee2013-12-29 16:54:59 +0000166 printf("DUP_TOP");
Damienf03001f2013-11-17 13:19:33 +0000167 break;
168
Damiend99b0522013-12-21 18:17:45 +0000169 case MP_BC_DUP_TOP_TWO:
Damienff099f32013-11-26 15:14:50 +0000170 printf("DUP_TOP_TWO");
Damienf03001f2013-11-17 13:19:33 +0000171 break;
Damienf03001f2013-11-17 13:19:33 +0000172
Damiend99b0522013-12-21 18:17:45 +0000173 case MP_BC_POP_TOP:
Damienf03001f2013-11-17 13:19:33 +0000174 printf("POP_TOP");
175 break;
176
177 /*
Damiend99b0522013-12-21 18:17:45 +0000178 case MP_BC_ROT_TWO:
Damienf03001f2013-11-17 13:19:33 +0000179 obj1 = sp[0];
180 sp[0] = sp[1];
181 sp[1] = obj1;
182 break;
Damienff099f32013-11-26 15:14:50 +0000183 */
Damienf03001f2013-11-17 13:19:33 +0000184
Damiend99b0522013-12-21 18:17:45 +0000185 case MP_BC_ROT_THREE:
Damienff099f32013-11-26 15:14:50 +0000186 printf("ROT_THREE");
Damienf03001f2013-11-17 13:19:33 +0000187 break;
Damienf03001f2013-11-17 13:19:33 +0000188
Damiend99b0522013-12-21 18:17:45 +0000189 case MP_BC_JUMP:
Damienf03001f2013-11-17 13:19:33 +0000190 DECODE_SLABEL;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200191 printf("JUMP " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000192 break;
193
Damiend99b0522013-12-21 18:17:45 +0000194 case MP_BC_POP_JUMP_IF_TRUE:
Damienf03001f2013-11-17 13:19:33 +0000195 DECODE_SLABEL;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200196 printf("POP_JUMP_IF_TRUE " 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_FALSE:
Damienf03001f2013-11-17 13:19:33 +0000200 DECODE_SLABEL;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200201 printf("POP_JUMP_IF_FALSE " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000202 break;
203
Damienff099f32013-11-26 15:14:50 +0000204 /*
Damiend99b0522013-12-21 18:17:45 +0000205 case MP_BC_JUMP_IF_TRUE_OR_POP:
Damienf03001f2013-11-17 13:19:33 +0000206 DECODE_SLABEL;
207 if (rt_is_true(*sp)) {
208 ip += unum;
209 } else {
210 sp++;
211 }
212 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;
216 if (rt_is_true(*sp)) {
217 sp++;
218 } else {
219 ip += unum;
220 }
221 break;
Damien8f9e2ee2013-12-29 16:54:59 +0000222 */
Damienf03001f2013-11-17 13:19:33 +0000223
Damiend99b0522013-12-21 18:17:45 +0000224 case MP_BC_SETUP_EXCEPT:
Damienf03001f2013-11-17 13:19:33 +0000225 DECODE_ULABEL; // except labels are always forward
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200226 printf("SETUP_EXCEPT " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000227 break;
228
Damiend99b0522013-12-21 18:17:45 +0000229 case MP_BC_END_FINALLY:
Damienf03001f2013-11-17 13:19:33 +0000230 // if TOS is an exception, reraises the exception (3 values on TOS)
231 // if TOS is an integer, does something else
232 // if TOS is None, just pops it and continues
233 // else error
Damien8f9e2ee2013-12-29 16:54:59 +0000234 printf("END_FINALLY");
Damienf03001f2013-11-17 13:19:33 +0000235 break;
236
Damiend99b0522013-12-21 18:17:45 +0000237 case MP_BC_GET_ITER:
Damienff099f32013-11-26 15:14:50 +0000238 printf("GET_ITER");
Damienf03001f2013-11-17 13:19:33 +0000239 break;
240
Damiend99b0522013-12-21 18:17:45 +0000241 case MP_BC_FOR_ITER:
Damienf03001f2013-11-17 13:19:33 +0000242 DECODE_ULABEL; // the jump offset if iteration finishes; for labels are always forward
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200243 printf("FOR_ITER " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000244 break;
245
Damiend99b0522013-12-21 18:17:45 +0000246 case MP_BC_POP_BLOCK:
Damienf03001f2013-11-17 13:19:33 +0000247 // pops block and restores the stack
Damien8f9e2ee2013-12-29 16:54:59 +0000248 printf("POP_BLOCK");
Damienf03001f2013-11-17 13:19:33 +0000249 break;
250
Damiend99b0522013-12-21 18:17:45 +0000251 case MP_BC_POP_EXCEPT:
Damienf03001f2013-11-17 13:19:33 +0000252 // 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 +0000253 printf("POP_EXCEPT");
Damienf03001f2013-11-17 13:19:33 +0000254 break;
255
Damien8f9e2ee2013-12-29 16:54:59 +0000256 /*
Damiend99b0522013-12-21 18:17:45 +0000257 case MP_BC_UNARY_OP:
Damienf03001f2013-11-17 13:19:33 +0000258 unum = *ip++;
259 *sp = rt_unary_op(unum, *sp);
260 break;
261 */
262
Damiend99b0522013-12-21 18:17:45 +0000263 case MP_BC_BINARY_OP:
Damienf03001f2013-11-17 13:19:33 +0000264 unum = *ip++;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200265 printf("BINARY_OP " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000266 break;
267
Damiend99b0522013-12-21 18:17:45 +0000268 case MP_BC_COMPARE_OP:
Damienf03001f2013-11-17 13:19:33 +0000269 unum = *ip++;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200270 printf("COMPARE_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
Damien8f9e2ee2013-12-29 16:54:59 +0000293 /*
Damiend99b0522013-12-21 18:17:45 +0000294 case MP_BC_STORE_MAP:
Damienf03001f2013-11-17 13:19:33 +0000295 sp += 2;
296 rt_store_map(sp[0], sp[-2], sp[-1]);
297 break;
298
Damiend99b0522013-12-21 18:17:45 +0000299 case MP_BC_MAP_ADD:
Damienf03001f2013-11-17 13:19:33 +0000300 DECODE_UINT;
301 // I think it's guaranteed by the compiler that sp[unum + 1] is a map
302 rt_store_map(sp[unum + 1], sp[0], sp[1]);
303 sp += 2;
304 break;
Damiendae7eb72013-12-29 22:32:51 +0000305 */
Damienf03001f2013-11-17 13:19:33 +0000306
Damiend99b0522013-12-21 18:17:45 +0000307 case MP_BC_BUILD_SET:
Damienf03001f2013-11-17 13:19:33 +0000308 DECODE_UINT;
Damien George212c2962013-12-30 12:52:32 +0000309 printf("BUILD_SET " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000310 break;
311
Damiend99b0522013-12-21 18:17:45 +0000312 case MP_BC_SET_ADD:
Damienf03001f2013-11-17 13:19:33 +0000313 DECODE_UINT;
Damien George212c2962013-12-30 12:52:32 +0000314 printf("SET_ADD " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000315 break;
Damienf03001f2013-11-17 13:19:33 +0000316
Damiend99b0522013-12-21 18:17:45 +0000317 case MP_BC_UNPACK_SEQUENCE:
Damienff099f32013-11-26 15:14:50 +0000318 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200319 printf("UNPACK_SEQUENCE " UINT_FMT, unum);
Damienff099f32013-11-26 15:14:50 +0000320 break;
321
Damiend99b0522013-12-21 18:17:45 +0000322 case MP_BC_MAKE_FUNCTION:
Damienf03001f2013-11-17 13:19:33 +0000323 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200324 printf("MAKE_FUNCTION " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000325 break;
326
Damien George6baf76e2013-12-30 22:32:17 +0000327 case MP_BC_MAKE_CLOSURE:
328 DECODE_UINT;
329 printf("MAKE_CLOSURE " UINT_FMT, unum);
330 break;
331
Damiend99b0522013-12-21 18:17:45 +0000332 case MP_BC_CALL_FUNCTION:
Damienf03001f2013-11-17 13:19:33 +0000333 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200334 printf("CALL_FUNCTION n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff);
Damienf03001f2013-11-17 13:19:33 +0000335 break;
336
Damiend99b0522013-12-21 18:17:45 +0000337 case MP_BC_CALL_METHOD:
Damienf03001f2013-11-17 13:19:33 +0000338 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200339 printf("CALL_METHOD n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff);
Damienf03001f2013-11-17 13:19:33 +0000340 break;
341
Damiend99b0522013-12-21 18:17:45 +0000342 case MP_BC_RETURN_VALUE:
Damienf03001f2013-11-17 13:19:33 +0000343 printf("RETURN_VALUE");
344 break;
345
Damiend99b0522013-12-21 18:17:45 +0000346 case MP_BC_YIELD_VALUE:
Damien George27bf5b82014-01-02 18:15:33 +0000347 printf("YIELD_VALUE");
348 break;
Damienf03001f2013-11-17 13:19:33 +0000349
Damien George66028ab2014-01-03 14:03:48 +0000350 case MP_BC_IMPORT_NAME:
351 DECODE_QSTR;
352 printf("IMPORT NAME %s", qstr_str(qstr));
353 break;
354
355 case MP_BC_IMPORT_FROM:
356 DECODE_QSTR;
357 printf("IMPORT NAME %s", qstr_str(qstr));
358 break;
359
Damienf03001f2013-11-17 13:19:33 +0000360 default:
361 printf("code %p, byte code 0x%02x not implemented\n", ip, op);
362 assert(0);
363 return;
364 }
365 printf("\n");
366 }
367}
Damien Georged3ebe482014-01-07 15:20:33 +0000368
369#endif // MICROPY_SHOW_BC