diff options
| author | Yukihiro Matz Matsumoto <[email protected]> | 2013-03-18 07:57:21 +0900 |
|---|---|---|
| committer | Yukihiro Matz Matsumoto <[email protected]> | 2013-03-18 07:57:21 +0900 |
| commit | 17bc0a1ae457d48353de28756039695019294138 (patch) | |
| tree | e2e8ecefa2f36665518b996de28b57100653ee54 /src | |
| parent | 13cd0363f0803d2cf0116cc28d5749dfbad6da83 (diff) | |
| parent | 59fbb16d4bf799a0594183d6c5a8c052b7427621 (diff) | |
| download | mruby-17bc0a1ae457d48353de28756039695019294138.tar.gz mruby-17bc0a1ae457d48353de28756039695019294138.zip | |
Merge branch 'master' of github.com:mruby/mruby
Diffstat (limited to 'src')
| -rw-r--r-- | src/string.c | 2 | ||||
| -rw-r--r-- | src/symbol.c | 1 | ||||
| -rw-r--r-- | src/vm.c | 37 |
3 files changed, 30 insertions, 10 deletions
diff --git a/src/string.c b/src/string.c index 32daaa3b5..7fefbefb5 100644 --- a/src/string.c +++ b/src/string.c @@ -2050,7 +2050,7 @@ mrb_cstr_to_inum(mrb_state *mrb, const char *str, int base, int badcheck) char *end; char sign = 1; int c; - unsigned int n; + unsigned long n; mrb_int val; #undef ISDIGIT diff --git a/src/symbol.c b/src/symbol.c index 34d274787..1c56af4cf 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -44,7 +44,6 @@ mrb_intern2(mrb_state *mrb, const char *name, size_t len) mrb_sym sym; char *p; - if (len < 0) len = 0; sname.len = len; sname.name = name; k = kh_get(n2s, h, sname); @@ -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); |
