summaryrefslogtreecommitdiffhomepage
path: root/src/codegen.c
diff options
context:
space:
mode:
authorYukihiro Matz Matsumoto <[email protected]>2012-12-07 16:58:50 +0900
committerYukihiro Matz Matsumoto <[email protected]>2012-12-07 16:58:50 +0900
commitf1ed1436240a2d0d3d45a7061ade26cdc25be352 (patch)
treefc4b9e25b6e2cba27e982bab89bfbb2b3553d499 /src/codegen.c
parentf4867743524c37c14acdfb93caa874818cc6c101 (diff)
downloadmruby-f1ed1436240a2d0d3d45a7061ade26cdc25be352.tar.gz
mruby-f1ed1436240a2d0d3d45a7061ade26cdc25be352.zip
mange arena_idx smarter for smaller ARENA_SIZE; now default to 100 from 1024
Diffstat (limited to 'src/codegen.c')
-rw-r--r--src/codegen.c89
1 files changed, 42 insertions, 47 deletions
diff --git a/src/codegen.c b/src/codegen.c
index c9225e91e..75ccce648 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -60,12 +60,9 @@ typedef struct scope {
short *lines;
int icapa;
- mrb_value *pool;
- int plen;
+ mrb_irep *irep;
int pcapa;
-
- mrb_sym *syms;
- int slen;
+ int scapa;
int nlocals;
int nregs;
@@ -75,7 +72,7 @@ typedef struct scope {
} codegen_scope;
static codegen_scope* scope_new(mrb_state *mrb, codegen_scope *prev, node *lv);
-static void scope_finish(codegen_scope *s, int idx);
+static void scope_finish(codegen_scope *s);
static struct loopinfo *loop_push(codegen_scope *s, enum looptype t);
static void loop_break(codegen_scope *s, node *tree);
static void loop_pop(codegen_scope *s, int val);
@@ -413,15 +410,17 @@ new_lit(codegen_scope *s, mrb_value val)
{
int i;
- for (i=0; i<s->plen; i++) {
- if (mrb_obj_equal(s->mrb, s->pool[i], val)) return i;
+ for (i=0; i<s->irep->plen; i++) {
+ if (mrb_obj_equal(s->mrb, s->irep->pool[i], val)) return i;
}
- if (s->plen == s->pcapa) {
+ if (s->irep->plen == s->pcapa) {
s->pcapa *= 2;
- s->pool = (mrb_value *)codegen_realloc(s, s->pool, sizeof(mrb_value)*s->pcapa);
+ s->irep->pool = (mrb_value *)codegen_realloc(s, s->irep->pool, sizeof(mrb_value)*s->pcapa);
}
- s->pool[s->plen] = val;
- return s->plen++;
+ s->irep->pool[s->irep->plen] = val;
+ i = s->irep->plen++;
+
+ return i;
}
static inline int
@@ -429,17 +428,17 @@ new_msym(codegen_scope *s, mrb_sym sym)
{
int i, len;
- len = s->slen;
+ len = s->irep->slen;
if (len > 255) len = 255;
for (i=0; i<len; i++) {
- if (s->syms[i] == sym) return i;
- if (s->syms[i] == 0) break;
+ if (s->irep->syms[i] == sym) return i;
+ if (s->irep->syms[i] == 0) break;
}
if (i > 255) {
codegen_error(s, "too many symbols (max 256)");
}
- s->syms[i] = sym;
- if (i == s->slen) s->slen++;
+ s->irep->syms[i] = sym;
+ if (i == s->irep->slen) s->irep->slen++;
return i;
}
@@ -448,19 +447,19 @@ new_sym(codegen_scope *s, mrb_sym sym)
{
int i;
- for (i=0; i<s->slen; i++) {
- if (s->syms[i] == sym) return i;
+ for (i=0; i<s->irep->slen; i++) {
+ if (s->irep->syms[i] == sym) return i;
}
- if (s->slen > 125 && s->slen < 256) {
- s->syms = (mrb_sym *)codegen_realloc(s, s->syms, sizeof(mrb_sym)*65536);
- for (i = 0; i < 256 - s->slen; i++) {
+ if (s->irep->slen > 125 && s->irep->slen < 256) {
+ s->irep->syms = (mrb_sym *)codegen_realloc(s, s->irep->syms, sizeof(mrb_sym)*65536);
+ for (i = 0; i < 256 - s->irep->slen; i++) {
static const mrb_sym mrb_sym_zero = { 0 };
- s->syms[i + s->slen] = mrb_sym_zero;
+ s->irep->syms[i + s->irep->slen] = mrb_sym_zero;
}
- s->slen = 256;
+ s->irep->slen = 256;
}
- s->syms[s->slen] = sym;
- return s->slen++;
+ s->irep->syms[s->irep->slen] = sym;
+ return s->irep->slen++;
}
static int
@@ -527,7 +526,7 @@ for_body(codegen_scope *s, node *tree)
genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL);
}
loop_pop(s, NOVAL);
- scope_finish(s, idx);
+ scope_finish(s);
s = prev;
genop(s, MKOP_Abc(OP_LAMBDA, cursp(), idx - base, OP_L_BLOCK));
pop();
@@ -619,7 +618,7 @@ lambda_body(codegen_scope *s, node *tree, int blk)
if (blk) {
loop_pop(s, NOVAL);
}
- scope_finish(s, idx);
+ scope_finish(s);
return idx - base;
}
@@ -643,7 +642,7 @@ scope_body(codegen_scope *s, node *tree)
genop_peep(scope, MKOP_AB(OP_RETURN, scope->sp, OP_R_NORMAL), NOVAL);
}
}
- scope_finish(scope, idx);
+ scope_finish(scope);
return idx - s->idx;
}
@@ -1813,8 +1812,10 @@ codegen(codegen_scope *s, node *tree, int val)
if (val) {
char *p = (char*)tree->car;
size_t len = (intptr_t)tree->cdr;
+ int ai = s->mrb->arena_idx;
int off = new_lit(s, mrb_str_new(s->mrb, p, len));
+ s->mrb->arena_idx = ai;
genop(s, MKOP_ABx(OP_STRING, cursp(), off));
push();
}
@@ -2055,7 +2056,6 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv)
static const codegen_scope codegen_scope_zero = { 0 };
mrb_pool *pool = mrb_pool_open(mrb);
codegen_scope *p = (codegen_scope *)mrb_pool_alloc(pool, sizeof(codegen_scope));
- mrb_irep *irep;
if (!p) return 0;
*p = codegen_scope_zero;
@@ -2066,23 +2066,25 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv)
p->ainfo = -1;
p->mscope = 0;
- p->mrb = prev->mrb;
+ p->irep = mrb_add_irep(mrb);
+ p->idx = p->irep->idx;
+
p->icapa = 1024;
p->iseq = (mrb_code*)mrb_malloc(mrb, sizeof(mrb_code)*p->icapa);
p->pcapa = 32;
- p->pool = (mrb_value*)mrb_malloc(mrb, sizeof(mrb_value)*p->pcapa);
+ p->irep->pool = (mrb_value*)mrb_malloc(mrb, sizeof(mrb_value)*p->pcapa);
+ p->irep->plen = 0;
- p->syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*256);
+ p->scapa = 256;
+ p->irep->syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*256);
+ p->irep->slen = 0;
p->lv = lv;
p->sp += node_len(lv)+1; /* add self */
p->nlocals = p->sp;
p->ai = mrb->arena_idx;
- irep = mrb_add_irep(mrb);
- p->idx = irep->idx;
-
p->filename = prev->filename;
if (p->filename) {
p->lines = (short*)mrb_malloc(mrb, sizeof(short)*p->icapa);
@@ -2091,12 +2093,11 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv)
}
static void
-scope_finish(codegen_scope *s, int idx)
+scope_finish(codegen_scope *s)
{
mrb_state *mrb = s->mrb;
- mrb_irep *irep;
+ mrb_irep *irep = s->irep;
- irep = mrb->irep[idx];
irep->flags = 0;
if (s->iseq) {
irep->iseq = (mrb_code *)codegen_realloc(s, s->iseq, sizeof(mrb_code)*s->pc);
@@ -2108,14 +2109,8 @@ scope_finish(codegen_scope *s, int idx)
irep->lines = 0;
}
}
- if (s->pool) {
- irep->pool = (mrb_value *)codegen_realloc(s, s->pool, sizeof(mrb_value)*s->plen);
- irep->plen = s->plen;
- }
- if (s->syms) {
- irep->syms = (mrb_sym *)codegen_realloc(s, s->syms, sizeof(mrb_sym)*s->slen);
- irep->slen = s->slen;
- }
+ irep->pool = (mrb_value *)codegen_realloc(s, irep->pool, sizeof(mrb_value)*irep->plen);
+ irep->syms = (mrb_sym *)codegen_realloc(s, irep->syms, sizeof(mrb_sym)*irep->slen);
if (s->filename) {
irep->filename = s->filename;
}