blob: 1bdb96aaa82ea8e0fbb50818b6e229980c310627 [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
Damien George51dfcb42015-01-01 20:27:54 +000030#include "py/bc0.h"
31#include "py/bc.h"
32
Damien Georgecbd2f742014-01-19 11:48:48 +000033#if MICROPY_DEBUG_PRINTERS
Damien Georged3ebe482014-01-07 15:20:33 +000034
Paul Sokolovsky1d30b112014-02-21 02:31:05 +020035#define DECODE_UINT { \
36 unum = 0; \
37 do { \
38 unum = (unum << 7) + (*ip & 0x7f); \
39 } while ((*ip++ & 0x80) != 0); \
40}
Damienf03001f2013-11-17 13:19:33 +000041#define DECODE_ULABEL do { unum = (ip[0] | (ip[1] << 8)); ip += 2; } while (0)
42#define DECODE_SLABEL do { unum = (ip[0] | (ip[1] << 8)) - 0x8000; ip += 2; } while (0)
Paul Sokolovsky1d30b112014-02-21 02:31:05 +020043#define DECODE_QSTR { \
Damien George50912e72015-01-20 11:55:10 +000044 qst = 0; \
Paul Sokolovsky1d30b112014-02-21 02:31:05 +020045 do { \
Damien George50912e72015-01-20 11:55:10 +000046 qst = (qst << 7) + (*ip & 0x7f); \
Paul Sokolovsky1d30b112014-02-21 02:31:05 +020047 } while ((*ip++ & 0x80) != 0); \
48}
Damien George3d484d92014-04-13 11:22:44 +010049#define DECODE_PTR do { \
Damien George40f3c022014-07-03 13:25:24 +010050 ip = (byte*)(((mp_uint_t)ip + sizeof(mp_uint_t) - 1) & (~(sizeof(mp_uint_t) - 1))); /* align ip */ \
51 unum = *(mp_uint_t*)ip; \
52 ip += sizeof(mp_uint_t); \
Damien George3d484d92014-04-13 11:22:44 +010053} while (0)
Damienf03001f2013-11-17 13:19:33 +000054
Paul Sokolovskydf103462014-12-28 21:34:45 +020055const byte *mp_showbc_code_start;
Paul Sokolovsky343266e2014-12-27 05:00:08 +020056
Damien George1084b0f2014-10-25 15:07:02 +010057void mp_bytecode_print(const void *descr, mp_uint_t n_total_args, const byte *ip, mp_uint_t len) {
Paul Sokolovskydf103462014-12-28 21:34:45 +020058 mp_showbc_code_start = ip;
Damien George6baf76e2013-12-30 22:32:17 +000059
Damien George08335002014-01-18 23:24:36 +000060 // get code info size
Damien George73496fb2014-04-13 14:51:56 +010061 const byte *code_info = ip;
Damien Georgeb534e1b2014-09-04 14:44:01 +010062 mp_uint_t code_info_size = mp_decode_uint(&code_info);
Damien George08335002014-01-18 23:24:36 +000063 ip += code_info_size;
64
Damien Georgeb534e1b2014-09-04 14:44:01 +010065 qstr block_name = mp_decode_uint(&code_info);
66 qstr source_file = mp_decode_uint(&code_info);
Damien George3eaa0c32014-10-03 17:54:25 +000067 printf("File %s, code block '%s' (descriptor: %p, bytecode @%p " UINT_FMT " bytes)\n",
Paul Sokolovskya4ac5b92014-06-03 01:24:29 +030068 qstr_str(source_file), qstr_str(block_name), descr, code_info, len);
Paul Sokolovsky8bf84042014-06-02 16:11:16 +030069
Damien George564963a2014-10-24 14:42:50 +000070 // raw bytecode dump
71 printf("Raw bytecode (code_info_size=" UINT_FMT ", bytecode_size=" UINT_FMT "):\n", code_info_size, len - code_info_size);
72 for (mp_uint_t i = 0; i < len; i++) {
73 if (i > 0 && i % 16 == 0) {
74 printf("\n");
75 }
Paul Sokolovskydf103462014-12-28 21:34:45 +020076 printf(" %02x", mp_showbc_code_start[i]);
Damien George564963a2014-10-24 14:42:50 +000077 }
78 printf("\n");
79
Damien George1084b0f2014-10-25 15:07:02 +010080 // bytecode prelude: arg names (as qstr objects)
81 printf("arg names:");
Damien George963a5a32015-01-16 17:47:07 +000082 for (mp_uint_t i = 0; i < n_total_args; i++) {
Damien George1084b0f2014-10-25 15:07:02 +010083 printf(" %s", qstr_str(MP_OBJ_QSTR_VALUE(*(mp_obj_t*)ip)));
84 ip += sizeof(mp_obj_t);
85 }
86 printf("\n");
87
Damien George440f0412014-03-28 18:38:20 +000088 // bytecode prelude: state size and exception stack size; 16 bit uints
89 {
Damien Georgeb534e1b2014-09-04 14:44:01 +010090 uint n_state = mp_decode_uint(&ip);
91 uint n_exc_stack = mp_decode_uint(&ip);
Damien George440f0412014-03-28 18:38:20 +000092 printf("(N_STATE %u)\n", n_state);
93 printf("(N_EXC_STACK %u)\n", n_exc_stack);
94 }
95
96 // bytecode prelude: initialise closed over variables
Damien George6baf76e2013-12-30 22:32:17 +000097 {
98 uint n_local = *ip++;
99 printf("(NUM_LOCAL %u)\n", n_local);
100 for (; n_local > 0; n_local--) {
101 uint local_num = *ip++;
102 printf("(INIT_CELL %u)\n", local_num);
103 }
Paul Sokolovskydf103462014-12-28 21:34:45 +0200104 len -= ip - mp_showbc_code_start;
Damien George6baf76e2013-12-30 22:32:17 +0000105 }
106
Damien George73496fb2014-04-13 14:51:56 +0100107 // print out line number info
108 {
Paul Sokolovskydf103462014-12-28 21:34:45 +0200109 mp_int_t bc = (mp_showbc_code_start + code_info_size) - ip; // start counting from the prelude
Damien George40f3c022014-07-03 13:25:24 +0100110 mp_uint_t source_line = 1;
Damien George73496fb2014-04-13 14:51:56 +0100111 printf(" bc=" INT_FMT " line=" UINT_FMT "\n", bc, source_line);
Damien George564963a2014-10-24 14:42:50 +0000112 for (const byte* ci = code_info; *ci;) {
Damien George4747bec2014-07-31 16:12:01 +0000113 if ((ci[0] & 0x80) == 0) {
114 // 0b0LLBBBBB encoding
115 bc += ci[0] & 0x1f;
116 source_line += ci[0] >> 5;
117 ci += 1;
118 } else {
119 // 0b1LLLBBBB 0bLLLLLLLL encoding (l's LSB in second byte)
120 bc += ci[0] & 0xf;
121 source_line += ((ci[0] << 4) & 0x700) | ci[1];
122 ci += 2;
123 }
Damien George73496fb2014-04-13 14:51:56 +0100124 printf(" bc=" INT_FMT " line=" UINT_FMT "\n", bc, source_line);
125 }
126 }
Damien George3417bc22014-05-10 10:36:38 +0100127 mp_bytecode_print2(ip, len - 0);
Paul Sokolovskyc5e32c62014-04-23 03:40:24 +0300128}
Damien George73496fb2014-04-13 14:51:56 +0100129
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200130const byte *mp_bytecode_print_str(const byte *ip) {
Damien George40f3c022014-07-03 13:25:24 +0100131 mp_uint_t unum;
Damien George50912e72015-01-20 11:55:10 +0000132 qstr qst;
Damienf03001f2013-11-17 13:19:33 +0000133
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200134 switch (*ip++) {
135 case MP_BC_LOAD_CONST_FALSE:
136 printf("LOAD_CONST_FALSE");
137 break;
Damienf03001f2013-11-17 13:19:33 +0000138
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200139 case MP_BC_LOAD_CONST_NONE:
140 printf("LOAD_CONST_NONE");
141 break;
Damienf03001f2013-11-17 13:19:33 +0000142
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200143 case MP_BC_LOAD_CONST_TRUE:
144 printf("LOAD_CONST_TRUE");
145 break;
Damien Georgee9906ac2014-01-04 18:44:46 +0000146
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200147 case MP_BC_LOAD_CONST_ELLIPSIS:
148 printf("LOAD_CONST_ELLIPSIS");
149 break;
150
151 case MP_BC_LOAD_CONST_SMALL_INT: {
152 mp_int_t num = 0;
153 if ((ip[0] & 0x40) != 0) {
154 // Number is negative
155 num--;
Paul Sokolovsky047cd402014-02-19 15:47:59 +0200156 }
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200157 do {
158 num = (num << 7) | (*ip & 0x7f);
159 } while ((*ip++ & 0x80) != 0);
160 printf("LOAD_CONST_SMALL_INT " INT_FMT, num);
161 break;
162 }
Damienf03001f2013-11-17 13:19:33 +0000163
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200164 case MP_BC_LOAD_CONST_INT:
165 DECODE_QSTR;
Damien George50912e72015-01-20 11:55:10 +0000166 printf("LOAD_CONST_INT %s", qstr_str(qst));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200167 break;
Paul Sokolovsky4b919d02014-01-10 04:16:50 +0200168
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200169 case MP_BC_LOAD_CONST_DEC:
170 DECODE_QSTR;
Damien George50912e72015-01-20 11:55:10 +0000171 printf("LOAD_CONST_DEC %s", qstr_str(qst));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200172 break;
Damienf03001f2013-11-17 13:19:33 +0000173
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200174 case MP_BC_LOAD_CONST_BYTES:
175 DECODE_QSTR;
Damien George50912e72015-01-20 11:55:10 +0000176 printf("LOAD_CONST_BYTES %s", qstr_str(qst));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200177 break;
Paul Sokolovskyb9b1c002014-04-12 00:34:57 +0300178
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200179 case MP_BC_LOAD_CONST_STRING:
180 DECODE_QSTR;
Damien George50912e72015-01-20 11:55:10 +0000181 printf("LOAD_CONST_STRING '%s'", qstr_str(qst));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200182 break;
Damienf03001f2013-11-17 13:19:33 +0000183
Damien Georged6ed6702015-01-13 23:08:47 +0000184 case MP_BC_LOAD_CONST_OBJ:
185 DECODE_PTR;
186 printf("LOAD_CONST_OBJ %p=", (void*)unum);
187 mp_obj_print((mp_obj_t)unum, PRINT_REPR);
188 break;
189
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200190 case MP_BC_LOAD_NULL:
191 printf("LOAD_NULL");
192 break;
Paul Sokolovsky00a9d132014-04-12 00:32:38 +0300193
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200194 case MP_BC_LOAD_FAST_N:
195 DECODE_UINT;
196 printf("LOAD_FAST_N " UINT_FMT, unum);
197 break;
Damienf03001f2013-11-17 13:19:33 +0000198
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200199 case MP_BC_LOAD_DEREF:
200 DECODE_UINT;
201 printf("LOAD_DEREF " UINT_FMT, unum);
202 break;
Damien George6baf76e2013-12-30 22:32:17 +0000203
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200204 case MP_BC_LOAD_NAME:
205 DECODE_QSTR;
Damien George50912e72015-01-20 11:55:10 +0000206 printf("LOAD_NAME %s", qstr_str(qst));
Damien Georged6ed6702015-01-13 23:08:47 +0000207 if (MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE) {
208 printf(" (cache=%u)", *ip++);
209 }
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200210 break;
Damienf03001f2013-11-17 13:19:33 +0000211
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200212 case MP_BC_LOAD_GLOBAL:
213 DECODE_QSTR;
Damien George50912e72015-01-20 11:55:10 +0000214 printf("LOAD_GLOBAL %s", qstr_str(qst));
Damien Georged6ed6702015-01-13 23:08:47 +0000215 if (MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE) {
216 printf(" (cache=%u)", *ip++);
217 }
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200218 break;
Damienf03001f2013-11-17 13:19:33 +0000219
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200220 case MP_BC_LOAD_ATTR:
221 DECODE_QSTR;
Damien George50912e72015-01-20 11:55:10 +0000222 printf("LOAD_ATTR %s", qstr_str(qst));
Damien Georged6ed6702015-01-13 23:08:47 +0000223 if (MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE) {
224 printf(" (cache=%u)", *ip++);
225 }
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200226 break;
Damienf03001f2013-11-17 13:19:33 +0000227
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200228 case MP_BC_LOAD_METHOD:
229 DECODE_QSTR;
Damien George50912e72015-01-20 11:55:10 +0000230 printf("LOAD_METHOD %s", qstr_str(qst));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200231 break;
Damienf03001f2013-11-17 13:19:33 +0000232
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200233 case MP_BC_LOAD_BUILD_CLASS:
234 printf("LOAD_BUILD_CLASS");
235 break;
Damienf03001f2013-11-17 13:19:33 +0000236
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200237 case MP_BC_LOAD_SUBSCR:
238 printf("LOAD_SUBSCR");
239 break;
Damien George729f7b42014-04-17 22:10:53 +0100240
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200241 case MP_BC_STORE_FAST_N:
242 DECODE_UINT;
243 printf("STORE_FAST_N " UINT_FMT, unum);
244 break;
Damienf03001f2013-11-17 13:19:33 +0000245
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200246 case MP_BC_STORE_DEREF:
247 DECODE_UINT;
248 printf("STORE_DEREF " UINT_FMT, unum);
249 break;
Damien George6baf76e2013-12-30 22:32:17 +0000250
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200251 case MP_BC_STORE_NAME:
252 DECODE_QSTR;
Damien George50912e72015-01-20 11:55:10 +0000253 printf("STORE_NAME %s", qstr_str(qst));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200254 break;
Damienf03001f2013-11-17 13:19:33 +0000255
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200256 case MP_BC_STORE_GLOBAL:
257 DECODE_QSTR;
Damien George50912e72015-01-20 11:55:10 +0000258 printf("STORE_GLOBAL %s", qstr_str(qst));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200259 break;
Damienf03001f2013-11-17 13:19:33 +0000260
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200261 case MP_BC_STORE_ATTR:
262 DECODE_QSTR;
Damien George50912e72015-01-20 11:55:10 +0000263 printf("STORE_ATTR %s", qstr_str(qst));
Damien Georged6ed6702015-01-13 23:08:47 +0000264 if (MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE) {
265 printf(" (cache=%u)", *ip++);
266 }
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200267 break;
Damienf03001f2013-11-17 13:19:33 +0000268
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200269 case MP_BC_STORE_SUBSCR:
270 printf("STORE_SUBSCR");
271 break;
Damienf03001f2013-11-17 13:19:33 +0000272
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200273 case MP_BC_DELETE_FAST:
274 DECODE_UINT;
275 printf("DELETE_FAST " UINT_FMT, unum);
276 break;
Damien George2bf7c092014-04-09 15:26:46 +0100277
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200278 case MP_BC_DELETE_DEREF:
279 DECODE_UINT;
280 printf("DELETE_DEREF " UINT_FMT, unum);
281 break;
Damien George2bf7c092014-04-09 15:26:46 +0100282
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200283 case MP_BC_DELETE_NAME:
284 DECODE_QSTR;
Damien George50912e72015-01-20 11:55:10 +0000285 printf("DELETE_NAME %s", qstr_str(qst));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200286 break;
Damien Georgeddaf6c12014-02-06 20:31:32 +0000287
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200288 case MP_BC_DUP_TOP:
289 printf("DUP_TOP");
290 break;
Damienf03001f2013-11-17 13:19:33 +0000291
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200292 case MP_BC_DUP_TOP_TWO:
293 printf("DUP_TOP_TWO");
294 break;
Damienf03001f2013-11-17 13:19:33 +0000295
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200296 case MP_BC_POP_TOP:
297 printf("POP_TOP");
298 break;
Damienf03001f2013-11-17 13:19:33 +0000299
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200300 case MP_BC_ROT_TWO:
301 printf("ROT_TWO");
302 break;
Damienf03001f2013-11-17 13:19:33 +0000303
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200304 case MP_BC_ROT_THREE:
305 printf("ROT_THREE");
306 break;
Damienf03001f2013-11-17 13:19:33 +0000307
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200308 case MP_BC_JUMP:
309 DECODE_SLABEL;
Paul Sokolovskydf103462014-12-28 21:34:45 +0200310 printf("JUMP " UINT_FMT, ip + unum - mp_showbc_code_start);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200311 break;
Damienf03001f2013-11-17 13:19:33 +0000312
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200313 case MP_BC_POP_JUMP_IF_TRUE:
314 DECODE_SLABEL;
Paul Sokolovskyd8bfd772015-01-07 00:24:34 +0200315 printf("POP_JUMP_IF_TRUE " UINT_FMT, ip + unum - mp_showbc_code_start);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200316 break;
Damienf03001f2013-11-17 13:19:33 +0000317
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200318 case MP_BC_POP_JUMP_IF_FALSE:
319 DECODE_SLABEL;
Paul Sokolovskyd8bfd772015-01-07 00:24:34 +0200320 printf("POP_JUMP_IF_FALSE " UINT_FMT, ip + unum - mp_showbc_code_start);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200321 break;
Damienf03001f2013-11-17 13:19:33 +0000322
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200323 case MP_BC_JUMP_IF_TRUE_OR_POP:
324 DECODE_SLABEL;
Paul Sokolovskyd8bfd772015-01-07 00:24:34 +0200325 printf("JUMP_IF_TRUE_OR_POP " UINT_FMT, ip + unum - mp_showbc_code_start);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200326 break;
Damienf03001f2013-11-17 13:19:33 +0000327
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200328 case MP_BC_JUMP_IF_FALSE_OR_POP:
329 DECODE_SLABEL;
Paul Sokolovskyd8bfd772015-01-07 00:24:34 +0200330 printf("JUMP_IF_FALSE_OR_POP " UINT_FMT, ip + unum - mp_showbc_code_start);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200331 break;
Damienf03001f2013-11-17 13:19:33 +0000332
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200333 case MP_BC_SETUP_WITH:
334 DECODE_ULABEL; // loop-like labels are always forward
Paul Sokolovskydf103462014-12-28 21:34:45 +0200335 printf("SETUP_WITH " UINT_FMT, ip + unum - mp_showbc_code_start);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200336 break;
Paul Sokolovsky182c31a2014-03-27 12:29:34 +0200337
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200338 case MP_BC_WITH_CLEANUP:
339 printf("WITH_CLEANUP");
340 break;
Paul Sokolovsky182c31a2014-03-27 12:29:34 +0200341
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200342 case MP_BC_UNWIND_JUMP:
343 DECODE_SLABEL;
Paul Sokolovskydf103462014-12-28 21:34:45 +0200344 printf("UNWIND_JUMP " UINT_FMT " %d", ip + unum - mp_showbc_code_start, *ip);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200345 ip += 1;
346 break;
Paul Sokolovsky7ee8e462014-01-31 19:33:31 +0200347
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200348 case MP_BC_SETUP_EXCEPT:
349 DECODE_ULABEL; // except labels are always forward
Paul Sokolovskydf103462014-12-28 21:34:45 +0200350 printf("SETUP_EXCEPT " UINT_FMT, ip + unum - mp_showbc_code_start);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200351 break;
Damienf03001f2013-11-17 13:19:33 +0000352
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200353 case MP_BC_SETUP_FINALLY:
354 DECODE_ULABEL; // except labels are always forward
Paul Sokolovskydf103462014-12-28 21:34:45 +0200355 printf("SETUP_FINALLY " UINT_FMT, ip + unum - mp_showbc_code_start);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200356 break;
Paul Sokolovsky7ee8e462014-01-31 19:33:31 +0200357
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200358 case MP_BC_END_FINALLY:
359 // if TOS is an exception, reraises the exception (3 values on TOS)
360 // if TOS is an integer, does something else
361 // if TOS is None, just pops it and continues
362 // else error
363 printf("END_FINALLY");
364 break;
Damienf03001f2013-11-17 13:19:33 +0000365
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200366 case MP_BC_GET_ITER:
367 printf("GET_ITER");
368 break;
Damienf03001f2013-11-17 13:19:33 +0000369
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200370 case MP_BC_FOR_ITER:
371 DECODE_ULABEL; // the jump offset if iteration finishes; for labels are always forward
Paul Sokolovskydf103462014-12-28 21:34:45 +0200372 printf("FOR_ITER " UINT_FMT, ip + unum - mp_showbc_code_start);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200373 break;
Damienf03001f2013-11-17 13:19:33 +0000374
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200375 case MP_BC_POP_BLOCK:
376 // pops block and restores the stack
377 printf("POP_BLOCK");
378 break;
Damienf03001f2013-11-17 13:19:33 +0000379
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200380 case MP_BC_POP_EXCEPT:
381 // pops block, checks it's an exception block, and restores the stack, saving the 3 exception values to local threadstate
382 printf("POP_EXCEPT");
383 break;
Damienf03001f2013-11-17 13:19:33 +0000384
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200385 case MP_BC_NOT:
386 printf("NOT");
387 break;
Damien George9aa2a522014-02-01 23:04:09 +0000388
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200389 case MP_BC_BUILD_TUPLE:
390 DECODE_UINT;
391 printf("BUILD_TUPLE " UINT_FMT, unum);
392 break;
Damienf03001f2013-11-17 13:19:33 +0000393
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200394 case MP_BC_BUILD_LIST:
395 DECODE_UINT;
396 printf("BUILD_LIST " UINT_FMT, unum);
397 break;
Damienf03001f2013-11-17 13:19:33 +0000398
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200399 case MP_BC_LIST_APPEND:
400 DECODE_UINT;
401 printf("LIST_APPEND " UINT_FMT, unum);
402 break;
Damienf03001f2013-11-17 13:19:33 +0000403
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200404 case MP_BC_BUILD_MAP:
405 DECODE_UINT;
406 printf("BUILD_MAP " UINT_FMT, unum);
407 break;
Damienf03001f2013-11-17 13:19:33 +0000408
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200409 case MP_BC_STORE_MAP:
410 printf("STORE_MAP");
411 break;
Damienf03001f2013-11-17 13:19:33 +0000412
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200413 case MP_BC_MAP_ADD:
414 DECODE_UINT;
415 printf("MAP_ADD " UINT_FMT, unum);
416 break;
Damienf03001f2013-11-17 13:19:33 +0000417
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200418 case MP_BC_BUILD_SET:
419 DECODE_UINT;
420 printf("BUILD_SET " UINT_FMT, unum);
421 break;
Damienf03001f2013-11-17 13:19:33 +0000422
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200423 case MP_BC_SET_ADD:
424 DECODE_UINT;
425 printf("SET_ADD " UINT_FMT, unum);
426 break;
Damienf03001f2013-11-17 13:19:33 +0000427
Damien Georgefb510b32014-06-01 13:32:54 +0100428#if MICROPY_PY_BUILTINS_SLICE
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200429 case MP_BC_BUILD_SLICE:
430 DECODE_UINT;
431 printf("BUILD_SLICE " UINT_FMT, unum);
432 break;
Damien George20006db2014-01-18 14:10:48 +0000433#endif
434
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200435 case MP_BC_UNPACK_SEQUENCE:
436 DECODE_UINT;
437 printf("UNPACK_SEQUENCE " UINT_FMT, unum);
438 break;
Damienff099f32013-11-26 15:14:50 +0000439
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200440 case MP_BC_MAKE_FUNCTION:
441 DECODE_PTR;
442 printf("MAKE_FUNCTION %p", (void*)unum);
443 break;
Damienf03001f2013-11-17 13:19:33 +0000444
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200445 case MP_BC_MAKE_FUNCTION_DEFARGS:
446 DECODE_PTR;
447 printf("MAKE_FUNCTION_DEFARGS %p", (void*)unum);
448 break;
Paul Sokolovsky90750022014-02-01 15:05:04 +0200449
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200450 case MP_BC_MAKE_CLOSURE: {
451 DECODE_PTR;
452 mp_uint_t n_closed_over = *ip++;
453 printf("MAKE_CLOSURE %p " UINT_FMT, (void*)unum, n_closed_over);
454 break;
Damienf03001f2013-11-17 13:19:33 +0000455 }
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200456
457 case MP_BC_MAKE_CLOSURE_DEFARGS: {
458 DECODE_PTR;
459 mp_uint_t n_closed_over = *ip++;
460 printf("MAKE_CLOSURE_DEFARGS %p " UINT_FMT, (void*)unum, n_closed_over);
461 break;
462 }
463
464 case MP_BC_CALL_FUNCTION:
465 DECODE_UINT;
466 printf("CALL_FUNCTION n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff);
467 break;
468
469 case MP_BC_CALL_FUNCTION_VAR_KW:
470 DECODE_UINT;
471 printf("CALL_FUNCTION_VAR_KW n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff);
472 break;
473
474 case MP_BC_CALL_METHOD:
475 DECODE_UINT;
476 printf("CALL_METHOD n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff);
477 break;
478
479 case MP_BC_CALL_METHOD_VAR_KW:
480 DECODE_UINT;
481 printf("CALL_METHOD_VAR_KW n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff);
482 break;
483
484 case MP_BC_RETURN_VALUE:
485 printf("RETURN_VALUE");
486 break;
487
488 case MP_BC_RAISE_VARARGS:
489 unum = *ip++;
490 printf("RAISE_VARARGS " UINT_FMT, unum);
491 break;
492
493 case MP_BC_YIELD_VALUE:
494 printf("YIELD_VALUE");
495 break;
496
497 case MP_BC_YIELD_FROM:
498 printf("YIELD_FROM");
499 break;
500
501 case MP_BC_IMPORT_NAME:
502 DECODE_QSTR;
Damien George50912e72015-01-20 11:55:10 +0000503 printf("IMPORT_NAME '%s'", qstr_str(qst));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200504 break;
505
506 case MP_BC_IMPORT_FROM:
507 DECODE_QSTR;
Damien George50912e72015-01-20 11:55:10 +0000508 printf("IMPORT_FROM '%s'", qstr_str(qst));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200509 break;
510
511 case MP_BC_IMPORT_STAR:
512 printf("IMPORT_STAR");
513 break;
514
515 default:
516 if (ip[-1] < MP_BC_LOAD_CONST_SMALL_INT_MULTI + 64) {
517 printf("LOAD_CONST_SMALL_INT " INT_FMT, (mp_int_t)ip[-1] - MP_BC_LOAD_CONST_SMALL_INT_MULTI - 16);
518 } else if (ip[-1] < MP_BC_LOAD_FAST_MULTI + 16) {
519 printf("LOAD_FAST " UINT_FMT, (mp_uint_t)ip[-1] - MP_BC_LOAD_FAST_MULTI);
520 } else if (ip[-1] < MP_BC_STORE_FAST_MULTI + 16) {
521 printf("STORE_FAST " UINT_FMT, (mp_uint_t)ip[-1] - MP_BC_STORE_FAST_MULTI);
522 } else if (ip[-1] < MP_BC_UNARY_OP_MULTI + 5) {
523 printf("UNARY_OP " UINT_FMT, (mp_uint_t)ip[-1] - MP_BC_UNARY_OP_MULTI);
524 } else if (ip[-1] < MP_BC_BINARY_OP_MULTI + 35) {
Paul Sokolovsky1ee17852014-12-28 21:41:58 +0200525 mp_uint_t op = ip[-1] - MP_BC_BINARY_OP_MULTI;
526 printf("BINARY_OP " UINT_FMT " %s", op, qstr_str(mp_binary_op_method_name[op]));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200527 } else {
528 printf("code %p, byte code 0x%02x not implemented\n", ip, ip[-1]);
529 assert(0);
530 return ip;
531 }
532 break;
533 }
534
535 return ip;
536}
537
538void mp_bytecode_print2(const byte *ip, mp_uint_t len) {
Paul Sokolovskydf103462014-12-28 21:34:45 +0200539 mp_showbc_code_start = ip;
Damien George963a5a32015-01-16 17:47:07 +0000540 while (ip < len + mp_showbc_code_start) {
Paul Sokolovskydf103462014-12-28 21:34:45 +0200541 printf("%02u ", (uint)(ip - mp_showbc_code_start));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200542 ip = mp_bytecode_print_str(ip);
Damienf03001f2013-11-17 13:19:33 +0000543 printf("\n");
544 }
545}
Damien Georged3ebe482014-01-07 15:20:33 +0000546
Damien Georgecbd2f742014-01-19 11:48:48 +0000547#endif // MICROPY_DEBUG_PRINTERS