google-protobuf 3.4.1.1-universal-darwin → 3.5.0-universal-darwin
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of google-protobuf might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/ext/google/protobuf_c/defs.c +14 -3
- data/ext/google/protobuf_c/encode_decode.c +72 -59
- data/ext/google/protobuf_c/message.c +42 -7
- data/ext/google/protobuf_c/protobuf.c +1 -1
- data/ext/google/protobuf_c/protobuf.h +14 -5
- data/ext/google/protobuf_c/storage.c +12 -1
- data/ext/google/protobuf_c/upb.c +1413 -411
- data/ext/google/protobuf_c/upb.h +508 -411
- data/lib/google/2.0/protobuf_c.bundle +0 -0
- data/lib/google/2.1/protobuf_c.bundle +0 -0
- data/lib/google/2.2/protobuf_c.bundle +0 -0
- data/lib/google/2.3/protobuf_c.bundle +0 -0
- data/lib/google/2.4/protobuf_c.bundle +0 -0
- data/tests/basic.rb +50 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bda9a713b39181ff8326f55819809a1cd9e97f92
|
4
|
+
data.tar.gz: 25fa899f5c99e0bf0e6dc07e1fcd02e6feea5237
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a3d506f87bcf1db665ae4e78fa81f86739f6d62cc3fc03c62279160109bff1be3a3360415002cb62ae1cb79f3d471e3738d95ca7f1237f050b0a810c13cee04
|
7
|
+
data.tar.gz: ad620df5df814513bfded4d5bec6addb817a6fb7b62b9900dac2930467a30d10ee4addffbe6c4420149531fc9847cbe1e971b3ba02c469abd5527857da0de960
|
@@ -228,7 +228,6 @@ DEFINE_CLASS(Descriptor, "Google::Protobuf::Descriptor");
|
|
228
228
|
void Descriptor_mark(void* _self) {
|
229
229
|
Descriptor* self = _self;
|
230
230
|
rb_gc_mark(self->klass);
|
231
|
-
rb_gc_mark(self->typeclass_references);
|
232
231
|
}
|
233
232
|
|
234
233
|
void Descriptor_free(void* _self) {
|
@@ -283,7 +282,6 @@ VALUE Descriptor_alloc(VALUE klass) {
|
|
283
282
|
self->pb_serialize_handlers = NULL;
|
284
283
|
self->json_serialize_handlers = NULL;
|
285
284
|
self->json_serialize_handlers_preserve = NULL;
|
286
|
-
self->typeclass_references = rb_ary_new();
|
287
285
|
return ret;
|
288
286
|
}
|
289
287
|
|
@@ -1635,7 +1633,7 @@ VALUE Builder_alloc(VALUE klass) {
|
|
1635
1633
|
Builder* self = ALLOC(Builder);
|
1636
1634
|
VALUE ret = TypedData_Wrap_Struct(
|
1637
1635
|
klass, &_Builder_type, self);
|
1638
|
-
self->pending_list =
|
1636
|
+
self->pending_list = Qnil;
|
1639
1637
|
self->defs = NULL;
|
1640
1638
|
return ret;
|
1641
1639
|
}
|
@@ -1645,11 +1643,24 @@ void Builder_register(VALUE module) {
|
|
1645
1643
|
rb_define_alloc_func(klass, Builder_alloc);
|
1646
1644
|
rb_define_method(klass, "add_message", Builder_add_message, 1);
|
1647
1645
|
rb_define_method(klass, "add_enum", Builder_add_enum, 1);
|
1646
|
+
rb_define_method(klass, "initialize", Builder_initialize, 0);
|
1648
1647
|
rb_define_method(klass, "finalize_to_pool", Builder_finalize_to_pool, 1);
|
1649
1648
|
cBuilder = klass;
|
1650
1649
|
rb_gc_register_address(&cBuilder);
|
1651
1650
|
}
|
1652
1651
|
|
1652
|
+
/*
|
1653
|
+
* call-seq:
|
1654
|
+
* Builder.new(d) => builder
|
1655
|
+
*
|
1656
|
+
* Create a new message builder.
|
1657
|
+
*/
|
1658
|
+
VALUE Builder_initialize(VALUE _self) {
|
1659
|
+
DEFINE_SELF(Builder, self, _self);
|
1660
|
+
self->pending_list = rb_ary_new();
|
1661
|
+
return Qnil;
|
1662
|
+
}
|
1663
|
+
|
1653
1664
|
/*
|
1654
1665
|
* call-seq:
|
1655
1666
|
* Builder.add_message(name, &block)
|
@@ -44,6 +44,56 @@ VALUE noleak_rb_str_cat(VALUE rb_str, const char *str, long len) {
|
|
44
44
|
return rb_str;
|
45
45
|
}
|
46
46
|
|
47
|
+
// The code below also comes from upb's prototype Ruby binding, developed by
|
48
|
+
// haberman@.
|
49
|
+
|
50
|
+
/* stringsink *****************************************************************/
|
51
|
+
|
52
|
+
static void *stringsink_start(void *_sink, const void *hd, size_t size_hint) {
|
53
|
+
stringsink *sink = _sink;
|
54
|
+
sink->len = 0;
|
55
|
+
return sink;
|
56
|
+
}
|
57
|
+
|
58
|
+
static size_t stringsink_string(void *_sink, const void *hd, const char *ptr,
|
59
|
+
size_t len, const upb_bufhandle *handle) {
|
60
|
+
stringsink *sink = _sink;
|
61
|
+
size_t new_size = sink->size;
|
62
|
+
|
63
|
+
UPB_UNUSED(hd);
|
64
|
+
UPB_UNUSED(handle);
|
65
|
+
|
66
|
+
while (sink->len + len > new_size) {
|
67
|
+
new_size *= 2;
|
68
|
+
}
|
69
|
+
|
70
|
+
if (new_size != sink->size) {
|
71
|
+
sink->ptr = realloc(sink->ptr, new_size);
|
72
|
+
sink->size = new_size;
|
73
|
+
}
|
74
|
+
|
75
|
+
memcpy(sink->ptr + sink->len, ptr, len);
|
76
|
+
sink->len += len;
|
77
|
+
|
78
|
+
return len;
|
79
|
+
}
|
80
|
+
|
81
|
+
void stringsink_init(stringsink *sink) {
|
82
|
+
upb_byteshandler_init(&sink->handler);
|
83
|
+
upb_byteshandler_setstartstr(&sink->handler, stringsink_start, NULL);
|
84
|
+
upb_byteshandler_setstring(&sink->handler, stringsink_string, NULL);
|
85
|
+
|
86
|
+
upb_bytessink_reset(&sink->sink, &sink->handler, sink);
|
87
|
+
|
88
|
+
sink->size = 32;
|
89
|
+
sink->ptr = malloc(sink->size);
|
90
|
+
sink->len = 0;
|
91
|
+
}
|
92
|
+
|
93
|
+
void stringsink_uninit(stringsink *sink) {
|
94
|
+
free(sink->ptr);
|
95
|
+
}
|
96
|
+
|
47
97
|
// -----------------------------------------------------------------------------
|
48
98
|
// Parsing.
|
49
99
|
// -----------------------------------------------------------------------------
|
@@ -613,6 +663,20 @@ static void add_handlers_for_oneof_field(upb_handlers *h,
|
|
613
663
|
upb_handlerattr_uninit(&attr);
|
614
664
|
}
|
615
665
|
|
666
|
+
static bool unknown_field_handler(void* closure, const void* hd,
|
667
|
+
const char* buf, size_t size) {
|
668
|
+
UPB_UNUSED(hd);
|
669
|
+
|
670
|
+
MessageHeader* msg = (MessageHeader*)closure;
|
671
|
+
if (msg->unknown_fields == NULL) {
|
672
|
+
msg->unknown_fields = malloc(sizeof(stringsink));
|
673
|
+
stringsink_init(msg->unknown_fields);
|
674
|
+
}
|
675
|
+
|
676
|
+
stringsink_string(msg->unknown_fields, NULL, buf, size, NULL);
|
677
|
+
|
678
|
+
return true;
|
679
|
+
}
|
616
680
|
|
617
681
|
static void add_handlers_for_message(const void *closure, upb_handlers *h) {
|
618
682
|
const upb_msgdef* msgdef = upb_handlers_msgdef(h);
|
@@ -634,6 +698,9 @@ static void add_handlers_for_message(const void *closure, upb_handlers *h) {
|
|
634
698
|
desc->layout = create_layout(desc->msgdef);
|
635
699
|
}
|
636
700
|
|
701
|
+
upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
|
702
|
+
upb_handlers_setunknown(h, unknown_field_handler, &attr);
|
703
|
+
|
637
704
|
for (upb_msg_field_begin(&i, desc->msgdef);
|
638
705
|
!upb_msg_field_done(&i);
|
639
706
|
upb_msg_field_next(&i)) {
|
@@ -831,65 +898,6 @@ VALUE Message_decode_json(VALUE klass, VALUE data) {
|
|
831
898
|
// -----------------------------------------------------------------------------
|
832
899
|
// Serializing.
|
833
900
|
// -----------------------------------------------------------------------------
|
834
|
-
//
|
835
|
-
// The code below also comes from upb's prototype Ruby binding, developed by
|
836
|
-
// haberman@.
|
837
|
-
|
838
|
-
/* stringsink *****************************************************************/
|
839
|
-
|
840
|
-
// This should probably be factored into a common upb component.
|
841
|
-
|
842
|
-
typedef struct {
|
843
|
-
upb_byteshandler handler;
|
844
|
-
upb_bytessink sink;
|
845
|
-
char *ptr;
|
846
|
-
size_t len, size;
|
847
|
-
} stringsink;
|
848
|
-
|
849
|
-
static void *stringsink_start(void *_sink, const void *hd, size_t size_hint) {
|
850
|
-
stringsink *sink = _sink;
|
851
|
-
sink->len = 0;
|
852
|
-
return sink;
|
853
|
-
}
|
854
|
-
|
855
|
-
static size_t stringsink_string(void *_sink, const void *hd, const char *ptr,
|
856
|
-
size_t len, const upb_bufhandle *handle) {
|
857
|
-
stringsink *sink = _sink;
|
858
|
-
size_t new_size = sink->size;
|
859
|
-
|
860
|
-
UPB_UNUSED(hd);
|
861
|
-
UPB_UNUSED(handle);
|
862
|
-
|
863
|
-
while (sink->len + len > new_size) {
|
864
|
-
new_size *= 2;
|
865
|
-
}
|
866
|
-
|
867
|
-
if (new_size != sink->size) {
|
868
|
-
sink->ptr = realloc(sink->ptr, new_size);
|
869
|
-
sink->size = new_size;
|
870
|
-
}
|
871
|
-
|
872
|
-
memcpy(sink->ptr + sink->len, ptr, len);
|
873
|
-
sink->len += len;
|
874
|
-
|
875
|
-
return len;
|
876
|
-
}
|
877
|
-
|
878
|
-
void stringsink_init(stringsink *sink) {
|
879
|
-
upb_byteshandler_init(&sink->handler);
|
880
|
-
upb_byteshandler_setstartstr(&sink->handler, stringsink_start, NULL);
|
881
|
-
upb_byteshandler_setstring(&sink->handler, stringsink_string, NULL);
|
882
|
-
|
883
|
-
upb_bytessink_reset(&sink->sink, &sink->handler, sink);
|
884
|
-
|
885
|
-
sink->size = 32;
|
886
|
-
sink->ptr = malloc(sink->size);
|
887
|
-
sink->len = 0;
|
888
|
-
}
|
889
|
-
|
890
|
-
void stringsink_uninit(stringsink *sink) {
|
891
|
-
free(sink->ptr);
|
892
|
-
}
|
893
901
|
|
894
902
|
/* msgvisitor *****************************************************************/
|
895
903
|
|
@@ -1171,6 +1179,11 @@ static void putmsg(VALUE msg_rb, const Descriptor* desc,
|
|
1171
1179
|
}
|
1172
1180
|
}
|
1173
1181
|
|
1182
|
+
stringsink* unknown = msg->unknown_fields;
|
1183
|
+
if (unknown != NULL) {
|
1184
|
+
upb_sink_putunknown(sink, unknown->ptr, unknown->len);
|
1185
|
+
}
|
1186
|
+
|
1174
1187
|
upb_sink_endmsg(sink, &status);
|
1175
1188
|
}
|
1176
1189
|
|
@@ -44,6 +44,11 @@ void Message_mark(void* _self) {
|
|
44
44
|
}
|
45
45
|
|
46
46
|
void Message_free(void* self) {
|
47
|
+
stringsink* unknown = ((MessageHeader *)self)->unknown_fields;
|
48
|
+
if (unknown != NULL) {
|
49
|
+
stringsink_uninit(unknown);
|
50
|
+
free(unknown);
|
51
|
+
}
|
47
52
|
xfree(self);
|
48
53
|
}
|
49
54
|
|
@@ -67,6 +72,8 @@ VALUE Message_alloc(VALUE klass) {
|
|
67
72
|
msg->descriptor = desc;
|
68
73
|
rb_ivar_set(ret, descriptor_instancevar_interned, descriptor);
|
69
74
|
|
75
|
+
msg->unknown_fields = NULL;
|
76
|
+
|
70
77
|
layout_init(desc->layout, Message_data(msg));
|
71
78
|
|
72
79
|
return ret;
|
@@ -217,20 +224,32 @@ VALUE Message_respond_to_missing(int argc, VALUE* argv, VALUE _self) {
|
|
217
224
|
return Qtrue;
|
218
225
|
}
|
219
226
|
|
227
|
+
VALUE create_submsg_from_hash(const upb_fielddef *f, VALUE hash) {
|
228
|
+
const upb_def *d = upb_fielddef_subdef(f);
|
229
|
+
assert(d != NULL);
|
230
|
+
|
231
|
+
VALUE descriptor = get_def_obj(d);
|
232
|
+
VALUE msgclass = rb_funcall(descriptor, rb_intern("msgclass"), 0, NULL);
|
233
|
+
|
234
|
+
VALUE args[1] = { hash };
|
235
|
+
return rb_class_new_instance(1, args, msgclass);
|
236
|
+
}
|
237
|
+
|
220
238
|
int Message_initialize_kwarg(VALUE key, VALUE val, VALUE _self) {
|
221
239
|
MessageHeader* self;
|
222
|
-
|
223
|
-
char* name;
|
240
|
+
char *name;
|
224
241
|
const upb_fielddef* f;
|
225
242
|
TypedData_Get_Struct(_self, MessageHeader, &Message_type, self);
|
226
243
|
|
227
|
-
if (
|
244
|
+
if (TYPE(key) == T_STRING) {
|
245
|
+
name = RSTRING_PTR(key);
|
246
|
+
} else if (TYPE(key) == T_SYMBOL) {
|
247
|
+
name = RSTRING_PTR(rb_id2str(SYM2ID(key)));
|
248
|
+
} else {
|
228
249
|
rb_raise(rb_eArgError,
|
229
|
-
"Expected symbols as hash keys
|
250
|
+
"Expected string or symbols as hash keys when initializing proto from hash.");
|
230
251
|
}
|
231
252
|
|
232
|
-
method_str = rb_id2str(SYM2ID(key));
|
233
|
-
name = RSTRING_PTR(method_str);
|
234
253
|
f = upb_msgdef_ntofz(self->descriptor->msgdef, name);
|
235
254
|
if (f == NULL) {
|
236
255
|
rb_raise(rb_eArgError,
|
@@ -255,9 +274,18 @@ int Message_initialize_kwarg(VALUE key, VALUE val, VALUE _self) {
|
|
255
274
|
}
|
256
275
|
ary = layout_get(self->descriptor->layout, Message_data(self), f);
|
257
276
|
for (int i = 0; i < RARRAY_LEN(val); i++) {
|
258
|
-
|
277
|
+
VALUE entry = rb_ary_entry(val, i);
|
278
|
+
if (TYPE(entry) == T_HASH && upb_fielddef_issubmsg(f)) {
|
279
|
+
entry = create_submsg_from_hash(f, entry);
|
280
|
+
}
|
281
|
+
|
282
|
+
RepeatedField_push(ary, entry);
|
259
283
|
}
|
260
284
|
} else {
|
285
|
+
if (TYPE(val) == T_HASH && upb_fielddef_issubmsg(f)) {
|
286
|
+
val = create_submsg_from_hash(f, val);
|
287
|
+
}
|
288
|
+
|
261
289
|
layout_set(self->descriptor->layout, Message_data(self), f, val);
|
262
290
|
}
|
263
291
|
return 0;
|
@@ -419,6 +447,13 @@ VALUE Message_to_h(VALUE _self) {
|
|
419
447
|
msg_value = Map_to_h(msg_value);
|
420
448
|
} else if (upb_fielddef_label(field) == UPB_LABEL_REPEATED) {
|
421
449
|
msg_value = RepeatedField_to_ary(msg_value);
|
450
|
+
|
451
|
+
if (upb_fielddef_type(field) == UPB_TYPE_MESSAGE) {
|
452
|
+
for (int i = 0; i < RARRAY_LEN(msg_value); i++) {
|
453
|
+
VALUE elem = rb_ary_entry(msg_value, i);
|
454
|
+
rb_ary_store(msg_value, i, Message_to_h(elem));
|
455
|
+
}
|
456
|
+
}
|
422
457
|
} else if (msg_value != Qnil &&
|
423
458
|
upb_fielddef_type(field) == UPB_TYPE_MESSAGE) {
|
424
459
|
msg_value = Message_to_h(msg_value);
|
@@ -110,6 +110,6 @@ void Init_protobuf_c() {
|
|
110
110
|
kRubyStringASCIIEncoding = rb_usascii_encoding();
|
111
111
|
kRubyString8bitEncoding = rb_ascii8bit_encoding();
|
112
112
|
|
113
|
-
upb_def_to_ruby_obj_map = rb_hash_new();
|
114
113
|
rb_gc_register_address(&upb_def_to_ruby_obj_map);
|
114
|
+
upb_def_to_ruby_obj_map = rb_hash_new();
|
115
115
|
}
|
@@ -116,10 +116,6 @@ struct Descriptor {
|
|
116
116
|
const upb_handlers* pb_serialize_handlers;
|
117
117
|
const upb_handlers* json_serialize_handlers;
|
118
118
|
const upb_handlers* json_serialize_handlers_preserve;
|
119
|
-
// Handlers hold type class references for sub-message fields directly in some
|
120
|
-
// cases. We need to keep these rooted because they might otherwise be
|
121
|
-
// collected.
|
122
|
-
VALUE typeclass_references;
|
123
119
|
};
|
124
120
|
|
125
121
|
struct FieldDescriptor {
|
@@ -280,6 +276,7 @@ void Builder_free(void* _self);
|
|
280
276
|
VALUE Builder_alloc(VALUE klass);
|
281
277
|
void Builder_register(VALUE module);
|
282
278
|
Builder* ruby_to_Builder(VALUE value);
|
279
|
+
VALUE Builder_initialize(VALUE _self);
|
283
280
|
VALUE Builder_add_message(VALUE _self, VALUE name);
|
284
281
|
VALUE Builder_add_enum(VALUE _self, VALUE name);
|
285
282
|
VALUE Builder_finalize_to_pool(VALUE _self, VALUE pool_rb);
|
@@ -478,8 +475,20 @@ VALUE layout_inspect(MessageLayout* layout, void* storage);
|
|
478
475
|
// Message class creation.
|
479
476
|
// -----------------------------------------------------------------------------
|
480
477
|
|
478
|
+
// This should probably be factored into a common upb component.
|
479
|
+
|
480
|
+
typedef struct {
|
481
|
+
upb_byteshandler handler;
|
482
|
+
upb_bytessink sink;
|
483
|
+
char *ptr;
|
484
|
+
size_t len, size;
|
485
|
+
} stringsink;
|
486
|
+
|
487
|
+
void stringsink_uninit(stringsink *sink);
|
488
|
+
|
481
489
|
struct MessageHeader {
|
482
|
-
Descriptor* descriptor;
|
490
|
+
Descriptor* descriptor; // kept alive by self.class.descriptor reference.
|
491
|
+
stringsink* unknown_fields; // store unknown fields in decoding.
|
483
492
|
// Data comes after this.
|
484
493
|
};
|
485
494
|
|
@@ -176,6 +176,15 @@ void native_slot_set_value_and_case(upb_fieldtype_t type, VALUE type_class,
|
|
176
176
|
break;
|
177
177
|
}
|
178
178
|
case UPB_TYPE_STRING:
|
179
|
+
if (CLASS_OF(value) == rb_cSymbol) {
|
180
|
+
value = rb_funcall(value, rb_intern("to_s"), 0, NULL);
|
181
|
+
} else if (CLASS_OF(value) != rb_cString) {
|
182
|
+
rb_raise(rb_eTypeError, "Invalid argument for string field.");
|
183
|
+
}
|
184
|
+
|
185
|
+
DEREF(memory, VALUE) = native_slot_encode_and_freeze_string(type, value);
|
186
|
+
break;
|
187
|
+
|
179
188
|
case UPB_TYPE_BYTES: {
|
180
189
|
if (CLASS_OF(value) != rb_cString) {
|
181
190
|
rb_raise(rb_eTypeError, "Invalid argument for string field.");
|
@@ -197,7 +206,9 @@ void native_slot_set_value_and_case(upb_fieldtype_t type, VALUE type_class,
|
|
197
206
|
}
|
198
207
|
case UPB_TYPE_ENUM: {
|
199
208
|
int32_t int_val = 0;
|
200
|
-
if (
|
209
|
+
if (TYPE(value) == T_STRING) {
|
210
|
+
value = rb_funcall(value, rb_intern("to_sym"), 0, NULL);
|
211
|
+
} else if (!is_ruby_num(value) && TYPE(value) != T_SYMBOL) {
|
201
212
|
rb_raise(rb_eTypeError,
|
202
213
|
"Expected number or symbol type for enum field.");
|
203
214
|
}
|