summaryrefslogtreecommitdiffhomepage
path: root/src/codegen.c
diff options
context:
space:
mode:
authorDaniel Bovensiepen <[email protected]>2012-09-19 09:36:35 +0900
committerDaniel Bovensiepen <[email protected]>2012-09-19 09:36:35 +0900
commitc0ff4fed3b721ae5892f3644e57b51551a612c0d (patch)
tree272807d44ec0025a2f64ef79301f3131630f4642 /src/codegen.c
parent17c877011d2ecaba8a904f1b5b87a4aa2f5a82bb (diff)
parent1afda93c7ae70d85e713a2a44e9c32dd604f1a5a (diff)
downloadmruby-c0ff4fed3b721ae5892f3644e57b51551a612c0d.tar.gz
mruby-c0ff4fed3b721ae5892f3644e57b51551a612c0d.zip
Merge remote-tracking branch 'upstream/master' into mrbgems
Diffstat (limited to 'src/codegen.c')
-rw-r--r--src/codegen.c57
1 files changed, 29 insertions, 28 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 799ec1500..50d3e3d3b 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -466,7 +466,8 @@ node_len(node *tree)
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
lv_idx(codegen_scope *s, mrb_sym id)
{
@@ -582,7 +583,7 @@ lambda_body(codegen_scope *s, node *tree, int blk)
dispatch(s, pos+i);
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();
genop_peep(s, MKOP_AB(OP_MOVE, idx, cursp()), NOVAL);
i++;
@@ -706,7 +707,7 @@ gen_values(codegen_scope *s, node *t)
static void
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 n = 0, noop = 0, sendv = 0, blk = 0;
@@ -796,11 +797,11 @@ gen_assignment(codegen_scope *s, node *node, int sp, int val)
node = node->cdr;
switch ((intptr_t)type) {
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);
break;
case NODE_LVAR:
- idx = lv_idx(s, (mrb_sym)node);
+ idx = lv_idx(s, sym(node));
if (idx > 0) {
if (idx != sp) {
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)
codegen_scope *up = s->prev;
while (up) {
- idx = lv_idx(up, (mrb_sym)node);
+ idx = lv_idx(up, sym(node));
if (idx > 0) {
genop_peep(s, MKOP_ABC(OP_SETUPVAR, sp, idx, lv), val);
break;
@@ -824,19 +825,19 @@ gen_assignment(codegen_scope *s, node *node, int sp, int val)
}
break;
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);
break;
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);
break;
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);
break;
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);
push();
codegen(s, node->car, VAL);
@@ -846,7 +847,7 @@ gen_assignment(codegen_scope *s, node *node, int sp, int val)
case NODE_CALL:
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() */
break;
@@ -1247,7 +1248,7 @@ codegen(codegen_scope *s, node *tree, int val)
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);
pop();
@@ -1258,7 +1259,7 @@ codegen(codegen_scope *s, node *tree, int val)
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_ABx(OP_GETMCNST, cursp(), sym));
@@ -1378,7 +1379,7 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_OP_ASGN:
{
- mrb_sym sym = (mrb_sym)tree->cdr->car;
+ mrb_sym sym = sym(tree->cdr->car);
int len;
const char *name = mrb_sym2name_len(s->mrb, sym, &len);
int idx;
@@ -1592,7 +1593,7 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_LVAR:
if (val) {
- int idx = lv_idx(s, (mrb_sym)tree);
+ int idx = lv_idx(s, sym(tree));
if (idx > 0) {
genop(s, MKOP_AB(OP_MOVE, cursp(), idx));
@@ -1602,7 +1603,7 @@ codegen(codegen_scope *s, node *tree, int val)
codegen_scope *up = s->prev;
while (up) {
- idx = lv_idx(up, (mrb_sym)tree);
+ idx = lv_idx(up, sym(tree));
if (idx > 0) {
genop(s, MKOP_ABC(OP_GETUPVAR, cursp(), idx, lv));
break;
@@ -1617,7 +1618,7 @@ codegen(codegen_scope *s, node *tree, int val)
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));
push();
@@ -1626,7 +1627,7 @@ codegen(codegen_scope *s, node *tree, int val)
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));
push();
@@ -1635,7 +1636,7 @@ codegen(codegen_scope *s, node *tree, int val)
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));
push();
@@ -1644,7 +1645,7 @@ codegen(codegen_scope *s, node *tree, int val)
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));
push();
@@ -1828,7 +1829,7 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_SYM:
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));
push();
@@ -1874,8 +1875,8 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_ALIAS:
{
- int a = new_msym(s, (mrb_sym)tree->car);
- int b = new_msym(s, (mrb_sym)tree->cdr);
+ int a = new_msym(s, sym(tree->car));
+ int b = new_msym(s, sym(tree->cdr));
int c = new_msym(s, mrb_intern(s->mrb, "alias_method"));
genop(s, MKOP_A(OP_TCLASS, cursp()));
@@ -1895,7 +1896,7 @@ codegen(codegen_scope *s, node *tree, int val)
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"));
genop(s, MKOP_A(OP_TCLASS, cursp()));
@@ -1934,7 +1935,7 @@ codegen(codegen_scope *s, node *tree, int val)
push();
}
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));
idx = scope_body(s, tree->cdr->cdr->car);
genop(s, MKOP_ABx(OP_EXEC, cursp(), idx));
@@ -1960,7 +1961,7 @@ codegen(codegen_scope *s, node *tree, int val)
codegen(s, tree->car->car, VAL);
}
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));
idx = scope_body(s, tree->cdr->car);
genop(s, MKOP_ABx(OP_EXEC, cursp(), idx));
@@ -1987,7 +1988,7 @@ codegen(codegen_scope *s, node *tree, int val)
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);
genop(s, MKOP_A(OP_TCLASS, cursp()));
@@ -2004,7 +2005,7 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_SDEF:
{
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);
codegen(s, recv, VAL);