blob: 6913d18c1ca824be6103cd6476c1ab751d513601 [file] [log] [blame]
Damien George04b91472014-05-03 23:27:38 +01001/*
Alexander Steffen55f33242017-06-30 09:22:17 +02002 * This file is part of the MicroPython project, http://micropython.org/
Damien George04b91472014-05-03 23:27:38 +01003 *
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"
Damien George1692cad2022-03-16 11:39:27 +110031#include "py/emitglue.h"
Damien George51dfcb42015-01-01 20:27:54 +000032
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 { \
Damien George69661f32020-02-27 15:36:53 +110036 unum = 0; \
37 do { \
38 unum = (unum << 7) + (*ip & 0x7f); \
39 } while ((*ip++ & 0x80) != 0); \
Paul Sokolovsky1d30b112014-02-21 02:31:05 +020040}
Damien George538c3c02022-03-16 09:37:58 +110041
42#define DECODE_ULABEL \
43 do { \
44 if (ip[0] & 0x80) { \
45 unum = ((ip[0] & 0x7f) | (ip[1] << 7)); \
46 ip += 2; \
47 } else { \
48 unum = ip[0]; \
49 ip += 1; \
50 } \
51 } while (0)
52
53#define DECODE_SLABEL \
54 do { \
55 if (ip[0] & 0x80) { \
56 unum = ((ip[0] & 0x7f) | (ip[1] << 7)) - 0x4000; \
57 ip += 2; \
58 } else { \
59 unum = ip[0] - 0x40; \
60 ip += 1; \
61 } \
62 } while (0)
Damien Georgec8e9c0d2015-11-02 17:27:18 +000063
Damien Georgef2040bf2021-10-22 22:22:47 +110064#if MICROPY_EMIT_BYTECODE_USES_QSTR_TABLE
Damien Georgec8e9c0d2015-11-02 17:27:18 +000065
66#define DECODE_QSTR \
Damien Georgec8e9c0d2015-11-02 17:27:18 +000067 DECODE_UINT; \
Damien George1692cad2022-03-16 11:39:27 +110068 qst = qstr_table[unum]
Damien Georgec8e9c0d2015-11-02 17:27:18 +000069
70#else
71
Damien Georgef2040bf2021-10-22 22:22:47 +110072#define DECODE_QSTR \
73 DECODE_UINT; \
74 qst = unum;
Damienf03001f2013-11-17 13:19:33 +000075
Damien Georgec8e9c0d2015-11-02 17:27:18 +000076#endif
77
Damien Georgef2040bf2021-10-22 22:22:47 +110078#define DECODE_PTR \
Damien George1692cad2022-03-16 11:39:27 +110079 DECODE_UINT; \
80 unum = (mp_uint_t)(uintptr_t)child_table[unum]
Paul Sokolovsky343266e2014-12-27 05:00:08 +020081
Damien Georgef2040bf2021-10-22 22:22:47 +110082#define DECODE_OBJ \
83 DECODE_UINT; \
Damien George1692cad2022-03-16 11:39:27 +110084 unum = (mp_uint_t)obj_table[unum]
Damien Georgef2040bf2021-10-22 22:22:47 +110085
Damien Georgedef6ad42024-02-13 10:46:11 +110086void mp_bytecode_print(const mp_print_t *print, const mp_raw_code_t *rc, size_t fun_data_len, const mp_module_constants_t *cm) {
Damien George1692cad2022-03-16 11:39:27 +110087 const byte *ip_start = rc->fun_data;
88 const byte *ip = rc->fun_data;
Damien George6baf76e2013-12-30 22:32:17 +000089
Damien Georgeb5ebfad2019-09-16 22:12:59 +100090 // Decode prelude
91 MP_BC_PRELUDE_SIG_DECODE(ip);
Damien Georgec8c0fd42019-09-25 15:45:47 +100092 MP_BC_PRELUDE_SIZE_DECODE(ip);
Damien George73496fb2014-04-13 14:51:56 +010093 const byte *code_info = ip;
Damien George08335002014-01-18 23:24:36 +000094
Damien Georgeb534e1b2014-09-04 14:44:01 +010095 qstr block_name = mp_decode_uint(&code_info);
Damien Georgef2040bf2021-10-22 22:22:47 +110096 #if MICROPY_EMIT_BYTECODE_USES_QSTR_TABLE
97 block_name = cm->qstr_table[block_name];
98 qstr source_file = cm->qstr_table[0];
99 #else
100 qstr source_file = cm->source_file;
Damien Georgec8e9c0d2015-11-02 17:27:18 +0000101 #endif
Damien George1692cad2022-03-16 11:39:27 +1100102 mp_printf(print, "File %s, code block '%s' (descriptor: %p, bytecode @%p %u bytes)\n",
Damien Georgedef6ad42024-02-13 10:46:11 +1100103 qstr_str(source_file), qstr_str(block_name), rc, ip_start, (unsigned)fun_data_len);
Paul Sokolovsky8bf84042014-06-02 16:11:16 +0300104
Damien George564963a2014-10-24 14:42:50 +0000105 // raw bytecode dump
Damien George1692cad2022-03-16 11:39:27 +1100106 size_t prelude_size = ip - ip_start + n_info + n_cell;
Damien Georged6dc4cb2021-12-15 16:54:47 +1100107 mp_printf(print, "Raw bytecode (code_info_size=%u, bytecode_size=%u):\n",
Damien Georgedef6ad42024-02-13 10:46:11 +1100108 (unsigned)prelude_size, (unsigned)(fun_data_len - prelude_size));
109 for (size_t i = 0; i < fun_data_len; i++) {
Damien George564963a2014-10-24 14:42:50 +0000110 if (i > 0 && i % 16 == 0) {
Damien George85f2b232020-09-11 17:22:28 +1000111 mp_printf(print, "\n");
Damien George564963a2014-10-24 14:42:50 +0000112 }
Damien George1692cad2022-03-16 11:39:27 +1100113 mp_printf(print, " %02x", ip_start[i]);
Damien George564963a2014-10-24 14:42:50 +0000114 }
Damien George85f2b232020-09-11 17:22:28 +1000115 mp_printf(print, "\n");
Damien George564963a2014-10-24 14:42:50 +0000116
Damien George1084b0f2014-10-25 15:07:02 +0100117 // bytecode prelude: arg names (as qstr objects)
Damien George85f2b232020-09-11 17:22:28 +1000118 mp_printf(print, "arg names:");
Damien George3a3db4d2015-10-22 23:45:37 +0100119 for (mp_uint_t i = 0; i < n_pos_args + n_kwonly_args; i++) {
Damien Georgef2040bf2021-10-22 22:22:47 +1100120 qstr qst = mp_decode_uint(&code_info);
121 #if MICROPY_EMIT_BYTECODE_USES_QSTR_TABLE
122 qst = cm->qstr_table[qst];
123 #endif
124 mp_printf(print, " %s", qstr_str(qst));
Damien George1084b0f2014-10-25 15:07:02 +0100125 }
Damien George85f2b232020-09-11 17:22:28 +1000126 mp_printf(print, "\n");
Damien George1084b0f2014-10-25 15:07:02 +0100127
Damien George85f2b232020-09-11 17:22:28 +1000128 mp_printf(print, "(N_STATE %u)\n", (unsigned)n_state);
129 mp_printf(print, "(N_EXC_STACK %u)\n", (unsigned)n_exc_stack);
Damien George9b7f5832015-03-18 17:47:47 +0000130
Damien Georgec8c0fd42019-09-25 15:45:47 +1000131 // skip over code_info
132 ip += n_info;
Damien Georgef2040bf2021-10-22 22:22:47 +1100133 const byte *line_info_top = ip;
Damien George440f0412014-03-28 18:38:20 +0000134
135 // bytecode prelude: initialise closed over variables
Damien Georgec8c0fd42019-09-25 15:45:47 +1000136 for (size_t i = 0; i < n_cell; ++i) {
137 uint local_num = *ip++;
Damien George85f2b232020-09-11 17:22:28 +1000138 mp_printf(print, "(INIT_CELL %u)\n", local_num);
Damien George6baf76e2013-12-30 22:32:17 +0000139 }
140
Damien George73496fb2014-04-13 14:51:56 +0100141 // print out line number info
142 {
Damien Georgec8c0fd42019-09-25 15:45:47 +1000143 mp_int_t bc = 0;
Damien George40f3c022014-07-03 13:25:24 +0100144 mp_uint_t source_line = 1;
Damien George85f2b232020-09-11 17:22:28 +1000145 mp_printf(print, " bc=" INT_FMT " line=" UINT_FMT "\n", bc, source_line);
Damien Georgef2040bf2021-10-22 22:22:47 +1100146 for (const byte *ci = code_info; ci < line_info_top;) {
Damien George4747bec2014-07-31 16:12:01 +0000147 if ((ci[0] & 0x80) == 0) {
148 // 0b0LLBBBBB encoding
149 bc += ci[0] & 0x1f;
150 source_line += ci[0] >> 5;
151 ci += 1;
152 } else {
153 // 0b1LLLBBBB 0bLLLLLLLL encoding (l's LSB in second byte)
154 bc += ci[0] & 0xf;
155 source_line += ((ci[0] << 4) & 0x700) | ci[1];
156 ci += 2;
157 }
Damien George85f2b232020-09-11 17:22:28 +1000158 mp_printf(print, " bc=" INT_FMT " line=" UINT_FMT "\n", bc, source_line);
Damien George73496fb2014-04-13 14:51:56 +0100159 }
160 }
Damien Georgedef6ad42024-02-13 10:46:11 +1100161 mp_bytecode_print2(print, ip, fun_data_len - prelude_size, rc->children, cm);
Paul Sokolovskyc5e32c62014-04-23 03:40:24 +0300162}
Damien George73496fb2014-04-13 14:51:56 +0100163
Damien George1692cad2022-03-16 11:39:27 +1100164const byte *mp_bytecode_print_str(const mp_print_t *print, const byte *ip_start, const byte *ip, mp_raw_code_t *const *child_table, const mp_module_constants_t *cm) {
165 #if MICROPY_EMIT_BYTECODE_USES_QSTR_TABLE
166 const qstr_short_t *qstr_table = cm->qstr_table;
167 #endif
168 const mp_obj_t *obj_table = cm->obj_table;
Damien George40f3c022014-07-03 13:25:24 +0100169 mp_uint_t unum;
Damien George50912e72015-01-20 11:55:10 +0000170 qstr qst;
Damienf03001f2013-11-17 13:19:33 +0000171
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200172 switch (*ip++) {
173 case MP_BC_LOAD_CONST_FALSE:
Damien George85f2b232020-09-11 17:22:28 +1000174 mp_printf(print, "LOAD_CONST_FALSE");
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200175 break;
Damienf03001f2013-11-17 13:19:33 +0000176
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200177 case MP_BC_LOAD_CONST_NONE:
Damien George85f2b232020-09-11 17:22:28 +1000178 mp_printf(print, "LOAD_CONST_NONE");
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200179 break;
Damienf03001f2013-11-17 13:19:33 +0000180
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200181 case MP_BC_LOAD_CONST_TRUE:
Damien George85f2b232020-09-11 17:22:28 +1000182 mp_printf(print, "LOAD_CONST_TRUE");
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200183 break;
Damien Georgee9906ac2014-01-04 18:44:46 +0000184
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200185 case MP_BC_LOAD_CONST_SMALL_INT: {
186 mp_int_t num = 0;
187 if ((ip[0] & 0x40) != 0) {
188 // Number is negative
189 num--;
Paul Sokolovsky047cd402014-02-19 15:47:59 +0200190 }
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200191 do {
Jeff Epler413f34c2021-06-08 07:45:56 -0500192 num = ((mp_uint_t)num << 7) | (*ip & 0x7f);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200193 } while ((*ip++ & 0x80) != 0);
Damien George85f2b232020-09-11 17:22:28 +1000194 mp_printf(print, "LOAD_CONST_SMALL_INT " INT_FMT, num);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200195 break;
196 }
Damienf03001f2013-11-17 13:19:33 +0000197
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200198 case MP_BC_LOAD_CONST_STRING:
199 DECODE_QSTR;
Damien George85f2b232020-09-11 17:22:28 +1000200 mp_printf(print, "LOAD_CONST_STRING '%s'", qstr_str(qst));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200201 break;
Damienf03001f2013-11-17 13:19:33 +0000202
Damien Georged6ed6702015-01-13 23:08:47 +0000203 case MP_BC_LOAD_CONST_OBJ:
Damien George999cedb2015-11-27 17:01:44 +0000204 DECODE_OBJ;
Damien George85f2b232020-09-11 17:22:28 +1000205 mp_printf(print, "LOAD_CONST_OBJ %p=", MP_OBJ_TO_PTR(unum));
206 mp_obj_print_helper(print, (mp_obj_t)unum, PRINT_REPR);
Damien Georged6ed6702015-01-13 23:08:47 +0000207 break;
208
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200209 case MP_BC_LOAD_NULL:
Damien George85f2b232020-09-11 17:22:28 +1000210 mp_printf(print, "LOAD_NULL");
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200211 break;
Paul Sokolovsky00a9d132014-04-12 00:32:38 +0300212
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200213 case MP_BC_LOAD_FAST_N:
214 DECODE_UINT;
Damien George85f2b232020-09-11 17:22:28 +1000215 mp_printf(print, "LOAD_FAST_N " UINT_FMT, unum);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200216 break;
Damienf03001f2013-11-17 13:19:33 +0000217
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200218 case MP_BC_LOAD_DEREF:
219 DECODE_UINT;
Damien George85f2b232020-09-11 17:22:28 +1000220 mp_printf(print, "LOAD_DEREF " UINT_FMT, unum);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200221 break;
Damien George6baf76e2013-12-30 22:32:17 +0000222
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200223 case MP_BC_LOAD_NAME:
224 DECODE_QSTR;
Damien George85f2b232020-09-11 17:22:28 +1000225 mp_printf(print, "LOAD_NAME %s", qstr_str(qst));
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_GLOBAL:
229 DECODE_QSTR;
Damien George85f2b232020-09-11 17:22:28 +1000230 mp_printf(print, "LOAD_GLOBAL %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_ATTR:
234 DECODE_QSTR;
Damien George85f2b232020-09-11 17:22:28 +1000235 mp_printf(print, "LOAD_ATTR %s", qstr_str(qst));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200236 break;
Damienf03001f2013-11-17 13:19:33 +0000237
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200238 case MP_BC_LOAD_METHOD:
239 DECODE_QSTR;
Damien George85f2b232020-09-11 17:22:28 +1000240 mp_printf(print, "LOAD_METHOD %s", qstr_str(qst));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200241 break;
Damienf03001f2013-11-17 13:19:33 +0000242
Damien Georgedd11af22017-04-19 09:45:59 +1000243 case MP_BC_LOAD_SUPER_METHOD:
244 DECODE_QSTR;
Damien George85f2b232020-09-11 17:22:28 +1000245 mp_printf(print, "LOAD_SUPER_METHOD %s", qstr_str(qst));
Damien Georgedd11af22017-04-19 09:45:59 +1000246 break;
247
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200248 case MP_BC_LOAD_BUILD_CLASS:
Damien George85f2b232020-09-11 17:22:28 +1000249 mp_printf(print, "LOAD_BUILD_CLASS");
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200250 break;
Damienf03001f2013-11-17 13:19:33 +0000251
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200252 case MP_BC_LOAD_SUBSCR:
Damien George85f2b232020-09-11 17:22:28 +1000253 mp_printf(print, "LOAD_SUBSCR");
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200254 break;
Damien George729f7b42014-04-17 22:10:53 +0100255
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200256 case MP_BC_STORE_FAST_N:
257 DECODE_UINT;
Damien George85f2b232020-09-11 17:22:28 +1000258 mp_printf(print, "STORE_FAST_N " UINT_FMT, unum);
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_DEREF:
262 DECODE_UINT;
Damien George85f2b232020-09-11 17:22:28 +1000263 mp_printf(print, "STORE_DEREF " UINT_FMT, unum);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200264 break;
Damien George6baf76e2013-12-30 22:32:17 +0000265
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200266 case MP_BC_STORE_NAME:
267 DECODE_QSTR;
Damien George85f2b232020-09-11 17:22:28 +1000268 mp_printf(print, "STORE_NAME %s", qstr_str(qst));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200269 break;
Damienf03001f2013-11-17 13:19:33 +0000270
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200271 case MP_BC_STORE_GLOBAL:
272 DECODE_QSTR;
Damien George85f2b232020-09-11 17:22:28 +1000273 mp_printf(print, "STORE_GLOBAL %s", qstr_str(qst));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200274 break;
Damienf03001f2013-11-17 13:19:33 +0000275
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200276 case MP_BC_STORE_ATTR:
277 DECODE_QSTR;
Damien George85f2b232020-09-11 17:22:28 +1000278 mp_printf(print, "STORE_ATTR %s", qstr_str(qst));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200279 break;
Damienf03001f2013-11-17 13:19:33 +0000280
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200281 case MP_BC_STORE_SUBSCR:
Damien George85f2b232020-09-11 17:22:28 +1000282 mp_printf(print, "STORE_SUBSCR");
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200283 break;
Damienf03001f2013-11-17 13:19:33 +0000284
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200285 case MP_BC_DELETE_FAST:
286 DECODE_UINT;
Damien George85f2b232020-09-11 17:22:28 +1000287 mp_printf(print, "DELETE_FAST " UINT_FMT, unum);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200288 break;
Damien George2bf7c092014-04-09 15:26:46 +0100289
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200290 case MP_BC_DELETE_DEREF:
291 DECODE_UINT;
Damien George85f2b232020-09-11 17:22:28 +1000292 mp_printf(print, "DELETE_DEREF " UINT_FMT, unum);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200293 break;
Damien George2bf7c092014-04-09 15:26:46 +0100294
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200295 case MP_BC_DELETE_NAME:
296 DECODE_QSTR;
Damien George85f2b232020-09-11 17:22:28 +1000297 mp_printf(print, "DELETE_NAME %s", qstr_str(qst));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200298 break;
Damien Georgeddaf6c12014-02-06 20:31:32 +0000299
Damien George8e9a7122015-03-20 17:12:09 +0000300 case MP_BC_DELETE_GLOBAL:
301 DECODE_QSTR;
Damien George85f2b232020-09-11 17:22:28 +1000302 mp_printf(print, "DELETE_GLOBAL %s", qstr_str(qst));
Damien George8e9a7122015-03-20 17:12:09 +0000303 break;
304
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200305 case MP_BC_DUP_TOP:
Damien George85f2b232020-09-11 17:22:28 +1000306 mp_printf(print, "DUP_TOP");
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200307 break;
Damienf03001f2013-11-17 13:19:33 +0000308
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200309 case MP_BC_DUP_TOP_TWO:
Damien George85f2b232020-09-11 17:22:28 +1000310 mp_printf(print, "DUP_TOP_TWO");
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_TOP:
Damien George85f2b232020-09-11 17:22:28 +1000314 mp_printf(print, "POP_TOP");
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200315 break;
Damienf03001f2013-11-17 13:19:33 +0000316
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200317 case MP_BC_ROT_TWO:
Damien George85f2b232020-09-11 17:22:28 +1000318 mp_printf(print, "ROT_TWO");
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200319 break;
Damienf03001f2013-11-17 13:19:33 +0000320
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200321 case MP_BC_ROT_THREE:
Damien George85f2b232020-09-11 17:22:28 +1000322 mp_printf(print, "ROT_THREE");
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200323 break;
Damienf03001f2013-11-17 13:19:33 +0000324
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200325 case MP_BC_JUMP:
326 DECODE_SLABEL;
Damien George1692cad2022-03-16 11:39:27 +1100327 mp_printf(print, "JUMP " UINT_FMT, (mp_uint_t)(ip + unum - ip_start));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200328 break;
Damienf03001f2013-11-17 13:19:33 +0000329
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200330 case MP_BC_POP_JUMP_IF_TRUE:
331 DECODE_SLABEL;
Damien George1692cad2022-03-16 11:39:27 +1100332 mp_printf(print, "POP_JUMP_IF_TRUE " UINT_FMT, (mp_uint_t)(ip + unum - ip_start));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200333 break;
Damienf03001f2013-11-17 13:19:33 +0000334
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200335 case MP_BC_POP_JUMP_IF_FALSE:
336 DECODE_SLABEL;
Damien George1692cad2022-03-16 11:39:27 +1100337 mp_printf(print, "POP_JUMP_IF_FALSE " UINT_FMT, (mp_uint_t)(ip + unum - ip_start));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200338 break;
Damienf03001f2013-11-17 13:19:33 +0000339
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200340 case MP_BC_JUMP_IF_TRUE_OR_POP:
Damien George6d11c692022-03-21 16:36:13 +1100341 DECODE_ULABEL;
Damien George1692cad2022-03-16 11:39:27 +1100342 mp_printf(print, "JUMP_IF_TRUE_OR_POP " UINT_FMT, (mp_uint_t)(ip + unum - ip_start));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200343 break;
Damienf03001f2013-11-17 13:19:33 +0000344
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200345 case MP_BC_JUMP_IF_FALSE_OR_POP:
Damien George6d11c692022-03-21 16:36:13 +1100346 DECODE_ULABEL;
Damien George1692cad2022-03-16 11:39:27 +1100347 mp_printf(print, "JUMP_IF_FALSE_OR_POP " UINT_FMT, (mp_uint_t)(ip + unum - ip_start));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200348 break;
Damienf03001f2013-11-17 13:19:33 +0000349
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200350 case MP_BC_SETUP_WITH:
351 DECODE_ULABEL; // loop-like labels are always forward
Damien George1692cad2022-03-16 11:39:27 +1100352 mp_printf(print, "SETUP_WITH " UINT_FMT, (mp_uint_t)(ip + unum - ip_start));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200353 break;
Paul Sokolovsky182c31a2014-03-27 12:29:34 +0200354
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200355 case MP_BC_WITH_CLEANUP:
Damien George85f2b232020-09-11 17:22:28 +1000356 mp_printf(print, "WITH_CLEANUP");
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200357 break;
Paul Sokolovsky182c31a2014-03-27 12:29:34 +0200358
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200359 case MP_BC_UNWIND_JUMP:
360 DECODE_SLABEL;
Damien George1692cad2022-03-16 11:39:27 +1100361 mp_printf(print, "UNWIND_JUMP " UINT_FMT " %d", (mp_uint_t)(ip + unum - ip_start), *ip);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200362 ip += 1;
363 break;
Paul Sokolovsky7ee8e462014-01-31 19:33:31 +0200364
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200365 case MP_BC_SETUP_EXCEPT:
366 DECODE_ULABEL; // except labels are always forward
Damien George1692cad2022-03-16 11:39:27 +1100367 mp_printf(print, "SETUP_EXCEPT " UINT_FMT, (mp_uint_t)(ip + unum - ip_start));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200368 break;
Damienf03001f2013-11-17 13:19:33 +0000369
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200370 case MP_BC_SETUP_FINALLY:
371 DECODE_ULABEL; // except labels are always forward
Damien George1692cad2022-03-16 11:39:27 +1100372 mp_printf(print, "SETUP_FINALLY " UINT_FMT, (mp_uint_t)(ip + unum - ip_start));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200373 break;
Paul Sokolovsky7ee8e462014-01-31 19:33:31 +0200374
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200375 case MP_BC_END_FINALLY:
376 // if TOS is an exception, reraises the exception (3 values on TOS)
377 // if TOS is an integer, does something else
378 // if TOS is None, just pops it and continues
379 // else error
Damien George85f2b232020-09-11 17:22:28 +1000380 mp_printf(print, "END_FINALLY");
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200381 break;
Damienf03001f2013-11-17 13:19:33 +0000382
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200383 case MP_BC_GET_ITER:
Damien George85f2b232020-09-11 17:22:28 +1000384 mp_printf(print, "GET_ITER");
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200385 break;
Damienf03001f2013-11-17 13:19:33 +0000386
Damien Georgef4df3aa2016-01-09 23:59:52 +0000387 case MP_BC_GET_ITER_STACK:
Damien George85f2b232020-09-11 17:22:28 +1000388 mp_printf(print, "GET_ITER_STACK");
Damien Georgef4df3aa2016-01-09 23:59:52 +0000389 break;
390
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200391 case MP_BC_FOR_ITER:
392 DECODE_ULABEL; // the jump offset if iteration finishes; for labels are always forward
Damien George1692cad2022-03-16 11:39:27 +1100393 mp_printf(print, "FOR_ITER " UINT_FMT, (mp_uint_t)(ip + unum - ip_start));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200394 break;
Damienf03001f2013-11-17 13:19:33 +0000395
Damien George5a2599d2019-02-15 12:18:59 +1100396 case MP_BC_POP_EXCEPT_JUMP:
397 DECODE_ULABEL; // these labels are always forward
Damien George1692cad2022-03-16 11:39:27 +1100398 mp_printf(print, "POP_EXCEPT_JUMP " UINT_FMT, (mp_uint_t)(ip + unum - ip_start));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200399 break;
Damienf03001f2013-11-17 13:19:33 +0000400
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200401 case MP_BC_BUILD_TUPLE:
402 DECODE_UINT;
Damien George85f2b232020-09-11 17:22:28 +1000403 mp_printf(print, "BUILD_TUPLE " UINT_FMT, unum);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200404 break;
Damienf03001f2013-11-17 13:19:33 +0000405
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200406 case MP_BC_BUILD_LIST:
407 DECODE_UINT;
Damien George85f2b232020-09-11 17:22:28 +1000408 mp_printf(print, "BUILD_LIST " UINT_FMT, unum);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200409 break;
Damienf03001f2013-11-17 13:19:33 +0000410
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200411 case MP_BC_BUILD_MAP:
412 DECODE_UINT;
Damien George85f2b232020-09-11 17:22:28 +1000413 mp_printf(print, "BUILD_MAP " UINT_FMT, unum);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200414 break;
Damienf03001f2013-11-17 13:19:33 +0000415
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200416 case MP_BC_STORE_MAP:
Damien George85f2b232020-09-11 17:22:28 +1000417 mp_printf(print, "STORE_MAP");
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200418 break;
Damienf03001f2013-11-17 13:19:33 +0000419
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200420 case MP_BC_BUILD_SET:
421 DECODE_UINT;
Damien George85f2b232020-09-11 17:22:28 +1000422 mp_printf(print, "BUILD_SET " UINT_FMT, unum);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200423 break;
Damienf03001f2013-11-17 13:19:33 +0000424
Damien George69661f32020-02-27 15:36:53 +1100425 #if MICROPY_PY_BUILTINS_SLICE
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200426 case MP_BC_BUILD_SLICE:
427 DECODE_UINT;
Damien George85f2b232020-09-11 17:22:28 +1000428 mp_printf(print, "BUILD_SLICE " UINT_FMT, unum);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200429 break;
Damien George69661f32020-02-27 15:36:53 +1100430 #endif
Damien George20006db2014-01-18 14:10:48 +0000431
Damien Georgeadaf0d82016-09-19 08:46:01 +1000432 case MP_BC_STORE_COMP:
433 DECODE_UINT;
Damien George85f2b232020-09-11 17:22:28 +1000434 mp_printf(print, "STORE_COMP " UINT_FMT, unum);
Damien Georgeadaf0d82016-09-19 08:46:01 +1000435 break;
436
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200437 case MP_BC_UNPACK_SEQUENCE:
438 DECODE_UINT;
Damien George85f2b232020-09-11 17:22:28 +1000439 mp_printf(print, "UNPACK_SEQUENCE " UINT_FMT, unum);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200440 break;
Damienff099f32013-11-26 15:14:50 +0000441
Damien Georgec8870b72015-06-18 15:12:17 +0000442 case MP_BC_UNPACK_EX:
443 DECODE_UINT;
Damien George85f2b232020-09-11 17:22:28 +1000444 mp_printf(print, "UNPACK_EX " UINT_FMT, unum);
Damien Georgec8870b72015-06-18 15:12:17 +0000445 break;
446
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200447 case MP_BC_MAKE_FUNCTION:
448 DECODE_PTR;
Damien George85f2b232020-09-11 17:22:28 +1000449 mp_printf(print, "MAKE_FUNCTION %p", (void *)(uintptr_t)unum);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200450 break;
Damienf03001f2013-11-17 13:19:33 +0000451
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200452 case MP_BC_MAKE_FUNCTION_DEFARGS:
453 DECODE_PTR;
Damien George85f2b232020-09-11 17:22:28 +1000454 mp_printf(print, "MAKE_FUNCTION_DEFARGS %p", (void *)(uintptr_t)unum);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200455 break;
Paul Sokolovsky90750022014-02-01 15:05:04 +0200456
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200457 case MP_BC_MAKE_CLOSURE: {
458 DECODE_PTR;
459 mp_uint_t n_closed_over = *ip++;
Damien George85f2b232020-09-11 17:22:28 +1000460 mp_printf(print, "MAKE_CLOSURE %p " UINT_FMT, (void *)(uintptr_t)unum, n_closed_over);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200461 break;
Damienf03001f2013-11-17 13:19:33 +0000462 }
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200463
464 case MP_BC_MAKE_CLOSURE_DEFARGS: {
465 DECODE_PTR;
466 mp_uint_t n_closed_over = *ip++;
Damien George85f2b232020-09-11 17:22:28 +1000467 mp_printf(print, "MAKE_CLOSURE_DEFARGS %p " UINT_FMT, (void *)(uintptr_t)unum, n_closed_over);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200468 break;
469 }
470
471 case MP_BC_CALL_FUNCTION:
472 DECODE_UINT;
Damien George85f2b232020-09-11 17:22:28 +1000473 mp_printf(print, "CALL_FUNCTION n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200474 break;
475
476 case MP_BC_CALL_FUNCTION_VAR_KW:
477 DECODE_UINT;
Damien George85f2b232020-09-11 17:22:28 +1000478 mp_printf(print, "CALL_FUNCTION_VAR_KW n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200479 break;
480
481 case MP_BC_CALL_METHOD:
482 DECODE_UINT;
Damien George85f2b232020-09-11 17:22:28 +1000483 mp_printf(print, "CALL_METHOD n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200484 break;
485
486 case MP_BC_CALL_METHOD_VAR_KW:
487 DECODE_UINT;
Damien George85f2b232020-09-11 17:22:28 +1000488 mp_printf(print, "CALL_METHOD_VAR_KW n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200489 break;
490
491 case MP_BC_RETURN_VALUE:
Damien George85f2b232020-09-11 17:22:28 +1000492 mp_printf(print, "RETURN_VALUE");
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200493 break;
494
Damien George02db91a2019-08-22 12:39:07 +1000495 case MP_BC_RAISE_LAST:
Damien George85f2b232020-09-11 17:22:28 +1000496 mp_printf(print, "RAISE_LAST");
Damien George02db91a2019-08-22 12:39:07 +1000497 break;
498
499 case MP_BC_RAISE_OBJ:
Damien George85f2b232020-09-11 17:22:28 +1000500 mp_printf(print, "RAISE_OBJ");
Damien George02db91a2019-08-22 12:39:07 +1000501 break;
502
503 case MP_BC_RAISE_FROM:
Damien George85f2b232020-09-11 17:22:28 +1000504 mp_printf(print, "RAISE_FROM");
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200505 break;
506
507 case MP_BC_YIELD_VALUE:
Damien George85f2b232020-09-11 17:22:28 +1000508 mp_printf(print, "YIELD_VALUE");
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200509 break;
510
511 case MP_BC_YIELD_FROM:
Damien George85f2b232020-09-11 17:22:28 +1000512 mp_printf(print, "YIELD_FROM");
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200513 break;
514
515 case MP_BC_IMPORT_NAME:
516 DECODE_QSTR;
Damien George85f2b232020-09-11 17:22:28 +1000517 mp_printf(print, "IMPORT_NAME '%s'", qstr_str(qst));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200518 break;
519
520 case MP_BC_IMPORT_FROM:
521 DECODE_QSTR;
Damien George85f2b232020-09-11 17:22:28 +1000522 mp_printf(print, "IMPORT_FROM '%s'", qstr_str(qst));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200523 break;
524
525 case MP_BC_IMPORT_STAR:
Damien George85f2b232020-09-11 17:22:28 +1000526 mp_printf(print, "IMPORT_STAR");
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200527 break;
528
529 default:
530 if (ip[-1] < MP_BC_LOAD_CONST_SMALL_INT_MULTI + 64) {
Damien George85f2b232020-09-11 17:22:28 +1000531 mp_printf(print, "LOAD_CONST_SMALL_INT " INT_FMT, (mp_int_t)ip[-1] - MP_BC_LOAD_CONST_SMALL_INT_MULTI - 16);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200532 } else if (ip[-1] < MP_BC_LOAD_FAST_MULTI + 16) {
Damien George85f2b232020-09-11 17:22:28 +1000533 mp_printf(print, "LOAD_FAST " UINT_FMT, (mp_uint_t)ip[-1] - MP_BC_LOAD_FAST_MULTI);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200534 } else if (ip[-1] < MP_BC_STORE_FAST_MULTI + 16) {
Damien George85f2b232020-09-11 17:22:28 +1000535 mp_printf(print, "STORE_FAST " UINT_FMT, (mp_uint_t)ip[-1] - MP_BC_STORE_FAST_MULTI);
Damien George0864a692017-10-03 23:34:28 +1100536 } else if (ip[-1] < MP_BC_UNARY_OP_MULTI + MP_UNARY_OP_NUM_BYTECODE) {
Damien George78ab2ee2021-11-19 17:05:40 +1100537 mp_uint_t op = ip[-1] - MP_BC_UNARY_OP_MULTI;
538 mp_printf(print, "UNARY_OP " UINT_FMT " %s", op, qstr_str(mp_unary_op_method_name[op]));
Damien George0864a692017-10-03 23:34:28 +1100539 } else if (ip[-1] < MP_BC_BINARY_OP_MULTI + MP_BINARY_OP_NUM_BYTECODE) {
Paul Sokolovsky1ee17852014-12-28 21:41:58 +0200540 mp_uint_t op = ip[-1] - MP_BC_BINARY_OP_MULTI;
Damien George85f2b232020-09-11 17:22:28 +1000541 mp_printf(print, "BINARY_OP " UINT_FMT " %s", op, qstr_str(mp_binary_op_method_name[op]));
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200542 } else {
Damien George85f2b232020-09-11 17:22:28 +1000543 mp_printf(print, "code %p, byte code 0x%02x not implemented\n", ip - 1, ip[-1]);
Paul Sokolovsky343266e2014-12-27 05:00:08 +0200544 assert(0);
545 return ip;
546 }
547 break;
548 }
549
550 return ip;
551}
552
Damien George1692cad2022-03-16 11:39:27 +1100553void mp_bytecode_print2(const mp_print_t *print, const byte *ip, size_t len, mp_raw_code_t *const *child_table, const mp_module_constants_t *cm) {
554 const byte *ip_start = ip;
555 while (ip < ip_start + len) {
556 mp_printf(print, "%02u ", (uint)(ip - ip_start));
557 ip = mp_bytecode_print_str(print, ip_start, ip, child_table, cm);
Damien George85f2b232020-09-11 17:22:28 +1000558 mp_printf(print, "\n");
Damienf03001f2013-11-17 13:19:33 +0000559 }
560}
Damien Georged3ebe482014-01-07 15:20:33 +0000561
Damien Georgecbd2f742014-01-19 11:48:48 +0000562#endif // MICROPY_DEBUG_PRINTERS