summaryrefslogtreecommitdiffhomepage
path: root/src
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
parent8082a37748215462562977dab9b78ae92eca0ad6 (diff)
downloadmruby-0b806ca17ba1a9dc6b5863050090a74e51236745.tar.gz
mruby-0b806ca17ba1a9dc6b5863050090a74e51236745.zip
reduce node size
Diffstat (limited to 'src')
-rw-r--r--src/codegen.c20
-rw-r--r--src/parse.y30
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