diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-02-28 11:34:54 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-02-28 11:34:54 +0900 |
| commit | fb3243e09616652c037b7392b9c54af74f15d423 (patch) | |
| tree | be16803342f05e0ab120b4ca24f454afa27c9510 /mrbgems/mruby-compiler/core/codegen.c | |
| parent | 22eb41ab209b3fa467b2efdb664eac156e5669d1 (diff) | |
| download | mruby-fb3243e09616652c037b7392b9c54af74f15d423.tar.gz mruby-fb3243e09616652c037b7392b9c54af74f15d423.zip | |
`return` (and `break`) should handle splat correctly; fix #3472
Diffstat (limited to 'mrbgems/mruby-compiler/core/codegen.c')
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index f198dbd5b..ad4da12f7 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -1221,6 +1221,22 @@ readint_mrb_int(codegen_scope *s, const char *p, int base, mrb_bool neg, mrb_boo } static void +gen_retval(codegen_scope *s, node *tree) +{ + if ((intptr_t)tree->car == NODE_SPLAT) { + genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), 0)); + push(); + codegen(s, tree, VAL); + pop(); pop(); + genop(s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1)); + } + else { + codegen(s, tree, VAL); + pop(); + } +} + +static void codegen(codegen_scope *s, node *tree, int val) { int nt; @@ -1965,8 +1981,7 @@ codegen(codegen_scope *s, node *tree, int val) case NODE_RETURN: if (tree) { - codegen(s, tree, VAL); - pop(); + gen_retval(s, tree); } else { genop(s, MKOP_A(OP_LOADNIL, cursp())); @@ -2893,8 +2908,7 @@ loop_break(codegen_scope *s, node *tree) struct loopinfo *loop; if (tree) { - codegen(s, tree, VAL); - pop(); + gen_retval(s, tree); } loop = s->loop; |
