diff options
Diffstat (limited to 'src/codegen.c')
| -rw-r--r-- | src/codegen.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/src/codegen.c b/src/codegen.c index 0347f8e7a..cec0d226f 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -15,7 +15,7 @@ #include "mruby/string.h" #include "mruby/debug.h" #include "node.h" -#include "opcode.h" +#include "mruby/opcode.h" #include "mruby/re.h" #include "mrb_throw.h" @@ -66,8 +66,8 @@ typedef struct scope { size_t scapa; size_t rcapa; - int nlocals; - int nregs; + uint16_t nlocals; + uint16_t nregs; int ai; int debug_start_pos; @@ -2500,11 +2500,17 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv) node *n = lv; size_t i = 0; - p->irep->lv = (struct mrb_locals*)mrb_malloc(mrb, sizeof(struct mrb_locals)*p->nlocals); + p->irep->lv = (struct mrb_locals*)mrb_malloc(mrb, sizeof(struct mrb_locals) * (p->nlocals - 1)); for (i=0, n=lv; n; i++,n=n->cdr) { p->irep->lv[i].name = lv_name(n); - p->irep->lv[i].r = lv_idx(p, lv_name(n)); + if (lv_name(n)) { + p->irep->lv[i].r = lv_idx(p, lv_name(n)); + } + else { + p->irep->lv[i].r = 0; + } } + mrb_assert(i + 1 == p->nlocals); } p->ai = mrb_gc_arena_save(mrb); @@ -2637,6 +2643,7 @@ loop_pop(codegen_scope *s, int val) if (val) push(); } +#ifdef ENABLE_STDIO static int print_r(mrb_state *mrb, mrb_irep *irep, size_t n, int pre) { @@ -2679,6 +2686,7 @@ print_lv(mrb_state *mrb, mrb_irep *irep, mrb_code c, int r) } printf("\n"); } +#endif static void codedump(mrb_state *mrb, mrb_irep *irep) @@ -2754,7 +2762,7 @@ codedump(mrb_state *mrb, mrb_irep *irep) print_lv(mrb, irep, c, RA); break; case OP_GETGLOBAL: - printf("OP_GETGLOBAL\tR%d\t:%s\n", GETARG_A(c), + printf("OP_GETGLOBAL\tR%d\t:%s", GETARG_A(c), mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)])); print_lv(mrb, irep, c, RA); break; |
