From 4e8317f5df061db63600113123a83c6572f6c63f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 3 Sep 2012 15:33:35 +0900 Subject: do no generate lineno info if no filename is specified --- src/codegen.c | 16 ++++++++++++---- src/error.c | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/codegen.c b/src/codegen.c index bdd2aeecc..49d53b1ea 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -145,10 +145,14 @@ genop(codegen_scope *s, mrb_code i) if (s->pc == s->icapa) { s->icapa *= 2; s->iseq = (mrb_code *)codegen_realloc(s, s->iseq, sizeof(mrb_code)*s->icapa); - s->lines = (short*)codegen_realloc(s, s->lines, sizeof(short)*s->icapa); + if (s->lines) { + s->lines = (short*)codegen_realloc(s, s->lines, sizeof(short)*s->icapa); + } } s->iseq[s->pc] = i; - s->lines[s->pc] = s->lineno; + if (s->lines) { + s->lines[s->pc] = s->lineno; + } s->pc++; } @@ -2040,7 +2044,6 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv) p->mrb = prev->mrb; p->icapa = 1024; p->iseq = (mrb_code*)mrb_malloc(mrb, sizeof(mrb_code)*p->icapa); - p->lines = (short*)mrb_malloc(mrb, sizeof(short)*p->icapa); p->pcapa = 32; p->pool = (mrb_value*)mrb_malloc(mrb, sizeof(mrb_value)*p->pcapa); @@ -2054,7 +2057,9 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv) p->idx = mrb->irep_len++; p->filename = prev->filename; - + if (p->filename) { + p->lines = (short*)mrb_malloc(mrb, sizeof(short)*p->icapa); + } return p; } @@ -2074,6 +2079,9 @@ scope_finish(codegen_scope *s, int idx) if (s->lines) { irep->lines = (short *)codegen_realloc(s, s->lines, sizeof(short)*s->pc); } + else { + irep->lines = 0; + } } if (s->pool) { irep->pool = (mrb_value *)codegen_realloc(s, s->pool, sizeof(mrb_value)*s->plen); diff --git a/src/error.c b/src/error.c index da8786650..6d05a3c6c 100644 --- a/src/error.c +++ b/src/error.c @@ -191,7 +191,7 @@ exc_debug_info(mrb_state *mrb, struct RObject *exc) if (ci->proc && !MRB_PROC_CFUNC_P(ci->proc)) { mrb_irep *irep = ci->proc->body.irep; - if (irep->lines && irep->iseq <= pc && pc < irep->iseq + irep->ilen) { + if (irep->filename && irep->lines && irep->iseq <= pc && pc < irep->iseq + irep->ilen) { mrb_obj_iv_set(mrb, exc, mrb_intern(mrb, "file"), mrb_str_new_cstr(mrb, irep->filename)); mrb_obj_iv_set(mrb, exc, mrb_intern(mrb, "line"), mrb_fixnum_value(irep->lines[pc - irep->iseq - 1])); return; -- cgit v1.2.3