diff options
| author | Christopher Aue <[email protected]> | 2017-08-23 18:07:37 +0200 |
|---|---|---|
| committer | Christopher Aue <[email protected]> | 2017-08-23 18:16:05 +0200 |
| commit | 3366894a4084c9f44a38410daf6abad9e2da5b33 (patch) | |
| tree | 7694adf91bfc6ca0ebc26be50b3935d6c3deb3fc /mrbgems/mruby-compiler/core/codegen.c | |
| parent | 499498a6a73a37dbc41fbac7af52e1f0a2dbafc9 (diff) | |
| download | mruby-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.c | 30 |
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); |
