summaryrefslogtreecommitdiffhomepage
path: root/src/parse.y
diff options
context:
space:
mode:
authortake_cheeze <[email protected]>2013-09-02 00:11:17 +0900
committertake_cheeze <[email protected]>2013-09-02 00:48:07 +0900
commit0b806ca17ba1a9dc6b5863050090a74e51236745 (patch)
tree1560617d507113a71c3f632acb126b1eae01d7d0 /src/parse.y
parent8082a37748215462562977dab9b78ae92eca0ad6 (diff)
downloadmruby-0b806ca17ba1a9dc6b5863050090a74e51236745.tar.gz
mruby-0b806ca17ba1a9dc6b5863050090a74e51236745.zip
reduce node size
Diffstat (limited to 'src/parse.y')
-rw-r--r--src/parse.y30
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