summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-02-28 11:34:54 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-02-28 11:34:54 +0900
commitfb3243e09616652c037b7392b9c54af74f15d423 (patch)
treebe16803342f05e0ab120b4ca24f454afa27c9510
parent22eb41ab209b3fa467b2efdb664eac156e5669d1 (diff)
downloadmruby-fb3243e09616652c037b7392b9c54af74f15d423.tar.gz
mruby-fb3243e09616652c037b7392b9c54af74f15d423.zip
`return` (and `break`) should handle splat correctly; fix #3472
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c22
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;