google-protobuf 3.0.0.alpha.3 → 3.0.0.alpha.3.1.pre
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 +7 -0
- data/ext/google/protobuf_c/defs.c +5 -3
- data/ext/google/protobuf_c/encode_decode.c +85 -75
- data/ext/google/protobuf_c/extconf.rb +1 -3
- data/ext/google/protobuf_c/message.c +9 -44
- data/ext/google/protobuf_c/protobuf.c +7 -10
- data/ext/google/protobuf_c/protobuf.h +9 -9
- data/ext/google/protobuf_c/repeated_field.c +55 -95
- data/ext/google/protobuf_c/storage.c +2 -5
- data/ext/google/protobuf_c/upb.c +248 -822
- data/ext/google/protobuf_c/upb.h +467 -511
- data/lib/google/protobuf.rb +0 -27
- data/tests/basic.rb +9 -119
- metadata +17 -27
- data/lib/google/protobuf/message_exts.rb +0 -53
- data/lib/google/protobuf/repeated_field.rb +0 -188
@@ -47,30 +47,6 @@ RepeatedField* ruby_to_RepeatedField(VALUE _self) {
|
|
47
47
|
return self;
|
48
48
|
}
|
49
49
|
|
50
|
-
static int index_position(VALUE _index, RepeatedField* repeated_field) {
|
51
|
-
int index = NUM2INT(_index);
|
52
|
-
if (index < 0 && repeated_field->size > 0) {
|
53
|
-
index = repeated_field->size + index;
|
54
|
-
}
|
55
|
-
return index;
|
56
|
-
}
|
57
|
-
|
58
|
-
VALUE RepeatedField_subarray(VALUE _self, long beg, long len) {
|
59
|
-
RepeatedField* self = ruby_to_RepeatedField(_self);
|
60
|
-
int element_size = native_slot_size(self->field_type);
|
61
|
-
upb_fieldtype_t field_type = self->field_type;
|
62
|
-
VALUE field_type_class = self->field_type_class;
|
63
|
-
|
64
|
-
size_t off = beg * element_size;
|
65
|
-
VALUE ary = rb_ary_new2(len);
|
66
|
-
for (int i = beg; i < beg + len; i++, off += element_size) {
|
67
|
-
void* mem = ((uint8_t *)self->elements) + off;
|
68
|
-
VALUE elem = native_slot_get(field_type, field_type_class, mem);
|
69
|
-
rb_ary_push(ary, elem);
|
70
|
-
}
|
71
|
-
return ary;
|
72
|
-
}
|
73
|
-
|
74
50
|
/*
|
75
51
|
* call-seq:
|
76
52
|
* RepeatedField.each(&block)
|
@@ -91,58 +67,29 @@ VALUE RepeatedField_each(VALUE _self) {
|
|
91
67
|
VALUE val = native_slot_get(field_type, field_type_class, memory);
|
92
68
|
rb_yield(val);
|
93
69
|
}
|
94
|
-
return
|
70
|
+
return Qnil;
|
95
71
|
}
|
96
72
|
|
97
|
-
|
98
73
|
/*
|
99
74
|
* call-seq:
|
100
75
|
* RepeatedField.[](index) => value
|
101
76
|
*
|
102
|
-
* Accesses the element at the given index.
|
77
|
+
* Accesses the element at the given index. Throws an exception on out-of-bounds
|
78
|
+
* errors.
|
103
79
|
*/
|
104
|
-
VALUE RepeatedField_index(
|
80
|
+
VALUE RepeatedField_index(VALUE _self, VALUE _index) {
|
105
81
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
106
82
|
int element_size = native_slot_size(self->field_type);
|
107
83
|
upb_fieldtype_t field_type = self->field_type;
|
108
84
|
VALUE field_type_class = self->field_type_class;
|
109
85
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
if (argc == 1){
|
114
|
-
if (FIXNUM_P(arg)) {
|
115
|
-
/* standard case */
|
116
|
-
int index = index_position(argv[0], self);
|
117
|
-
if (index < 0 || index >= self->size) {
|
118
|
-
return Qnil;
|
119
|
-
}
|
120
|
-
void* memory = (void *) (((uint8_t *)self->elements) +
|
121
|
-
index * element_size);
|
122
|
-
return native_slot_get(field_type, field_type_class, memory);
|
123
|
-
}else{
|
124
|
-
/* check if idx is Range */
|
125
|
-
size_t off;
|
126
|
-
switch (rb_range_beg_len(arg, &beg, &len, self->size, 0)) {
|
127
|
-
case Qfalse:
|
128
|
-
break;
|
129
|
-
case Qnil:
|
130
|
-
return Qnil;
|
131
|
-
default:
|
132
|
-
return RepeatedField_subarray(_self, beg, len);
|
133
|
-
}
|
134
|
-
}
|
135
|
-
}
|
136
|
-
/* assume 2 arguments */
|
137
|
-
beg = NUM2LONG(argv[0]);
|
138
|
-
len = NUM2LONG(argv[1]);
|
139
|
-
if (beg < 0) {
|
140
|
-
beg += self->size;
|
141
|
-
}
|
142
|
-
if (beg >= self->size) {
|
143
|
-
return Qnil;
|
86
|
+
int index = NUM2INT(_index);
|
87
|
+
if (index < 0 || index >= self->size) {
|
88
|
+
rb_raise(rb_eRangeError, "Index out of range");
|
144
89
|
}
|
145
|
-
|
90
|
+
|
91
|
+
void* memory = (void *) (((uint8_t *)self->elements) + index * element_size);
|
92
|
+
return native_slot_get(field_type, field_type_class, memory);
|
146
93
|
}
|
147
94
|
|
148
95
|
/*
|
@@ -158,9 +105,9 @@ VALUE RepeatedField_index_set(VALUE _self, VALUE _index, VALUE val) {
|
|
158
105
|
VALUE field_type_class = self->field_type_class;
|
159
106
|
int element_size = native_slot_size(field_type);
|
160
107
|
|
161
|
-
int index =
|
108
|
+
int index = NUM2INT(_index);
|
162
109
|
if (index < 0 || index >= (INT_MAX - 1)) {
|
163
|
-
|
110
|
+
rb_raise(rb_eRangeError, "Index out of range");
|
164
111
|
}
|
165
112
|
if (index >= self->size) {
|
166
113
|
RepeatedField_reserve(self, index + 1);
|
@@ -218,7 +165,6 @@ VALUE RepeatedField_push(VALUE _self, VALUE val) {
|
|
218
165
|
return _self;
|
219
166
|
}
|
220
167
|
|
221
|
-
|
222
168
|
// Used by parsing handlers.
|
223
169
|
void RepeatedField_push_native(VALUE _self, void* data) {
|
224
170
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
@@ -239,15 +185,19 @@ void* RepeatedField_index_native(VALUE _self, int index) {
|
|
239
185
|
}
|
240
186
|
|
241
187
|
/*
|
242
|
-
*
|
188
|
+
* call-seq:
|
189
|
+
* RepeatedField.pop => value
|
190
|
+
*
|
191
|
+
* Removes the last element and returns it. Throws an exception if the repeated
|
192
|
+
* field is empty.
|
243
193
|
*/
|
244
|
-
VALUE
|
194
|
+
VALUE RepeatedField_pop(VALUE _self) {
|
245
195
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
246
196
|
upb_fieldtype_t field_type = self->field_type;
|
247
197
|
VALUE field_type_class = self->field_type_class;
|
248
198
|
int element_size = native_slot_size(field_type);
|
249
199
|
if (self->size == 0) {
|
250
|
-
|
200
|
+
rb_raise(rb_eRangeError, "Pop from empty repeated field is not allowed.");
|
251
201
|
}
|
252
202
|
int index = self->size - 1;
|
253
203
|
void* memory = (void *) (((uint8_t *)self->elements) + index * element_size);
|
@@ -256,6 +206,19 @@ VALUE RepeatedField_pop_one(VALUE _self) {
|
|
256
206
|
return ret;
|
257
207
|
}
|
258
208
|
|
209
|
+
/*
|
210
|
+
* call-seq:
|
211
|
+
* RepeatedField.insert(*args)
|
212
|
+
*
|
213
|
+
* Pushes each arg in turn onto the end of the repeated field.
|
214
|
+
*/
|
215
|
+
VALUE RepeatedField_insert(int argc, VALUE* argv, VALUE _self) {
|
216
|
+
for (int i = 0; i < argc; i++) {
|
217
|
+
RepeatedField_push(_self, argv[i]);
|
218
|
+
}
|
219
|
+
return Qnil;
|
220
|
+
}
|
221
|
+
|
259
222
|
/*
|
260
223
|
* call-seq:
|
261
224
|
* RepeatedField.replace(list)
|
@@ -269,7 +232,7 @@ VALUE RepeatedField_replace(VALUE _self, VALUE list) {
|
|
269
232
|
for (int i = 0; i < RARRAY_LEN(list); i++) {
|
270
233
|
RepeatedField_push(_self, rb_ary_entry(list, i));
|
271
234
|
}
|
272
|
-
return
|
235
|
+
return Qnil;
|
273
236
|
}
|
274
237
|
|
275
238
|
/*
|
@@ -281,7 +244,7 @@ VALUE RepeatedField_replace(VALUE _self, VALUE list) {
|
|
281
244
|
VALUE RepeatedField_clear(VALUE _self) {
|
282
245
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
283
246
|
self->size = 0;
|
284
|
-
return
|
247
|
+
return Qnil;
|
285
248
|
}
|
286
249
|
|
287
250
|
/*
|
@@ -370,6 +333,7 @@ VALUE RepeatedField_to_ary(VALUE _self) {
|
|
370
333
|
for (int i = 0; i < self->size; i++, off += elem_size) {
|
371
334
|
void* mem = ((uint8_t *)self->elements) + off;
|
372
335
|
VALUE elem = native_slot_get(field_type, self->field_type_class, mem);
|
336
|
+
|
373
337
|
rb_ary_push(ary, elem);
|
374
338
|
}
|
375
339
|
return ary;
|
@@ -445,6 +409,19 @@ VALUE RepeatedField_hash(VALUE _self) {
|
|
445
409
|
return hash;
|
446
410
|
}
|
447
411
|
|
412
|
+
/*
|
413
|
+
* call-seq:
|
414
|
+
* RepeatedField.inspect => string
|
415
|
+
*
|
416
|
+
* Returns a string representing this repeated field's elements. It will be
|
417
|
+
* formated as "[<element>, <element>, ...]", with each element's string
|
418
|
+
* representation computed by its own #inspect method.
|
419
|
+
*/
|
420
|
+
VALUE RepeatedField_inspect(VALUE _self) {
|
421
|
+
VALUE self_ary = RepeatedField_to_ary(_self);
|
422
|
+
return rb_funcall(self_ary, rb_intern("inspect"), 0);
|
423
|
+
}
|
424
|
+
|
448
425
|
/*
|
449
426
|
* call-seq:
|
450
427
|
* RepeatedField.+(other) => repeated field
|
@@ -481,30 +458,14 @@ VALUE RepeatedField_plus(VALUE _self, VALUE list) {
|
|
481
458
|
return dupped;
|
482
459
|
}
|
483
460
|
|
484
|
-
/*
|
485
|
-
* call-seq:
|
486
|
-
* RepeatedField.concat(other) => self
|
487
|
-
*
|
488
|
-
* concats the passed in array to self. Returns a Ruby array.
|
489
|
-
*/
|
490
|
-
VALUE RepeatedField_concat(VALUE _self, VALUE list) {
|
491
|
-
RepeatedField* self = ruby_to_RepeatedField(_self);
|
492
|
-
Check_Type(list, T_ARRAY);
|
493
|
-
for (int i = 0; i < RARRAY_LEN(list); i++) {
|
494
|
-
RepeatedField_push(_self, rb_ary_entry(list, i));
|
495
|
-
}
|
496
|
-
return _self;
|
497
|
-
}
|
498
|
-
|
499
|
-
|
500
461
|
void validate_type_class(upb_fieldtype_t type, VALUE klass) {
|
501
|
-
if (
|
462
|
+
if (rb_iv_get(klass, kDescriptorInstanceVar) == Qnil) {
|
502
463
|
rb_raise(rb_eArgError,
|
503
464
|
"Type class has no descriptor. Please pass a "
|
504
465
|
"class or enum as returned by the DescriptorPool.");
|
505
466
|
}
|
506
467
|
if (type == UPB_TYPE_MESSAGE) {
|
507
|
-
VALUE desc =
|
468
|
+
VALUE desc = rb_iv_get(klass, kDescriptorInstanceVar);
|
508
469
|
if (!RB_TYPE_P(desc, T_DATA) || !RTYPEDDATA_P(desc) ||
|
509
470
|
RTYPEDDATA_TYPE(desc) != &_Descriptor_type) {
|
510
471
|
rb_raise(rb_eArgError, "Descriptor has an incorrect type.");
|
@@ -514,7 +475,7 @@ void validate_type_class(upb_fieldtype_t type, VALUE klass) {
|
|
514
475
|
"Message class was not returned by the DescriptorPool.");
|
515
476
|
}
|
516
477
|
} else if (type == UPB_TYPE_ENUM) {
|
517
|
-
VALUE enumdesc =
|
478
|
+
VALUE enumdesc = rb_iv_get(klass, kDescriptorInstanceVar);
|
518
479
|
if (!RB_TYPE_P(enumdesc, T_DATA) || !RTYPEDDATA_P(enumdesc) ||
|
519
480
|
RTYPEDDATA_TYPE(enumdesc) != &_EnumDescriptor_type) {
|
520
481
|
rb_raise(rb_eArgError, "Descriptor has an incorrect type.");
|
@@ -616,23 +577,22 @@ void RepeatedField_register(VALUE module) {
|
|
616
577
|
rb_define_method(klass, "initialize",
|
617
578
|
RepeatedField_init, -1);
|
618
579
|
rb_define_method(klass, "each", RepeatedField_each, 0);
|
619
|
-
rb_define_method(klass, "[]", RepeatedField_index,
|
620
|
-
rb_define_method(klass, "at", RepeatedField_index, -1);
|
580
|
+
rb_define_method(klass, "[]", RepeatedField_index, 1);
|
621
581
|
rb_define_method(klass, "[]=", RepeatedField_index_set, 2);
|
622
582
|
rb_define_method(klass, "push", RepeatedField_push, 1);
|
623
583
|
rb_define_method(klass, "<<", RepeatedField_push, 1);
|
624
|
-
|
584
|
+
rb_define_method(klass, "pop", RepeatedField_pop, 0);
|
585
|
+
rb_define_method(klass, "insert", RepeatedField_insert, -1);
|
625
586
|
rb_define_method(klass, "replace", RepeatedField_replace, 1);
|
626
587
|
rb_define_method(klass, "clear", RepeatedField_clear, 0);
|
627
588
|
rb_define_method(klass, "length", RepeatedField_length, 0);
|
628
|
-
rb_define_method(klass, "size", RepeatedField_length, 0);
|
629
589
|
rb_define_method(klass, "dup", RepeatedField_dup, 0);
|
630
590
|
// Also define #clone so that we don't inherit Object#clone.
|
631
591
|
rb_define_method(klass, "clone", RepeatedField_dup, 0);
|
632
592
|
rb_define_method(klass, "==", RepeatedField_eq, 1);
|
633
593
|
rb_define_method(klass, "to_ary", RepeatedField_to_ary, 0);
|
634
594
|
rb_define_method(klass, "hash", RepeatedField_hash, 0);
|
595
|
+
rb_define_method(klass, "inspect", RepeatedField_inspect, 0);
|
635
596
|
rb_define_method(klass, "+", RepeatedField_plus, 1);
|
636
|
-
rb_define_method(klass, "concat", RepeatedField_concat, 1);
|
637
597
|
rb_include_module(klass, rb_mEnumerable);
|
638
598
|
}
|
@@ -155,9 +155,7 @@ void native_slot_set_value_and_case(upb_fieldtype_t type, VALUE type_class,
|
|
155
155
|
break;
|
156
156
|
}
|
157
157
|
case UPB_TYPE_MESSAGE: {
|
158
|
-
if (CLASS_OF(value)
|
159
|
-
value = Qnil;
|
160
|
-
} else if (CLASS_OF(value) != type_class) {
|
158
|
+
if (CLASS_OF(value) != type_class) {
|
161
159
|
rb_raise(rb_eTypeError,
|
162
160
|
"Invalid type %s to assign to submessage field.",
|
163
161
|
rb_class2name(CLASS_OF(value)));
|
@@ -415,8 +413,7 @@ MessageLayout* create_layout(const upb_msgdef* msgdef) {
|
|
415
413
|
// Align current offset up to |size| granularity.
|
416
414
|
off = align_up_to(off, field_size);
|
417
415
|
layout->fields[upb_fielddef_index(field)].offset = off;
|
418
|
-
layout->fields[upb_fielddef_index(field)].case_offset =
|
419
|
-
MESSAGE_FIELD_NO_CASE;
|
416
|
+
layout->fields[upb_fielddef_index(field)].case_offset = MESSAGE_FIELD_NO_CASE;
|
420
417
|
off += field_size;
|
421
418
|
}
|
422
419
|
|