Commit 540066c9 authored by Yukihiro Matsumoto's avatar Yukihiro Matsumoto

mrb_sym can be short integer; reduced 10KB

parent 3a49dfd1
...@@ -62,11 +62,10 @@ typedef double mrb_float; ...@@ -62,11 +62,10 @@ typedef double mrb_float;
#ifdef MRB_NAN_BOXING #ifdef MRB_NAN_BOXING
typedef int32_t mrb_int; typedef int32_t mrb_int;
typedef int32_t mrb_sym;
#else #else
typedef int mrb_int; typedef int mrb_int;
typedef intptr_t mrb_sym;
#endif #endif
typedef short mrb_sym;
/* define ENABLE_XXXX from DISABLE_XXX */ /* define ENABLE_XXXX from DISABLE_XXX */
#ifndef DISABLE_REGEXP #ifndef DISABLE_REGEXP
......
...@@ -466,7 +466,8 @@ node_len(node *tree) ...@@ -466,7 +466,8 @@ node_len(node *tree)
return n; return n;
} }
#define lv_name(lv) ((mrb_sym)(lv)->car) #define sym(x) ((mrb_sym)(intptr_t)(x))
#define lv_name(lv) sym((lv)->car)
static int static int
lv_idx(codegen_scope *s, mrb_sym id) lv_idx(codegen_scope *s, mrb_sym id)
{ {
...@@ -582,7 +583,7 @@ lambda_body(codegen_scope *s, node *tree, int blk) ...@@ -582,7 +583,7 @@ lambda_body(codegen_scope *s, node *tree, int blk)
dispatch(s, pos+i); dispatch(s, pos+i);
codegen(s, opt->car->cdr, VAL); codegen(s, opt->car->cdr, VAL);
idx = lv_idx(s, (mrb_sym)opt->car->car); idx = lv_idx(s, (mrb_sym)(intptr_t)opt->car->car);
pop(); pop();
genop_peep(s, MKOP_AB(OP_MOVE, idx, cursp()), NOVAL); genop_peep(s, MKOP_AB(OP_MOVE, idx, cursp()), NOVAL);
i++; i++;
...@@ -706,7 +707,7 @@ gen_values(codegen_scope *s, node *t) ...@@ -706,7 +707,7 @@ gen_values(codegen_scope *s, node *t)
static void static void
gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val) gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val)
{ {
mrb_sym sym = name ? name : (mrb_sym)tree->cdr->car; mrb_sym sym = name ? name : sym(tree->cdr->car);
int idx; int idx;
int n = 0, noop = 0, sendv = 0, blk = 0; int n = 0, noop = 0, sendv = 0, blk = 0;
...@@ -796,11 +797,11 @@ gen_assignment(codegen_scope *s, node *node, int sp, int val) ...@@ -796,11 +797,11 @@ gen_assignment(codegen_scope *s, node *node, int sp, int val)
node = node->cdr; node = node->cdr;
switch ((intptr_t)type) { switch ((intptr_t)type) {
case NODE_GVAR: case NODE_GVAR:
idx = new_sym(s, (mrb_sym)node); idx = new_sym(s, sym(node));
genop_peep(s, MKOP_ABx(OP_SETGLOBAL, sp, idx), val); genop_peep(s, MKOP_ABx(OP_SETGLOBAL, sp, idx), val);
break; break;
case NODE_LVAR: case NODE_LVAR:
idx = lv_idx(s, (mrb_sym)node); idx = lv_idx(s, sym(node));
if (idx > 0) { if (idx > 0) {
if (idx != sp) { if (idx != sp) {
genop_peep(s, MKOP_AB(OP_MOVE, idx, sp), val); genop_peep(s, MKOP_AB(OP_MOVE, idx, sp), val);
...@@ -812,7 +813,7 @@ gen_assignment(codegen_scope *s, node *node, int sp, int val) ...@@ -812,7 +813,7 @@ gen_assignment(codegen_scope *s, node *node, int sp, int val)
codegen_scope *up = s->prev; codegen_scope *up = s->prev;
while (up) { while (up) {
idx = lv_idx(up, (mrb_sym)node); idx = lv_idx(up, sym(node));
if (idx > 0) { if (idx > 0) {
genop_peep(s, MKOP_ABC(OP_SETUPVAR, sp, idx, lv), val); genop_peep(s, MKOP_ABC(OP_SETUPVAR, sp, idx, lv), val);
break; break;
...@@ -824,19 +825,19 @@ gen_assignment(codegen_scope *s, node *node, int sp, int val) ...@@ -824,19 +825,19 @@ gen_assignment(codegen_scope *s, node *node, int sp, int val)
} }
break; break;
case NODE_IVAR: case NODE_IVAR:
idx = new_sym(s, (mrb_sym)node); idx = new_sym(s, sym(node));
genop_peep(s, MKOP_ABx(OP_SETIV, sp, idx), val); genop_peep(s, MKOP_ABx(OP_SETIV, sp, idx), val);
break; break;
case NODE_CVAR: case NODE_CVAR:
idx = new_sym(s, (mrb_sym)node); idx = new_sym(s, sym(node));
genop_peep(s, MKOP_ABx(OP_SETCV, sp, idx), val); genop_peep(s, MKOP_ABx(OP_SETCV, sp, idx), val);
break; break;
case NODE_CONST: case NODE_CONST:
idx = new_sym(s, (mrb_sym)node); idx = new_sym(s, sym(node));
genop_peep(s, MKOP_ABx(OP_SETCONST, sp, idx), val); genop_peep(s, MKOP_ABx(OP_SETCONST, sp, idx), val);
break; break;
case NODE_COLON2: case NODE_COLON2:
idx = new_sym(s, (mrb_sym)node->cdr); idx = new_sym(s, sym(node->cdr));
genop_peep(s, MKOP_AB(OP_MOVE, cursp(), sp), NOVAL); genop_peep(s, MKOP_AB(OP_MOVE, cursp(), sp), NOVAL);
push(); push();
codegen(s, node->car, VAL); codegen(s, node->car, VAL);
...@@ -846,7 +847,7 @@ gen_assignment(codegen_scope *s, node *node, int sp, int val) ...@@ -846,7 +847,7 @@ gen_assignment(codegen_scope *s, node *node, int sp, int val)
case NODE_CALL: case NODE_CALL:
push(); push();
gen_call(s, node, attrsym(s, (mrb_sym)node->cdr->car), sp, val); gen_call(s, node, attrsym(s, sym(node->cdr->car)), sp, val);
val = NOVAL; /* push should have done in gen_call() */ val = NOVAL; /* push should have done in gen_call() */
break; break;
...@@ -1247,7 +1248,7 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -1247,7 +1248,7 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_COLON2: case NODE_COLON2:
{ {
int sym = new_sym(s, (mrb_sym)tree->cdr); int sym = new_sym(s, sym(tree->cdr));
codegen(s, tree->car, VAL); codegen(s, tree->car, VAL);
pop(); pop();
...@@ -1258,7 +1259,7 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -1258,7 +1259,7 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_COLON3: case NODE_COLON3:
{ {
int sym = new_sym(s, (mrb_sym)tree); int sym = new_sym(s, sym(tree));
genop(s, MKOP_A(OP_OCLASS, cursp())); genop(s, MKOP_A(OP_OCLASS, cursp()));
genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym)); genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
...@@ -1378,7 +1379,7 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -1378,7 +1379,7 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_OP_ASGN: case NODE_OP_ASGN:
{ {
mrb_sym sym = (mrb_sym)tree->cdr->car; mrb_sym sym = sym(tree->cdr->car);
int len; int len;
const char *name = mrb_sym2name_len(s->mrb, sym, &len); const char *name = mrb_sym2name_len(s->mrb, sym, &len);
int idx; int idx;
...@@ -1592,7 +1593,7 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -1592,7 +1593,7 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_LVAR: case NODE_LVAR:
if (val) { if (val) {
int idx = lv_idx(s, (mrb_sym)tree); int idx = lv_idx(s, sym(tree));
if (idx > 0) { if (idx > 0) {
genop(s, MKOP_AB(OP_MOVE, cursp(), idx)); genop(s, MKOP_AB(OP_MOVE, cursp(), idx));
...@@ -1602,7 +1603,7 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -1602,7 +1603,7 @@ codegen(codegen_scope *s, node *tree, int val)
codegen_scope *up = s->prev; codegen_scope *up = s->prev;
while (up) { while (up) {
idx = lv_idx(up, (mrb_sym)tree); idx = lv_idx(up, sym(tree));
if (idx > 0) { if (idx > 0) {
genop(s, MKOP_ABC(OP_GETUPVAR, cursp(), idx, lv)); genop(s, MKOP_ABC(OP_GETUPVAR, cursp(), idx, lv));
break; break;
...@@ -1617,7 +1618,7 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -1617,7 +1618,7 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_GVAR: case NODE_GVAR:
{ {
int sym = new_sym(s, (mrb_sym)tree); int sym = new_sym(s, sym(tree));
genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym)); genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym));
push(); push();
...@@ -1626,7 +1627,7 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -1626,7 +1627,7 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_IVAR: case NODE_IVAR:
{ {
int sym = new_sym(s, (mrb_sym)tree); int sym = new_sym(s, sym(tree));
genop(s, MKOP_ABx(OP_GETIV, cursp(), sym)); genop(s, MKOP_ABx(OP_GETIV, cursp(), sym));
push(); push();
...@@ -1635,7 +1636,7 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -1635,7 +1636,7 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_CVAR: case NODE_CVAR:
{ {
int sym = new_sym(s, (mrb_sym)tree); int sym = new_sym(s, sym(tree));
genop(s, MKOP_ABx(OP_GETCV, cursp(), sym)); genop(s, MKOP_ABx(OP_GETCV, cursp(), sym));
push(); push();
...@@ -1644,7 +1645,7 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -1644,7 +1645,7 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_CONST: case NODE_CONST:
{ {
int sym = new_sym(s, (mrb_sym)tree); int sym = new_sym(s, sym(tree));
genop(s, MKOP_ABx(OP_GETCONST, cursp(), sym)); genop(s, MKOP_ABx(OP_GETCONST, cursp(), sym));
push(); push();
...@@ -1828,7 +1829,7 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -1828,7 +1829,7 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_SYM: case NODE_SYM:
if (val) { if (val) {
int sym = new_sym(s, (mrb_sym)tree); int sym = new_sym(s, sym(tree));
genop(s, MKOP_ABx(OP_LOADSYM, cursp(), sym)); genop(s, MKOP_ABx(OP_LOADSYM, cursp(), sym));
push(); push();
...@@ -1874,8 +1875,8 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -1874,8 +1875,8 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_ALIAS: case NODE_ALIAS:
{ {
int a = new_msym(s, (mrb_sym)tree->car); int a = new_msym(s, sym(tree->car));
int b = new_msym(s, (mrb_sym)tree->cdr); int b = new_msym(s, sym(tree->cdr));
int c = new_msym(s, mrb_intern(s->mrb, "alias_method")); int c = new_msym(s, mrb_intern(s->mrb, "alias_method"));
genop(s, MKOP_A(OP_TCLASS, cursp())); genop(s, MKOP_A(OP_TCLASS, cursp()));
...@@ -1895,7 +1896,7 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -1895,7 +1896,7 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_UNDEF: case NODE_UNDEF:
{ {
int sym = new_msym(s, (mrb_sym)tree); int sym = new_msym(s, sym(tree));
int undef = new_msym(s, mrb_intern(s->mrb, "undef_method")); int undef = new_msym(s, mrb_intern(s->mrb, "undef_method"));
genop(s, MKOP_A(OP_TCLASS, cursp())); genop(s, MKOP_A(OP_TCLASS, cursp()));
...@@ -1934,7 +1935,7 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -1934,7 +1935,7 @@ codegen(codegen_scope *s, node *tree, int val)
push(); push();
} }
pop(); pop(); pop(); pop();
idx = new_msym(s, (mrb_sym)tree->car->cdr); idx = new_msym(s, sym(tree->car->cdr));
genop(s, MKOP_AB(OP_CLASS, cursp(), idx)); genop(s, MKOP_AB(OP_CLASS, cursp(), idx));
idx = scope_body(s, tree->cdr->cdr->car); idx = scope_body(s, tree->cdr->cdr->car);
genop(s, MKOP_ABx(OP_EXEC, cursp(), idx)); genop(s, MKOP_ABx(OP_EXEC, cursp(), idx));
...@@ -1960,7 +1961,7 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -1960,7 +1961,7 @@ codegen(codegen_scope *s, node *tree, int val)
codegen(s, tree->car->car, VAL); codegen(s, tree->car->car, VAL);
} }
pop(); pop();
idx = new_msym(s, (mrb_sym)tree->car->cdr); idx = new_msym(s, sym(tree->car->cdr));
genop(s, MKOP_AB(OP_MODULE, cursp(), idx)); genop(s, MKOP_AB(OP_MODULE, cursp(), idx));
idx = scope_body(s, tree->cdr->car); idx = scope_body(s, tree->cdr->car);
genop(s, MKOP_ABx(OP_EXEC, cursp(), idx)); genop(s, MKOP_ABx(OP_EXEC, cursp(), idx));
...@@ -1987,7 +1988,7 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -1987,7 +1988,7 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_DEF: case NODE_DEF:
{ {
int sym = new_msym(s, (mrb_sym)tree->car); int sym = new_msym(s, sym(tree->car));
int idx = lambda_body(s, tree->cdr, 0); int idx = lambda_body(s, tree->cdr, 0);
genop(s, MKOP_A(OP_TCLASS, cursp())); genop(s, MKOP_A(OP_TCLASS, cursp()));
...@@ -2004,7 +2005,7 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -2004,7 +2005,7 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_SDEF: case NODE_SDEF:
{ {
node *recv = tree->car; node *recv = tree->car;
int sym = new_msym(s, (mrb_sym)tree->cdr->car); int sym = new_msym(s, sym(tree->cdr->car));
int idx = lambda_body(s, tree->cdr->cdr, 0); int idx = lambda_body(s, tree->cdr->cdr, 0);
codegen(s, recv, VAL); codegen(s, recv, VAL);
......
This diff is collapsed.
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