Commit 0b806ca1 authored by take_cheeze's avatar take_cheeze

reduce node size

parent 8082a377
......@@ -37,8 +37,7 @@ void mrbc_partial_hook(mrb_state *mrb, mrbc_context *c, int (*partial_hook)(stru
/* AST node structure */
typedef struct mrb_ast_node {
struct mrb_ast_node *car, *cdr;
uint16_t lineno;
char const* filename;
uint16_t lineno, filename;
} mrb_ast_node;
/* lexer states */
......@@ -144,6 +143,10 @@ struct mrb_parser_state {
struct mrb_parser_message error_buffer[10];
struct mrb_parser_message warn_buffer[10];
mrb_sym* filename_table;
size_t filename_table_length;
int current_filename_index;
jmp_buf jmp;
};
......@@ -152,6 +155,7 @@ void mrb_parser_free(struct mrb_parser_state*);
void mrb_parser_parse(struct mrb_parser_state*,mrbc_context*);
void mrb_parser_set_filename(struct mrb_parser_state*, char const*);
char const* mrb_parser_get_filename(struct mrb_parser_state*, uint16_t idx);
/* utility functions */
#ifdef ENABLE_STDIO
......
......@@ -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);
......
......@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment