summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-04-05 18:22:26 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-04-05 18:22:26 +0900
commitd9fb8b69b0621e8cd2c7c43fd8511a83718d7e45 (patch)
treee0099f708d97ba840c576205704d648468d5ebe5 /src/vm.c
parentbd7bf260e8946f721e3fb81b84c24bb31e92ab90 (diff)
downloadmruby-d9fb8b69b0621e8cd2c7c43fd8511a83718d7e45.tar.gz
mruby-d9fb8b69b0621e8cd2c7c43fd8511a83718d7e45.zip
Fixed a bug in OP_SUPER block conversion; fix #3590
Diffstat (limited to 'src/vm.c')
-rw-r--r--src/vm.c43
1 files changed, 22 insertions, 21 deletions
diff --git a/src/vm.c b/src/vm.c
index 889fd31bc..518323cf7 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -1375,6 +1375,8 @@ RETRY_TRY_BLOCK:
mrb_sym mid = ci->mid;
int a = GETARG_A(i);
int n = GETARG_C(i);
+ mrb_value blk;
+ int bidx;
if (mid == 0 || !ci->target_class) {
mrb_value exc;
@@ -1414,6 +1416,21 @@ RETRY_TRY_BLOCK:
}
}
+ if (n == CALL_MAXARGS) {
+ bidx = a+2;
+ }
+ else {
+ bidx = a+n+1;
+ }
+ blk = regs[bidx];
+ if (!mrb_nil_p(blk) && mrb_type(blk) != MRB_TT_PROC) {
+ if (bidx >= ci->nregs) {
+ stack_extend(mrb, bidx+1, ci->nregs);
+ ci->nregs = bidx+1;
+ }
+ regs[bidx] = mrb_convert_type(mrb, blk, MRB_TT_PROC, "Proc", "to_proc");
+ }
+
/* push callinfo */
ci = cipush(mrb);
ci->mid = mid;
@@ -1421,27 +1438,11 @@ RETRY_TRY_BLOCK:
ci->stackent = mrb->c->stack;
ci->target_class = c;
ci->pc = pc + 1;
- {
- int bidx;
- mrb_value blk;
-
- if (n == CALL_MAXARGS) {
- ci->argc = -1;
- bidx = a+2;
- }
- else {
- ci->argc = n;
- bidx = a+n+1;
- }
- blk = regs[bidx];
- if (!mrb_nil_p(blk) && mrb_type(blk) != MRB_TT_PROC) {
- if (bidx >= ci->nregs) {
- stack_extend(mrb, bidx+1, ci->nregs);
- ci->nregs = bidx+1;
- }
- regs[bidx] = mrb_convert_type(mrb, blk, MRB_TT_PROC, "Proc", "to_proc");
- ci = mrb->c->ci;
- }
+ if (n == CALL_MAXARGS) {
+ ci->argc = -1;
+ }
+ else {
+ ci->argc = n;
}
/* prepare stack */