diff options
| author | Yukihiro Matsumoto <[email protected]> | 2012-05-31 15:54:09 +0900 |
|---|---|---|
| committer | Yukihiro Matsumoto <[email protected]> | 2012-05-31 15:54:09 +0900 |
| commit | d19cdfd2b164bd2b226ea6918e9853b01234676d (patch) | |
| tree | 0d5d5764cb3baa29eddee0ed6a1412982952db2a | |
| parent | 1f1ab75d754dc5f26dbf103eb6461db950895788 (diff) | |
| download | mruby-d19cdfd2b164bd2b226ea6918e9853b01234676d.tar.gz mruby-d19cdfd2b164bd2b226ea6918e9853b01234676d.zip | |
allow ||= and &&=
| -rw-r--r-- | src/codegen.c | 25 |
1 files changed, 20 insertions, 5 deletions
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)); } |
