diff --git a/ruby/extconf.rb b/ruby/extconf.rb index 10a807e7..4082a92f 100644 --- a/ruby/extconf.rb +++ b/ruby/extconf.rb @@ -1,5 +1,6 @@ require 'mkmf' require './version.rb' $CFLAGS << %[ -I.. -Wall -O3 -DMESSAGEPACK_VERSION=\\"#{MessagePack::VERSION}\\" -g] +have_header("ruby/st.h") create_makefile('msgpack') diff --git a/ruby/pack.c b/ruby/pack.c index c0e135c8..c09bf0f1 100644 --- a/ruby/pack.c +++ b/ruby/pack.c @@ -15,6 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#define RSTRING_NOT_MODIFIED #include "ruby.h" #include "compat.h" @@ -39,8 +40,8 @@ static ID s_append; #include "msgpack/pack_template.h" -#ifndef RUBY_VM -#include "st.h" // ruby hash +#ifdef HAVE_RUBY_ST_H +#include "ruby/st.h" // ruby hash #endif #define ARG_BUFFER(name, argc, argv) \ @@ -219,11 +220,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; }