diff options
| author | Masaki Muranaka <[email protected]> | 2013-03-17 13:38:25 +0900 |
|---|---|---|
| committer | Masaki Muranaka <[email protected]> | 2013-03-17 17:25:44 +0900 |
| commit | ca3fd5d0d4310a72c284c169c1d94b7f42ab42c9 (patch) | |
| tree | 4d441e2ae184f31b81d4c4a071feabc6f99988b2 /src | |
| parent | 526f4bf6400acdc69b214076946c65b09828f643 (diff) | |
| download | mruby-ca3fd5d0d4310a72c284c169c1d94b7f42ab42c9.tar.gz mruby-ca3fd5d0d4310a72c284c169c1d94b7f42ab42c9.zip | |
Remove memmove(). Use value_move() instead.
value_move() is type-safer than memmove().
And may be faster on some targets.
(If it makes slow on your target,
rewrite to call memset(s1, s2, sizeof(mrb_value)*n)
in value_move().)
Diffstat (limited to 'src')
| -rw-r--r-- | src/vm.c | 37 |
1 files changed, 29 insertions, 8 deletions
@@ -55,6 +55,27 @@ The value below allows about 60000 recursive calls in the simplest case. */ #endif static inline void +value_move(mrb_value *s1, const mrb_value *s2, size_t n) +{ + if (s1 > s2 && s1 < s2 + n) + { + s1 += n; + s2 += n; + while (n-- > 0) { + *--s1 = *--s2; + } + } + else if (s1 != s2) { + while (n-- > 0) { + *s1++ = *s2++; + } + } + else { + /* nothing to do. */ + } +} + +static inline void stack_clear(mrb_value *from, size_t count) { const mrb_value mrb_value_zero = { { 0 } }; @@ -855,7 +876,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) mrb_ary_unshift(mrb, regs[a+1], sym); } else { - memmove(regs+a+2, regs+a+1, sizeof(mrb_value)*(n+1)); + value_move(regs+a+2, regs+a+1, n+1); regs[a+1] = sym; n++; } @@ -994,7 +1015,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) mrb_ary_unshift(mrb, regs[a+1], mrb_symbol_value(ci->mid)); } else { - memmove(regs+a+2, regs+a+1, sizeof(mrb_value)*(n+1)); + value_move(regs+a+2, regs+a+1, n+1); SET_SYM_VALUE(regs[a+1], ci->mid); n++; } @@ -1138,10 +1159,10 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) if (argc < len) { regs[len+1] = *blk; /* move block */ if (argv0 != argv) { - memmove(®s[1], argv, sizeof(mrb_value)*(argc-m2)); /* m1 + o */ + value_move(®s[1], argv, argc-m2); /* m1 + o */ } if (m2) { - memmove(®s[len-m2+1], &argv[argc-m2], sizeof(mrb_value)*m2); /* m2 */ + value_move(®s[len-m2+1], &argv[argc-m2], m2); /* m2 */ } if (r) { /* r */ regs[m1+o+1] = mrb_ary_new_capa(mrb, 0); @@ -1153,13 +1174,13 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) else { if (argv0 != argv) { regs[len+1] = *blk; /* move block */ - memmove(®s[1], argv, sizeof(mrb_value)*(m1+o)); /* m1 + o */ + value_move(®s[1], argv, m1+o); /* m1 + o */ } if (r) { /* r */ regs[m1+o+1] = mrb_ary_new_from_values(mrb, argc-m1-o-m2, argv+m1+o); } if (m2) { - memmove(®s[m1+o+r+1], &argv[argc-m2], sizeof(mrb_value)*m2); + value_move(®s[m1+o+r+1], &argv[argc-m2], m2); } if (argv0 == argv) { regs[len+1] = *blk; /* move block */ @@ -1313,7 +1334,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) mrb_ary_unshift(mrb, regs[a+1], sym); } else { - memmove(regs+a+2, regs+a+1, sizeof(mrb_value)*(n+1)); + value_move(regs+a+2, regs+a+1, n+1); regs[a+1] = sym; n++; } @@ -1328,7 +1349,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) if (ci->argc == CALL_MAXARGS) ci->argc = -1; /* move stack */ - memmove(mrb->stack, ®s[a], (ci->argc+1)*sizeof(mrb_value)); + value_move(mrb->stack, ®s[a], ci->argc+1); if (MRB_PROC_CFUNC_P(m)) { mrb->stack[0] = m->body.func(mrb, recv); |
