diff options
Diffstat (limited to 'src/codegen.c')
| -rw-r--r-- | src/codegen.c | 48 |
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: |
