summaryrefslogtreecommitdiff
path: root/ruby
diff options
context:
space:
mode:
authorfrsyuki <frsyuki@users.sourceforge.jp>2010-05-26 18:01:27 +0900
committerfrsyuki <frsyuki@users.sourceforge.jp>2010-05-26 18:01:27 +0900
commit293293c23cf6672827248910f133b22d0d58fcf3 (patch)
tree66531801c271741a204ac5d7283f489526cb63ea /ruby
parent47185d757ebee52cc06775a843b3bf06292d8bf1 (diff)
downloadmsgpack-python-293293c23cf6672827248910f133b22d0d58fcf3.tar.gz
ruby: set mp->user.source = Qnil before tempalte_execute_do on Unpacker#each
Diffstat (limited to 'ruby')
-rw-r--r--ruby/unpack.c42
1 files changed, 25 insertions, 17 deletions
diff --git a/ruby/unpack.c b/ruby/unpack.c
index c93af35..65852b9 100644
--- a/ruby/unpack.c
+++ b/ruby/unpack.c
@@ -156,15 +156,25 @@ static inline int template_callback_raw(unpack_user* u, const char* b, const cha
rb_raise(rb_eTypeError, "instance of String needed"); \
}
-
-static VALUE template_execute_rescue(VALUE nouse)
-{
- rb_gc_enable();
#ifdef RUBY_VM
- rb_exc_raise(rb_errinfo());
+#define RERAISE rb_exc_raise(rb_errinfo())
#else
- rb_exc_raise(ruby_errinfo);
+#define RERAISE rb_exc_raise(ruby_errinfo)
#endif
+
+
+static VALUE template_execute_rescue(VALUE data)
+{
+ rb_gc_enable();
+ VALUE* resc = (VALUE*)data;
+ rb_enc_set_index(resc[0], (int)resc[1]);
+ RERAISE;
+}
+
+static VALUE template_execute_rescue_each(VALUE nouse)
+{
+ rb_gc_enable();
+ RERAISE;
}
static VALUE template_execute_do(VALUE argv)
@@ -192,7 +202,6 @@ static int template_execute_wrap(msgpack_unpack_t* mp,
};
#ifdef HAVE_RUBY_ENCODING_H
- // FIXME encodingをASCII-8BITにする
int enc_orig = rb_enc_get_index(str);
rb_enc_set_index(str, s_ascii_8bit);
#endif
@@ -202,10 +211,10 @@ static int template_execute_wrap(msgpack_unpack_t* mp,
mp->user.source = str;
- int ret = (int)rb_rescue(template_execute_do, (VALUE)args,
- template_execute_rescue, Qnil);
+ VALUE resc[2] = {str, enc_orig};
- mp->user.source = Qnil;
+ int ret = (int)rb_rescue(template_execute_do, (VALUE)args,
+ template_execute_rescue, (VALUE)resc);
rb_gc_enable();
@@ -229,8 +238,10 @@ static int template_execute_wrap_each(msgpack_unpack_t* mp,
// FIXME execute実行中はmp->topが更新されないのでGC markが機能しない
rb_gc_disable();
+ mp->user.source = Qnil;
+
int ret = (int)rb_rescue(template_execute_do, (VALUE)args,
- template_execute_rescue, Qnil);
+ template_execute_rescue_each, Qnil);
rb_gc_enable();
@@ -401,8 +412,7 @@ static void feed_buffer(msgpack_unpack_t* mp, const char* ptr, size_t len)
struct unpack_buffer* buffer = &mp->user.buffer;
if(buffer->size == 0) {
- char* tmp = (char*)malloc(MSGPACK_UNPACKER_BUFFER_INIT_SIZE);
- // FIXME check tmp == NULL
+ char* tmp = ALLOC_N(char, MSGPACK_UNPACKER_BUFFER_INIT_SIZE);
buffer->ptr = tmp;
buffer->free = MSGPACK_UNPACKER_BUFFER_INIT_SIZE;
buffer->size = 0;
@@ -430,8 +440,7 @@ static void feed_buffer(msgpack_unpack_t* mp, const char* ptr, size_t len)
while(csize < buffer->size + len) {
csize *= 2;
}
- char* tmp = (char*)realloc(buffer->ptr, csize);
- // FIXME check tmp == NULL
+ char* tmp = REALLOC_N(buffer->ptr, char, csize);
memcpy(tmp + buffer->size, ptr, len);
buffer->ptr = tmp;
buffer->free = csize - buffer->size;
@@ -446,8 +455,7 @@ static void feed_buffer(msgpack_unpack_t* mp, const char* ptr, size_t len)
while(csize < not_parsed + len) {
csize *= 2;
}
- char* tmp = (char*)realloc(buffer->ptr, csize);
- // FIXME check tmp == NULL
+ char* tmp = REALLOC_N(buffer->ptr, char, csize);
buffer->ptr = tmp;
}