msgpack 0.7.4 → 1.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.gitignore +3 -1
- data/.rubocop.yml +3 -0
- data/.travis.yml +27 -14
- data/ChangeLog +89 -1
- data/Gemfile +6 -1
- data/README.rdoc +55 -1
- data/Rakefile +5 -1
- data/bench/pack_symbols.rb +28 -0
- data/bench/run_symbols.sh +26 -0
- data/doclib/msgpack.rb +2 -2
- data/doclib/msgpack/core_ext.rb +20 -20
- data/doclib/msgpack/factory.rb +33 -0
- data/doclib/msgpack/packer.rb +20 -0
- data/doclib/msgpack/time.rb +22 -0
- data/doclib/msgpack/timestamp.rb +44 -0
- data/ext/java/org/msgpack/jruby/Buffer.java +4 -0
- data/ext/java/org/msgpack/jruby/Encoder.java +48 -18
- data/ext/java/org/msgpack/jruby/ExtensionRegistry.java +67 -38
- data/ext/java/org/msgpack/jruby/Factory.java +20 -8
- data/ext/java/org/msgpack/jruby/MessagePackLibrary.java +0 -92
- data/ext/java/org/msgpack/jruby/Packer.java +114 -11
- data/ext/java/org/msgpack/jruby/Unpacker.java +15 -8
- data/ext/msgpack/buffer.h +14 -0
- data/ext/msgpack/buffer_class.c +1 -1
- data/ext/msgpack/compat.h +10 -0
- data/ext/msgpack/factory_class.c +24 -17
- data/ext/msgpack/factory_class.h +0 -2
- data/ext/msgpack/packer.c +5 -4
- data/ext/msgpack/packer.h +13 -1
- data/ext/msgpack/packer_class.c +130 -43
- data/ext/msgpack/packer_class.h +0 -2
- data/ext/msgpack/packer_ext_registry.c +2 -2
- data/ext/msgpack/packer_ext_registry.h +64 -25
- data/ext/msgpack/rbinit.c +0 -2
- data/ext/msgpack/unpacker.c +3 -3
- data/ext/msgpack/unpacker_class.c +25 -56
- data/ext/msgpack/unpacker_class.h +0 -2
- data/ext/msgpack/unpacker_ext_registry.c +2 -2
- data/ext/msgpack/unpacker_ext_registry.h +3 -3
- data/lib/msgpack.rb +36 -0
- data/lib/msgpack/core_ext.rb +139 -0
- data/lib/msgpack/factory.rb +21 -0
- data/lib/msgpack/symbol.rb +9 -0
- data/lib/msgpack/time.rb +29 -0
- data/lib/msgpack/timestamp.rb +76 -0
- data/lib/msgpack/version.rb +8 -1
- data/msgpack.gemspec +6 -7
- data/spec/cruby/buffer_spec.rb +6 -1
- data/spec/factory_spec.rb +134 -0
- data/spec/msgpack_spec.rb +52 -0
- data/spec/packer_spec.rb +200 -0
- data/spec/timestamp_spec.rb +121 -0
- data/spec/unpacker_spec.rb +29 -0
- metadata +29 -23
- data/ext/msgpack/core_ext.c +0 -144
- data/ext/msgpack/core_ext.h +0 -26
data/ext/msgpack/buffer.h
CHANGED
@@ -262,6 +262,20 @@ static inline size_t msgpack_buffer_append_string(msgpack_buffer_t* b, VALUE str
|
|
262
262
|
return length;
|
263
263
|
}
|
264
264
|
|
265
|
+
static inline size_t msgpack_buffer_append_string_reference(msgpack_buffer_t* b, VALUE string)
|
266
|
+
{
|
267
|
+
size_t length = RSTRING_LEN(string);
|
268
|
+
|
269
|
+
if(length > MSGPACK_BUFFER_STRING_WRITE_REFERENCE_MINIMUM) {
|
270
|
+
_msgpack_buffer_append_long_string(b, string);
|
271
|
+
|
272
|
+
} else {
|
273
|
+
msgpack_buffer_append(b, RSTRING_PTR(string), length);
|
274
|
+
}
|
275
|
+
|
276
|
+
return length;
|
277
|
+
}
|
278
|
+
|
265
279
|
|
266
280
|
/*
|
267
281
|
* IO functions
|
data/ext/msgpack/buffer_class.c
CHANGED
@@ -54,7 +54,7 @@ static void Buffer_free(void* data)
|
|
54
54
|
|
55
55
|
static VALUE Buffer_alloc(VALUE klass)
|
56
56
|
{
|
57
|
-
msgpack_buffer_t* b =
|
57
|
+
msgpack_buffer_t* b = ZALLOC_N(msgpack_buffer_t, 1);
|
58
58
|
msgpack_buffer_init(b);
|
59
59
|
|
60
60
|
return Data_Wrap_Struct(klass, msgpack_buffer_mark, Buffer_free, b);
|
data/ext/msgpack/compat.h
CHANGED
@@ -28,6 +28,16 @@
|
|
28
28
|
#endif
|
29
29
|
|
30
30
|
|
31
|
+
/*
|
32
|
+
* ZALLOC_N (ruby 2.2 or later)
|
33
|
+
*/
|
34
|
+
#ifndef RB_ZALLOC_N
|
35
|
+
# define RB_ZALLOC_N(type,n) ((type*)ruby_xcalloc((size_t)(n),sizeof(type)))
|
36
|
+
#endif
|
37
|
+
#ifndef ZALLOC_N
|
38
|
+
# define ZALLOC_N(type,n) RB_ZALLOC_N(type,n)
|
39
|
+
#endif
|
40
|
+
|
31
41
|
/*
|
32
42
|
* COMPAT_HAVE_ENCODING
|
33
43
|
*/
|
data/ext/msgpack/factory_class.c
CHANGED
@@ -24,7 +24,6 @@
|
|
24
24
|
#include "unpacker_class.h"
|
25
25
|
|
26
26
|
VALUE cMessagePack_Factory;
|
27
|
-
VALUE cMessagePack_DefaultFactory;
|
28
27
|
|
29
28
|
struct msgpack_factory_t;
|
30
29
|
typedef struct msgpack_factory_t msgpack_factory_t;
|
@@ -32,6 +31,7 @@ typedef struct msgpack_factory_t msgpack_factory_t;
|
|
32
31
|
struct msgpack_factory_t {
|
33
32
|
msgpack_packer_ext_registry_t pkrg;
|
34
33
|
msgpack_unpacker_ext_registry_t ukrg;
|
34
|
+
bool has_symbol_ext_type;
|
35
35
|
};
|
36
36
|
|
37
37
|
#define FACTORY(from, name) \
|
@@ -59,10 +59,7 @@ void Factory_mark(msgpack_factory_t* fc)
|
|
59
59
|
|
60
60
|
static VALUE Factory_alloc(VALUE klass)
|
61
61
|
{
|
62
|
-
msgpack_factory_t* fc =
|
63
|
-
|
64
|
-
msgpack_packer_ext_registry_init(&fc->pkrg);
|
65
|
-
msgpack_unpacker_ext_registry_init(&fc->ukrg);
|
62
|
+
msgpack_factory_t* fc = ZALLOC_N(msgpack_factory_t, 1);
|
66
63
|
|
67
64
|
VALUE self = Data_Wrap_Struct(klass, Factory_mark, Factory_free, fc);
|
68
65
|
return self;
|
@@ -72,6 +69,11 @@ static VALUE Factory_initialize(int argc, VALUE* argv, VALUE self)
|
|
72
69
|
{
|
73
70
|
FACTORY(self, fc);
|
74
71
|
|
72
|
+
msgpack_packer_ext_registry_init(&fc->pkrg);
|
73
|
+
msgpack_unpacker_ext_registry_init(&fc->ukrg);
|
74
|
+
|
75
|
+
fc->has_symbol_ext_type = false;
|
76
|
+
|
75
77
|
switch (argc) {
|
76
78
|
case 0:
|
77
79
|
break;
|
@@ -95,6 +97,7 @@ VALUE MessagePack_Factory_packer(int argc, VALUE* argv, VALUE self)
|
|
95
97
|
|
96
98
|
msgpack_packer_ext_registry_destroy(&pk->ext_registry);
|
97
99
|
msgpack_packer_ext_registry_dup(&fc->pkrg, &pk->ext_registry);
|
100
|
+
pk->has_symbol_ext_type = fc->has_symbol_ext_type;
|
98
101
|
|
99
102
|
return packer;
|
100
103
|
}
|
@@ -137,11 +140,15 @@ static VALUE Factory_register_type(int argc, VALUE* argv, VALUE self)
|
|
137
140
|
FACTORY(self, fc);
|
138
141
|
|
139
142
|
int ext_type;
|
140
|
-
VALUE
|
143
|
+
VALUE ext_module;
|
141
144
|
VALUE options;
|
142
145
|
VALUE packer_arg, unpacker_arg;
|
143
146
|
VALUE packer_proc, unpacker_proc;
|
144
147
|
|
148
|
+
if (OBJ_FROZEN(self)) {
|
149
|
+
rb_raise(rb_eRuntimeError, "can't modify frozen Factory");
|
150
|
+
}
|
151
|
+
|
145
152
|
switch (argc) {
|
146
153
|
case 2:
|
147
154
|
/* register_type(0x7f, Time) */
|
@@ -161,14 +168,14 @@ static VALUE Factory_register_type(int argc, VALUE* argv, VALUE self)
|
|
161
168
|
rb_raise(rb_eArgError, "wrong number of arguments (%d for 2..3)", argc);
|
162
169
|
}
|
163
170
|
|
164
|
-
ext_type =
|
171
|
+
ext_type = NUM2INT(argv[0]);
|
165
172
|
if(ext_type < -128 || ext_type > 127) {
|
166
173
|
rb_raise(rb_eRangeError, "integer %d too big to convert to `signed char'", ext_type);
|
167
174
|
}
|
168
175
|
|
169
|
-
|
170
|
-
if(rb_type(
|
171
|
-
rb_raise(rb_eArgError, "expected Class but found %s.", rb_obj_classname(
|
176
|
+
ext_module = argv[1];
|
177
|
+
if(rb_type(ext_module) != T_MODULE && rb_type(ext_module) != T_CLASS) {
|
178
|
+
rb_raise(rb_eArgError, "expected Module/Class but found %s.", rb_obj_classname(ext_module));
|
172
179
|
}
|
173
180
|
|
174
181
|
packer_proc = Qnil;
|
@@ -180,15 +187,19 @@ static VALUE Factory_register_type(int argc, VALUE* argv, VALUE self)
|
|
180
187
|
|
181
188
|
if(unpacker_arg != Qnil) {
|
182
189
|
if(rb_type(unpacker_arg) == T_SYMBOL || rb_type(unpacker_arg) == T_STRING) {
|
183
|
-
unpacker_proc = rb_obj_method(
|
190
|
+
unpacker_proc = rb_obj_method(ext_module, unpacker_arg);
|
184
191
|
} else {
|
185
192
|
unpacker_proc = rb_funcall(unpacker_arg, rb_intern("method"), 1, ID2SYM(rb_intern("call")));
|
186
193
|
}
|
187
194
|
}
|
188
195
|
|
189
|
-
msgpack_packer_ext_registry_put(&fc->pkrg,
|
196
|
+
msgpack_packer_ext_registry_put(&fc->pkrg, ext_module, ext_type, packer_proc, packer_arg);
|
190
197
|
|
191
|
-
|
198
|
+
if (ext_module == rb_cSymbol) {
|
199
|
+
fc->has_symbol_ext_type = true;
|
200
|
+
}
|
201
|
+
|
202
|
+
msgpack_unpacker_ext_registry_put(&fc->ukrg, ext_module, ext_type, unpacker_proc, unpacker_arg);
|
192
203
|
|
193
204
|
return Qnil;
|
194
205
|
}
|
@@ -206,8 +217,4 @@ void MessagePack_Factory_module_init(VALUE mMessagePack)
|
|
206
217
|
|
207
218
|
rb_define_private_method(cMessagePack_Factory, "registered_types_internal", Factory_registered_types_internal, 0);
|
208
219
|
rb_define_method(cMessagePack_Factory, "register_type", Factory_register_type, -1);
|
209
|
-
|
210
|
-
cMessagePack_DefaultFactory = Factory_alloc(cMessagePack_Factory);
|
211
|
-
Factory_initialize(0, NULL, cMessagePack_DefaultFactory);
|
212
|
-
rb_define_const(mMessagePack, "DefaultFactory", cMessagePack_DefaultFactory);
|
213
220
|
}
|
data/ext/msgpack/factory_class.h
CHANGED
data/ext/msgpack/packer.c
CHANGED
@@ -121,11 +121,12 @@ void msgpack_packer_write_hash_value(msgpack_packer_t* pk, VALUE v)
|
|
121
121
|
#endif
|
122
122
|
}
|
123
123
|
|
124
|
-
|
124
|
+
void msgpack_packer_write_other_value(msgpack_packer_t* pk, VALUE v)
|
125
125
|
{
|
126
126
|
int ext_type;
|
127
|
-
|
128
|
-
|
127
|
+
|
128
|
+
VALUE proc = msgpack_packer_ext_registry_lookup(&pk->ext_registry, v, &ext_type);
|
129
|
+
|
129
130
|
if(proc != Qnil) {
|
130
131
|
VALUE payload = rb_funcall(proc, s_call, 1, v);
|
131
132
|
StringValue(payload);
|
@@ -169,7 +170,7 @@ void msgpack_packer_write_value(msgpack_packer_t* pk, VALUE v)
|
|
169
170
|
msgpack_packer_write_float_value(pk, v);
|
170
171
|
break;
|
171
172
|
default:
|
172
|
-
|
173
|
+
msgpack_packer_write_other_value(pk, v);
|
173
174
|
}
|
174
175
|
}
|
175
176
|
|
data/ext/msgpack/packer.h
CHANGED
@@ -32,6 +32,7 @@ struct msgpack_packer_t {
|
|
32
32
|
msgpack_buffer_t buffer;
|
33
33
|
|
34
34
|
bool compatibility_mode;
|
35
|
+
bool has_symbol_ext_type;
|
35
36
|
|
36
37
|
ID to_msgpack_method;
|
37
38
|
VALUE to_msgpack_arg;
|
@@ -448,7 +449,7 @@ static inline void msgpack_packer_write_string_value(msgpack_packer_t* pk, VALUE
|
|
448
449
|
#endif
|
449
450
|
}
|
450
451
|
|
451
|
-
static inline void
|
452
|
+
static inline void msgpack_packer_write_symbol_string_value(msgpack_packer_t* pk, VALUE v)
|
452
453
|
{
|
453
454
|
#ifdef HAVE_RB_SYM2STR
|
454
455
|
/* rb_sym2str is added since MRI 2.2.0 */
|
@@ -462,6 +463,17 @@ static inline void msgpack_packer_write_symbol_value(msgpack_packer_t* pk, VALUE
|
|
462
463
|
#endif
|
463
464
|
}
|
464
465
|
|
466
|
+
void msgpack_packer_write_other_value(msgpack_packer_t* pk, VALUE v);
|
467
|
+
|
468
|
+
static inline void msgpack_packer_write_symbol_value(msgpack_packer_t* pk, VALUE v)
|
469
|
+
{
|
470
|
+
if (pk->has_symbol_ext_type) {
|
471
|
+
msgpack_packer_write_other_value(pk, v);
|
472
|
+
} else {
|
473
|
+
msgpack_packer_write_symbol_string_value(pk, v);
|
474
|
+
}
|
475
|
+
}
|
476
|
+
|
465
477
|
static inline void msgpack_packer_write_fixnum_value(msgpack_packer_t* pk, VALUE v)
|
466
478
|
{
|
467
479
|
#ifdef JRUBY
|
data/ext/msgpack/packer_class.c
CHANGED
@@ -56,14 +56,12 @@ static void Packer_mark(msgpack_packer_t* pk)
|
|
56
56
|
|
57
57
|
VALUE MessagePack_Packer_alloc(VALUE klass)
|
58
58
|
{
|
59
|
-
msgpack_packer_t* pk =
|
59
|
+
msgpack_packer_t* pk = ZALLOC_N(msgpack_packer_t, 1);
|
60
60
|
msgpack_packer_init(pk);
|
61
61
|
|
62
62
|
VALUE self = Data_Wrap_Struct(klass, Packer_mark, Packer_free, pk);
|
63
63
|
|
64
64
|
msgpack_packer_set_to_msgpack_method(pk, s_to_msgpack, self);
|
65
|
-
msgpack_packer_ext_registry_init(&pk->ext_registry);
|
66
|
-
pk->buffer_ref = MessagePack_Buffer_wrap(PACKER_BUFFER_(pk), self);
|
67
65
|
|
68
66
|
return self;
|
69
67
|
}
|
@@ -97,6 +95,9 @@ VALUE MessagePack_Packer_initialize(int argc, VALUE* argv, VALUE self)
|
|
97
95
|
|
98
96
|
PACKER(self, pk);
|
99
97
|
|
98
|
+
msgpack_packer_ext_registry_init(&pk->ext_registry);
|
99
|
+
pk->buffer_ref = MessagePack_Buffer_wrap(PACKER_BUFFER_(pk), self);
|
100
|
+
|
100
101
|
MessagePack_Buffer_set_options(PACKER_BUFFER_(pk), io, options);
|
101
102
|
|
102
103
|
if(options != Qnil) {
|
@@ -135,6 +136,100 @@ static VALUE Packer_write_nil(VALUE self)
|
|
135
136
|
return self;
|
136
137
|
}
|
137
138
|
|
139
|
+
static VALUE Packer_write_true(VALUE self)
|
140
|
+
{
|
141
|
+
PACKER(self, pk);
|
142
|
+
msgpack_packer_write_true(pk);
|
143
|
+
return self;
|
144
|
+
}
|
145
|
+
|
146
|
+
static VALUE Packer_write_false(VALUE self)
|
147
|
+
{
|
148
|
+
PACKER(self, pk);
|
149
|
+
msgpack_packer_write_false(pk);
|
150
|
+
return self;
|
151
|
+
}
|
152
|
+
|
153
|
+
static VALUE Packer_write_float(VALUE self, VALUE obj)
|
154
|
+
{
|
155
|
+
PACKER(self, pk);
|
156
|
+
msgpack_packer_write_float_value(pk, obj);
|
157
|
+
return self;
|
158
|
+
}
|
159
|
+
|
160
|
+
static VALUE Packer_write_string(VALUE self, VALUE obj)
|
161
|
+
{
|
162
|
+
PACKER(self, pk);
|
163
|
+
Check_Type(obj, T_STRING);
|
164
|
+
msgpack_packer_write_string_value(pk, obj);
|
165
|
+
return self;
|
166
|
+
}
|
167
|
+
|
168
|
+
static VALUE Packer_write_bin(VALUE self, VALUE obj)
|
169
|
+
{
|
170
|
+
PACKER(self, pk);
|
171
|
+
Check_Type(obj, T_STRING);
|
172
|
+
|
173
|
+
VALUE enc = rb_enc_from_encoding(rb_ascii8bit_encoding());
|
174
|
+
obj = rb_str_encode(obj, enc, 0, Qnil);
|
175
|
+
|
176
|
+
msgpack_packer_write_string_value(pk, obj);
|
177
|
+
return self;
|
178
|
+
}
|
179
|
+
|
180
|
+
static VALUE Packer_write_array(VALUE self, VALUE obj)
|
181
|
+
{
|
182
|
+
PACKER(self, pk);
|
183
|
+
Check_Type(obj, T_ARRAY);
|
184
|
+
msgpack_packer_write_array_value(pk, obj);
|
185
|
+
return self;
|
186
|
+
}
|
187
|
+
|
188
|
+
static VALUE Packer_write_hash(VALUE self, VALUE obj)
|
189
|
+
{
|
190
|
+
PACKER(self, pk);
|
191
|
+
Check_Type(obj, T_HASH);
|
192
|
+
msgpack_packer_write_hash_value(pk, obj);
|
193
|
+
return self;
|
194
|
+
}
|
195
|
+
|
196
|
+
static VALUE Packer_write_symbol(VALUE self, VALUE obj)
|
197
|
+
{
|
198
|
+
PACKER(self, pk);
|
199
|
+
Check_Type(obj, T_SYMBOL);
|
200
|
+
msgpack_packer_write_symbol_value(pk, obj);
|
201
|
+
return self;
|
202
|
+
}
|
203
|
+
|
204
|
+
static VALUE Packer_write_int(VALUE self, VALUE obj)
|
205
|
+
{
|
206
|
+
PACKER(self, pk);
|
207
|
+
|
208
|
+
if (FIXNUM_P(obj)) {
|
209
|
+
msgpack_packer_write_fixnum_value(pk, obj);
|
210
|
+
} else {
|
211
|
+
Check_Type(obj, T_BIGNUM);
|
212
|
+
msgpack_packer_write_bignum_value(pk, obj);
|
213
|
+
}
|
214
|
+
return self;
|
215
|
+
}
|
216
|
+
|
217
|
+
static VALUE Packer_write_extension(VALUE self, VALUE obj)
|
218
|
+
{
|
219
|
+
PACKER(self, pk);
|
220
|
+
Check_Type(obj, T_STRUCT);
|
221
|
+
|
222
|
+
int ext_type = FIX2INT(RSTRUCT_GET(obj, 0));
|
223
|
+
if(ext_type < -128 || ext_type > 127) {
|
224
|
+
rb_raise(rb_eRangeError, "integer %d too big to convert to `signed char'", ext_type);
|
225
|
+
}
|
226
|
+
VALUE payload = RSTRUCT_GET(obj, 1);
|
227
|
+
StringValue(payload);
|
228
|
+
msgpack_packer_write_ext(pk, ext_type, payload);
|
229
|
+
|
230
|
+
return self;
|
231
|
+
}
|
232
|
+
|
138
233
|
static VALUE Packer_write_array_header(VALUE self, VALUE n)
|
139
234
|
{
|
140
235
|
PACKER(self, pk);
|
@@ -149,6 +244,13 @@ static VALUE Packer_write_map_header(VALUE self, VALUE n)
|
|
149
244
|
return self;
|
150
245
|
}
|
151
246
|
|
247
|
+
static VALUE Packer_write_bin_header(VALUE self, VALUE n)
|
248
|
+
{
|
249
|
+
PACKER(self, pk);
|
250
|
+
msgpack_packer_write_bin_header(pk, NUM2UINT(n));
|
251
|
+
return self;
|
252
|
+
}
|
253
|
+
|
152
254
|
static VALUE Packer_write_float32(VALUE self, VALUE numeric)
|
153
255
|
{
|
154
256
|
if(!rb_obj_is_kind_of(numeric, rb_cNumeric)) {
|
@@ -163,7 +265,7 @@ static VALUE Packer_write_float32(VALUE self, VALUE numeric)
|
|
163
265
|
static VALUE Packer_write_ext(VALUE self, VALUE type, VALUE data)
|
164
266
|
{
|
165
267
|
PACKER(self, pk);
|
166
|
-
int ext_type =
|
268
|
+
int ext_type = NUM2INT(type);
|
167
269
|
if(ext_type < -128 || ext_type > 127) {
|
168
270
|
rb_raise(rb_eRangeError, "integer %d too big to convert to `signed char'", ext_type);
|
169
271
|
}
|
@@ -249,7 +351,7 @@ static VALUE Packer_register_type(int argc, VALUE* argv, VALUE self)
|
|
249
351
|
PACKER(self, pk);
|
250
352
|
|
251
353
|
int ext_type;
|
252
|
-
VALUE
|
354
|
+
VALUE ext_module;
|
253
355
|
VALUE proc;
|
254
356
|
VALUE arg;
|
255
357
|
|
@@ -274,36 +376,31 @@ static VALUE Packer_register_type(int argc, VALUE* argv, VALUE self)
|
|
274
376
|
rb_raise(rb_eArgError, "wrong number of arguments (%d for 2..3)", argc);
|
275
377
|
}
|
276
378
|
|
277
|
-
ext_type =
|
379
|
+
ext_type = NUM2INT(argv[0]);
|
278
380
|
if(ext_type < -128 || ext_type > 127) {
|
279
381
|
rb_raise(rb_eRangeError, "integer %d too big to convert to `signed char'", ext_type);
|
280
382
|
}
|
281
383
|
|
282
|
-
|
283
|
-
if(rb_type(
|
284
|
-
rb_raise(rb_eArgError, "expected Class but found %s.", rb_obj_classname(
|
384
|
+
ext_module = argv[1];
|
385
|
+
if(rb_type(ext_module) != T_MODULE && rb_type(ext_module) != T_CLASS) {
|
386
|
+
rb_raise(rb_eArgError, "expected Module/Class but found %s.", rb_obj_classname(ext_module));
|
285
387
|
}
|
286
388
|
|
287
|
-
msgpack_packer_ext_registry_put(&pk->ext_registry,
|
389
|
+
msgpack_packer_ext_registry_put(&pk->ext_registry, ext_module, ext_type, proc, arg);
|
390
|
+
|
391
|
+
if (ext_module == rb_cSymbol) {
|
392
|
+
pk->has_symbol_ext_type = true;
|
393
|
+
}
|
288
394
|
|
289
395
|
return Qnil;
|
290
396
|
}
|
291
397
|
|
292
|
-
VALUE
|
398
|
+
VALUE Packer_full_pack(VALUE self)
|
293
399
|
{
|
294
|
-
VALUE
|
295
|
-
|
296
|
-
if (argc < 0 || argc > 3) {
|
297
|
-
rb_raise(rb_eArgError, "wrong number of arguments (%d for 1..3)", argc);
|
298
|
-
}
|
299
|
-
v = argv[0];
|
400
|
+
VALUE retval;
|
300
401
|
|
301
|
-
VALUE self = MessagePack_Factory_packer(argc - 1, argv + 1, cMessagePack_DefaultFactory);
|
302
402
|
PACKER(self, pk);
|
303
403
|
|
304
|
-
msgpack_packer_write_value(pk, v);
|
305
|
-
|
306
|
-
VALUE retval;
|
307
404
|
if(msgpack_buffer_has_io(PACKER_BUFFER_(pk))) {
|
308
405
|
msgpack_buffer_flush(PACKER_BUFFER_(pk));
|
309
406
|
retval = Qnil;
|
@@ -313,27 +410,9 @@ VALUE MessagePack_pack(int argc, VALUE* argv)
|
|
313
410
|
|
314
411
|
msgpack_buffer_clear(PACKER_BUFFER_(pk)); /* to free rmem before GC */
|
315
412
|
|
316
|
-
#ifdef RB_GC_GUARD
|
317
|
-
/* This prevents compilers from optimizing out the `self` variable
|
318
|
-
* from stack. Otherwise GC free()s it. */
|
319
|
-
RB_GC_GUARD(self);
|
320
|
-
#endif
|
321
|
-
|
322
413
|
return retval;
|
323
414
|
}
|
324
415
|
|
325
|
-
static VALUE MessagePack_dump_module_method(int argc, VALUE* argv, VALUE mod)
|
326
|
-
{
|
327
|
-
UNUSED(mod);
|
328
|
-
return MessagePack_pack(argc, argv);
|
329
|
-
}
|
330
|
-
|
331
|
-
static VALUE MessagePack_pack_module_method(int argc, VALUE* argv, VALUE mod)
|
332
|
-
{
|
333
|
-
UNUSED(mod);
|
334
|
-
return MessagePack_pack(argc, argv);
|
335
|
-
}
|
336
|
-
|
337
416
|
void MessagePack_Packer_module_init(VALUE mMessagePack)
|
338
417
|
{
|
339
418
|
s_to_msgpack = rb_intern("to_msgpack");
|
@@ -352,8 +431,19 @@ void MessagePack_Packer_module_init(VALUE mMessagePack)
|
|
352
431
|
rb_define_method(cMessagePack_Packer, "write", Packer_write, 1);
|
353
432
|
rb_define_alias(cMessagePack_Packer, "pack", "write");
|
354
433
|
rb_define_method(cMessagePack_Packer, "write_nil", Packer_write_nil, 0);
|
434
|
+
rb_define_method(cMessagePack_Packer, "write_true", Packer_write_true, 0);
|
435
|
+
rb_define_method(cMessagePack_Packer, "write_false", Packer_write_false, 0);
|
436
|
+
rb_define_method(cMessagePack_Packer, "write_float", Packer_write_float, 1);
|
437
|
+
rb_define_method(cMessagePack_Packer, "write_string", Packer_write_string, 1);
|
438
|
+
rb_define_method(cMessagePack_Packer, "write_bin", Packer_write_bin, 1);
|
439
|
+
rb_define_method(cMessagePack_Packer, "write_array", Packer_write_array, 1);
|
440
|
+
rb_define_method(cMessagePack_Packer, "write_hash", Packer_write_hash, 1);
|
441
|
+
rb_define_method(cMessagePack_Packer, "write_symbol", Packer_write_symbol, 1);
|
442
|
+
rb_define_method(cMessagePack_Packer, "write_int", Packer_write_int, 1);
|
443
|
+
rb_define_method(cMessagePack_Packer, "write_extension", Packer_write_extension, 1);
|
355
444
|
rb_define_method(cMessagePack_Packer, "write_array_header", Packer_write_array_header, 1);
|
356
445
|
rb_define_method(cMessagePack_Packer, "write_map_header", Packer_write_map_header, 1);
|
446
|
+
rb_define_method(cMessagePack_Packer, "write_bin_header", Packer_write_bin_header, 1);
|
357
447
|
rb_define_method(cMessagePack_Packer, "write_ext", Packer_write_ext, 2);
|
358
448
|
rb_define_method(cMessagePack_Packer, "write_float32", Packer_write_float32, 1);
|
359
449
|
rb_define_method(cMessagePack_Packer, "flush", Packer_flush, 0);
|
@@ -376,8 +466,5 @@ void MessagePack_Packer_module_init(VALUE mMessagePack)
|
|
376
466
|
//rb_gc_register_address(&s_packer_value);
|
377
467
|
//Data_Get_Struct(s_packer_value, msgpack_packer_t, s_packer);
|
378
468
|
|
379
|
-
|
380
|
-
rb_define_module_function(mMessagePack, "pack", MessagePack_pack_module_method, -1);
|
381
|
-
rb_define_module_function(mMessagePack, "dump", MessagePack_dump_module_method, -1);
|
469
|
+
rb_define_method(cMessagePack_Packer, "full_pack", Packer_full_pack, 0);
|
382
470
|
}
|
383
|
-
|