2 #include <mruby/irep.h>
3 #include <mruby/debug.h>
4 #include <mruby/opcode.h>
5 #include <mruby/string.h>
6 #include <mruby/proc.h>
8 #ifndef MRB_DISABLE_STDIO
10 print_r(mrb_state *mrb, mrb_irep *irep, size_t n)
16 for (i=0; i+1<irep->nlocals; i++) {
17 if (irep->lv[i].r == n) {
18 mrb_sym sym = irep->lv[i].name;
19 printf(" R%d:%s", (int)n, mrb_sym2name(mrb, sym));
26 print_lv_a(mrb_state *mrb, mrb_irep *irep, uint16_t a)
28 if (!irep->lv || a >= irep->nlocals || a == 0) {
33 print_r(mrb, irep, a);
38 print_lv_ab(mrb_state *mrb, mrb_irep *irep, uint16_t a, uint16_t b)
40 if (!irep->lv || (a >= irep->nlocals && b >= irep->nlocals) || a+b == 0) {
45 if (a > 0) print_r(mrb, irep, a);
46 if (b > 0) print_r(mrb, irep, b);
51 print_header(mrb_state *mrb, mrb_irep *irep, ptrdiff_t i)
55 line = mrb_debug_get_line(mrb, irep, i);
63 printf("%03d ", (int)i);
66 #define CASE(insn,ops) case insn: FETCH_ ## ops (); L_ ## insn
69 codedump(mrb_state *mrb, mrb_irep *irep)
74 const char *file = NULL, *next_file;
77 printf("irep %p nregs=%d nlocals=%d pools=%d syms=%d reps=%d iseq=%d\n", (void*)irep,
78 irep->nregs, irep->nlocals, (int)irep->plen, (int)irep->slen, (int)irep->rlen, (int)irep->ilen);
83 printf("local variable names:\n");
84 for (i = 1; i < irep->nlocals; ++i) {
85 char const *s = mrb_sym2name(mrb, irep->lv[i - 1].name);
86 int n = irep->lv[i - 1].r ? irep->lv[i - 1].r : i;
87 printf(" R%d:%s\n", n, s ? s : "");
92 pcend = pc + irep->ilen;
99 ai = mrb_gc_arena_save(mrb);
102 next_file = mrb_debug_get_filename(mrb, irep, i);
103 if (next_file && file != next_file) {
104 printf("file: %s\n", next_file);
107 print_header(mrb, irep, i);
114 printf("OP_MOVE\tR%d\tR%d\t", a, b);
115 print_lv_ab(mrb, irep, a, b);
119 mrb_value v = irep->pool[b];
120 mrb_value s = mrb_inspect(mrb, v);
121 printf("OP_LOADL\tR%d\tL(%d)\t; %s", a, b, RSTRING_PTR(s));
123 print_lv_a(mrb, irep, a);
126 printf("OP_LOADI\tR%d\t%d\t", a, b);
127 print_lv_a(mrb, irep, a);
129 CASE(OP_LOADINEG, BB):
130 printf("OP_LOADI\tR%d\t-%d\t", a, b);
131 print_lv_a(mrb, irep, a);
133 CASE(OP_LOADI__1, B):
134 printf("OP_LOADI__1\tR%d\t\t", a);
135 print_lv_a(mrb, irep, a);
137 CASE(OP_LOADI_0, B): goto L_LOADI;
138 CASE(OP_LOADI_1, B): goto L_LOADI;
139 CASE(OP_LOADI_2, B): goto L_LOADI;
140 CASE(OP_LOADI_3, B): goto L_LOADI;
141 CASE(OP_LOADI_4, B): goto L_LOADI;
142 CASE(OP_LOADI_5, B): goto L_LOADI;
143 CASE(OP_LOADI_6, B): goto L_LOADI;
146 printf("OP_LOADI_%d\tR%d\t\t", ins-(int)OP_LOADI_0, a);
147 print_lv_a(mrb, irep, a);
149 CASE(OP_LOADSYM, BB):
150 printf("OP_LOADSYM\tR%d\t:%s\t", a, mrb_sym2name(mrb, irep->syms[b]));
151 print_lv_a(mrb, irep, a);
154 printf("OP_LOADNIL\tR%d\t\t", a);
155 print_lv_a(mrb, irep, a);
157 CASE(OP_LOADSELF, B):
158 printf("OP_LOADSELF\tR%d\t\t", a);
159 print_lv_a(mrb, irep, a);
162 printf("OP_LOADT\tR%d\t\t", a);
163 print_lv_a(mrb, irep, a);
166 printf("OP_LOADF\tR%d\t\t", a);
167 print_lv_a(mrb, irep, a);
170 printf("OP_GETGV\tR%d\t:%s", a, mrb_sym2name(mrb, irep->syms[b]));
171 print_lv_a(mrb, irep, a);
174 printf("OP_SETGV\t:%s\tR%d", mrb_sym2name(mrb, irep->syms[b]), a);
175 print_lv_a(mrb, irep, a);
178 printf("OP_GETSV\tR%d\t:%s", a, mrb_sym2name(mrb, irep->syms[b]));
179 print_lv_a(mrb, irep, a);
182 printf("OP_SETSV\t:%s\tR%d", mrb_sym2name(mrb, irep->syms[b]), a);
183 print_lv_a(mrb, irep, a);
185 CASE(OP_GETCONST, BB):
186 printf("OP_GETCONST\tR%d\t:%s", a, mrb_sym2name(mrb, irep->syms[b]));
187 print_lv_a(mrb, irep, a);
189 CASE(OP_SETCONST, BB):
190 printf("OP_SETCONST\t:%s\tR%d", mrb_sym2name(mrb, irep->syms[b]), a);
191 print_lv_a(mrb, irep, a);
193 CASE(OP_GETMCNST, BB):
194 printf("OP_GETMCNST\tR%d\tR%d::%s", a, a, mrb_sym2name(mrb, irep->syms[b]));
195 print_lv_a(mrb, irep, a);
197 CASE(OP_SETMCNST, BB):
198 printf("OP_SETMCNST\tR%d::%s\tR%d", a+1, mrb_sym2name(mrb, irep->syms[b]), a);
199 print_lv_a(mrb, irep, a);
202 printf("OP_GETIV\tR%d\t%s", a, mrb_sym2name(mrb, irep->syms[b]));
203 print_lv_a(mrb, irep, a);
206 printf("OP_SETIV\t%s\tR%d", mrb_sym2name(mrb, irep->syms[b]), a);
207 print_lv_a(mrb, irep, a);
209 CASE(OP_GETUPVAR, BBB):
210 printf("OP_GETUPVAR\tR%d\t%d\t%d", a, b, c);
211 print_lv_a(mrb, irep, a);
213 CASE(OP_SETUPVAR, BBB):
214 printf("OP_SETUPVAR\tR%d\t%d\t%d", a, b, c);
215 print_lv_a(mrb, irep, a);
218 printf("OP_GETCV\tR%d\t%s", a, mrb_sym2name(mrb, irep->syms[b]));
219 print_lv_a(mrb, irep, a);
222 printf("OP_SETCV\t%s\tR%d", mrb_sym2name(mrb, irep->syms[b]), a);
223 print_lv_a(mrb, irep, a);
226 printf("OP_JMP\t\t%03d\n", a);
229 printf("OP_JMPIF\tR%d\t%03d\t", a, b);
230 print_lv_a(mrb, irep, a);
233 printf("OP_JMPNOT\tR%d\t%03d\t", a, b);
234 print_lv_a(mrb, irep, a);
237 printf("OP_JMPNIL\tR%d\t%03d\t", a, b);
238 print_lv_a(mrb, irep, a);
241 printf("OP_SENDV\tR%d\t:%s\n", a, mrb_sym2name(mrb, irep->syms[b]));
244 printf("OP_SENDVB\tR%d\t:%s\n", a, mrb_sym2name(mrb, irep->syms[b]));
247 printf("OP_SEND\tR%d\t:%s\t%d\n", a, mrb_sym2name(mrb, irep->syms[b]), c);
250 printf("OP_SENDB\tR%d\t:%s\t%d\n", a, mrb_sym2name(mrb, irep->syms[b]), c);
256 printf("OP_SUPER\tR%d\t%d\n", a, b);
259 printf("OP_ARGARY\tR%d\t%d:%d:%d:%d (%d)", a,
265 print_lv_a(mrb, irep, a);
268 printf("OP_ENTER\t%d:%d:%d:%d:%d:%d:%d\n",
278 printf("OP_KEY_P\tR%d\t:%s\t", a, mrb_sym2name(mrb, irep->syms[b]));
279 print_lv_a(mrb, irep, a);
282 printf("OP_KEYEND\n");
285 printf("OP_KARG\tR%d\t:%s\t", a, mrb_sym2name(mrb, irep->syms[b]));
286 print_lv_a(mrb, irep, a);
289 printf("OP_RETURN\tR%d\t\t", a);
290 print_lv_a(mrb, irep, a);
292 CASE(OP_RETURN_BLK, B):
293 printf("OP_RETURN_BLK\tR%d\t\t", a);
294 print_lv_a(mrb, irep, a);
297 printf("OP_BREAK\tR%d\t\t", a);
298 print_lv_a(mrb, irep, a);
300 CASE(OP_BLKPUSH, BS):
301 printf("OP_BLKPUSH\tR%d\t%d:%d:%d:%d (%d)", a,
307 print_lv_a(mrb, irep, a);
310 printf("OP_LAMBDA\tR%d\tI(%d:%p)\n", a, b, irep->reps[b]);
313 printf("OP_BLOCK\tR%d\tI(%d:%p)\n", a, b, irep->reps[b]);
316 printf("OP_METHOD\tR%d\tI(%d:%p)\n", a, b, irep->reps[b]);
318 CASE(OP_RANGE_INC, B):
319 printf("OP_RANGE_INC\tR%d\n", a);
321 CASE(OP_RANGE_EXC, B):
322 printf("OP_RANGE_EXC\tR%d\n", a);
325 printf("OP_DEF\tR%d\t:%s\n", a, mrb_sym2name(mrb, irep->syms[b]));
328 printf("OP_UNDEF\t:%s\n", mrb_sym2name(mrb, irep->syms[a]));
331 printf("OP_ALIAS\t:%s\t%s\n", mrb_sym2name(mrb, irep->syms[a]), mrb_sym2name(mrb, irep->syms[b]));
334 printf("OP_ADD\tR%d\t\n", a);
337 printf("OP_ADDI\tR%d\t%d\n", a, b);
340 printf("OP_SUB\tR%d\t\n", a);
343 printf("OP_SUBI\tR%d\t%d\n", a, b);
346 printf("OP_MUL\tR%d\t\n", a);
349 printf("OP_DIV\tR%d\t\n", a);
352 printf("OP_LT\t\tR%d\t\n", a);
355 printf("OP_LE\t\tR%d\t\n", a);
358 printf("OP_GT\t\tR%d\t\n", a);
361 printf("OP_GE\t\tR%d\t\n", a);
364 printf("OP_EQ\t\tR%d\t\n", a);
367 printf("OP_ARRAY\tR%d\t%d\t", a, b);
368 print_lv_a(mrb, irep, a);
370 CASE(OP_ARRAY2, BBB):
371 printf("OP_ARRAY\tR%d\tR%d\t%d\t", a, b, c);
372 print_lv_ab(mrb, irep, a, b);
375 printf("OP_ARYCAT\tR%d\t", a);
376 print_lv_a(mrb, irep, a);
379 printf("OP_ARYPUSH\tR%d\t", a);
380 print_lv_a(mrb, irep, a);
383 printf("OP_ARYDUP\tR%d\t", a);
384 print_lv_a(mrb, irep, a);
387 printf("OP_AREF\tR%d\tR%d\t%d", a, b, c);
388 print_lv_ab(mrb, irep, a, b);
391 printf("OP_ASET\tR%d\tR%d\t%d", a, b, c);
392 print_lv_ab(mrb, irep, a, b);
395 printf("OP_APOST\tR%d\t%d\t%d", a, b, c);
396 print_lv_a(mrb, irep, a);
399 printf("OP_INTERN\tR%d", a);
400 print_lv_a(mrb, irep, a);
404 mrb_value v = irep->pool[b];
405 mrb_value s = mrb_str_dump(mrb, mrb_str_new(mrb, RSTRING_PTR(v), RSTRING_LEN(v)));
406 printf("OP_STRING\tR%d\tL(%d)\t; %s", a, b, RSTRING_PTR(s));
408 print_lv_a(mrb, irep, a);
411 printf("OP_STRCAT\tR%d\t", a);
412 print_lv_a(mrb, irep, a);
415 printf("OP_HASH\tR%d\t%d\t", a, b);
416 print_lv_a(mrb, irep, a);
418 CASE(OP_HASHADD, BB):
419 printf("OP_HASHADD\tR%d\t%d\t", a, b);
420 print_lv_a(mrb, irep, a);
423 printf("OP_HASHCAT\tR%d\t", a);
424 print_lv_a(mrb, irep, a);
428 printf("OP_OCLASS\tR%d\t\t", a);
429 print_lv_a(mrb, irep, a);
432 printf("OP_CLASS\tR%d\t:%s", a, mrb_sym2name(mrb, irep->syms[b]));
433 print_lv_a(mrb, irep, a);
436 printf("OP_MODULE\tR%d\t:%s", a, mrb_sym2name(mrb, irep->syms[b]));
437 print_lv_a(mrb, irep, a);
440 printf("OP_EXEC\tR%d\tI(%d:%p)", a, b, irep->reps[b]);
441 print_lv_a(mrb, irep, a);
444 printf("OP_SCLASS\tR%d\t", a);
445 print_lv_a(mrb, irep, a);
448 printf("OP_TCLASS\tR%d\t\t", a);
449 print_lv_a(mrb, irep, a);
453 mrb_value v = irep->pool[a];
454 mrb_value s = mrb_str_dump(mrb, mrb_str_new(mrb, RSTRING_PTR(v), RSTRING_LEN(v)));
455 printf("OP_ERR\t%s\n", RSTRING_PTR(s));
459 printf("OP_EPUSH\t\t:I(%d:%p)\n", a, irep->reps[a]);
462 printf("OP_ONERR\t%03d\n", a);
465 printf("OP_EXCEPT\tR%d\t\t", a);
466 print_lv_a(mrb, irep, a);
469 printf("OP_RESCUE\tR%d\tR%d", a, b);
470 print_lv_ab(mrb, irep, a, b);
473 printf("OP_RAISE\tR%d\t\t", a);
474 print_lv_a(mrb, irep, a);
477 printf("OP_POPERR\t%d\t\t\n", a);
480 printf("OP_EPOP\t%d\n", a);
484 printf("OP_DEBUG\t%d\t%d\t%d\n", a, b, c);
494 print_header(mrb, irep, pc-irep->iseq-2);
496 #define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _1 (); goto L_OP_ ## i;
497 #include "mruby/ops.h"
504 print_header(mrb, irep, pc-irep->iseq-2);
506 #define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _2 (); goto L_OP_ ## i;
507 #include "mruby/ops.h"
514 print_header(mrb, irep, pc-irep->iseq-2);
516 #define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _3 (); goto L_OP_ ## i;
517 #include "mruby/ops.h"
523 printf("OP_unknown (0x%x)\n", ins);
526 mrb_gc_arena_restore(mrb, ai);
532 codedump_recur(mrb_state *mrb, mrb_irep *irep)
537 for (i=0; i<irep->rlen; i++) {
538 codedump_recur(mrb, irep->reps[i]);
544 mrb_codedump_all(mrb_state *mrb, struct RProc *proc)
546 #ifndef MRB_DISABLE_STDIO
547 codedump_recur(mrb, proc->body.irep);