mochilo 1.3.0 → 2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -7,7 +7,27 @@
7
7
 
8
8
  extern VALUE rb_eMochiloPackError;
9
9
 
10
- void mochilo_pack_one(mochilo_buf *buf, VALUE rb_object, int trusted);
10
+ void mochilo_pack_one(mochilo_buf *buf, VALUE rb_object);
11
+
12
+ static void mochilo_buf_put_ext_size(mochilo_buf *buf, long size)
13
+ {
14
+ if (size < 0x100) {
15
+ uint8_t lead = size;
16
+ mochilo_buf_putc(buf, MSGPACK_T_ENC8);
17
+ mochilo_buf_putc(buf, lead);
18
+ } else if (size < 0x10000) {
19
+ uint16_t lead = size;
20
+ mochilo_buf_putc(buf, MSGPACK_T_ENC16);
21
+ mochilo_buf_put16be(buf, &lead);
22
+ } else if (size < 0x100000000) {
23
+ mochilo_buf_putc(buf, MSGPACK_T_ENC32);
24
+ mochilo_buf_put32be(buf, &size);
25
+ } else {
26
+ // there is no ext 64
27
+ rb_raise(rb_eMochiloPackError,
28
+ "String cannot be larger than %ld bytes", 0x100000000);
29
+ }
30
+ }
11
31
 
12
32
  void mochilo_pack_fixnum(mochilo_buf *buf, VALUE rb_fixnum)
13
33
  {
@@ -73,42 +93,49 @@ void mochilo_pack_bignum(mochilo_buf *buf, VALUE rb_bignum)
73
93
  }
74
94
  }
75
95
 
76
- #ifdef HAVE_RUBY_ENCODING_H
96
+ static void mochilo_put_ext_size_and_type(mochilo_buf *buf, size_t size, enum mochilo_ext_types_t type)
97
+ {
98
+ mochilo_buf_put_ext_size(buf, size + 1);
99
+ mochilo_buf_putc(buf, MOCHILO_EXT_TYPE);
100
+ mochilo_buf_putc(buf, type);
101
+ }
102
+
103
+ void mochilo_pack_symbol(mochilo_buf *buf, VALUE rb_symbol)
104
+ {
105
+ char *symbol_name;
106
+ size_t size;
107
+
108
+ symbol_name = rb_id2name(SYM2ID(rb_symbol));
109
+ size = strlen(symbol_name);
110
+
111
+ mochilo_put_ext_size_and_type(buf, size, MOCHILO_T_SYMBOL);
112
+ mochilo_buf_put(buf, symbol_name, size);
113
+ }
114
+
77
115
  void mochilo_pack_regexp(mochilo_buf *buf, VALUE rb_regexp)
78
116
  {
117
+ uint32_t options;
79
118
  size_t size;
80
119
  rb_encoding *encoding;
81
120
  char *enc_name;
82
121
  const struct mochilo_enc_map *enc2id;
83
- uint32_t options;
84
- const char *regexp;
85
-
86
- size = RREGEXP_SRC_LEN(rb_regexp);
87
-
88
- if (size < (1<<16)) {
89
- uint16_t packed_size = size;
90
122
 
91
- encoding = rb_enc_get(rb_regexp);
92
- enc_name = rb_enc_name(encoding);
93
- enc2id = mochilo_encoding_to_id(enc_name, (unsigned int)strlen(enc_name));
123
+ encoding = rb_enc_get(rb_regexp);
124
+ enc_name = rb_enc_name(encoding);
125
+ enc2id = mochilo_encoding_to_id(enc_name, (unsigned int)strlen(enc_name));
94
126
 
95
- options = rb_reg_options(rb_regexp);
96
- regexp = RREGEXP_SRC_PTR(rb_regexp);
127
+ options = rb_reg_options(rb_regexp);
128
+ size = RREGEXP_SRC_LEN(rb_regexp);
97
129
 
98
- mochilo_buf_putc(buf, MSGPACK_T_REGEXP);
99
- mochilo_buf_put16be(buf, &packed_size);
100
- mochilo_buf_put32be(buf, &options);
101
- mochilo_buf_putc(buf, enc2id ? enc2id->id : 0);
102
- mochilo_buf_put(buf, regexp, size);
103
- } else {
104
- rb_raise(rb_eMochiloPackError,
105
- "Regexp too long: must be under %d bytes, %ld given", 1<<16, size);
106
- }
130
+ mochilo_put_ext_size_and_type(buf, 4 + 1 + size, MOCHILO_T_REGEXP);
131
+ mochilo_buf_put32be(buf, &options);
132
+ mochilo_buf_putc(buf, enc2id ? enc2id->id : 0);
133
+ mochilo_buf_put(buf, RREGEXP_SRC_PTR(rb_regexp), size);
107
134
  }
108
- #endif
109
135
 
110
136
  void mochilo_pack_time(mochilo_buf *buf, VALUE rb_time)
111
137
  {
138
+ struct time_object *tobj;
112
139
  uint64_t sec;
113
140
  uint64_t usec;
114
141
  int32_t utc_offset;
@@ -117,7 +144,7 @@ void mochilo_pack_time(mochilo_buf *buf, VALUE rb_time)
117
144
  usec = NUM2ULONG(rb_funcall(rb_time, rb_intern("usec"), 0));
118
145
  utc_offset = NUM2INT(rb_funcall(rb_time, rb_intern("utc_offset"), 0));
119
146
 
120
- mochilo_buf_putc(buf, MSGPACK_T_TIME);
147
+ mochilo_put_ext_size_and_type(buf, 8+8+4, MOCHILO_T_TIME);
121
148
  mochilo_buf_put64be(buf, &sec);
122
149
  mochilo_buf_put64be(buf, &usec);
123
150
  mochilo_buf_put32be(buf, &utc_offset);
@@ -125,14 +152,13 @@ void mochilo_pack_time(mochilo_buf *buf, VALUE rb_time)
125
152
 
126
153
  struct mochilo_hash_pack {
127
154
  mochilo_buf *buf;
128
- int trusted;
129
155
  };
130
156
 
131
157
  static int hash_callback(VALUE key, VALUE val, VALUE opaque)
132
158
  {
133
159
  struct mochilo_hash_pack *hash_pack = (struct mochilo_hash_pack*)opaque;
134
- mochilo_pack_one(hash_pack->buf, key, hash_pack->trusted);
135
- mochilo_pack_one(hash_pack->buf, val, hash_pack->trusted);
160
+ mochilo_pack_one(hash_pack->buf, key);
161
+ mochilo_pack_one(hash_pack->buf, val);
136
162
  return 0;
137
163
  }
138
164
 
@@ -143,13 +169,12 @@ void mochilo_pack_double(mochilo_buf *buf, VALUE rb_double)
143
169
  mochilo_buf_put64be(buf, &d);
144
170
  }
145
171
 
146
- void mochilo_pack_hash(mochilo_buf *buf, VALUE rb_hash, int trusted)
172
+ void mochilo_pack_hash(mochilo_buf *buf, VALUE rb_hash)
147
173
  {
148
174
  struct mochilo_hash_pack hash_pack;
149
175
  long size = RHASH_SIZE(rb_hash);
150
176
 
151
177
  hash_pack.buf = buf;
152
- hash_pack.trusted = trusted;
153
178
 
154
179
  if (size < 0x10) {
155
180
  uint8_t lead = 0x80 | size;
@@ -174,46 +199,26 @@ void mochilo_pack_bytes(mochilo_buf *buf, VALUE rb_bytes)
174
199
  {
175
200
  long size = RSTRING_LEN(rb_bytes);
176
201
 
177
- if (size < 0x20) {
178
- uint8_t lead = 0xA0 | size;
202
+ if (size < 0x100) {
203
+ uint8_t lead = size;
204
+ mochilo_buf_putc(buf, MSGPACK_T_BIN8);
179
205
  mochilo_buf_putc(buf, lead);
180
- }
181
-
182
- else if (size < 0x10000) {
206
+ } else if (size < 0x10000) {
183
207
  uint16_t lead = size;
184
- mochilo_buf_putc(buf, MSGPACK_T_RAW16);
208
+ mochilo_buf_putc(buf, MSGPACK_T_BIN16);
185
209
  mochilo_buf_put16be(buf, &lead);
186
- }
187
-
188
- else {
189
- mochilo_buf_putc(buf, MSGPACK_T_RAW32);
210
+ } else if (size < 0x100000000) {
211
+ mochilo_buf_putc(buf, MSGPACK_T_BIN32);
190
212
  mochilo_buf_put32be(buf, &size);
191
- }
192
-
193
- mochilo_buf_put(buf, RSTRING_PTR(rb_bytes), size);
194
- }
195
-
196
- void mochilo_pack_symbol(mochilo_buf *buf, VALUE rb_symbol)
197
- {
198
- long size;
199
- const char *name;
200
-
201
- name = rb_id2name(SYM2ID(rb_symbol));
202
- size = strlen(name);
203
-
204
- if (size < 0x100) {
205
- uint8_t lead = size;
206
- mochilo_buf_putc(buf, MSGPACK_T_SYM);
207
- mochilo_buf_putc(buf, lead);
208
213
  } else {
214
+ // there is no bin 64
209
215
  rb_raise(rb_eMochiloPackError,
210
- "Symbol too long: must be under %d bytes, %ld given", 0x100, size);
216
+ "Binary string cannot be larger than %ld bytes", 0x100000000);
211
217
  }
212
218
 
213
- mochilo_buf_put(buf, name, size);
219
+ mochilo_buf_put(buf, RSTRING_PTR(rb_bytes), size);
214
220
  }
215
221
 
216
- #ifdef HAVE_RUBY_ENCODING_H
217
222
  void mochilo_pack_str(mochilo_buf *buf, VALUE rb_str)
218
223
  {
219
224
  long size = RSTRING_LEN(rb_str);
@@ -222,27 +227,41 @@ void mochilo_pack_str(mochilo_buf *buf, VALUE rb_str)
222
227
  const struct mochilo_enc_map *enc2id;
223
228
  const char *enc_name;
224
229
 
225
- if (size < 0x10000) {
226
- uint16_t lead = size;
227
- mochilo_buf_putc(buf, MSGPACK_T_STR16);
228
- mochilo_buf_put16be(buf, &lead);
229
- }
230
-
231
- else {
232
- mochilo_buf_putc(buf, MSGPACK_T_STR32);
233
- mochilo_buf_put32be(buf, &size);
234
- }
235
-
236
230
  encoding = rb_enc_get(rb_str);
237
231
  enc_name = rb_enc_name(encoding);
238
- enc2id = mochilo_encoding_to_id(enc_name, (unsigned int)strlen(enc_name));
239
232
 
240
- mochilo_buf_putc(buf, enc2id ? enc2id->id : 0);
233
+ if (encoding == rb_utf8_encoding()) {
234
+ // use str type from msgpack spec
235
+ if (size < 0x20) {
236
+ uint8_t lead = 0xa0 | size;
237
+ mochilo_buf_putc(buf, lead);
238
+ } else if (size < 0x100) {
239
+ uint8_t lead = size;
240
+ mochilo_buf_putc(buf, MSGPACK_T_STR8);
241
+ mochilo_buf_putc(buf, lead);
242
+ } else if (size < 0x10000) {
243
+ uint16_t lead = size;
244
+ mochilo_buf_putc(buf, MSGPACK_T_STR16);
245
+ mochilo_buf_put16be(buf, &lead);
246
+ } else if (size < 0x100000000) {
247
+ mochilo_buf_putc(buf, MSGPACK_T_STR32);
248
+ mochilo_buf_put32be(buf, &size);
249
+ } else {
250
+ // there is no str 64
251
+ rb_raise(rb_eMochiloPackError,
252
+ "String cannot be larger than %ld bytes", 0x100000000);
253
+ }
254
+ } else {
255
+ // if another encoding is used we need to use our custom types
256
+ mochilo_buf_put_ext_size(buf, size);
257
+ enc2id = mochilo_encoding_to_id(enc_name, (unsigned int)strlen(enc_name));
258
+ mochilo_buf_putc(buf, enc2id ? enc2id->id : 0);
259
+ }
260
+
241
261
  mochilo_buf_put(buf, RSTRING_PTR(rb_str), size);
242
262
  }
243
- #endif
244
263
 
245
- void mochilo_pack_array(mochilo_buf *buf, VALUE rb_array, int trusted)
264
+ void mochilo_pack_array(mochilo_buf *buf, VALUE rb_array)
246
265
  {
247
266
  long i, size = RARRAY_LEN(rb_array);
248
267
 
@@ -263,11 +282,11 @@ void mochilo_pack_array(mochilo_buf *buf, VALUE rb_array, int trusted)
263
282
  }
264
283
 
265
284
  for (i = 0; i < size; i++) {
266
- mochilo_pack_one(buf, rb_ary_entry(rb_array, i), trusted);
285
+ mochilo_pack_one(buf, rb_ary_entry(rb_array, i));
267
286
  }
268
287
  }
269
288
 
270
- void mochilo_pack_one(mochilo_buf *buf, VALUE rb_object, int trusted)
289
+ void mochilo_pack_one(mochilo_buf *buf, VALUE rb_object)
271
290
  {
272
291
  switch (rb_type(rb_object)) {
273
292
  case T_NIL:
@@ -286,28 +305,19 @@ void mochilo_pack_one(mochilo_buf *buf, VALUE rb_object, int trusted)
286
305
  mochilo_pack_fixnum(buf, rb_object);
287
306
  return;
288
307
 
289
- case T_SYMBOL:
290
- if (trusted)
291
- mochilo_pack_symbol(buf, rb_object);
292
- else
293
- mochilo_pack_str(buf, rb_obj_as_string(rb_object));
294
- return;
295
-
296
308
  case T_STRING:
297
- #ifdef HAVE_RUBY_ENCODING_H
298
309
  if (ENCODING_GET(rb_object) != 0)
299
310
  mochilo_pack_str(buf, rb_object);
300
311
  else
301
- #endif
302
312
  mochilo_pack_bytes(buf, rb_object);
303
313
  return;
304
314
 
305
315
  case T_HASH:
306
- mochilo_pack_hash(buf, rb_object, trusted);
316
+ mochilo_pack_hash(buf, rb_object);
307
317
  return;
308
318
 
309
319
  case T_ARRAY:
310
- mochilo_pack_array(buf, rb_object, trusted);
320
+ mochilo_pack_array(buf, rb_object);
311
321
  return;
312
322
 
313
323
  case T_FLOAT:
@@ -318,22 +328,20 @@ void mochilo_pack_one(mochilo_buf *buf, VALUE rb_object, int trusted)
318
328
  mochilo_pack_bignum(buf, rb_object);
319
329
  return;
320
330
 
321
- #ifdef HAVE_RUBY_ENCODING_H
331
+ case T_SYMBOL:
332
+ mochilo_pack_symbol(buf, rb_object);
333
+ return;
334
+
322
335
  case T_REGEXP:
323
336
  mochilo_pack_regexp(buf, rb_object);
324
337
  return;
325
- #endif
326
338
 
327
339
  default:
328
340
  if (rb_cTime == rb_obj_class(rb_object)) {
329
341
  mochilo_pack_time(buf, rb_object);
330
- } else if (rb_respond_to(rb_object, rb_intern("to_bpack"))) {
331
- VALUE bpack = rb_funcall(rb_object, rb_intern("to_bpack"), 0);
332
-
333
- mochilo_buf_put(buf, RSTRING_PTR(bpack), RSTRING_LEN(bpack));
334
342
  } else {
335
343
  rb_raise(rb_eMochiloPackError,
336
- "Unsupported object type: %s", rb_obj_classname(rb_object));
344
+ "Unsupported object type: %s", rb_obj_classname(rb_object));
337
345
  }
338
346
  return;
339
347
  }
@@ -6,6 +6,8 @@
6
6
  #include "mochilo.h"
7
7
  #include "mochilo_api.h"
8
8
 
9
+ extern VALUE rb_eMochiloUnpackError;
10
+
9
11
  static inline int unpack_array(mo_value *_array, size_t elements, mochilo_src *buf)
10
12
  {
11
13
  size_t i;
@@ -57,6 +59,69 @@ static inline int unpack_hash(mo_value *_hash, size_t elements, mochilo_src *buf
57
59
  return 0; \
58
60
  }
59
61
 
62
+ static int mochilo_unpack_custom(mo_value *_value, mochilo_src *src, size_t length)
63
+ {
64
+ uint8_t custom_type;
65
+
66
+ SRC_ENSURE_AVAIL(src, length);
67
+
68
+ if (length < 1)
69
+ return -1;
70
+ length--;
71
+ mochilo_src_get8be(src, &custom_type);
72
+
73
+ switch (custom_type) {
74
+ case MOCHILO_T_SYMBOL:
75
+ {
76
+ const char *ptr;
77
+ if (!(ptr = mochilo_src_peek(src, length)))
78
+ return -1;
79
+ *_value = moapi_symbol_new(ptr, length);
80
+ return 0;
81
+ }
82
+
83
+ case MOCHILO_T_REGEXP:
84
+ {
85
+ uint32_t options;
86
+ uint8_t encoding;
87
+ const char *ptr;
88
+
89
+ if (length < 5)
90
+ return -1;
91
+ mochilo_src_get32be(src, &options);
92
+ mochilo_src_get8be(src, &encoding);
93
+ length -= 5;
94
+
95
+ if (!(ptr = mochilo_src_peek(src, length)))
96
+ return -1;
97
+
98
+ *_value = moapi_regexp_new(ptr, length, encoding, options);
99
+ return 0;
100
+ }
101
+
102
+ case MOCHILO_T_TIME:
103
+ {
104
+ uint64_t sec;
105
+ uint64_t usec;
106
+ int32_t utc_offset;
107
+
108
+ if (length != 8+8+4)
109
+ return -1;
110
+
111
+ mochilo_src_get64be(src, &sec);
112
+ mochilo_src_get64be(src, &usec);
113
+ mochilo_src_get32be(src, &utc_offset);
114
+
115
+ *_value = moapi_time_new(sec, usec, utc_offset);
116
+ return 0;
117
+ }
118
+
119
+ default:
120
+ rb_raise(rb_eMochiloUnpackError, "unknown custom type 0x%02x", custom_type);
121
+ return -1;
122
+ }
123
+ }
124
+
60
125
  int mochilo_unpack_one(mo_value *_value, mochilo_src *src)
61
126
  {
62
127
  uint8_t leader;
@@ -159,14 +224,10 @@ int mochilo_unpack_one(mo_value *_value, mochilo_src *src)
159
224
  return unpack_hash(_value, (size_t)length, src);
160
225
  }
161
226
 
162
- case MSGPACK_T_SYM:
227
+ case MSGPACK_T_STR8:
163
228
  {
164
229
  uint8_t length;
165
230
  const char *ptr;
166
-
167
- if (!src->trusted) {
168
- return MSGPACK_EUNSAFE;
169
- }
170
231
 
171
232
  SRC_ENSURE_AVAIL(src, 1);
172
233
  mochilo_src_get8be(src, &length);
@@ -174,48 +235,61 @@ int mochilo_unpack_one(mo_value *_value, mochilo_src *src)
174
235
  if (!(ptr = mochilo_src_peek(src, length)))
175
236
  return -1;
176
237
 
177
- *_value = moapi_sym_new(ptr, length);
238
+ *_value = moapi_str_new(ptr, length, MSGPACK_ENC_UTF_8);
178
239
  return 0;
179
240
  }
180
241
 
181
- #ifdef HAVE_RUBY_ENCODING_H
182
- case MSGPACK_T_REGEXP:
242
+ case MSGPACK_T_STR16:
183
243
  {
184
244
  uint16_t length;
185
- uint32_t options;
186
- uint8_t encoding;
187
245
  const char *ptr;
188
246
 
189
- SRC_ENSURE_AVAIL(src, 2+4+1);
247
+ SRC_ENSURE_AVAIL(src, 2 + 1);
190
248
  mochilo_src_get16be(src, &length);
191
- mochilo_src_get32be(src, &options);
192
- mochilo_src_get8be(src, &encoding);
193
249
 
194
250
  if (!(ptr = mochilo_src_peek(src, length)))
195
251
  return -1;
196
252
 
197
- *_value = moapi_regexp_new(ptr, length, encoding, options);
253
+ *_value = moapi_str_new(ptr, length, MSGPACK_ENC_UTF_8);
198
254
  return 0;
199
255
  }
200
- #endif
201
256
 
202
- case MSGPACK_T_TIME:
257
+ case MSGPACK_T_STR32:
203
258
  {
204
- uint64_t sec;
205
- uint64_t usec;
206
- int32_t utc_offset;
259
+ uint32_t length;
260
+ const char *ptr;
207
261
 
208
- SRC_ENSURE_AVAIL(src, 8+8+4);
209
- mochilo_src_get64be(src, &sec);
210
- mochilo_src_get64be(src, &usec);
211
- mochilo_src_get32be(src, &utc_offset);
262
+ SRC_ENSURE_AVAIL(src, 4 + 1);
263
+ mochilo_src_get32be(src, &length);
212
264
 
213
- *_value = moapi_time_new(sec, usec, utc_offset);
265
+ if (!(ptr = mochilo_src_peek(src, length)))
266
+ return -1;
267
+
268
+ *_value = moapi_str_new(ptr, length, MSGPACK_ENC_UTF_8);
214
269
  return 0;
215
270
  }
216
271
 
217
- #ifdef HAVE_RUBY_ENCODING_H
218
- case MSGPACK_T_STR16:
272
+ case MSGPACK_T_ENC8:
273
+ {
274
+ uint8_t length;
275
+ uint8_t encoding;
276
+ const char *ptr;
277
+
278
+ SRC_ENSURE_AVAIL(src, 1 + 1);
279
+ mochilo_src_get8be(src, &length);
280
+ mochilo_src_get8be(src, &encoding);
281
+
282
+ if (encoding == MOCHILO_EXT_TYPE)
283
+ return mochilo_unpack_custom(_value, src, length);
284
+
285
+ if (!(ptr = mochilo_src_peek(src, length)))
286
+ return -1;
287
+
288
+ *_value = moapi_str_new(ptr, length, encoding);
289
+ return 0;
290
+ }
291
+
292
+ case MSGPACK_T_ENC16:
219
293
  {
220
294
  uint16_t length;
221
295
  uint8_t encoding;
@@ -225,6 +299,9 @@ int mochilo_unpack_one(mo_value *_value, mochilo_src *src)
225
299
  mochilo_src_get16be(src, &length);
226
300
  mochilo_src_get8be(src, &encoding);
227
301
 
302
+ if (encoding == MOCHILO_EXT_TYPE)
303
+ return mochilo_unpack_custom(_value, src, length);
304
+
228
305
  if (!(ptr = mochilo_src_peek(src, length)))
229
306
  return -1;
230
307
 
@@ -232,7 +309,7 @@ int mochilo_unpack_one(mo_value *_value, mochilo_src *src)
232
309
  return 0;
233
310
  }
234
311
 
235
- case MSGPACK_T_STR32:
312
+ case MSGPACK_T_ENC32:
236
313
  {
237
314
  uint32_t length;
238
315
  uint8_t encoding;
@@ -242,15 +319,32 @@ int mochilo_unpack_one(mo_value *_value, mochilo_src *src)
242
319
  mochilo_src_get32be(src, &length);
243
320
  mochilo_src_get8be(src, &encoding);
244
321
 
322
+ if (encoding == MOCHILO_EXT_TYPE)
323
+ return mochilo_unpack_custom(_value, src, length);
324
+
245
325
  if (!(ptr = mochilo_src_peek(src, length)))
246
326
  return -1;
247
327
 
248
328
  *_value = moapi_str_new(ptr, length, encoding);
249
329
  return 0;
250
330
  }
251
- #endif
252
331
 
253
- case MSGPACK_T_RAW16:
332
+ case MSGPACK_T_BIN8:
333
+ {
334
+ uint8_t length;
335
+ const char *ptr;
336
+
337
+ SRC_ENSURE_AVAIL(src, 1);
338
+ mochilo_src_get8be(src, &length);
339
+
340
+ if (!(ptr = mochilo_src_peek(src, length)))
341
+ return -1;
342
+
343
+ *_value = moapi_bytes_new(ptr, length);
344
+ return 0;
345
+ }
346
+
347
+ case MSGPACK_T_BIN16:
254
348
  {
255
349
  uint16_t length;
256
350
  const char *ptr;
@@ -265,7 +359,7 @@ int mochilo_unpack_one(mo_value *_value, mochilo_src *src)
265
359
  return 0;
266
360
  }
267
361
 
268
- case MSGPACK_T_RAW32:
362
+ case MSGPACK_T_BIN32:
269
363
  {
270
364
  uint32_t length;
271
365
  const char *ptr;
@@ -304,7 +398,7 @@ int mochilo_unpack_one(mo_value *_value, mochilo_src *src)
304
398
  if (!(ptr = mochilo_src_peek(src, length)))
305
399
  return -1;
306
400
 
307
- *_value = moapi_bytes_new(ptr, length);
401
+ *_value = moapi_str_new(ptr, length, MSGPACK_ENC_UTF_8);
308
402
  return 0;
309
403
  }
310
404
 
@@ -312,4 +406,3 @@ int mochilo_unpack_one(mo_value *_value, mochilo_src *src)
312
406
  }
313
407
  }
314
408
  }
315
-
@@ -1,3 +1,3 @@
1
1
  module Mochilo
2
- VERSION = "1.3.0"
2
+ VERSION = "2.1"
3
3
  end
data/mochilo.gemspec CHANGED
@@ -13,8 +13,9 @@ Gem::Specification.new do |s|
13
13
  s.require_paths = ["lib"]
14
14
  s.rubygems_version = %q{1.4.2}
15
15
  s.summary = %q{A ruby library for BananaPack}
16
- s.test_files = `git ls-files test`.split("\n")
16
+ s.test_files = `git ls-files spec`.split("\n")
17
17
  s.required_ruby_version = ">= 1.9.3"
18
+ s.licenses = ["MIT"]
18
19
 
19
20
  # tests
20
21
  s.add_development_dependency 'rake-compiler', ">= 0.8.1"
data/script/bootstrap CHANGED
@@ -12,5 +12,6 @@ cd "$(dirname "$0")/.."
12
12
  if bundle check 1>/dev/null 2>&1; then
13
13
  echo "Gem environment up-to-date"
14
14
  else
15
+ gem update bundler
15
16
  exec bundle install --binstubs --path vendor/gems --without benchmark "$@"
16
17
  fi