diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2012-08-14 17:35:13 -0700 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2012-08-14 17:35:13 -0700 |
| commit | 2900b01a3dfe8cbc6fe8e96446d8a1c138379462 (patch) | |
| tree | 446cba3e00102c55e55ab3dc6e3f27e5a3bc996d /src | |
| parent | 6e01057292d627fd1f503aeb933bdadee0c5e272 (diff) | |
| parent | 13b11112128e23ec99610502ec1a85723f1ddb76 (diff) | |
| download | mruby-2900b01a3dfe8cbc6fe8e96446d8a1c138379462.tar.gz mruby-2900b01a3dfe8cbc6fe8e96446d8a1c138379462.zip | |
Merge pull request #426 from mirichi/op_enter_optimize
op_enter_optimize
Diffstat (limited to 'src')
| -rw-r--r-- | src/vm.c | 17 |
1 files changed, 13 insertions, 4 deletions
@@ -996,6 +996,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) */ int argc = mrb->ci->argc; mrb_value *argv = regs+1; + mrb_value *argv0 = argv; int len = m1 + o + r + m2; mrb_value *blk = &argv[argc < 0 ? 1 : argc]; @@ -1020,8 +1021,12 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) mrb->ci->argc = len; if (argc < len) { regs[len+1] = *blk; /* move block */ - memmove(®s[1], argv, sizeof(mrb_value)*(argc-m2)); /* m1 + o */ - memmove(®s[len-m2+1], &argv[argc-m2], sizeof(mrb_value)*m2); /* m2 */ + if (argv0 != argv) { + memmove(®s[1], argv, sizeof(mrb_value)*(argc-m2)); /* m1 + o */ + } + if (m2) { + memmove(®s[len-m2+1], &argv[argc-m2], sizeof(mrb_value)*m2); /* m2 */ + } if (r) { /* r */ regs[m1+o+1] = mrb_ary_new_capa(mrb, 0); } @@ -1030,11 +1035,15 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) pc += argc - m1 - m2 + 1; } else { - memmove(®s[1], argv, sizeof(mrb_value)*(m1+o)); /* m1 + o */ + if (argv0 != argv) { + memmove(®s[1], argv, sizeof(mrb_value)*(m1+o)); /* m1 + o */ + } if (r) { /* r */ regs[m1+o+1] = mrb_ary_new_elts(mrb, argc-m1-o-m2, argv+m1+o); } - memmove(®s[m1+o+r+1], &argv[argc-m2], sizeof(mrb_value)*m2); + if (m2) { + memmove(®s[m1+o+r+1], &argv[argc-m2], sizeof(mrb_value)*m2); + } regs[len+1] = *blk; /* move block */ pc += o + 1; } |
