mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
file/line info passed to codegen; argument type of mrb_generate_code() has changed
This commit is contained in:
@@ -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*);
|
||||
|
||||
+26
-6
@@ -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;
|
||||
|
||||
+2
-1
@@ -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";
|
||||
|
||||
+1
-1
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user