msgpack 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/ext/unpack.c +28 -14
  2. metadata +2 -2
@@ -156,15 +156,27 @@ static inline int template_callback_raw(unpack_user* u, const char* b, const cha
156
156
  rb_raise(rb_eTypeError, "instance of String needed"); \
157
157
  }
158
158
 
159
+ #ifdef RUBY_VM
160
+ #define RERAISE rb_exc_raise(rb_errinfo())
161
+ #else
162
+ #define RERAISE rb_exc_raise(ruby_errinfo)
163
+ #endif
159
164
 
160
- static VALUE template_execute_rescue(VALUE nouse)
165
+
166
+ #ifdef HAVE_RUBY_ENCODING_H
167
+ static VALUE template_execute_rescue_enc(VALUE data)
161
168
  {
162
169
  rb_gc_enable();
163
- #ifdef RUBY_VM
164
- rb_exc_raise(rb_errinfo());
165
- #else
166
- rb_exc_raise(ruby_errinfo);
170
+ VALUE* resc = (VALUE*)data;
171
+ rb_enc_set_index(resc[0], (int)resc[1]);
172
+ RERAISE;
173
+ }
167
174
  #endif
175
+
176
+ static VALUE template_execute_rescue(VALUE nouse)
177
+ {
178
+ rb_gc_enable();
179
+ RERAISE;
168
180
  }
169
181
 
170
182
  static VALUE template_execute_do(VALUE argv)
@@ -192,7 +204,6 @@ static int template_execute_wrap(msgpack_unpack_t* mp,
192
204
  };
193
205
 
194
206
  #ifdef HAVE_RUBY_ENCODING_H
195
- // FIXME encodingをASCII-8BITにする
196
207
  int enc_orig = rb_enc_get_index(str);
197
208
  rb_enc_set_index(str, s_ascii_8bit);
198
209
  #endif
@@ -202,10 +213,14 @@ static int template_execute_wrap(msgpack_unpack_t* mp,
202
213
 
203
214
  mp->user.source = str;
204
215
 
216
+ #ifdef HAVE_RUBY_ENCODING_H
217
+ VALUE resc[2] = {str, enc_orig};
218
+ int ret = (int)rb_rescue(template_execute_do, (VALUE)args,
219
+ template_execute_rescue_enc, (VALUE)resc);
220
+ #else
205
221
  int ret = (int)rb_rescue(template_execute_do, (VALUE)args,
206
222
  template_execute_rescue, Qnil);
207
-
208
- mp->user.source = Qnil;
223
+ #endif
209
224
 
210
225
  rb_gc_enable();
211
226
 
@@ -229,6 +244,8 @@ static int template_execute_wrap_each(msgpack_unpack_t* mp,
229
244
  // FIXME execute実行中はmp->topが更新されないのでGC markが機能しない
230
245
  rb_gc_disable();
231
246
 
247
+ mp->user.source = Qnil;
248
+
232
249
  int ret = (int)rb_rescue(template_execute_do, (VALUE)args,
233
250
  template_execute_rescue, Qnil);
234
251
 
@@ -401,8 +418,7 @@ static void feed_buffer(msgpack_unpack_t* mp, const char* ptr, size_t len)
401
418
  struct unpack_buffer* buffer = &mp->user.buffer;
402
419
 
403
420
  if(buffer->size == 0) {
404
- char* tmp = (char*)malloc(MSGPACK_UNPACKER_BUFFER_INIT_SIZE);
405
- // FIXME check tmp == NULL
421
+ char* tmp = ALLOC_N(char, MSGPACK_UNPACKER_BUFFER_INIT_SIZE);
406
422
  buffer->ptr = tmp;
407
423
  buffer->free = MSGPACK_UNPACKER_BUFFER_INIT_SIZE;
408
424
  buffer->size = 0;
@@ -430,8 +446,7 @@ static void feed_buffer(msgpack_unpack_t* mp, const char* ptr, size_t len)
430
446
  while(csize < buffer->size + len) {
431
447
  csize *= 2;
432
448
  }
433
- char* tmp = (char*)realloc(buffer->ptr, csize);
434
- // FIXME check tmp == NULL
449
+ char* tmp = REALLOC_N(buffer->ptr, char, csize);
435
450
  memcpy(tmp + buffer->size, ptr, len);
436
451
  buffer->ptr = tmp;
437
452
  buffer->free = csize - buffer->size;
@@ -446,8 +461,7 @@ static void feed_buffer(msgpack_unpack_t* mp, const char* ptr, size_t len)
446
461
  while(csize < not_parsed + len) {
447
462
  csize *= 2;
448
463
  }
449
- char* tmp = (char*)realloc(buffer->ptr, csize);
450
- // FIXME check tmp == NULL
464
+ char* tmp = REALLOC_N(buffer->ptr, char, csize);
451
465
  buffer->ptr = tmp;
452
466
  }
453
467
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: msgpack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - FURUHASHI Sadayuki
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-05-26 00:00:00 +09:00
12
+ date: 2010-05-27 00:00:00 +09:00
13
13
  default_executable:
14
14
  dependencies: []
15
15