diff options
Diffstat (limited to 'src/parse.y')
| -rw-r--r-- | src/parse.y | 30 |
1 files changed, 28 insertions, 2 deletions
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 |
