summaryrefslogtreecommitdiffhomepage
path: root/src/codegen.c
diff options
context:
space:
mode:
authorPaolo Bosetti <[email protected]>2012-05-31 18:52:33 -0700
committerPaolo Bosetti <[email protected]>2012-05-31 18:52:33 -0700
commit9c0bfd343679fcd84090b7611ed582ae31e0e3b9 (patch)
tree75e6ac394862821a0e466ccfee361655c40ae749 /src/codegen.c
parent6dbba7b799e0cf1a86ec86f347bbc1b40420d372 (diff)
parent8180fee1808c56048b9fa18a8dd16014e694e48e (diff)
downloadmruby-9c0bfd343679fcd84090b7611ed582ae31e0e3b9.tar.gz
mruby-9c0bfd343679fcd84090b7611ed582ae31e0e3b9.zip
Merge branch 'master' of git://github.com/mruby/mruby into XCode
Diffstat (limited to 'src/codegen.c')
-rw-r--r--src/codegen.c25
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));
}