diff options
| author | take_cheeze <[email protected]> | 2013-09-02 00:11:17 +0900 |
|---|---|---|
| committer | take_cheeze <[email protected]> | 2013-09-02 00:48:07 +0900 |
| commit | 0b806ca17ba1a9dc6b5863050090a74e51236745 (patch) | |
| tree | 1560617d507113a71c3f632acb126b1eae01d7d0 /src | |
| parent | 8082a37748215462562977dab9b78ae92eca0ad6 (diff) | |
| download | mruby-0b806ca17ba1a9dc6b5863050090a74e51236745.tar.gz mruby-0b806ca17ba1a9dc6b5863050090a74e51236745.zip | |
reduce node size
Diffstat (limited to 'src')
| -rw-r--r-- | src/codegen.c | 20 | ||||
| -rw-r--r-- | src/parse.y | 30 |
2 files changed, 40 insertions, 10 deletions
diff --git a/src/codegen.c b/src/codegen.c index e4fa75b33..b46ddf87e 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -70,6 +70,8 @@ typedef struct scope { int idx; int debug_start_pos; + uint16_t filename_index; + parser_state* parser; } codegen_scope; static codegen_scope* scope_new(mrb_state *mrb, codegen_scope *prev, node *lv); @@ -1112,14 +1114,12 @@ codegen(codegen_scope *s, node *tree, int val) if (!tree) return; - if (s->irep) { - if (s->pc > 0 && strcmp(s->filename, tree->filename) != 0) { - mrb_debug_info_append_file(s->mrb, s->irep, s->debug_start_pos, s->pc); - s->debug_start_pos = s->pc; - // fprintf(stderr, "%s\n", s->filename); - } - s->irep->filename = tree->filename; - s->filename = tree->filename; + if (s->irep && s->pc > 0 && s->filename_index != tree->filename) { + s->irep->filename = s->filename = mrb_parser_get_filename(s->parser, s->filename_index); + mrb_debug_info_append_file(s->mrb, s->irep, s->debug_start_pos, s->pc); + s->debug_start_pos = s->pc; + s->filename_index = tree->filename; + s->filename = mrb_parser_get_filename(s->parser, tree->filename); } nt = (intptr_t)tree->car; @@ -2421,6 +2421,8 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv) else { p->irep->debug_info = NULL; } + p->parser = prev->parser; + p->filename_index = prev->filename_index; return p; } @@ -2869,7 +2871,9 @@ codegen_start(mrb_state *mrb, parser_state *p) return -1; } scope->mrb = mrb; + scope->parser = p; scope->filename = p->filename; + scope->filename_index = p->current_filename_index; if (setjmp(scope->jmp) == 0) { // prepare irep codegen(scope, p->tree, NOVAL); diff --git a/src/parse.y b/src/parse.y index 9ebcd5d98..8bbfea668 100644 --- a/src/parse.y +++ b/src/parse.y @@ -120,7 +120,7 @@ cons_gen(parser_state *p, node *car, node *cdr) c->car = car; c->cdr = cdr; c->lineno = p->lineno; - c->filename = p->filename; + c->filename = p->current_filename_index; return c; } #define cons(a,b) cons_gen(p,(a),(b)) @@ -5183,8 +5183,34 @@ mrbc_partial_hook(mrb_state *mrb, mrbc_context *c, int (*func)(struct mrb_parser void mrb_parser_set_filename(struct mrb_parser_state* p, char const* f) { - p->filename = mrbc_filename(p->mrb, p->cxt, f); + mrb_sym const sym = mrb_intern(p->mrb, f); + size_t len; + p->filename = mrb_sym2name_len(p->mrb, sym, &len); p->lineno = 1; + + for(size_t i = 0; i < p->filename_table_length; ++i) { + if(p->filename_table[i] == sym) { + p->current_filename_index = i; + return; + } + } + + p->current_filename_index = p->filename_table_length++; + + mrb_sym* const new_table = parser_palloc(p, sizeof(mrb_sym) * p->filename_table_length); + if (p->filename_table) { + memcpy(new_table, p->filename_table, sizeof(mrb_sym) * p->filename_table_length); + } + p->filename_table = new_table; + p->filename_table[p->filename_table_length - 1] = sym; +} + +char const* mrb_parser_get_filename(struct mrb_parser_state* p, uint16_t idx) { + if (idx >= p->filename_table_length) { return NULL; } + else { + size_t len; + return mrb_sym2name_len(p->mrb, p->filename_table[idx], &len); + } } #ifdef ENABLE_STDIO |
