diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-05-25 00:45:06 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-05-25 00:45:06 +0900 |
| commit | aa1cc2360f268e1d3b1827d0cb9297d4f6fd903c (patch) | |
| tree | 657b8969cdc55614fe3cab4948d88bb52d40edd7 /src | |
| parent | fdb6176aeed6b018305ca99bdabdc2dda3cafc80 (diff) | |
| download | mruby-aa1cc2360f268e1d3b1827d0cb9297d4f6fd903c.tar.gz mruby-aa1cc2360f268e1d3b1827d0cb9297d4f6fd903c.zip | |
fixed a bug in initializing post mandatory block parameters
Diffstat (limited to 'src')
| -rw-r--r-- | src/vm.c | 16 |
1 files changed, 11 insertions, 5 deletions
@@ -1186,9 +1186,13 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) value_move(®s[1], argv, argc-m2); /* m1 + o */ } if (m2) { - value_move(®s[len-m2+1], &argv[argc-m2], m2); /* m2 */ + int mlen = m2; + if (argc-m2 <= m1) { + mlen = argc - m1; + } + value_move(®s[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(®s[1], argv, m1+o); /* m1 + o */ + value_move(®s[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(®s[m1+o+r+1], &argv[argc-m2], m2); + if (argc-m2 > m1) { + value_move(®s[m1+o+r+1], &argv[argc-m2], m2); + } } if (argv0 == argv) { regs[len+1] = *blk; /* move block */ |
