blob: 67c5d7adea5f0159c4a9edc2f510658022ac5392 [file] [log] [blame]
Damien George04b91472014-05-03 23:27:38 +01001/*
2 * This file is part of the Micro Python project, http://micropython.org/
3 *
4 * The MIT License (MIT)
5 *
6 * Copyright (c) 2013, 2014 Damien P. George
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a copy
9 * of this software and associated documentation files (the "Software"), to deal
10 * in the Software without restriction, including without limitation the rights
11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 * copies of the Software, and to permit persons to whom the Software is
13 * furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 * THE SOFTWARE.
25 */
26
Damienf03001f2013-11-17 13:19:33 +000027#include <stdio.h>
Damienf03001f2013-11-17 13:19:33 +000028#include <assert.h>
29
Damiend99b0522013-12-21 18:17:45 +000030#include "mpconfig.h"
Paul Sokolovskyf54bcbf2014-05-02 17:47:01 +030031#include "misc.h"
Damien George55baff42014-01-21 21:40:13 +000032#include "qstr.h"
Damien Georgeb534e1b2014-09-04 14:44:01 +010033#include "obj.h"
34#include "runtime.h"
Damiend99b0522013-12-21 18:17:45 +000035#include "bc0.h"
Damien Georgeb534e1b2014-09-04 14:44:01 +010036#include "bc.h"
Damienf03001f2013-11-17 13:19:33 +000037
Damien Georgecbd2f742014-01-19 11:48:48 +000038#if MICROPY_DEBUG_PRINTERS
Damien Georged3ebe482014-01-07 15:20:33 +000039
Paul Sokolovsky1d30b112014-02-21 02:31:05 +020040#define DECODE_UINT { \
41 unum = 0; \
42 do { \
43 unum = (unum << 7) + (*ip & 0x7f); \
44 } while ((*ip++ & 0x80) != 0); \
45}
Damienf03001f2013-11-17 13:19:33 +000046#define DECODE_ULABEL do { unum = (ip[0] | (ip[1] << 8)); ip += 2; } while (0)
47#define DECODE_SLABEL do { unum = (ip[0] | (ip[1] << 8)) - 0x8000; ip += 2; } while (0)
Paul Sokolovsky1d30b112014-02-21 02:31:05 +020048#define DECODE_QSTR { \
49 qstr = 0; \
50 do { \
51 qstr = (qstr << 7) + (*ip & 0x7f); \
52 } while ((*ip++ & 0x80) != 0); \
53}
Damien George3d484d92014-04-13 11:22:44 +010054#define DECODE_PTR do { \
Damien George40f3c022014-07-03 13:25:24 +010055 ip = (byte*)(((mp_uint_t)ip + sizeof(mp_uint_t) - 1) & (~(sizeof(mp_uint_t) - 1))); /* align ip */ \
56 unum = *(mp_uint_t*)ip; \
57 ip += sizeof(mp_uint_t); \
Damien George3d484d92014-04-13 11:22:44 +010058} while (0)
Damienf03001f2013-11-17 13:19:33 +000059
Damien George3417bc22014-05-10 10:36:38 +010060void mp_bytecode_print2(const byte *ip, int len);
Paul Sokolovskyc5e32c62014-04-23 03:40:24 +030061
Paul Sokolovskya4ac5b92014-06-03 01:24:29 +030062void mp_bytecode_print(const void *descr, const byte *ip, int len) {
Damienf03001f2013-11-17 13:19:33 +000063 const byte *ip_start = ip;
Damien George6baf76e2013-12-30 22:32:17 +000064
Damien George08335002014-01-18 23:24:36 +000065 // get code info size
Damien George73496fb2014-04-13 14:51:56 +010066 const byte *code_info = ip;
Damien Georgeb534e1b2014-09-04 14:44:01 +010067 mp_uint_t code_info_size = mp_decode_uint(&code_info);
Damien George08335002014-01-18 23:24:36 +000068 ip += code_info_size;
69
Damien Georgeb534e1b2014-09-04 14:44:01 +010070 qstr block_name = mp_decode_uint(&code_info);
71 qstr source_file = mp_decode_uint(&code_info);
Paul Sokolovskya4ac5b92014-06-03 01:24:29 +030072 printf("File %s, code block '%s' (descriptor: %p, bytecode @%p %d bytes)\n",
73 qstr_str(source_file), qstr_str(block_name), descr, code_info, len);
Paul Sokolovsky8bf84042014-06-02 16:11:16 +030074
Damien George440f0412014-03-28 18:38:20 +000075 // bytecode prelude: state size and exception stack size; 16 bit uints
76 {
Damien Georgeb534e1b2014-09-04 14:44:01 +010077 uint n_state = mp_decode_uint(&ip);
78 uint n_exc_stack = mp_decode_uint(&ip);
Damien George440f0412014-03-28 18:38:20 +000079 printf("(N_STATE %u)\n", n_state);
80 printf("(N_EXC_STACK %u)\n", n_exc_stack);
81 }
82
83 // bytecode prelude: initialise closed over variables
Damien George6baf76e2013-12-30 22:32:17 +000084 {
85 uint n_local = *ip++;
86 printf("(NUM_LOCAL %u)\n", n_local);
87 for (; n_local > 0; n_local--) {
88 uint local_num = *ip++;
89 printf("(INIT_CELL %u)\n", local_num);
90 }
91 len -= ip - ip_start;
92 ip_start = ip;
93 }
94
Damien George73496fb2014-04-13 14:51:56 +010095 // print out line number info
96 {
Damien George40f3c022014-07-03 13:25:24 +010097 mp_int_t bc = (code_info + code_info_size) - ip;
98 mp_uint_t source_line = 1;
Damien George73496fb2014-04-13 14:51:56 +010099 printf(" bc=" INT_FMT " line=" UINT_FMT "\n", bc, source_line);
Damien George4747bec2014-07-31 16:12:01 +0000100 for (const byte* ci = code_info + 12; *ci;) {
101 if ((ci[0] & 0x80) == 0) {
102 // 0b0LLBBBBB encoding
103 bc += ci[0] & 0x1f;
104 source_line += ci[0] >> 5;
105 ci += 1;
106 } else {
107 // 0b1LLLBBBB 0bLLLLLLLL encoding (l's LSB in second byte)
108 bc += ci[0] & 0xf;
109 source_line += ((ci[0] << 4) & 0x700) | ci[1];
110 ci += 2;
111 }
Damien George73496fb2014-04-13 14:51:56 +0100112 printf(" bc=" INT_FMT " line=" UINT_FMT "\n", bc, source_line);
113 }
114 }
Damien George3417bc22014-05-10 10:36:38 +0100115 mp_bytecode_print2(ip, len - 0);
Paul Sokolovskyc5e32c62014-04-23 03:40:24 +0300116}
Damien George73496fb2014-04-13 14:51:56 +0100117
Damien George3417bc22014-05-10 10:36:38 +0100118void mp_bytecode_print2(const byte *ip, int len) {
Paul Sokolovskyc5e32c62014-04-23 03:40:24 +0300119 const byte *ip_start = ip;
Damien George40f3c022014-07-03 13:25:24 +0100120 mp_uint_t unum;
Damienf03001f2013-11-17 13:19:33 +0000121 qstr qstr;
122 while (ip - ip_start < len) {
123 printf("%02u ", (uint)(ip - ip_start));
124 int op = *ip++;
125 switch (op) {
Damiend99b0522013-12-21 18:17:45 +0000126 case MP_BC_LOAD_CONST_FALSE:
Damienf03001f2013-11-17 13:19:33 +0000127 printf("LOAD_CONST_FALSE");
128 break;
129
Damiend99b0522013-12-21 18:17:45 +0000130 case MP_BC_LOAD_CONST_NONE:
Damienf03001f2013-11-17 13:19:33 +0000131 printf("LOAD_CONST_NONE");
132 break;
133
Damiend99b0522013-12-21 18:17:45 +0000134 case MP_BC_LOAD_CONST_TRUE:
Damienf03001f2013-11-17 13:19:33 +0000135 printf("LOAD_CONST_TRUE");
136 break;
137
Damien Georgee9906ac2014-01-04 18:44:46 +0000138 case MP_BC_LOAD_CONST_ELLIPSIS:
139 printf("LOAD_CONST_ELLIPSIS");
140 break;
141
Paul Sokolovsky047cd402014-02-19 15:47:59 +0200142 case MP_BC_LOAD_CONST_SMALL_INT: {
Damien George40f3c022014-07-03 13:25:24 +0100143 mp_int_t num = 0;
Paul Sokolovsky047cd402014-02-19 15:47:59 +0200144 if ((ip[0] & 0x40) != 0) {
145 // Number is negative
146 num--;
147 }
148 do {
149 num = (num << 7) | (*ip & 0x7f);
150 } while ((*ip++ & 0x80) != 0);
Damien George0379b552014-02-22 17:34:09 +0000151 printf("LOAD_CONST_SMALL_INT " INT_FMT, num);
Damienf03001f2013-11-17 13:19:33 +0000152 break;
Paul Sokolovsky047cd402014-02-19 15:47:59 +0200153 }
Damienf03001f2013-11-17 13:19:33 +0000154
Paul Sokolovsky4b919d02014-01-10 04:16:50 +0200155 case MP_BC_LOAD_CONST_INT:
156 DECODE_QSTR;
157 printf("LOAD_CONST_INT %s", qstr_str(qstr));
158 break;
159
Damiend99b0522013-12-21 18:17:45 +0000160 case MP_BC_LOAD_CONST_DEC:
Damienf03001f2013-11-17 13:19:33 +0000161 DECODE_QSTR;
Damien George08d07552014-01-29 18:58:52 +0000162 printf("LOAD_CONST_DEC %s", qstr_str(qstr));
Damienf03001f2013-11-17 13:19:33 +0000163 break;
164
Paul Sokolovskyb9b1c002014-04-12 00:34:57 +0300165 case MP_BC_LOAD_CONST_BYTES:
166 DECODE_QSTR;
167 printf("LOAD_CONST_BYTES %s", qstr_str(qstr));
168 break;
169
Damiend99b0522013-12-21 18:17:45 +0000170 case MP_BC_LOAD_CONST_STRING:
Damienf03001f2013-11-17 13:19:33 +0000171 DECODE_QSTR;
Paul Sokolovskyfaf84492014-04-12 16:18:40 +0300172 printf("LOAD_CONST_STRING '%s'", qstr_str(qstr));
Damienf03001f2013-11-17 13:19:33 +0000173 break;
Damienf03001f2013-11-17 13:19:33 +0000174
Paul Sokolovsky00a9d132014-04-12 00:32:38 +0300175 case MP_BC_LOAD_NULL:
176 printf("LOAD_NULL");
177 break;
178
Damiend99b0522013-12-21 18:17:45 +0000179 case MP_BC_LOAD_FAST_0:
Damienf03001f2013-11-17 13:19:33 +0000180 printf("LOAD_FAST_0");
181 break;
182
Damiend99b0522013-12-21 18:17:45 +0000183 case MP_BC_LOAD_FAST_1:
Damienf03001f2013-11-17 13:19:33 +0000184 printf("LOAD_FAST_1");
185 break;
186
Damiend99b0522013-12-21 18:17:45 +0000187 case MP_BC_LOAD_FAST_2:
Damienf03001f2013-11-17 13:19:33 +0000188 printf("LOAD_FAST_2");
189 break;
190
Damiend99b0522013-12-21 18:17:45 +0000191 case MP_BC_LOAD_FAST_N:
Damienf03001f2013-11-17 13:19:33 +0000192 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200193 printf("LOAD_FAST_N " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000194 break;
Damienf03001f2013-11-17 13:19:33 +0000195
Damien George6baf76e2013-12-30 22:32:17 +0000196 case MP_BC_LOAD_DEREF:
197 DECODE_UINT;
198 printf("LOAD_DEREF " UINT_FMT, unum);
199 break;
200
Damiend99b0522013-12-21 18:17:45 +0000201 case MP_BC_LOAD_NAME:
Damienf03001f2013-11-17 13:19:33 +0000202 DECODE_QSTR;
203 printf("LOAD_NAME %s", qstr_str(qstr));
204 break;
205
Damiend99b0522013-12-21 18:17:45 +0000206 case MP_BC_LOAD_GLOBAL:
Damienf03001f2013-11-17 13:19:33 +0000207 DECODE_QSTR;
208 printf("LOAD_GLOBAL %s", qstr_str(qstr));
209 break;
210
Damiend99b0522013-12-21 18:17:45 +0000211 case MP_BC_LOAD_ATTR:
Damienf03001f2013-11-17 13:19:33 +0000212 DECODE_QSTR;
Damienc1075dd2013-11-25 23:39:36 +0000213 printf("LOAD_ATTR %s", qstr_str(qstr));
Damienf03001f2013-11-17 13:19:33 +0000214 break;
Damienf03001f2013-11-17 13:19:33 +0000215
Damiend99b0522013-12-21 18:17:45 +0000216 case MP_BC_LOAD_METHOD:
Damienf03001f2013-11-17 13:19:33 +0000217 DECODE_QSTR;
218 printf("LOAD_METHOD %s", qstr_str(qstr));
219 break;
220
Damiend99b0522013-12-21 18:17:45 +0000221 case MP_BC_LOAD_BUILD_CLASS:
Damienc1075dd2013-11-25 23:39:36 +0000222 printf("LOAD_BUILD_CLASS");
Damienf03001f2013-11-17 13:19:33 +0000223 break;
Damienf03001f2013-11-17 13:19:33 +0000224
Damien George729f7b42014-04-17 22:10:53 +0100225 case MP_BC_LOAD_SUBSCR:
226 printf("LOAD_SUBSCR");
227 break;
228
Damiend99b0522013-12-21 18:17:45 +0000229 case MP_BC_STORE_FAST_0:
Damienf03001f2013-11-17 13:19:33 +0000230 printf("STORE_FAST_0");
231 break;
232
Damiend99b0522013-12-21 18:17:45 +0000233 case MP_BC_STORE_FAST_1:
Damienf03001f2013-11-17 13:19:33 +0000234 printf("STORE_FAST_1");
235 break;
236
Damiend99b0522013-12-21 18:17:45 +0000237 case MP_BC_STORE_FAST_2:
Damienf03001f2013-11-17 13:19:33 +0000238 printf("STORE_FAST_2");
239 break;
240
Damiend99b0522013-12-21 18:17:45 +0000241 case MP_BC_STORE_FAST_N:
Damienf03001f2013-11-17 13:19:33 +0000242 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200243 printf("STORE_FAST_N " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000244 break;
Damienf03001f2013-11-17 13:19:33 +0000245
Damien George6baf76e2013-12-30 22:32:17 +0000246 case MP_BC_STORE_DEREF:
247 DECODE_UINT;
248 printf("STORE_DEREF " UINT_FMT, unum);
249 break;
250
Damiend99b0522013-12-21 18:17:45 +0000251 case MP_BC_STORE_NAME:
Damienf03001f2013-11-17 13:19:33 +0000252 DECODE_QSTR;
253 printf("STORE_NAME %s", qstr_str(qstr));
254 break;
255
Damiend99b0522013-12-21 18:17:45 +0000256 case MP_BC_STORE_GLOBAL:
Damienf03001f2013-11-17 13:19:33 +0000257 DECODE_QSTR;
Damien George66028ab2014-01-03 14:03:48 +0000258 printf("STORE_GLOBAL %s", qstr_str(qstr));
Damienf03001f2013-11-17 13:19:33 +0000259 break;
260
Damiend99b0522013-12-21 18:17:45 +0000261 case MP_BC_STORE_ATTR:
Damienf03001f2013-11-17 13:19:33 +0000262 DECODE_QSTR;
Damienc1075dd2013-11-25 23:39:36 +0000263 printf("STORE_ATTR %s", qstr_str(qstr));
Damienf03001f2013-11-17 13:19:33 +0000264 break;
265
Damiend99b0522013-12-21 18:17:45 +0000266 case MP_BC_STORE_SUBSCR:
Damienff099f32013-11-26 15:14:50 +0000267 printf("STORE_SUBSCR");
Damienf03001f2013-11-17 13:19:33 +0000268 break;
269
Damien George2bf7c092014-04-09 15:26:46 +0100270 case MP_BC_DELETE_FAST:
271 DECODE_UINT;
272 printf("DELETE_FAST " UINT_FMT, unum);
273 break;
274
275 case MP_BC_DELETE_DEREF:
276 DECODE_UINT;
277 printf("DELETE_DEREF " UINT_FMT, unum);
278 break;
279
Damien Georgeddaf6c12014-02-06 20:31:32 +0000280 case MP_BC_DELETE_NAME:
281 DECODE_QSTR;
282 printf("DELETE_NAME %s", qstr_str(qstr));
283 break;
284
Damiend99b0522013-12-21 18:17:45 +0000285 case MP_BC_DUP_TOP:
Damien8f9e2ee2013-12-29 16:54:59 +0000286 printf("DUP_TOP");
Damienf03001f2013-11-17 13:19:33 +0000287 break;
288
Damiend99b0522013-12-21 18:17:45 +0000289 case MP_BC_DUP_TOP_TWO:
Damienff099f32013-11-26 15:14:50 +0000290 printf("DUP_TOP_TWO");
Damienf03001f2013-11-17 13:19:33 +0000291 break;
Damienf03001f2013-11-17 13:19:33 +0000292
Damiend99b0522013-12-21 18:17:45 +0000293 case MP_BC_POP_TOP:
Damienf03001f2013-11-17 13:19:33 +0000294 printf("POP_TOP");
295 break;
296
Damiend99b0522013-12-21 18:17:45 +0000297 case MP_BC_ROT_TWO:
Paul Sokolovsky4b919d02014-01-10 04:16:50 +0200298 printf("ROT_TWO");
Damienf03001f2013-11-17 13:19:33 +0000299 break;
300
Damiend99b0522013-12-21 18:17:45 +0000301 case MP_BC_ROT_THREE:
Damienff099f32013-11-26 15:14:50 +0000302 printf("ROT_THREE");
Damienf03001f2013-11-17 13:19:33 +0000303 break;
Damienf03001f2013-11-17 13:19:33 +0000304
Damiend99b0522013-12-21 18:17:45 +0000305 case MP_BC_JUMP:
Damienf03001f2013-11-17 13:19:33 +0000306 DECODE_SLABEL;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200307 printf("JUMP " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000308 break;
309
Damiend99b0522013-12-21 18:17:45 +0000310 case MP_BC_POP_JUMP_IF_TRUE:
Damienf03001f2013-11-17 13:19:33 +0000311 DECODE_SLABEL;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200312 printf("POP_JUMP_IF_TRUE " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000313 break;
314
Damiend99b0522013-12-21 18:17:45 +0000315 case MP_BC_POP_JUMP_IF_FALSE:
Damienf03001f2013-11-17 13:19:33 +0000316 DECODE_SLABEL;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200317 printf("POP_JUMP_IF_FALSE " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000318 break;
319
Damiend99b0522013-12-21 18:17:45 +0000320 case MP_BC_JUMP_IF_TRUE_OR_POP:
Damienf03001f2013-11-17 13:19:33 +0000321 DECODE_SLABEL;
Damien Georgee02b2d42014-01-19 01:14:37 +0000322 printf("JUMP_IF_TRUE_OR_POP " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000323 break;
324
Damiend99b0522013-12-21 18:17:45 +0000325 case MP_BC_JUMP_IF_FALSE_OR_POP:
Damienf03001f2013-11-17 13:19:33 +0000326 DECODE_SLABEL;
Damien Georgee02b2d42014-01-19 01:14:37 +0000327 printf("JUMP_IF_FALSE_OR_POP " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000328 break;
329
Paul Sokolovsky182c31a2014-03-27 12:29:34 +0200330 case MP_BC_SETUP_WITH:
331 DECODE_ULABEL; // loop-like labels are always forward
332 printf("SETUP_WITH " UINT_FMT, ip + unum - ip_start);
333 break;
334
335 case MP_BC_WITH_CLEANUP:
336 printf("WITH_CLEANUP");
337 break;
338
Damien Georgecbddb272014-02-01 20:08:18 +0000339 case MP_BC_UNWIND_JUMP:
340 DECODE_SLABEL;
341 printf("UNWIND_JUMP " UINT_FMT " %d", ip + unum - ip_start, *ip);
342 ip += 1;
Paul Sokolovsky7ee8e462014-01-31 19:33:31 +0200343 break;
344
Damiend99b0522013-12-21 18:17:45 +0000345 case MP_BC_SETUP_EXCEPT:
Damienf03001f2013-11-17 13:19:33 +0000346 DECODE_ULABEL; // except labels are always forward
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200347 printf("SETUP_EXCEPT " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000348 break;
349
Paul Sokolovsky7ee8e462014-01-31 19:33:31 +0200350 case MP_BC_SETUP_FINALLY:
351 DECODE_ULABEL; // except labels are always forward
352 printf("SETUP_FINALLY " UINT_FMT, ip + unum - ip_start);
353 break;
354
Damiend99b0522013-12-21 18:17:45 +0000355 case MP_BC_END_FINALLY:
Damienf03001f2013-11-17 13:19:33 +0000356 // if TOS is an exception, reraises the exception (3 values on TOS)
357 // if TOS is an integer, does something else
358 // if TOS is None, just pops it and continues
359 // else error
Damien8f9e2ee2013-12-29 16:54:59 +0000360 printf("END_FINALLY");
Damienf03001f2013-11-17 13:19:33 +0000361 break;
362
Damiend99b0522013-12-21 18:17:45 +0000363 case MP_BC_GET_ITER:
Damienff099f32013-11-26 15:14:50 +0000364 printf("GET_ITER");
Damienf03001f2013-11-17 13:19:33 +0000365 break;
366
Damiend99b0522013-12-21 18:17:45 +0000367 case MP_BC_FOR_ITER:
Damienf03001f2013-11-17 13:19:33 +0000368 DECODE_ULABEL; // the jump offset if iteration finishes; for labels are always forward
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200369 printf("FOR_ITER " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000370 break;
371
Damiend99b0522013-12-21 18:17:45 +0000372 case MP_BC_POP_BLOCK:
Damienf03001f2013-11-17 13:19:33 +0000373 // pops block and restores the stack
Damien8f9e2ee2013-12-29 16:54:59 +0000374 printf("POP_BLOCK");
Damienf03001f2013-11-17 13:19:33 +0000375 break;
376
Damiend99b0522013-12-21 18:17:45 +0000377 case MP_BC_POP_EXCEPT:
Damienf03001f2013-11-17 13:19:33 +0000378 // 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 +0000379 printf("POP_EXCEPT");
Damienf03001f2013-11-17 13:19:33 +0000380 break;
381
Damien George9aa2a522014-02-01 23:04:09 +0000382 case MP_BC_NOT:
383 printf("NOT");
384 break;
385
Damiend99b0522013-12-21 18:17:45 +0000386 case MP_BC_UNARY_OP:
Damienf03001f2013-11-17 13:19:33 +0000387 unum = *ip++;
Damien George9aa2a522014-02-01 23:04:09 +0000388 printf("UNARY_OP " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000389 break;
Damienf03001f2013-11-17 13:19:33 +0000390
Damiend99b0522013-12-21 18:17:45 +0000391 case MP_BC_BINARY_OP:
Damienf03001f2013-11-17 13:19:33 +0000392 unum = *ip++;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200393 printf("BINARY_OP " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000394 break;
395
Damiend99b0522013-12-21 18:17:45 +0000396 case MP_BC_BUILD_TUPLE:
Damienf03001f2013-11-17 13:19:33 +0000397 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200398 printf("BUILD_TUPLE " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000399 break;
400
Damiend99b0522013-12-21 18:17:45 +0000401 case MP_BC_BUILD_LIST:
Damienf03001f2013-11-17 13:19:33 +0000402 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200403 printf("BUILD_LIST " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000404 break;
405
Damiend99b0522013-12-21 18:17:45 +0000406 case MP_BC_LIST_APPEND:
Damienf03001f2013-11-17 13:19:33 +0000407 DECODE_UINT;
Damien George27bf5b82014-01-02 18:15:33 +0000408 printf("LIST_APPEND " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000409 break;
410
Damiend99b0522013-12-21 18:17:45 +0000411 case MP_BC_BUILD_MAP:
Damienf03001f2013-11-17 13:19:33 +0000412 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200413 printf("BUILD_MAP " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000414 break;
415
Damiend99b0522013-12-21 18:17:45 +0000416 case MP_BC_STORE_MAP:
Damien George20006db2014-01-18 14:10:48 +0000417 printf("STORE_MAP");
Damienf03001f2013-11-17 13:19:33 +0000418 break;
419
Damiend99b0522013-12-21 18:17:45 +0000420 case MP_BC_MAP_ADD:
Damienf03001f2013-11-17 13:19:33 +0000421 DECODE_UINT;
Paul Sokolovsky0f570cf2014-05-11 19:25:01 +0300422 printf("MAP_ADD " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000423 break;
424
Damiend99b0522013-12-21 18:17:45 +0000425 case MP_BC_BUILD_SET:
Damienf03001f2013-11-17 13:19:33 +0000426 DECODE_UINT;
Damien George212c2962013-12-30 12:52:32 +0000427 printf("BUILD_SET " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000428 break;
429
Damiend99b0522013-12-21 18:17:45 +0000430 case MP_BC_SET_ADD:
Damienf03001f2013-11-17 13:19:33 +0000431 DECODE_UINT;
Damien George212c2962013-12-30 12:52:32 +0000432 printf("SET_ADD " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000433 break;
Damienf03001f2013-11-17 13:19:33 +0000434
Damien Georgefb510b32014-06-01 13:32:54 +0100435#if MICROPY_PY_BUILTINS_SLICE
Damien George20006db2014-01-18 14:10:48 +0000436 case MP_BC_BUILD_SLICE:
437 DECODE_UINT;
438 printf("BUILD_SLICE " UINT_FMT, unum);
439 break;
440#endif
441
Damiend99b0522013-12-21 18:17:45 +0000442 case MP_BC_UNPACK_SEQUENCE:
Damienff099f32013-11-26 15:14:50 +0000443 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200444 printf("UNPACK_SEQUENCE " UINT_FMT, unum);
Damienff099f32013-11-26 15:14:50 +0000445 break;
446
Damiend99b0522013-12-21 18:17:45 +0000447 case MP_BC_MAKE_FUNCTION:
Damien George3d484d92014-04-13 11:22:44 +0100448 DECODE_PTR;
Paul Sokolovskya4ac5b92014-06-03 01:24:29 +0300449 printf("MAKE_FUNCTION %p", (void*)unum);
Damienf03001f2013-11-17 13:19:33 +0000450 break;
451
Paul Sokolovsky90750022014-02-01 15:05:04 +0200452 case MP_BC_MAKE_FUNCTION_DEFARGS:
Damien George3d484d92014-04-13 11:22:44 +0100453 DECODE_PTR;
Paul Sokolovskya4ac5b92014-06-03 01:24:29 +0300454 printf("MAKE_FUNCTION_DEFARGS %p", (void*)unum);
Paul Sokolovsky90750022014-02-01 15:05:04 +0200455 break;
456
Paul Sokolovsky4c6b3752014-04-23 03:22:10 +0300457 case MP_BC_MAKE_CLOSURE: {
Damien George3d484d92014-04-13 11:22:44 +0100458 DECODE_PTR;
Damien George40f3c022014-07-03 13:25:24 +0100459 mp_uint_t n_closed_over = *ip++;
Paul Sokolovskya4ac5b92014-06-03 01:24:29 +0300460 printf("MAKE_CLOSURE %p " UINT_FMT, (void*)unum, n_closed_over);
Damien George6baf76e2013-12-30 22:32:17 +0000461 break;
Paul Sokolovsky4c6b3752014-04-23 03:22:10 +0300462 }
Damien George6baf76e2013-12-30 22:32:17 +0000463
Paul Sokolovsky4c6b3752014-04-23 03:22:10 +0300464 case MP_BC_MAKE_CLOSURE_DEFARGS: {
Damien George3d484d92014-04-13 11:22:44 +0100465 DECODE_PTR;
Damien George40f3c022014-07-03 13:25:24 +0100466 mp_uint_t n_closed_over = *ip++;
Paul Sokolovskya4ac5b92014-06-03 01:24:29 +0300467 printf("MAKE_CLOSURE_DEFARGS %p " UINT_FMT, (void*)unum, n_closed_over);
Paul Sokolovsky2447a5b2014-03-26 23:14:59 +0200468 break;
Paul Sokolovsky4c6b3752014-04-23 03:22:10 +0300469 }
Paul Sokolovsky2447a5b2014-03-26 23:14:59 +0200470
Damiend99b0522013-12-21 18:17:45 +0000471 case MP_BC_CALL_FUNCTION:
Damienf03001f2013-11-17 13:19:33 +0000472 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200473 printf("CALL_FUNCTION n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff);
Damienf03001f2013-11-17 13:19:33 +0000474 break;
475
Paul Sokolovsky48bdb212014-03-30 17:39:25 +0300476 case MP_BC_CALL_FUNCTION_VAR_KW:
477 DECODE_UINT;
478 printf("CALL_FUNCTION_VAR_KW n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff);
479 break;
480
Damiend99b0522013-12-21 18:17:45 +0000481 case MP_BC_CALL_METHOD:
Damienf03001f2013-11-17 13:19:33 +0000482 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200483 printf("CALL_METHOD n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff);
Damienf03001f2013-11-17 13:19:33 +0000484 break;
485
Paul Sokolovsky48bdb212014-03-30 17:39:25 +0300486 case MP_BC_CALL_METHOD_VAR_KW:
487 DECODE_UINT;
488 printf("CALL_METHOD_VAR_KW n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff);
489 break;
490
Damiend99b0522013-12-21 18:17:45 +0000491 case MP_BC_RETURN_VALUE:
Damienf03001f2013-11-17 13:19:33 +0000492 printf("RETURN_VALUE");
493 break;
494
Paul Sokolovsky4b919d02014-01-10 04:16:50 +0200495 case MP_BC_RAISE_VARARGS:
496 unum = *ip++;
497 printf("RAISE_VARARGS " UINT_FMT, unum);
498 break;
499
Damiend99b0522013-12-21 18:17:45 +0000500 case MP_BC_YIELD_VALUE:
Damien George27bf5b82014-01-02 18:15:33 +0000501 printf("YIELD_VALUE");
502 break;
Damienf03001f2013-11-17 13:19:33 +0000503
Paul Sokolovskyda8d21e2014-03-22 13:47:06 +0200504 case MP_BC_YIELD_FROM:
505 printf("YIELD_FROM");
506 break;
507
Damien George66028ab2014-01-03 14:03:48 +0000508 case MP_BC_IMPORT_NAME:
509 DECODE_QSTR;
Paul Sokolovskyfaf84492014-04-12 16:18:40 +0300510 printf("IMPORT_NAME '%s'", qstr_str(qstr));
Damien George66028ab2014-01-03 14:03:48 +0000511 break;
512
513 case MP_BC_IMPORT_FROM:
514 DECODE_QSTR;
Paul Sokolovskyfaf84492014-04-12 16:18:40 +0300515 printf("IMPORT_FROM '%s'", qstr_str(qstr));
Damien George66028ab2014-01-03 14:03:48 +0000516 break;
517
Paul Sokolovskyda1ce932014-02-14 00:22:06 +0200518 case MP_BC_IMPORT_STAR:
519 printf("IMPORT_STAR");
520 break;
521
Damienf03001f2013-11-17 13:19:33 +0000522 default:
523 printf("code %p, byte code 0x%02x not implemented\n", ip, op);
524 assert(0);
525 return;
526 }
527 printf("\n");
528 }
529}
Damien Georged3ebe482014-01-07 15:20:33 +0000530
Damien Georgecbd2f742014-01-19 11:48:48 +0000531#endif // MICROPY_DEBUG_PRINTERS