summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-08-22 22:36:44 +0900
committerYukihiro Matsumoto <[email protected]>2012-08-22 22:36:44 +0900
commit15725eb4f6dc67de626fe5822d77312d7ab8994a (patch)
tree0b33a09d486046c49edef7af6b24a90a6ce3e643
parent655518f38a712073cd68d678b046226b64c98859 (diff)
downloadmruby-15725eb4f6dc67de626fe5822d77312d7ab8994a.tar.gz
mruby-15725eb4f6dc67de626fe5822d77312d7ab8994a.zip
file/line info passed to codegen; argument type of mrb_generate_code() has changed
-rw-r--r--include/mruby/compile.h3
-rw-r--r--src/codegen.c32
-rw-r--r--src/parse.y3
-rw-r--r--tools/mirb/mirb.c2
4 files changed, 31 insertions, 9 deletions
diff --git a/include/mruby/compile.h b/include/mruby/compile.h
index e16f34d71..4a27eaa6f 100644
--- a/include/mruby/compile.h
+++ b/include/mruby/compile.h
@@ -33,6 +33,7 @@ const char *mrbc_filename(mrb_state *mrb, mrbc_context *c, const char *s);
/* AST node structure */
typedef struct mrb_ast_node {
struct mrb_ast_node *car, *cdr;
+ int lineno;
} mrb_ast_node;
/* lexer states */
@@ -107,7 +108,7 @@ void mrb_parser_parse(struct mrb_parser_state*,mrbc_context*);
struct mrb_parser_state* mrb_parse_file(mrb_state*,FILE*,mrbc_context*);
struct mrb_parser_state* mrb_parse_string(mrb_state*,const char*,mrbc_context*);
struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,int,mrbc_context*);
-int mrb_generate_code(mrb_state*, mrb_ast_node*);
+int mrb_generate_code(mrb_state*, struct mrb_parser_state*);
/* program load functions */
mrb_value mrb_load_file(mrb_state*,FILE*);
diff --git a/src/codegen.c b/src/codegen.c
index 38d57d581..fbc1503c0 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -53,6 +53,8 @@ typedef struct scope {
struct loopinfo *loop;
int ensure_level;
+ char *filename;
+ int lineno;
mrb_code *iseq;
int icapa;
@@ -92,7 +94,12 @@ codegen_error(codegen_scope *s, const char *message)
}
mrb_pool_close(s->mpool);
#ifdef ENABLE_STDIO
- fprintf(stderr, "codegen error: %s\n", message);
+ if (s->filename && s->lineno) {
+ fprintf(stderr, "codegen error:%s:%d: %s\n", s->filename, s->lineno, message);
+ }
+ else {
+ fprintf(stderr, "codegen error: %s\n", message);
+ }
#endif
longjmp(s->jmp, 1);
}
@@ -911,6 +918,7 @@ codegen(codegen_scope *s, node *tree, int val)
if (!tree) return;
nt = (intptr_t)tree->car;
+ s->lineno = tree->lineno;
tree = tree->cdr;
switch (nt) {
case NODE_BEGIN:
@@ -2032,6 +2040,7 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv)
p->ai = mrb->arena_idx;
p->idx = mrb->irep_len++;
+ p->filename = prev->filename;
return p;
}
@@ -2063,7 +2072,10 @@ scope_finish(codegen_scope *s, int idx)
irep->nlocals = s->nlocals;
irep->nregs = s->nregs;
- s->mrb->arena_idx = s->ai;
+ mrb->arena_idx = s->ai;
+ if (!s->prev && s->filename) {
+ mrb_free(mrb, s->filename);
+ }
mrb_pool_close(s->mpool);
}
@@ -2445,7 +2457,7 @@ codedump_all(mrb_state *mrb, int start)
}
static int
-codegen_start(mrb_state *mrb, node *tree)
+codegen_start(mrb_state *mrb, parser_state *p)
{
codegen_scope *scope = scope_new(mrb, 0, 0);
@@ -2453,22 +2465,30 @@ codegen_start(mrb_state *mrb, node *tree)
return -1;
}
scope->mrb = mrb;
+ if (p->filename) {
+ int len = strlen(p->filename);
+ char *s = (char*)mrb_malloc(mrb, len+1);
+ memcpy(s, p->filename, len + 1);
+ scope->filename = s;
+ }
if (setjmp(scope->jmp) != 0) {
+ if (scope->filename) mrb_free(mrb, scope->filename);
return -1;
}
// prepare irep
- codegen(scope, tree, NOVAL);
+ codegen(scope, p->tree, NOVAL);
+ if (scope->filename) mrb_free(mrb, scope->filename);
return 0;
}
int
-mrb_generate_code(mrb_state *mrb, node *tree)
+mrb_generate_code(mrb_state *mrb, parser_state *p)
{
int start = mrb->irep_len;
int n;
- n = codegen_start(mrb, tree);
+ n = codegen_start(mrb, p);
if (n < 0) return n;
return start;
diff --git a/src/parse.y b/src/parse.y
index ec2baa179..3e0c670ea 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -99,6 +99,7 @@ cons_gen(parser_state *p, node *car, node *cdr)
c->car = car;
c->cdr = cdr;
+ c->lineno = p->lineno;
return c;
}
#define cons(a,b) cons_gen(p,(a),(b))
@@ -4862,7 +4863,7 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c)
return mrb_nil_value();
}
}
- n = mrb_generate_code(mrb, p->tree);
+ n = mrb_generate_code(mrb, p);
mrb_parser_free(p);
if (n < 0) {
static const char msg[] = "codegen error";
diff --git a/tools/mirb/mirb.c b/tools/mirb/mirb.c
index c9198917e..b3b86f013 100644
--- a/tools/mirb/mirb.c
+++ b/tools/mirb/mirb.c
@@ -220,7 +220,7 @@ main(void)
}
else {
/* generate bytecode */
- n = mrb_generate_code(mrb, parser->tree);
+ n = mrb_generate_code(mrb, parser);
/* evaluate the bytecode */
result = mrb_run(mrb,