diff --git a/ruby/pack.c b/ruby/pack.c index c0e135c8..826f4e27 100644 --- a/ruby/pack.c +++ b/ruby/pack.c @@ -219,11 +219,12 @@ static VALUE MessagePack_Array_to_msgpack(int argc, VALUE *argv, VALUE self) { ARG_BUFFER(out, argc, argv); // FIXME check sizeof(long) > sizeof(unsigned int) && RARRAY_LEN(self) > UINT_MAX - msgpack_pack_array(out, (unsigned int)RARRAY_LEN(self)); - VALUE* p = RARRAY_PTR(self); - VALUE* const pend = p + RARRAY_LEN(self); - for(;p != pend; ++p) { - rb_funcall(*p, s_to_msgpack, 1, out); + unsigned int ary_length = (unsigned int)RARRAY_LEN(self); + unsigned int i = 0; + msgpack_pack_array(out, ary_length); + for(; i < ary_length; ++i) { + VALUE p = rb_ary_entry(self, i); + rb_funcall(p, s_to_msgpack, 1, out); } return out; } diff --git a/ruby/unpack.c b/ruby/unpack.c index f61fe6db..a3bb861d 100644 --- a/ruby/unpack.c +++ b/ruby/unpack.c @@ -112,7 +112,7 @@ static inline int template_callback_array(unpack_user* u, unsigned int n, VALUE* { *o = rb_ary_new2(n); return 0; } static inline int template_callback_array_item(unpack_user* u, VALUE* c, VALUE o) -{ rb_ary_push(*c, o); return 0; } // FIXME set value directry RARRAY_PTR(obj)[RARRAY_LEN(obj)++] +{ rb_ary_push(*c, o); return 0; } static inline int template_callback_map(unpack_user* u, unsigned int n, VALUE* o) { *o = rb_hash_new(); return 0; }