diff options
| -rw-r--r-- | include/mruby/array.h | 34 | ||||
| -rw-r--r-- | mrbgems/mruby-array-ext/src/array.c | 11 | ||||
| -rw-r--r-- | mrbgems/mruby-enum-lazy/mrblib/lazy.rb | 3 | ||||
| -rw-r--r-- | mrbgems/mruby-enumerator/mrblib/enumerator.rb | 3 | ||||
| -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 |
9 files changed, 48 insertions, 40 deletions
diff --git a/include/mruby/array.h b/include/mruby/array.h index bd3124d8c..946897a22 100644 --- a/include/mruby/array.h +++ b/include/mruby/array.h @@ -46,7 +46,7 @@ struct RArray { #define ARY_EMBED_P(a) ((a)->flags & MRB_ARY_EMBED) #define ARY_SET_EMBED_FLAG(a) ((a)->flags |= MRB_ARY_EMBED) #define ARY_UNSET_EMBED_FLAG(a) ((a)->flags &= ~(MRB_ARY_EMBED|MRB_ARY_EMBED_MASK)) -#define ARY_EMBED_LEN(a) ((a)->flags & MRB_ARY_EMBED_MASK) +#define ARY_EMBED_LEN(a) ((mrb_int)((a)->flags & MRB_ARY_EMBED_MASK)) #define ARY_SET_EMBED_LEN(a,len) (a)->flags = ((a)->flags&~MRB_ARY_EMBED_MASK) | ((len)&MRB_ARY_EMBED_MASK); #define ARY_EMBED_PTR(a) (&((a)->as.embed[0])) @@ -204,7 +204,7 @@ MRB_API void mrb_ary_replace(mrb_state *mrb, mrb_value self, mrb_value other); MRB_API mrb_value mrb_check_array_type(mrb_state *mrb, mrb_value self); /* - * Unshift an element into an array + * Unshift an element into the array * * Equivalent to: * @@ -215,6 +215,17 @@ MRB_API mrb_value mrb_check_array_type(mrb_state *mrb, mrb_value self); * @param item The item to unshift. */ MRB_API mrb_value mrb_ary_unshift(mrb_state *mrb, mrb_value self, mrb_value item); + +/* + * Get nth element in the array + * + * Equivalent to: + * + * ary[offset] + * + * @param ary The target array. + * @param offset The element position (negative counts from the tail). + */ MRB_API mrb_value mrb_ary_entry(mrb_value ary, mrb_int offset); /* @@ -231,7 +242,7 @@ MRB_API mrb_value mrb_ary_entry(mrb_value ary, mrb_int offset); MRB_API mrb_value mrb_ary_shift(mrb_state *mrb, mrb_value self); /* - * Removes all elements from this array + * Removes all elements from the array * * Equivalent to: * @@ -265,23 +276,6 @@ MRB_API mrb_value mrb_ary_join(mrb_state *mrb, mrb_value ary, mrb_value sep); */ MRB_API mrb_value mrb_ary_resize(mrb_state *mrb, mrb_value ary, mrb_int new_len); -static inline mrb_int -mrb_ary_len(mrb_state *mrb, mrb_value ary) -{ - (void)mrb; - mrb_assert(mrb_array_p(ary)); - return RARRAY_LEN(ary); -} - -static inline mrb_value -ary_elt(mrb_value ary, mrb_int offset) -{ - if (offset < 0 || RARRAY_LEN(ary) <= offset) { - return mrb_nil_value(); - } - return RARRAY_PTR(ary)[offset]; -} - MRB_END_DECL #endif /* MRUBY_ARRAY_H */ diff --git a/mrbgems/mruby-array-ext/src/array.c b/mrbgems/mruby-array-ext/src/array.c index 72e5080f1..e99599b09 100644 --- a/mrbgems/mruby-array-ext/src/array.c +++ b/mrbgems/mruby-array-ext/src/array.c @@ -127,19 +127,20 @@ mrb_ary_to_h(mrb_state *mrb, mrb_value ary) hash = mrb_hash_new_capa(mrb, 0); for (i = 0; i < RARRAY_LEN(ary); ++i) { - v = mrb_check_array_type(mrb, RARRAY_PTR(ary)[i]); + mrb_value elt = RARRAY_PTR(ary)[i]; + v = mrb_check_array_type(mrb, elt); if (mrb_nil_p(v)) { mrb_raisef(mrb, E_TYPE_ERROR, "wrong element type %S at %S (expected array)", - mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, ary_elt(ary, i))), - mrb_fixnum_value(i) + mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, elt)), + mrb_fixnum_value(i) ); } if (RARRAY_LEN(v) != 2) { mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong array length at %S (expected 2, was %S)", - mrb_fixnum_value(i), - mrb_fixnum_value(RARRAY_LEN(v)) + mrb_fixnum_value(i), + mrb_fixnum_value(RARRAY_LEN(v)) ); } diff --git a/mrbgems/mruby-enum-lazy/mrblib/lazy.rb b/mrbgems/mruby-enum-lazy/mrblib/lazy.rb index 8a7ac7fdc..c98681edf 100644 --- a/mrbgems/mruby-enum-lazy/mrblib/lazy.rb +++ b/mrbgems/mruby-enum-lazy/mrblib/lazy.rb @@ -43,6 +43,9 @@ class Enumerator end def to_enum(meth=:each, *args, &block) + unless self.respond_to?(meth) + raise NoMethodError, "undefined method #{meth}" + end lz = Lazy.new(self, &block) lz.obj = self lz.meth = meth diff --git a/mrbgems/mruby-enumerator/mrblib/enumerator.rb b/mrbgems/mruby-enumerator/mrblib/enumerator.rb index c872ceedc..1e77af369 100644 --- a/mrbgems/mruby-enumerator/mrblib/enumerator.rb +++ b/mrbgems/mruby-enumerator/mrblib/enumerator.rb @@ -115,6 +115,9 @@ class Enumerator else raise ArgumentError unless obj end + if @obj and !self.respond_to?(meth) + raise NoMethodError, "undefined method #{meth}" + end @obj = obj @meth = meth 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) { |
