From d19cdfd2b164bd2b226ea6918e9853b01234676d Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 31 May 2012 15:54:09 +0900 Subject: allow ||= and &&= --- src/codegen.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/codegen.c b/src/codegen.c index 11e9eb236..1f4fa818c 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1225,15 +1225,30 @@ codegen(codegen_scope *s, node *tree, int val) break; case NODE_OP_ASGN: - codegen(s, tree->car, VAL); - codegen(s, tree->cdr->cdr->car, VAL); - genop(s, MKOP_A(OP_LOADNIL, cursp())); - pop(); pop(); { mrb_sym sym = (mrb_sym)tree->cdr->car; const char *name = mrb_sym2name(s->mrb, sym); - int idx = new_msym(s, sym); + int idx; + + codegen(s, tree->car, VAL); + if ((name[0] == '|' && strlen(name) == 2 && name[1] == '|') || + (name[0] == '&' && strlen(name) == 2 && name[1] == '&')) { + int pos; + + pop(); + pos = new_label(s); + genop(s, MKOP_AsBx(name[0] == '|' ? OP_JMPIF : OP_JMPNOT, cursp(), 0)); + codegen(s, tree->cdr->cdr->car, VAL); + pop(); + gen_assignment(s, tree->car, cursp(), val); + dispatch(s, pos); + break; + } + codegen(s, tree->cdr->cdr->car, VAL); + genop(s, MKOP_A(OP_LOADNIL, cursp())); + pop(); pop(); + idx = new_msym(s, sym); if (name[0] == '+' && strlen(name) == 1) { genop(s, MKOP_ABC(OP_ADD, cursp(), idx, 1)); } -- cgit v1.2.3