diff options
| author | mirichi <[email protected]> | 2012-08-15 00:34:36 +0900 |
|---|---|---|
| committer | mirichi <[email protected]> | 2012-08-15 00:34:36 +0900 |
| commit | 13b11112128e23ec99610502ec1a85723f1ddb76 (patch) | |
| tree | a01bf5c73f8a2ebe5a80354ff80954024708cab8 /src | |
| parent | 7d02df3016b0c6eb3f4ee945198772cf4ebca3fa (diff) | |
| download | mruby-13b11112128e23ec99610502ec1a85723f1ddb76.tar.gz mruby-13b11112128e23ec99610502ec1a85723f1ddb76.zip | |
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; } |
