mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
reduce node size
This commit is contained in:
@@ -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
|
||||
|
||||
+12
-8
@@ -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);
|
||||
|
||||
+28
-2
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user