summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-05-25 00:45:06 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2013-05-25 00:45:06 +0900
commitaa1cc2360f268e1d3b1827d0cb9297d4f6fd903c (patch)
tree657b8969cdc55614fe3cab4948d88bb52d40edd7
parentfdb6176aeed6b018305ca99bdabdc2dda3cafc80 (diff)
downloadmruby-aa1cc2360f268e1d3b1827d0cb9297d4f6fd903c.tar.gz
mruby-aa1cc2360f268e1d3b1827d0cb9297d4f6fd903c.zip
fixed a bug in initializing post mandatory block parameters
-rw-r--r--src/vm.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/vm.c b/src/vm.c
index 99eb84700..9d615e50f 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -1186,9 +1186,13 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
value_move(&regs[1], argv, argc-m2); /* m1 + o */
}
if (m2) {
- value_move(&regs[len-m2+1], &argv[argc-m2], m2); /* m2 */
+ int mlen = m2;
+ if (argc-m2 <= m1) {
+ mlen = argc - m1;
+ }
+ value_move(&regs[len-m2+1], &argv[argc-mlen], mlen);
}
- if (r) { /* r */
+ if (r) {
regs[m1+o+1] = mrb_ary_new_capa(mrb, 0);
}
if (o == 0) pc++;
@@ -1198,13 +1202,15 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
else {
if (argv0 != argv) {
regs[len+1] = *blk; /* move block */
- value_move(&regs[1], argv, m1+o); /* m1 + o */
+ value_move(&regs[1], argv, m1+o);
}
- if (r) { /* r */
+ if (r) {
regs[m1+o+1] = mrb_ary_new_from_values(mrb, argc-m1-o-m2, argv+m1+o);
}
if (m2) {
- value_move(&regs[m1+o+r+1], &argv[argc-m2], m2);
+ if (argc-m2 > m1) {
+ value_move(&regs[m1+o+r+1], &argv[argc-m2], m2);
+ }
}
if (argv0 == argv) {
regs[len+1] = *blk; /* move block */