summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler/core/codegen.c
diff options
context:
space:
mode:
authorChristopher Aue <[email protected]>2017-08-23 18:07:37 +0200
committerChristopher Aue <[email protected]>2017-08-23 18:16:05 +0200
commit3366894a4084c9f44a38410daf6abad9e2da5b33 (patch)
tree7694adf91bfc6ca0ebc26be50b3935d6c3deb3fc /mrbgems/mruby-compiler/core/codegen.c
parent499498a6a73a37dbc41fbac7af52e1f0a2dbafc9 (diff)
downloadmruby-3366894a4084c9f44a38410daf6abad9e2da5b33.tar.gz
mruby-3366894a4084c9f44a38410daf6abad9e2da5b33.zip
Fixed register windows of OP_SENDs generated by NODE_{DREGX,REGX}; ref #3783
Diffstat (limited to 'mrbgems/mruby-compiler/core/codegen.c')
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c30
1 files changed, 15 insertions, 15 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index a457705fb..8f15a9b18 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/mrbgems/mruby-compiler/core/codegen.c
@@ -2450,26 +2450,26 @@ codegen(codegen_scope *s, node *tree, int val)
genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
push();
genop(s, MKOP_ABx(OP_STRING, cursp(), off));
+ push();
if (p2 || p3) {
- push();
- if (p2) {
+ if (p2) { /* opt */
off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
genop(s, MKOP_ABx(OP_STRING, cursp(), off));
}
else {
genop(s, MKOP_A(OP_LOADNIL, cursp()));
}
+ push();
argc++;
- if (p3) {
- push();
+ if (p3) { /* enc */
off = new_lit(s, mrb_str_new(s->mrb, p3, 1));
genop(s, MKOP_ABx(OP_STRING, cursp(), off));
+ push();
argc++;
- pop();
}
- pop();
}
- pop();
+ push(); /* space for a block */
+ pop_n(argc+2);
sym = new_sym(s, mrb_intern_lit(s->mrb, "compile"));
genop(s, MKOP_ABC(OP_SEND, cursp(), sym, argc));
mrb_gc_arena_restore(s->mrb, ai);
@@ -2499,31 +2499,31 @@ codegen(codegen_scope *s, node *tree, int val)
n = n->cdr;
}
n = tree->cdr->cdr;
- if (n->car) {
+ if (n->car) { /* tail */
p = (char*)n->car;
off = new_lit(s, mrb_str_new_cstr(s->mrb, p));
codegen(s, tree->car, VAL);
genop(s, MKOP_ABx(OP_STRING, cursp(), off));
pop();
genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);
+ push();
}
- if (n->cdr->car) {
+ if (n->cdr->car) { /* opt */
char *p2 = (char*)n->cdr->car;
-
- push();
off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
genop(s, MKOP_ABx(OP_STRING, cursp(), off));
+ push();
argc++;
}
- if (n->cdr->cdr) {
+ if (n->cdr->cdr) { /* enc */
char *p2 = (char*)n->cdr->cdr;
-
- push();
off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
genop(s, MKOP_ABx(OP_STRING, cursp(), off));
+ push();
argc++;
}
- pop_n(argc);
+ push(); /* space for a block */
+ pop_n(argc+2);
sym = new_sym(s, mrb_intern_lit(s->mrb, "compile"));
genop(s, MKOP_ABC(OP_SEND, cursp(), sym, argc));
mrb_gc_arena_restore(s->mrb, ai);