blob: a3bfa2833b191ae9efa0c10191166489e90ae2c9 [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
11#define DECODE_UINT do { unum = *ip++; if (unum > 127) { unum = ((unum & 0x3f) << 8) | (*ip++); } } while (0)
12#define DECODE_ULABEL do { unum = (ip[0] | (ip[1] << 8)); ip += 2; } while (0)
13#define DECODE_SLABEL do { unum = (ip[0] | (ip[1] << 8)) - 0x8000; ip += 2; } while (0)
14#define DECODE_QSTR do { qstr = *ip++; if (qstr > 127) { qstr = ((qstr & 0x3f) << 8) | (*ip++); } } while (0)
15
Damiend99b0522013-12-21 18:17:45 +000016void mp_show_byte_code(const byte *ip, int len) {
Damienf03001f2013-11-17 13:19:33 +000017 const byte *ip_start = ip;
Damien George6baf76e2013-12-30 22:32:17 +000018
19 // decode prelude
20 {
21 uint n_local = *ip++;
22 printf("(NUM_LOCAL %u)\n", n_local);
23 for (; n_local > 0; n_local--) {
24 uint local_num = *ip++;
25 printf("(INIT_CELL %u)\n", local_num);
26 }
27 len -= ip - ip_start;
28 ip_start = ip;
29 }
30
Damienf03001f2013-11-17 13:19:33 +000031 machine_uint_t unum;
32 qstr qstr;
33 while (ip - ip_start < len) {
34 printf("%02u ", (uint)(ip - ip_start));
35 int op = *ip++;
36 switch (op) {
Damiend99b0522013-12-21 18:17:45 +000037 case MP_BC_LOAD_CONST_FALSE:
Damienf03001f2013-11-17 13:19:33 +000038 printf("LOAD_CONST_FALSE");
39 break;
40
Damiend99b0522013-12-21 18:17:45 +000041 case MP_BC_LOAD_CONST_NONE:
Damienf03001f2013-11-17 13:19:33 +000042 printf("LOAD_CONST_NONE");
43 break;
44
Damiend99b0522013-12-21 18:17:45 +000045 case MP_BC_LOAD_CONST_TRUE:
Damienf03001f2013-11-17 13:19:33 +000046 printf("LOAD_CONST_TRUE");
47 break;
48
Damiend99b0522013-12-21 18:17:45 +000049 case MP_BC_LOAD_CONST_SMALL_INT:
Damienf03001f2013-11-17 13:19:33 +000050 unum = (ip[0] | (ip[1] << 8) | (ip[2] << 16)) - 0x800000;
51 ip += 3;
52 printf("LOAD_CONST_SMALL_INT %d", (int)unum);
53 break;
54
55 /*
Damiend99b0522013-12-21 18:17:45 +000056 case MP_BC_LOAD_CONST_DEC:
Damienf03001f2013-11-17 13:19:33 +000057 DECODE_QSTR;
58 PUSH(rt_load_const_dec(qstr));
59 break;
Damienc1075dd2013-11-25 23:39:36 +000060 */
Damienf03001f2013-11-17 13:19:33 +000061
Damiend99b0522013-12-21 18:17:45 +000062 case MP_BC_LOAD_CONST_ID:
Damienf03001f2013-11-17 13:19:33 +000063 DECODE_QSTR;
Damienc1075dd2013-11-25 23:39:36 +000064 printf("LOAD_CONST_ID %s", qstr_str(qstr));
Damienf03001f2013-11-17 13:19:33 +000065 break;
66
Damiend99b0522013-12-21 18:17:45 +000067 case MP_BC_LOAD_CONST_STRING:
Damienf03001f2013-11-17 13:19:33 +000068 DECODE_QSTR;
Damienff099f32013-11-26 15:14:50 +000069 printf("LOAD_CONST_STRING %s", qstr_str(qstr));
Damienf03001f2013-11-17 13:19:33 +000070 break;
Damienf03001f2013-11-17 13:19:33 +000071
Damiend99b0522013-12-21 18:17:45 +000072 case MP_BC_LOAD_FAST_0:
Damienf03001f2013-11-17 13:19:33 +000073 printf("LOAD_FAST_0");
74 break;
75
Damiend99b0522013-12-21 18:17:45 +000076 case MP_BC_LOAD_FAST_1:
Damienf03001f2013-11-17 13:19:33 +000077 printf("LOAD_FAST_1");
78 break;
79
Damiend99b0522013-12-21 18:17:45 +000080 case MP_BC_LOAD_FAST_2:
Damienf03001f2013-11-17 13:19:33 +000081 printf("LOAD_FAST_2");
82 break;
83
Damiend99b0522013-12-21 18:17:45 +000084 case MP_BC_LOAD_FAST_N:
Damienf03001f2013-11-17 13:19:33 +000085 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +020086 printf("LOAD_FAST_N " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +000087 break;
Damienf03001f2013-11-17 13:19:33 +000088
Damien George6baf76e2013-12-30 22:32:17 +000089 case MP_BC_LOAD_DEREF:
90 DECODE_UINT;
91 printf("LOAD_DEREF " UINT_FMT, unum);
92 break;
93
Damiend99b0522013-12-21 18:17:45 +000094 case MP_BC_LOAD_NAME:
Damienf03001f2013-11-17 13:19:33 +000095 DECODE_QSTR;
96 printf("LOAD_NAME %s", qstr_str(qstr));
97 break;
98
Damiend99b0522013-12-21 18:17:45 +000099 case MP_BC_LOAD_GLOBAL:
Damienf03001f2013-11-17 13:19:33 +0000100 DECODE_QSTR;
101 printf("LOAD_GLOBAL %s", qstr_str(qstr));
102 break;
103
Damiend99b0522013-12-21 18:17:45 +0000104 case MP_BC_LOAD_ATTR:
Damienf03001f2013-11-17 13:19:33 +0000105 DECODE_QSTR;
Damienc1075dd2013-11-25 23:39:36 +0000106 printf("LOAD_ATTR %s", qstr_str(qstr));
Damienf03001f2013-11-17 13:19:33 +0000107 break;
Damienf03001f2013-11-17 13:19:33 +0000108
Damiend99b0522013-12-21 18:17:45 +0000109 case MP_BC_LOAD_METHOD:
Damienf03001f2013-11-17 13:19:33 +0000110 DECODE_QSTR;
111 printf("LOAD_METHOD %s", qstr_str(qstr));
112 break;
113
Damiend99b0522013-12-21 18:17:45 +0000114 case MP_BC_LOAD_BUILD_CLASS:
Damienc1075dd2013-11-25 23:39:36 +0000115 printf("LOAD_BUILD_CLASS");
Damienf03001f2013-11-17 13:19:33 +0000116 break;
Damienf03001f2013-11-17 13:19:33 +0000117
Damiend99b0522013-12-21 18:17:45 +0000118 case MP_BC_STORE_FAST_0:
Damienf03001f2013-11-17 13:19:33 +0000119 printf("STORE_FAST_0");
120 break;
121
Damiend99b0522013-12-21 18:17:45 +0000122 case MP_BC_STORE_FAST_1:
Damienf03001f2013-11-17 13:19:33 +0000123 printf("STORE_FAST_1");
124 break;
125
Damiend99b0522013-12-21 18:17:45 +0000126 case MP_BC_STORE_FAST_2:
Damienf03001f2013-11-17 13:19:33 +0000127 printf("STORE_FAST_2");
128 break;
129
Damiend99b0522013-12-21 18:17:45 +0000130 case MP_BC_STORE_FAST_N:
Damienf03001f2013-11-17 13:19:33 +0000131 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200132 printf("STORE_FAST_N " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000133 break;
Damienf03001f2013-11-17 13:19:33 +0000134
Damien George6baf76e2013-12-30 22:32:17 +0000135 case MP_BC_STORE_DEREF:
136 DECODE_UINT;
137 printf("STORE_DEREF " UINT_FMT, unum);
138 break;
139
Damiend99b0522013-12-21 18:17:45 +0000140 case MP_BC_STORE_NAME:
Damienf03001f2013-11-17 13:19:33 +0000141 DECODE_QSTR;
142 printf("STORE_NAME %s", qstr_str(qstr));
143 break;
144
Damiend99b0522013-12-21 18:17:45 +0000145 case MP_BC_STORE_GLOBAL:
Damienf03001f2013-11-17 13:19:33 +0000146 DECODE_QSTR;
Damien George66028ab2014-01-03 14:03:48 +0000147 printf("STORE_GLOBAL %s", qstr_str(qstr));
Damienf03001f2013-11-17 13:19:33 +0000148 break;
149
Damiend99b0522013-12-21 18:17:45 +0000150 case MP_BC_STORE_ATTR:
Damienf03001f2013-11-17 13:19:33 +0000151 DECODE_QSTR;
Damienc1075dd2013-11-25 23:39:36 +0000152 printf("STORE_ATTR %s", qstr_str(qstr));
Damienf03001f2013-11-17 13:19:33 +0000153 break;
154
Damiend99b0522013-12-21 18:17:45 +0000155 case MP_BC_STORE_SUBSCR:
Damienff099f32013-11-26 15:14:50 +0000156 printf("STORE_SUBSCR");
Damienf03001f2013-11-17 13:19:33 +0000157 break;
158
Damiend99b0522013-12-21 18:17:45 +0000159 case MP_BC_DUP_TOP:
Damien8f9e2ee2013-12-29 16:54:59 +0000160 printf("DUP_TOP");
Damienf03001f2013-11-17 13:19:33 +0000161 break;
162
Damiend99b0522013-12-21 18:17:45 +0000163 case MP_BC_DUP_TOP_TWO:
Damienff099f32013-11-26 15:14:50 +0000164 printf("DUP_TOP_TWO");
Damienf03001f2013-11-17 13:19:33 +0000165 break;
Damienf03001f2013-11-17 13:19:33 +0000166
Damiend99b0522013-12-21 18:17:45 +0000167 case MP_BC_POP_TOP:
Damienf03001f2013-11-17 13:19:33 +0000168 printf("POP_TOP");
169 break;
170
171 /*
Damiend99b0522013-12-21 18:17:45 +0000172 case MP_BC_ROT_TWO:
Damienf03001f2013-11-17 13:19:33 +0000173 obj1 = sp[0];
174 sp[0] = sp[1];
175 sp[1] = obj1;
176 break;
Damienff099f32013-11-26 15:14:50 +0000177 */
Damienf03001f2013-11-17 13:19:33 +0000178
Damiend99b0522013-12-21 18:17:45 +0000179 case MP_BC_ROT_THREE:
Damienff099f32013-11-26 15:14:50 +0000180 printf("ROT_THREE");
Damienf03001f2013-11-17 13:19:33 +0000181 break;
Damienf03001f2013-11-17 13:19:33 +0000182
Damiend99b0522013-12-21 18:17:45 +0000183 case MP_BC_JUMP:
Damienf03001f2013-11-17 13:19:33 +0000184 DECODE_SLABEL;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200185 printf("JUMP " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000186 break;
187
Damiend99b0522013-12-21 18:17:45 +0000188 case MP_BC_POP_JUMP_IF_TRUE:
Damienf03001f2013-11-17 13:19:33 +0000189 DECODE_SLABEL;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200190 printf("POP_JUMP_IF_TRUE " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000191 break;
192
Damiend99b0522013-12-21 18:17:45 +0000193 case MP_BC_POP_JUMP_IF_FALSE:
Damienf03001f2013-11-17 13:19:33 +0000194 DECODE_SLABEL;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200195 printf("POP_JUMP_IF_FALSE " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000196 break;
197
Damienff099f32013-11-26 15:14:50 +0000198 /*
Damiend99b0522013-12-21 18:17:45 +0000199 case MP_BC_JUMP_IF_TRUE_OR_POP:
Damienf03001f2013-11-17 13:19:33 +0000200 DECODE_SLABEL;
201 if (rt_is_true(*sp)) {
202 ip += unum;
203 } else {
204 sp++;
205 }
206 break;
207
Damiend99b0522013-12-21 18:17:45 +0000208 case MP_BC_JUMP_IF_FALSE_OR_POP:
Damienf03001f2013-11-17 13:19:33 +0000209 DECODE_SLABEL;
210 if (rt_is_true(*sp)) {
211 sp++;
212 } else {
213 ip += unum;
214 }
215 break;
Damien8f9e2ee2013-12-29 16:54:59 +0000216 */
Damienf03001f2013-11-17 13:19:33 +0000217
Damiend99b0522013-12-21 18:17:45 +0000218 case MP_BC_SETUP_EXCEPT:
Damienf03001f2013-11-17 13:19:33 +0000219 DECODE_ULABEL; // except labels are always forward
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200220 printf("SETUP_EXCEPT " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000221 break;
222
Damiend99b0522013-12-21 18:17:45 +0000223 case MP_BC_END_FINALLY:
Damienf03001f2013-11-17 13:19:33 +0000224 // if TOS is an exception, reraises the exception (3 values on TOS)
225 // if TOS is an integer, does something else
226 // if TOS is None, just pops it and continues
227 // else error
Damien8f9e2ee2013-12-29 16:54:59 +0000228 printf("END_FINALLY");
Damienf03001f2013-11-17 13:19:33 +0000229 break;
230
Damiend99b0522013-12-21 18:17:45 +0000231 case MP_BC_GET_ITER:
Damienff099f32013-11-26 15:14:50 +0000232 printf("GET_ITER");
Damienf03001f2013-11-17 13:19:33 +0000233 break;
234
Damiend99b0522013-12-21 18:17:45 +0000235 case MP_BC_FOR_ITER:
Damienf03001f2013-11-17 13:19:33 +0000236 DECODE_ULABEL; // the jump offset if iteration finishes; for labels are always forward
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200237 printf("FOR_ITER " UINT_FMT, ip + unum - ip_start);
Damienf03001f2013-11-17 13:19:33 +0000238 break;
239
Damiend99b0522013-12-21 18:17:45 +0000240 case MP_BC_POP_BLOCK:
Damienf03001f2013-11-17 13:19:33 +0000241 // pops block and restores the stack
Damien8f9e2ee2013-12-29 16:54:59 +0000242 printf("POP_BLOCK");
Damienf03001f2013-11-17 13:19:33 +0000243 break;
244
Damiend99b0522013-12-21 18:17:45 +0000245 case MP_BC_POP_EXCEPT:
Damienf03001f2013-11-17 13:19:33 +0000246 // 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 +0000247 printf("POP_EXCEPT");
Damienf03001f2013-11-17 13:19:33 +0000248 break;
249
Damien8f9e2ee2013-12-29 16:54:59 +0000250 /*
Damiend99b0522013-12-21 18:17:45 +0000251 case MP_BC_UNARY_OP:
Damienf03001f2013-11-17 13:19:33 +0000252 unum = *ip++;
253 *sp = rt_unary_op(unum, *sp);
254 break;
255 */
256
Damiend99b0522013-12-21 18:17:45 +0000257 case MP_BC_BINARY_OP:
Damienf03001f2013-11-17 13:19:33 +0000258 unum = *ip++;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200259 printf("BINARY_OP " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000260 break;
261
Damiend99b0522013-12-21 18:17:45 +0000262 case MP_BC_COMPARE_OP:
Damienf03001f2013-11-17 13:19:33 +0000263 unum = *ip++;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200264 printf("COMPARE_OP " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000265 break;
266
Damiend99b0522013-12-21 18:17:45 +0000267 case MP_BC_BUILD_TUPLE:
Damienf03001f2013-11-17 13:19:33 +0000268 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200269 printf("BUILD_TUPLE " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000270 break;
271
Damiend99b0522013-12-21 18:17:45 +0000272 case MP_BC_BUILD_LIST:
Damienf03001f2013-11-17 13:19:33 +0000273 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200274 printf("BUILD_LIST " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000275 break;
276
Damiend99b0522013-12-21 18:17:45 +0000277 case MP_BC_LIST_APPEND:
Damienf03001f2013-11-17 13:19:33 +0000278 DECODE_UINT;
Damien George27bf5b82014-01-02 18:15:33 +0000279 printf("LIST_APPEND " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000280 break;
281
Damiend99b0522013-12-21 18:17:45 +0000282 case MP_BC_BUILD_MAP:
Damienf03001f2013-11-17 13:19:33 +0000283 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200284 printf("BUILD_MAP " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000285 break;
286
Damien8f9e2ee2013-12-29 16:54:59 +0000287 /*
Damiend99b0522013-12-21 18:17:45 +0000288 case MP_BC_STORE_MAP:
Damienf03001f2013-11-17 13:19:33 +0000289 sp += 2;
290 rt_store_map(sp[0], sp[-2], sp[-1]);
291 break;
292
Damiend99b0522013-12-21 18:17:45 +0000293 case MP_BC_MAP_ADD:
Damienf03001f2013-11-17 13:19:33 +0000294 DECODE_UINT;
295 // I think it's guaranteed by the compiler that sp[unum + 1] is a map
296 rt_store_map(sp[unum + 1], sp[0], sp[1]);
297 sp += 2;
298 break;
Damiendae7eb72013-12-29 22:32:51 +0000299 */
Damienf03001f2013-11-17 13:19:33 +0000300
Damiend99b0522013-12-21 18:17:45 +0000301 case MP_BC_BUILD_SET:
Damienf03001f2013-11-17 13:19:33 +0000302 DECODE_UINT;
Damien George212c2962013-12-30 12:52:32 +0000303 printf("BUILD_SET " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000304 break;
305
Damiend99b0522013-12-21 18:17:45 +0000306 case MP_BC_SET_ADD:
Damienf03001f2013-11-17 13:19:33 +0000307 DECODE_UINT;
Damien George212c2962013-12-30 12:52:32 +0000308 printf("SET_ADD " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000309 break;
Damienf03001f2013-11-17 13:19:33 +0000310
Damiend99b0522013-12-21 18:17:45 +0000311 case MP_BC_UNPACK_SEQUENCE:
Damienff099f32013-11-26 15:14:50 +0000312 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200313 printf("UNPACK_SEQUENCE " UINT_FMT, unum);
Damienff099f32013-11-26 15:14:50 +0000314 break;
315
Damiend99b0522013-12-21 18:17:45 +0000316 case MP_BC_MAKE_FUNCTION:
Damienf03001f2013-11-17 13:19:33 +0000317 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200318 printf("MAKE_FUNCTION " UINT_FMT, unum);
Damienf03001f2013-11-17 13:19:33 +0000319 break;
320
Damien George6baf76e2013-12-30 22:32:17 +0000321 case MP_BC_MAKE_CLOSURE:
322 DECODE_UINT;
323 printf("MAKE_CLOSURE " UINT_FMT, unum);
324 break;
325
Damiend99b0522013-12-21 18:17:45 +0000326 case MP_BC_CALL_FUNCTION:
Damienf03001f2013-11-17 13:19:33 +0000327 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200328 printf("CALL_FUNCTION n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff);
Damienf03001f2013-11-17 13:19:33 +0000329 break;
330
Damiend99b0522013-12-21 18:17:45 +0000331 case MP_BC_CALL_METHOD:
Damienf03001f2013-11-17 13:19:33 +0000332 DECODE_UINT;
Paul Sokolovskye85c3892013-12-30 03:38:32 +0200333 printf("CALL_METHOD n=" UINT_FMT " nkw=" UINT_FMT, unum & 0xff, (unum >> 8) & 0xff);
Damienf03001f2013-11-17 13:19:33 +0000334 break;
335
Damiend99b0522013-12-21 18:17:45 +0000336 case MP_BC_RETURN_VALUE:
Damienf03001f2013-11-17 13:19:33 +0000337 printf("RETURN_VALUE");
338 break;
339
Damiend99b0522013-12-21 18:17:45 +0000340 case MP_BC_YIELD_VALUE:
Damien George27bf5b82014-01-02 18:15:33 +0000341 printf("YIELD_VALUE");
342 break;
Damienf03001f2013-11-17 13:19:33 +0000343
Damien George66028ab2014-01-03 14:03:48 +0000344 case MP_BC_IMPORT_NAME:
345 DECODE_QSTR;
346 printf("IMPORT NAME %s", qstr_str(qstr));
347 break;
348
349 case MP_BC_IMPORT_FROM:
350 DECODE_QSTR;
351 printf("IMPORT NAME %s", qstr_str(qstr));
352 break;
353
Damienf03001f2013-11-17 13:19:33 +0000354 default:
355 printf("code %p, byte code 0x%02x not implemented\n", ip, op);
356 assert(0);
357 return;
358 }
359 printf("\n");
360 }
361}