diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/array.c | 5 | ||||
| -rw-r--r-- | src/backtrace.c | 4 | ||||
| -rw-r--r-- | src/error.c | 5 | ||||
| -rw-r--r-- | src/string.c | 17 | ||||
| -rw-r--r-- | src/vm.c | 6 |
5 files changed, 22 insertions, 15 deletions
diff --git a/src/array.c b/src/array.c index 2ef29dcf5..e97aaa1c9 100644 --- a/src/array.c +++ b/src/array.c @@ -1074,7 +1074,10 @@ mrb_ary_entry(mrb_value ary, mrb_int offset) if (offset < 0) { offset += RARRAY_LEN(ary); } - return ary_elt(ary, offset); + if (offset < 0 || RARRAY_LEN(ary) <= offset) { + return mrb_nil_value(); + } + return RARRAY_PTR(ary)[offset]; } static mrb_value diff --git a/src/backtrace.c b/src/backtrace.c index 0f5240f6f..2ac5eb95a 100644 --- a/src/backtrace.c +++ b/src/backtrace.c @@ -26,9 +26,9 @@ typedef void (*each_backtrace_func)(mrb_state*, int i, struct backtrace_location static const mrb_data_type bt_type = { "Backtrace", mrb_free }; static void -each_backtrace(mrb_state *mrb, mrb_int ciidx, mrb_code *pc0, each_backtrace_func func, void *data) +each_backtrace(mrb_state *mrb, ptrdiff_t ciidx, mrb_code *pc0, each_backtrace_func func, void *data) { - int i, j; + ptrdiff_t i, j; if (ciidx >= mrb->c->ciend - mrb->c->cibase) ciidx = 10; /* ciidx is broken... */ diff --git a/src/error.c b/src/error.c index 062282719..cd771dc2d 100644 --- a/src/error.c +++ b/src/error.c @@ -269,9 +269,12 @@ mrb_vformat(mrb_state *mrb, const char *format, va_list ap) if (c == '%') { if (*p == 'S') { + mrb_value val; + size = p - b - 1; mrb_ary_push(mrb, ary, mrb_str_new(mrb, b, size)); - mrb_ary_push(mrb, ary, va_arg(ap, mrb_value)); + val = va_arg(ap, mrb_value); + mrb_ary_push(mrb, ary, mrb_obj_as_string(mrb, val)); b = p + 1; } } diff --git a/src/string.c b/src/string.c index 5abc5c4cf..ae650865d 100644 --- a/src/string.c +++ b/src/string.c @@ -40,7 +40,7 @@ str_new_static(mrb_state *mrb, const char *p, size_t len) mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big"); } s = mrb_obj_alloc_string(mrb); - s->as.heap.len = len; + s->as.heap.len = (mrb_int)len; s->as.heap.aux.capa = 0; /* nofree */ s->as.heap.ptr = (char *)p; s->flags = MRB_STR_NOFREE; @@ -68,8 +68,8 @@ str_new(mrb_state *mrb, const char *p, size_t len) if (len >= MRB_INT_MAX) { mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big"); } - s->as.heap.len = len; - s->as.heap.aux.capa = len; + s->as.heap.len = (mrb_int)len; + s->as.heap.aux.capa = (mrb_int)len; s->as.heap.ptr = (char *)mrb_malloc(mrb, len+1); if (p) { memcpy(s->as.heap.ptr, p, len); @@ -112,7 +112,7 @@ mrb_str_buf_new(mrb_state *mrb, size_t capa) capa = MRB_STR_BUF_MIN_SIZE; } s->as.heap.len = 0; - s->as.heap.aux.capa = capa; + s->as.heap.aux.capa = (mrb_int)capa; s->as.heap.ptr = (char *)mrb_malloc(mrb, capa+1); RSTR_PTR(s)[0] = '\0'; @@ -341,7 +341,8 @@ mrb_memsearch_qs(const unsigned char *xs, mrb_int m, const unsigned char *ys, mr { const unsigned char *x = xs, *xe = xs + m; const unsigned char *y = ys; - int i, qstable[256]; + int i; + ptrdiff_t qstable[256]; /* Preprocessing */ for (i = 0; i < 256; ++i) @@ -351,7 +352,7 @@ mrb_memsearch_qs(const unsigned char *xs, mrb_int m, const unsigned char *ys, mr /* Searching */ for (; y + m <= ys + n; y += *(qstable + y[m])) { if (*xs == *y && memcmp(xs, y, m) == 0) - return y - ys; + return (mrb_int)(y - ys); } return -1; } @@ -372,7 +373,7 @@ mrb_memsearch(const void *x0, mrb_int m, const void *y0, mrb_int n) const unsigned char *ys = (const unsigned char *)memchr(y, *x, n); if (ys) - return ys - y; + return (mrb_int)(ys - y); else return -1; } @@ -585,7 +586,7 @@ str_rindex(mrb_state *mrb, mrb_value str, mrb_value sub, mrb_int pos) if (len) { while (sbeg <= s) { if (memcmp(s, t, len) == 0) { - return s - RSTR_PTR(ps); + return (mrb_int)(s - RSTR_PTR(ps)); } s--; } @@ -223,7 +223,7 @@ uvenv(mrb_state *mrb, int up) static inline mrb_bool is_strict(mrb_state *mrb, struct REnv *e) { - int cioff = e->cioff; + ptrdiff_t cioff = e->cioff; if (MRB_ENV_STACK_SHARED_P(e) && e->cxt.c->cibase[cioff].proc && MRB_PROC_STRICT_P(e->cxt.c->cibase[cioff].proc)) { @@ -732,7 +732,7 @@ mrb_yield_with_class(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value mrb->c->stack = mrb->c->ci->stackent; } else { - int cioff = mrb->c->ci - mrb->c->cibase; + ptrdiff_t cioff = mrb->c->ci - mrb->c->cibase; val = mrb_run(mrb, p, self); mrb->c->ci = mrb->c->cibase + cioff; } @@ -903,7 +903,7 @@ mrb_vm_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stac mrb_irep *irep = proc->body.irep; mrb_value result; struct mrb_context *c = mrb->c; - int cioff = c->ci - c->cibase; + ptrdiff_t cioff = c->ci - c->cibase; unsigned int nregs = irep->nregs; if (!c->stack) { |
