summaryrefslogtreecommitdiffhomepage
path: root/src/codegen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen.c')
-rw-r--r--src/codegen.c48
1 files changed, 30 insertions, 18 deletions
diff --git a/src/codegen.c b/src/codegen.c
index ebab9e11e..65d276b02 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -953,6 +953,18 @@ gen_assignment(codegen_scope *s, node *tree, int sp, int val)
}
break;
+ case NODE_MASGN:
+ gen_vmassignment(s, tree->car, sp, val);
+ break;
+
+ push();
+ gen_call(s, tree, attrsym(s, sym(tree->cdr->car)), sp, NOVAL);
+ pop();
+ if (val) {
+ genop_peep(s, MKOP_AB(OP_MOVE, cursp(), sp), val);
+ }
+ break;
+
default:
#ifdef ENABLE_STDIO
printf("unknown lhs %d\n", type);
@@ -1006,7 +1018,7 @@ gen_vmassignment(codegen_scope *s, node *tree, int rhs, int val)
}
}
}
- else {
+ else if (val) {
pop();
}
}
@@ -2746,7 +2758,7 @@ codedump(mrb_state *mrb, mrb_irep *irep)
printf("OP_NOP\n");
break;
case OP_MOVE:
- printf("OP_MOVE\tR%d\tR%d", GETARG_A(c), GETARG_B(c));
+ printf("OP_MOVE\tR%d\tR%d\t", GETARG_A(c), GETARG_B(c));
print_lv(mrb, irep, c, RAB);
break;
case OP_LOADL:
@@ -2758,7 +2770,7 @@ codedump(mrb_state *mrb, mrb_irep *irep)
print_lv(mrb, irep, c, RA);
break;
case OP_LOADI:
- printf("OP_LOADI\tR%d\t%d", GETARG_A(c), GETARG_sBx(c));
+ printf("OP_LOADI\tR%d\t%d\t", GETARG_A(c), GETARG_sBx(c));
print_lv(mrb, irep, c, RA);
break;
case OP_LOADSYM:
@@ -2767,19 +2779,19 @@ codedump(mrb_state *mrb, mrb_irep *irep)
print_lv(mrb, irep, c, RA);
break;
case OP_LOADNIL:
- printf("OP_LOADNIL\tR%d\t", GETARG_A(c));
+ printf("OP_LOADNIL\tR%d\t\t", GETARG_A(c));
print_lv(mrb, irep, c, RA);
break;
case OP_LOADSELF:
- printf("OP_LOADSELF\tR%d\t", GETARG_A(c));
+ printf("OP_LOADSELF\tR%d\t\t", GETARG_A(c));
print_lv(mrb, irep, c, RA);
break;
case OP_LOADT:
- printf("OP_LOADT\tR%d\t", GETARG_A(c));
+ printf("OP_LOADT\tR%d\t\t", GETARG_A(c));
print_lv(mrb, irep, c, RA);
break;
case OP_LOADF:
- printf("OP_LOADF\tR%d\t", GETARG_A(c));
+ printf("OP_LOADF\tR%d\t\t", GETARG_A(c));
print_lv(mrb, irep, c, RA);
break;
case OP_GETGLOBAL:
@@ -2788,7 +2800,7 @@ codedump(mrb_state *mrb, mrb_irep *irep)
print_lv(mrb, irep, c, RA);
break;
case OP_SETGLOBAL:
- printf("OP_SETGLOBAL\t:%s\tR%d",
+ printf("OP_SETGLOBAL\t:%s\tR%d\t",
mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]),
GETARG_A(c));
print_lv(mrb, irep, c, RA);
@@ -2799,7 +2811,7 @@ codedump(mrb_state *mrb, mrb_irep *irep)
print_lv(mrb, irep, c, RA);
break;
case OP_SETCONST:
- printf("OP_SETCONST\t:%s\tR%d",
+ printf("OP_SETCONST\t:%s\tR%d\t",
mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]),
GETARG_A(c));
print_lv(mrb, irep, c, RA);
@@ -2996,11 +3008,11 @@ codedump(mrb_state *mrb, mrb_irep *irep)
print_lv(mrb, irep, c, RAB);
break;
case OP_ARYCAT:
- printf("OP_ARYCAT\tR%d\tR%d", GETARG_A(c), GETARG_B(c));
+ printf("OP_ARYCAT\tR%d\tR%d\t", GETARG_A(c), GETARG_B(c));
print_lv(mrb, irep, c, RAB);
break;
case OP_ARYPUSH:
- printf("OP_ARYPUSH\tR%d\tR%d", GETARG_A(c), GETARG_B(c));
+ printf("OP_ARYPUSH\tR%d\tR%d\t", GETARG_A(c), GETARG_B(c));
print_lv(mrb, irep, c, RAB);
break;
case OP_AREF:
@@ -3020,7 +3032,7 @@ codedump(mrb_state *mrb, mrb_irep *irep)
print_lv(mrb, irep, c, RA);
break;
case OP_STRCAT:
- printf("OP_STRCAT\tR%d\tR%d", GETARG_A(c), GETARG_B(c));
+ printf("OP_STRCAT\tR%d\tR%d\t", GETARG_A(c), GETARG_B(c));
print_lv(mrb, irep, c, RAB);
break;
case OP_HASH:
@@ -3029,7 +3041,7 @@ codedump(mrb_state *mrb, mrb_irep *irep)
break;
case OP_OCLASS:
- printf("OP_OCLASS\tR%d", GETARG_A(c));
+ printf("OP_OCLASS\tR%d\t\t", GETARG_A(c));
print_lv(mrb, irep, c, RA);
break;
case OP_CLASS:
@@ -3047,11 +3059,11 @@ codedump(mrb_state *mrb, mrb_irep *irep)
print_lv(mrb, irep, c, RA);
break;
case OP_SCLASS:
- printf("OP_SCLASS\tR%d\tR%d", GETARG_A(c), GETARG_B(c));
+ printf("OP_SCLASS\tR%d\tR%d\t", GETARG_A(c), GETARG_B(c));
print_lv(mrb, irep, c, RAB);
break;
case OP_TCLASS:
- printf("OP_TCLASS\tR%d", GETARG_A(c));
+ printf("OP_TCLASS\tR%d\t\t", GETARG_A(c));
print_lv(mrb, irep, c, RA);
break;
case OP_ERR:
@@ -3068,15 +3080,15 @@ codedump(mrb_state *mrb, mrb_irep *irep)
printf("OP_ONERR\t%03d\n", i+GETARG_sBx(c));
break;
case OP_RESCUE:
- printf("OP_RESCUE\tR%d", GETARG_A(c));
+ printf("OP_RESCUE\tR%d\t\t", GETARG_A(c));
print_lv(mrb, irep, c, RA);
break;
case OP_RAISE:
- printf("OP_RAISE\tR%d", GETARG_A(c));
+ printf("OP_RAISE\tR%d\t\t", GETARG_A(c));
print_lv(mrb, irep, c, RA);
break;
case OP_POPERR:
- printf("OP_POPERR\t%d", GETARG_A(c));
+ printf("OP_POPERR\t%d\t\t", GETARG_A(c));
print_lv(mrb, irep, c, RA);
break;
case OP_EPOP: