mochilo 1.3.0 → 2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -7,7 +7,7 @@
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
11
 
12
12
  void mochilo_pack_fixnum(mochilo_buf *buf, VALUE rb_fixnum)
13
13
  {
@@ -73,66 +73,15 @@ void mochilo_pack_bignum(mochilo_buf *buf, VALUE rb_bignum)
73
73
  }
74
74
  }
75
75
 
76
- #ifdef HAVE_RUBY_ENCODING_H
77
- void mochilo_pack_regexp(mochilo_buf *buf, VALUE rb_regexp)
78
- {
79
- size_t size;
80
- rb_encoding *encoding;
81
- char *enc_name;
82
- 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
-
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));
94
-
95
- options = rb_reg_options(rb_regexp);
96
- regexp = RREGEXP_SRC_PTR(rb_regexp);
97
-
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
- }
107
- }
108
- #endif
109
-
110
- void mochilo_pack_time(mochilo_buf *buf, VALUE rb_time)
111
- {
112
- uint64_t sec;
113
- uint64_t usec;
114
- int32_t utc_offset;
115
-
116
- sec = NUM2ULONG(rb_funcall(rb_time, rb_intern("to_i"), 0));
117
- usec = NUM2ULONG(rb_funcall(rb_time, rb_intern("usec"), 0));
118
- utc_offset = NUM2INT(rb_funcall(rb_time, rb_intern("utc_offset"), 0));
119
-
120
- mochilo_buf_putc(buf, MSGPACK_T_TIME);
121
- mochilo_buf_put64be(buf, &sec);
122
- mochilo_buf_put64be(buf, &usec);
123
- mochilo_buf_put32be(buf, &utc_offset);
124
- }
125
-
126
76
  struct mochilo_hash_pack {
127
77
  mochilo_buf *buf;
128
- int trusted;
129
78
  };
130
79
 
131
80
  static int hash_callback(VALUE key, VALUE val, VALUE opaque)
132
81
  {
133
82
  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);
83
+ mochilo_pack_one(hash_pack->buf, key);
84
+ mochilo_pack_one(hash_pack->buf, val);
136
85
  return 0;
137
86
  }
138
87
 
@@ -143,13 +92,12 @@ void mochilo_pack_double(mochilo_buf *buf, VALUE rb_double)
143
92
  mochilo_buf_put64be(buf, &d);
144
93
  }
145
94
 
146
- void mochilo_pack_hash(mochilo_buf *buf, VALUE rb_hash, int trusted)
95
+ void mochilo_pack_hash(mochilo_buf *buf, VALUE rb_hash)
147
96
  {
148
97
  struct mochilo_hash_pack hash_pack;
149
98
  long size = RHASH_SIZE(rb_hash);
150
99
 
151
100
  hash_pack.buf = buf;
152
- hash_pack.trusted = trusted;
153
101
 
154
102
  if (size < 0x10) {
155
103
  uint8_t lead = 0x80 | size;
@@ -174,46 +122,26 @@ void mochilo_pack_bytes(mochilo_buf *buf, VALUE rb_bytes)
174
122
  {
175
123
  long size = RSTRING_LEN(rb_bytes);
176
124
 
177
- if (size < 0x20) {
178
- uint8_t lead = 0xA0 | size;
125
+ if (size < 0x100) {
126
+ uint8_t lead = size;
127
+ mochilo_buf_putc(buf, MSGPACK_T_BIN8);
179
128
  mochilo_buf_putc(buf, lead);
180
- }
181
-
182
- else if (size < 0x10000) {
129
+ } else if (size < 0x10000) {
183
130
  uint16_t lead = size;
184
- mochilo_buf_putc(buf, MSGPACK_T_RAW16);
131
+ mochilo_buf_putc(buf, MSGPACK_T_BIN16);
185
132
  mochilo_buf_put16be(buf, &lead);
186
- }
187
-
188
- else {
189
- mochilo_buf_putc(buf, MSGPACK_T_RAW32);
133
+ } else if (size < 0x100000000) {
134
+ mochilo_buf_putc(buf, MSGPACK_T_BIN32);
190
135
  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
136
  } else {
137
+ // there is no bin 64
209
138
  rb_raise(rb_eMochiloPackError,
210
- "Symbol too long: must be under %d bytes, %ld given", 0x100, size);
139
+ "Binary string cannot be larger than %ld bytes", 0x100000000);
211
140
  }
212
141
 
213
- mochilo_buf_put(buf, name, size);
142
+ mochilo_buf_put(buf, RSTRING_PTR(rb_bytes), size);
214
143
  }
215
144
 
216
- #ifdef HAVE_RUBY_ENCODING_H
217
145
  void mochilo_pack_str(mochilo_buf *buf, VALUE rb_str)
218
146
  {
219
147
  long size = RSTRING_LEN(rb_str);
@@ -222,27 +150,57 @@ void mochilo_pack_str(mochilo_buf *buf, VALUE rb_str)
222
150
  const struct mochilo_enc_map *enc2id;
223
151
  const char *enc_name;
224
152
 
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
153
  encoding = rb_enc_get(rb_str);
237
154
  enc_name = rb_enc_name(encoding);
238
- enc2id = mochilo_encoding_to_id(enc_name, (unsigned int)strlen(enc_name));
239
155
 
240
- mochilo_buf_putc(buf, enc2id ? enc2id->id : 0);
156
+ if (encoding == rb_utf8_encoding()) {
157
+ // use str type from msgpack spec
158
+ if (size < 0x20) {
159
+ uint8_t lead = 0xa0 | size;
160
+ mochilo_buf_putc(buf, lead);
161
+ } else if (size < 0x100) {
162
+ uint8_t lead = size;
163
+ mochilo_buf_putc(buf, MSGPACK_T_STR8);
164
+ mochilo_buf_putc(buf, lead);
165
+ } else if (size < 0x10000) {
166
+ uint16_t lead = size;
167
+ mochilo_buf_putc(buf, MSGPACK_T_STR16);
168
+ mochilo_buf_put16be(buf, &lead);
169
+ } else if (size < 0x100000000) {
170
+ mochilo_buf_putc(buf, MSGPACK_T_STR32);
171
+ mochilo_buf_put32be(buf, &size);
172
+ } else {
173
+ // there is no str 64
174
+ rb_raise(rb_eMochiloPackError,
175
+ "String cannot be larger than %ld bytes", 0x100000000);
176
+ }
177
+ } else {
178
+ // if another encoding is used we need to use our custom types
179
+ if (size < 0x100) {
180
+ uint8_t lead = size;
181
+ mochilo_buf_putc(buf, MSGPACK_T_ENC8);
182
+ mochilo_buf_putc(buf, lead);
183
+ } else if (size < 0x10000) {
184
+ uint16_t lead = size;
185
+ mochilo_buf_putc(buf, MSGPACK_T_ENC16);
186
+ mochilo_buf_put16be(buf, &lead);
187
+ } else if (size < 0x100000000) {
188
+ mochilo_buf_putc(buf, MSGPACK_T_ENC32);
189
+ mochilo_buf_put32be(buf, &size);
190
+ } else {
191
+ // there is no ext 64
192
+ rb_raise(rb_eMochiloPackError,
193
+ "String cannot be larger than %ld bytes", 0x100000000);
194
+ }
195
+
196
+ enc2id = mochilo_encoding_to_id(enc_name, (unsigned int)strlen(enc_name));
197
+ mochilo_buf_putc(buf, enc2id ? enc2id->id : 0);
198
+ }
199
+
241
200
  mochilo_buf_put(buf, RSTRING_PTR(rb_str), size);
242
201
  }
243
- #endif
244
202
 
245
- void mochilo_pack_array(mochilo_buf *buf, VALUE rb_array, int trusted)
203
+ void mochilo_pack_array(mochilo_buf *buf, VALUE rb_array)
246
204
  {
247
205
  long i, size = RARRAY_LEN(rb_array);
248
206
 
@@ -263,11 +221,11 @@ void mochilo_pack_array(mochilo_buf *buf, VALUE rb_array, int trusted)
263
221
  }
264
222
 
265
223
  for (i = 0; i < size; i++) {
266
- mochilo_pack_one(buf, rb_ary_entry(rb_array, i), trusted);
224
+ mochilo_pack_one(buf, rb_ary_entry(rb_array, i));
267
225
  }
268
226
  }
269
227
 
270
- void mochilo_pack_one(mochilo_buf *buf, VALUE rb_object, int trusted)
228
+ void mochilo_pack_one(mochilo_buf *buf, VALUE rb_object)
271
229
  {
272
230
  switch (rb_type(rb_object)) {
273
231
  case T_NIL:
@@ -286,28 +244,19 @@ void mochilo_pack_one(mochilo_buf *buf, VALUE rb_object, int trusted)
286
244
  mochilo_pack_fixnum(buf, rb_object);
287
245
  return;
288
246
 
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
247
  case T_STRING:
297
- #ifdef HAVE_RUBY_ENCODING_H
298
248
  if (ENCODING_GET(rb_object) != 0)
299
249
  mochilo_pack_str(buf, rb_object);
300
250
  else
301
- #endif
302
251
  mochilo_pack_bytes(buf, rb_object);
303
252
  return;
304
253
 
305
254
  case T_HASH:
306
- mochilo_pack_hash(buf, rb_object, trusted);
255
+ mochilo_pack_hash(buf, rb_object);
307
256
  return;
308
257
 
309
258
  case T_ARRAY:
310
- mochilo_pack_array(buf, rb_object, trusted);
259
+ mochilo_pack_array(buf, rb_object);
311
260
  return;
312
261
 
313
262
  case T_FLOAT:
@@ -318,23 +267,9 @@ void mochilo_pack_one(mochilo_buf *buf, VALUE rb_object, int trusted)
318
267
  mochilo_pack_bignum(buf, rb_object);
319
268
  return;
320
269
 
321
- #ifdef HAVE_RUBY_ENCODING_H
322
- case T_REGEXP:
323
- mochilo_pack_regexp(buf, rb_object);
324
- return;
325
- #endif
326
-
327
270
  default:
328
- if (rb_cTime == rb_obj_class(rb_object)) {
329
- 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
- } else {
335
- rb_raise(rb_eMochiloPackError,
336
- "Unsupported object type: %s", rb_obj_classname(rb_object));
337
- }
271
+ rb_raise(rb_eMochiloPackError,
272
+ "Unsupported object type: %s", rb_obj_classname(rb_object));
338
273
  return;
339
274
  }
340
275
  }
@@ -159,14 +159,10 @@ int mochilo_unpack_one(mo_value *_value, mochilo_src *src)
159
159
  return unpack_hash(_value, (size_t)length, src);
160
160
  }
161
161
 
162
- case MSGPACK_T_SYM:
162
+ case MSGPACK_T_STR8:
163
163
  {
164
164
  uint8_t length;
165
165
  const char *ptr;
166
-
167
- if (!src->trusted) {
168
- return MSGPACK_EUNSAFE;
169
- }
170
166
 
171
167
  SRC_ENSURE_AVAIL(src, 1);
172
168
  mochilo_src_get8be(src, &length);
@@ -174,48 +170,58 @@ int mochilo_unpack_one(mo_value *_value, mochilo_src *src)
174
170
  if (!(ptr = mochilo_src_peek(src, length)))
175
171
  return -1;
176
172
 
177
- *_value = moapi_sym_new(ptr, length);
173
+ *_value = moapi_str_new(ptr, length, MSGPACK_ENC_UTF_8);
178
174
  return 0;
179
175
  }
180
176
 
181
- #ifdef HAVE_RUBY_ENCODING_H
182
- case MSGPACK_T_REGEXP:
177
+ case MSGPACK_T_STR16:
183
178
  {
184
179
  uint16_t length;
185
- uint32_t options;
186
- uint8_t encoding;
187
180
  const char *ptr;
188
181
 
189
- SRC_ENSURE_AVAIL(src, 2+4+1);
182
+ SRC_ENSURE_AVAIL(src, 2 + 1);
190
183
  mochilo_src_get16be(src, &length);
191
- mochilo_src_get32be(src, &options);
192
- mochilo_src_get8be(src, &encoding);
193
184
 
194
185
  if (!(ptr = mochilo_src_peek(src, length)))
195
186
  return -1;
196
187
 
197
- *_value = moapi_regexp_new(ptr, length, encoding, options);
188
+ *_value = moapi_str_new(ptr, length, MSGPACK_ENC_UTF_8);
198
189
  return 0;
199
190
  }
200
- #endif
201
191
 
202
- case MSGPACK_T_TIME:
192
+ case MSGPACK_T_STR32:
203
193
  {
204
- uint64_t sec;
205
- uint64_t usec;
206
- int32_t utc_offset;
194
+ uint32_t length;
195
+ const char *ptr;
207
196
 
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);
197
+ SRC_ENSURE_AVAIL(src, 4 + 1);
198
+ mochilo_src_get32be(src, &length);
212
199
 
213
- *_value = moapi_time_new(sec, usec, utc_offset);
200
+ if (!(ptr = mochilo_src_peek(src, length)))
201
+ return -1;
202
+
203
+ *_value = moapi_str_new(ptr, length, MSGPACK_ENC_UTF_8);
214
204
  return 0;
215
205
  }
216
206
 
217
- #ifdef HAVE_RUBY_ENCODING_H
218
- case MSGPACK_T_STR16:
207
+ case MSGPACK_T_ENC8:
208
+ {
209
+ uint8_t length;
210
+ uint8_t encoding;
211
+ const char *ptr;
212
+
213
+ SRC_ENSURE_AVAIL(src, 1 + 1);
214
+ mochilo_src_get8be(src, &length);
215
+ mochilo_src_get8be(src, &encoding);
216
+
217
+ if (!(ptr = mochilo_src_peek(src, length)))
218
+ return -1;
219
+
220
+ *_value = moapi_str_new(ptr, length, encoding);
221
+ return 0;
222
+ }
223
+
224
+ case MSGPACK_T_ENC16:
219
225
  {
220
226
  uint16_t length;
221
227
  uint8_t encoding;
@@ -232,7 +238,7 @@ int mochilo_unpack_one(mo_value *_value, mochilo_src *src)
232
238
  return 0;
233
239
  }
234
240
 
235
- case MSGPACK_T_STR32:
241
+ case MSGPACK_T_ENC32:
236
242
  {
237
243
  uint32_t length;
238
244
  uint8_t encoding;
@@ -248,9 +254,23 @@ int mochilo_unpack_one(mo_value *_value, mochilo_src *src)
248
254
  *_value = moapi_str_new(ptr, length, encoding);
249
255
  return 0;
250
256
  }
251
- #endif
252
257
 
253
- case MSGPACK_T_RAW16:
258
+ case MSGPACK_T_BIN8:
259
+ {
260
+ uint8_t length;
261
+ const char *ptr;
262
+
263
+ SRC_ENSURE_AVAIL(src, 1);
264
+ mochilo_src_get8be(src, &length);
265
+
266
+ if (!(ptr = mochilo_src_peek(src, length)))
267
+ return -1;
268
+
269
+ *_value = moapi_bytes_new(ptr, length);
270
+ return 0;
271
+ }
272
+
273
+ case MSGPACK_T_BIN16:
254
274
  {
255
275
  uint16_t length;
256
276
  const char *ptr;
@@ -265,7 +285,7 @@ int mochilo_unpack_one(mo_value *_value, mochilo_src *src)
265
285
  return 0;
266
286
  }
267
287
 
268
- case MSGPACK_T_RAW32:
288
+ case MSGPACK_T_BIN32:
269
289
  {
270
290
  uint32_t length;
271
291
  const char *ptr;
@@ -304,7 +324,7 @@ int mochilo_unpack_one(mo_value *_value, mochilo_src *src)
304
324
  if (!(ptr = mochilo_src_peek(src, length)))
305
325
  return -1;
306
326
 
307
- *_value = moapi_bytes_new(ptr, length);
327
+ *_value = moapi_str_new(ptr, length, MSGPACK_ENC_UTF_8);
308
328
  return 0;
309
329
  }
310
330
 
@@ -312,4 +332,3 @@ int mochilo_unpack_one(mo_value *_value, mochilo_src *src)
312
332
  }
313
333
  }
314
334
  }
315
-
@@ -1,3 +1,3 @@
1
1
  module Mochilo
2
- VERSION = "1.3.0"
2
+ VERSION = "2.0"
3
3
  end
data/mochilo.gemspec CHANGED
@@ -13,10 +13,12 @@ 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
18
 
19
19
  # tests
20
20
  s.add_development_dependency 'rake-compiler', ">= 0.8.1"
21
21
  s.add_development_dependency 'minitest', ">= 4.1.0"
22
+ # benchmarks
23
+ s.add_development_dependency 'msgpack'
22
24
  end
data/script/bootstrap CHANGED
@@ -12,5 +12,5 @@ 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
- exec bundle install --binstubs --path vendor/gems --without benchmark "$@"
15
+ exec bundle install --binstubs --path vendor/gems "$@"
16
16
  fi