summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.in2
-rw-r--r--ruby/gem/lib/msgpack/version.rb4
-rw-r--r--ruby/unpack.c30
3 files changed, 25 insertions, 11 deletions
diff --git a/configure.in b/configure.in
index 3a67081..a464fb9 100644
--- a/configure.in
+++ b/configure.in
@@ -1,5 +1,5 @@
AC_INIT(msgpack/unpack_template.h)
-AM_INIT_AUTOMAKE(msgpack, 0.2.2)
+AM_INIT_AUTOMAKE(msgpack, 0.3.0)
AC_CONFIG_HEADER(config.h)
AC_PROG_LIBTOOL
diff --git a/ruby/gem/lib/msgpack/version.rb b/ruby/gem/lib/msgpack/version.rb
index 488e0b2..433e6fc 100644
--- a/ruby/gem/lib/msgpack/version.rb
+++ b/ruby/gem/lib/msgpack/version.rb
@@ -1,8 +1,8 @@
module MessagePack
module VERSION #:nodoc:
MAJOR = 0
- MINOR = 2
- TINY = 2
+ MINOR = 3
+ TINY = 0
STRING = [MAJOR, MINOR, TINY].join('.')
end
diff --git a/ruby/unpack.c b/ruby/unpack.c
index df72246..2920240 100644
--- a/ruby/unpack.c
+++ b/ruby/unpack.c
@@ -169,12 +169,11 @@ static VALUE MessagePack_Unpacker_execute_impl(VALUE args)
{
VALUE self = ((VALUE*)args)[0];
VALUE data = ((VALUE*)args)[1];
- VALUE off = ((VALUE*)args)[2];
UNPACKER(self, mp);
- size_t from = NUM2UINT(off);
+ size_t from = NUM2UINT(((VALUE*)args)[2]);
char* dptr = RSTRING_PTR(data);
- long dlen = RSTRING_LEN(data);
+ long dlen = FIX2LONG(((VALUE*)args)[3]);
int ret;
if(from >= dlen) {
@@ -206,17 +205,24 @@ static VALUE MessagePack_Unpacker_execute_rescue(VALUE nouse)
#endif
}
-static VALUE MessagePack_Unpacker_execute(VALUE self, VALUE data, VALUE off)
+static VALUE MessagePack_Unpacker_execute_limit(VALUE self, VALUE data,
+ VALUE off, VALUE limit)
{
// FIXME execute実行中はmp->topが更新されないのでGC markが機能しない
rb_gc_disable();
- VALUE args[3] = {self, data, off};
+ VALUE args[4] = {self, data, off, limit};
VALUE ret = rb_rescue(MessagePack_Unpacker_execute_impl, (VALUE)args,
MessagePack_Unpacker_execute_rescue, Qnil);
rb_gc_enable();
return ret;
}
+static VALUE MessagePack_Unpacker_execute(VALUE self, VALUE data, VALUE off)
+{
+ return MessagePack_Unpacker_execute_limit(self, data, off,
+ LONG2FIX(RSTRING_LEN(data)));
+}
+
static VALUE MessagePack_Unpacker_finished_p(VALUE self)
{
UNPACKER(self, mp);
@@ -240,7 +246,7 @@ static VALUE MessagePack_unpack_impl(VALUE args)
size_t from = 0;
char* dptr = RSTRING_PTR(data);
- long dlen = RSTRING_LEN(data);
+ long dlen = FIX2LONG(((VALUE*)args)[2]);
int ret;
mp->user.origstr = data;
@@ -269,7 +275,7 @@ static VALUE MessagePack_unpack_rescue(VALUE args)
#endif
}
-static VALUE MessagePack_unpack(VALUE self, VALUE data)
+static VALUE MessagePack_unpack_limit(VALUE self, VALUE data, VALUE limit)
{
CHECK_STRING_TYPE(data);
msgpack_unpacker mp;
@@ -278,13 +284,19 @@ static VALUE MessagePack_unpack(VALUE self, VALUE data)
mp.user = ctx;
rb_gc_disable();
- VALUE args[2] = {(VALUE)&mp, data};
+ VALUE args[3] = {(VALUE)&mp, data, limit};
VALUE ret = rb_rescue(MessagePack_unpack_impl, (VALUE)args,
MessagePack_unpack_rescue, Qnil);
rb_gc_enable();
return ret;
}
+static VALUE MessagePack_unpack(VALUE self, VALUE data)
+{
+ return MessagePack_unpack_limit(self, data,
+ LONG2FIX(RSTRING_LEN(data)));
+}
+
void Init_msgpack_unpack(VALUE mMessagePack)
{
@@ -293,10 +305,12 @@ void Init_msgpack_unpack(VALUE mMessagePack)
rb_define_alloc_func(cUnpacker, MessagePack_Unpacker_alloc);
rb_define_method(cUnpacker, "initialize", MessagePack_Unpacker_initialize, 0);
rb_define_method(cUnpacker, "execute", MessagePack_Unpacker_execute, 2);
+ rb_define_method(cUnpacker, "execute_limit", MessagePack_Unpacker_execute_limit, 3);
rb_define_method(cUnpacker, "finished?", MessagePack_Unpacker_finished_p, 0);
rb_define_method(cUnpacker, "data", MessagePack_Unpacker_data, 0);
rb_define_method(cUnpacker, "reset", MessagePack_Unpacker_reset, 0);
rb_define_module_function(mMessagePack, "unpack", MessagePack_unpack, 1);
+ rb_define_module_function(mMessagePack, "unpack_limit", MessagePack_unpack_limit, 2);
}