google-protobuf 3.17.0 → 3.23.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.
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/convert.c +128 -116
- data/ext/google/protobuf_c/convert.h +12 -9
- data/ext/google/protobuf_c/defs.c +235 -1529
- data/ext/google/protobuf_c/defs.h +19 -19
- data/ext/google/protobuf_c/extconf.rb +12 -6
- data/ext/google/protobuf_c/map.c +108 -110
- data/ext/google/protobuf_c/map.h +7 -7
- data/ext/google/protobuf_c/message.c +456 -343
- data/ext/google/protobuf_c/message.h +22 -19
- data/ext/google/protobuf_c/protobuf.c +78 -56
- data/ext/google/protobuf_c/protobuf.h +16 -9
- data/ext/google/protobuf_c/repeated_field.c +85 -85
- data/ext/google/protobuf_c/repeated_field.h +6 -5
- data/ext/google/protobuf_c/ruby-upb.c +11806 -6746
- data/ext/google/protobuf_c/ruby-upb.h +10860 -3532
- data/ext/google/protobuf_c/third_party/utf8_range/LICENSE +22 -0
- data/ext/google/protobuf_c/third_party/utf8_range/naive.c +92 -0
- data/ext/google/protobuf_c/third_party/utf8_range/range2-neon.c +157 -0
- data/ext/google/protobuf_c/third_party/utf8_range/range2-sse.c +170 -0
- data/ext/google/protobuf_c/third_party/utf8_range/utf8_range.h +21 -0
- data/ext/google/protobuf_c/wrap_memcpy.c +4 -3
- data/lib/google/protobuf/any_pb.rb +24 -5
- data/lib/google/protobuf/api_pb.rb +27 -23
- data/lib/google/protobuf/descriptor_dsl.rb +465 -0
- data/lib/google/protobuf/descriptor_pb.rb +75 -0
- data/lib/google/protobuf/duration_pb.rb +24 -5
- data/lib/google/protobuf/empty_pb.rb +24 -3
- data/lib/google/protobuf/field_mask_pb.rb +24 -4
- data/lib/google/protobuf/message_exts.rb +7 -2
- data/lib/google/protobuf/plugin_pb.rb +47 -0
- data/lib/google/protobuf/repeated_field.rb +15 -2
- data/lib/google/protobuf/source_context_pb.rb +24 -4
- data/lib/google/protobuf/struct_pb.rb +24 -20
- data/lib/google/protobuf/timestamp_pb.rb +24 -5
- data/lib/google/protobuf/type_pb.rb +27 -68
- data/lib/google/protobuf/well_known_types.rb +12 -2
- data/lib/google/protobuf/wrappers_pb.rb +24 -28
- data/lib/google/protobuf.rb +5 -73
- metadata +17 -36
- data/ext/google/protobuf_c/third_party/wyhash/wyhash.h +0 -145
- data/tests/basic.rb +0 -604
- data/tests/generated_code_test.rb +0 -23
- data/tests/stress.rb +0 -38
@@ -34,17 +34,16 @@
|
|
34
34
|
#include "defs.h"
|
35
35
|
#include "message.h"
|
36
36
|
#include "protobuf.h"
|
37
|
-
#include "third_party/wyhash/wyhash.h"
|
38
37
|
|
39
38
|
// -----------------------------------------------------------------------------
|
40
39
|
// Repeated field container type.
|
41
40
|
// -----------------------------------------------------------------------------
|
42
41
|
|
43
42
|
typedef struct {
|
44
|
-
const
|
43
|
+
const upb_Array* array; // Can get as mutable when non-frozen.
|
45
44
|
TypeInfo type_info;
|
46
45
|
VALUE type_class; // To GC-root the msgdef/enumdef in type_info.
|
47
|
-
VALUE arena; // To GC-root the
|
46
|
+
VALUE arena; // To GC-root the upb_Array.
|
48
47
|
} RepeatedField;
|
49
48
|
|
50
49
|
VALUE cRepeatedField;
|
@@ -56,9 +55,9 @@ static void RepeatedField_mark(void* _self) {
|
|
56
55
|
}
|
57
56
|
|
58
57
|
const rb_data_type_t RepeatedField_type = {
|
59
|
-
|
60
|
-
|
61
|
-
|
58
|
+
"Google::Protobuf::RepeatedField",
|
59
|
+
{RepeatedField_mark, RUBY_DEFAULT_FREE, NULL},
|
60
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
62
61
|
};
|
63
62
|
|
64
63
|
static RepeatedField* ruby_to_RepeatedField(VALUE _self) {
|
@@ -67,9 +66,9 @@ static RepeatedField* ruby_to_RepeatedField(VALUE _self) {
|
|
67
66
|
return self;
|
68
67
|
}
|
69
68
|
|
70
|
-
static
|
69
|
+
static upb_Array* RepeatedField_GetMutable(VALUE _self) {
|
71
70
|
rb_check_frozen(_self);
|
72
|
-
return (
|
71
|
+
return (upb_Array*)ruby_to_RepeatedField(_self)->array;
|
73
72
|
}
|
74
73
|
|
75
74
|
VALUE RepeatedField_alloc(VALUE klass) {
|
@@ -80,7 +79,7 @@ VALUE RepeatedField_alloc(VALUE klass) {
|
|
80
79
|
return TypedData_Wrap_Struct(klass, &RepeatedField_type, self);
|
81
80
|
}
|
82
81
|
|
83
|
-
VALUE RepeatedField_GetRubyWrapper(
|
82
|
+
VALUE RepeatedField_GetRubyWrapper(upb_Array* array, TypeInfo type_info,
|
84
83
|
VALUE arena) {
|
85
84
|
PBRUBY_ASSERT(array);
|
86
85
|
VALUE val = ObjectCache_Get(array);
|
@@ -93,7 +92,7 @@ VALUE RepeatedField_GetRubyWrapper(upb_array* array, TypeInfo type_info,
|
|
93
92
|
self->array = array;
|
94
93
|
self->arena = arena;
|
95
94
|
self->type_info = type_info;
|
96
|
-
if (self->type_info.type ==
|
95
|
+
if (self->type_info.type == kUpb_CType_Message) {
|
97
96
|
self->type_class = Descriptor_DefToClass(type_info.def.msgdef);
|
98
97
|
}
|
99
98
|
}
|
@@ -106,24 +105,24 @@ VALUE RepeatedField_GetRubyWrapper(upb_array* array, TypeInfo type_info,
|
|
106
105
|
|
107
106
|
static VALUE RepeatedField_new_this_type(RepeatedField* from) {
|
108
107
|
VALUE arena_rb = Arena_new();
|
109
|
-
|
108
|
+
upb_Array* array = upb_Array_New(Arena_get(arena_rb), from->type_info.type);
|
110
109
|
VALUE ret = RepeatedField_GetRubyWrapper(array, from->type_info, arena_rb);
|
111
110
|
PBRUBY_ASSERT(ruby_to_RepeatedField(ret)->type_class == from->type_class);
|
112
111
|
return ret;
|
113
112
|
}
|
114
113
|
|
115
|
-
void RepeatedField_Inspect(StringBuilder* b, const
|
114
|
+
void RepeatedField_Inspect(StringBuilder* b, const upb_Array* array,
|
116
115
|
TypeInfo info) {
|
117
116
|
bool first = true;
|
118
117
|
StringBuilder_Printf(b, "[");
|
119
|
-
size_t n = array ?
|
118
|
+
size_t n = array ? upb_Array_Size(array) : 0;
|
120
119
|
for (size_t i = 0; i < n; i++) {
|
121
120
|
if (first) {
|
122
121
|
first = false;
|
123
122
|
} else {
|
124
123
|
StringBuilder_Printf(b, ", ");
|
125
124
|
}
|
126
|
-
StringBuilder_PrintMsgval(b,
|
125
|
+
StringBuilder_PrintMsgval(b, upb_Array_Get(array, i), info);
|
127
126
|
}
|
128
127
|
StringBuilder_Printf(b, "]");
|
129
128
|
}
|
@@ -133,23 +132,24 @@ VALUE RepeatedField_deep_copy(VALUE _self) {
|
|
133
132
|
VALUE new_rptfield = RepeatedField_new_this_type(self);
|
134
133
|
RepeatedField* new_self = ruby_to_RepeatedField(new_rptfield);
|
135
134
|
VALUE arena_rb = new_self->arena;
|
136
|
-
|
137
|
-
|
138
|
-
size_t elements =
|
135
|
+
upb_Array* new_array = RepeatedField_GetMutable(new_rptfield);
|
136
|
+
upb_Arena* arena = Arena_get(arena_rb);
|
137
|
+
size_t elements = upb_Array_Size(self->array);
|
139
138
|
|
140
|
-
|
139
|
+
upb_Array_Resize(new_array, elements, arena);
|
141
140
|
|
142
|
-
size_t size =
|
141
|
+
size_t size = upb_Array_Size(self->array);
|
143
142
|
for (size_t i = 0; i < size; i++) {
|
144
|
-
|
145
|
-
|
146
|
-
|
143
|
+
upb_MessageValue msgval = upb_Array_Get(self->array, i);
|
144
|
+
upb_MessageValue copy = Msgval_DeepCopy(msgval, self->type_info, arena);
|
145
|
+
upb_Array_Set(new_array, i, copy);
|
147
146
|
}
|
148
147
|
|
149
148
|
return new_rptfield;
|
150
149
|
}
|
151
150
|
|
152
|
-
const
|
151
|
+
const upb_Array* RepeatedField_GetUpbArray(VALUE val, const upb_FieldDef* field,
|
152
|
+
upb_Arena* arena) {
|
153
153
|
RepeatedField* self;
|
154
154
|
TypeInfo type_info = TypeInfo_get(field);
|
155
155
|
|
@@ -167,22 +167,23 @@ const upb_array* RepeatedField_GetUpbArray(VALUE val, const upb_fielddef *field)
|
|
167
167
|
rb_raise(cTypeError, "Repeated field array has wrong message/enum class");
|
168
168
|
}
|
169
169
|
|
170
|
+
Arena_fuse(self->arena, arena);
|
170
171
|
return self->array;
|
171
172
|
}
|
172
173
|
|
173
174
|
static int index_position(VALUE _index, RepeatedField* repeated_field) {
|
174
175
|
int index = NUM2INT(_index);
|
175
|
-
if (index < 0) index +=
|
176
|
+
if (index < 0) index += upb_Array_Size(repeated_field->array);
|
176
177
|
return index;
|
177
178
|
}
|
178
179
|
|
179
180
|
static VALUE RepeatedField_subarray(RepeatedField* self, long beg, long len) {
|
180
|
-
size_t size =
|
181
|
+
size_t size = upb_Array_Size(self->array);
|
181
182
|
VALUE ary = rb_ary_new2(size);
|
182
183
|
long i;
|
183
184
|
|
184
185
|
for (i = beg; i < beg + len; i++) {
|
185
|
-
|
186
|
+
upb_MessageValue msgval = upb_Array_Get(self->array, i);
|
186
187
|
VALUE elem = Convert_UpbToRuby(msgval, self->type_info, self->arena);
|
187
188
|
rb_ary_push(ary, elem);
|
188
189
|
}
|
@@ -199,18 +200,17 @@ static VALUE RepeatedField_subarray(RepeatedField* self, long beg, long len) {
|
|
199
200
|
*/
|
200
201
|
static VALUE RepeatedField_each(VALUE _self) {
|
201
202
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
202
|
-
int size =
|
203
|
+
int size = upb_Array_Size(self->array);
|
203
204
|
int i;
|
204
205
|
|
205
206
|
for (i = 0; i < size; i++) {
|
206
|
-
|
207
|
+
upb_MessageValue msgval = upb_Array_Get(self->array, i);
|
207
208
|
VALUE val = Convert_UpbToRuby(msgval, self->type_info, self->arena);
|
208
209
|
rb_yield(val);
|
209
210
|
}
|
210
211
|
return _self;
|
211
212
|
}
|
212
213
|
|
213
|
-
|
214
214
|
/*
|
215
215
|
* call-seq:
|
216
216
|
* RepeatedField.[](index) => value
|
@@ -219,20 +219,20 @@ static VALUE RepeatedField_each(VALUE _self) {
|
|
219
219
|
*/
|
220
220
|
static VALUE RepeatedField_index(int argc, VALUE* argv, VALUE _self) {
|
221
221
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
222
|
-
long size =
|
222
|
+
long size = upb_Array_Size(self->array);
|
223
223
|
|
224
224
|
VALUE arg = argv[0];
|
225
225
|
long beg, len;
|
226
226
|
|
227
|
-
if (argc == 1){
|
227
|
+
if (argc == 1) {
|
228
228
|
if (FIXNUM_P(arg)) {
|
229
229
|
/* standard case */
|
230
|
-
|
230
|
+
upb_MessageValue msgval;
|
231
231
|
int index = index_position(argv[0], self);
|
232
|
-
if (index < 0 || (size_t)index >=
|
232
|
+
if (index < 0 || (size_t)index >= upb_Array_Size(self->array)) {
|
233
233
|
return Qnil;
|
234
234
|
}
|
235
|
-
msgval =
|
235
|
+
msgval = upb_Array_Get(self->array, index);
|
236
236
|
return Convert_UpbToRuby(msgval, self->type_info, self->arena);
|
237
237
|
} else {
|
238
238
|
/* check if idx is Range */
|
@@ -268,10 +268,10 @@ static VALUE RepeatedField_index(int argc, VALUE* argv, VALUE _self) {
|
|
268
268
|
*/
|
269
269
|
static VALUE RepeatedField_index_set(VALUE _self, VALUE _index, VALUE val) {
|
270
270
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
271
|
-
int size =
|
272
|
-
|
273
|
-
|
274
|
-
|
271
|
+
int size = upb_Array_Size(self->array);
|
272
|
+
upb_Array* array = RepeatedField_GetMutable(_self);
|
273
|
+
upb_Arena* arena = Arena_get(self->arena);
|
274
|
+
upb_MessageValue msgval = Convert_RubyToUpb(val, "", self->type_info, arena);
|
275
275
|
|
276
276
|
int index = index_position(_index, self);
|
277
277
|
if (index < 0 || index >= (INT_MAX - 1)) {
|
@@ -279,17 +279,17 @@ static VALUE RepeatedField_index_set(VALUE _self, VALUE _index, VALUE val) {
|
|
279
279
|
}
|
280
280
|
|
281
281
|
if (index >= size) {
|
282
|
-
|
283
|
-
|
282
|
+
upb_Array_Resize(array, index + 1, arena);
|
283
|
+
upb_MessageValue fill;
|
284
284
|
memset(&fill, 0, sizeof(fill));
|
285
285
|
for (int i = size; i < index; i++) {
|
286
286
|
// Fill default values.
|
287
287
|
// TODO(haberman): should this happen at the upb level?
|
288
|
-
|
288
|
+
upb_Array_Set(array, i, fill);
|
289
289
|
}
|
290
290
|
}
|
291
291
|
|
292
|
-
|
292
|
+
upb_Array_Set(array, index, msgval);
|
293
293
|
return Qnil;
|
294
294
|
}
|
295
295
|
|
@@ -301,13 +301,14 @@ static VALUE RepeatedField_index_set(VALUE _self, VALUE _index, VALUE val) {
|
|
301
301
|
*/
|
302
302
|
static VALUE RepeatedField_push_vararg(int argc, VALUE* argv, VALUE _self) {
|
303
303
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
304
|
-
|
305
|
-
|
304
|
+
upb_Arena* arena = Arena_get(self->arena);
|
305
|
+
upb_Array* array = RepeatedField_GetMutable(_self);
|
306
306
|
int i;
|
307
307
|
|
308
308
|
for (i = 0; i < argc; i++) {
|
309
|
-
|
310
|
-
|
309
|
+
upb_MessageValue msgval =
|
310
|
+
Convert_RubyToUpb(argv[i], "", self->type_info, arena);
|
311
|
+
upb_Array_Append(array, msgval, arena);
|
311
312
|
}
|
312
313
|
|
313
314
|
return _self;
|
@@ -321,11 +322,11 @@ static VALUE RepeatedField_push_vararg(int argc, VALUE* argv, VALUE _self) {
|
|
321
322
|
*/
|
322
323
|
static VALUE RepeatedField_push(VALUE _self, VALUE val) {
|
323
324
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
324
|
-
|
325
|
-
|
325
|
+
upb_Arena* arena = Arena_get(self->arena);
|
326
|
+
upb_Array* array = RepeatedField_GetMutable(_self);
|
326
327
|
|
327
|
-
|
328
|
-
|
328
|
+
upb_MessageValue msgval = Convert_RubyToUpb(val, "", self->type_info, arena);
|
329
|
+
upb_Array_Append(array, msgval, arena);
|
329
330
|
|
330
331
|
return _self;
|
331
332
|
}
|
@@ -335,19 +336,19 @@ static VALUE RepeatedField_push(VALUE _self, VALUE val) {
|
|
335
336
|
*/
|
336
337
|
static VALUE RepeatedField_pop_one(VALUE _self) {
|
337
338
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
338
|
-
size_t size =
|
339
|
-
|
340
|
-
|
339
|
+
size_t size = upb_Array_Size(self->array);
|
340
|
+
upb_Array* array = RepeatedField_GetMutable(_self);
|
341
|
+
upb_MessageValue last;
|
341
342
|
VALUE ret;
|
342
343
|
|
343
344
|
if (size == 0) {
|
344
345
|
return Qnil;
|
345
346
|
}
|
346
347
|
|
347
|
-
last =
|
348
|
+
last = upb_Array_Get(self->array, size - 1);
|
348
349
|
ret = Convert_UpbToRuby(last, self->type_info, self->arena);
|
349
350
|
|
350
|
-
|
351
|
+
upb_Array_Resize(array, size - 1, Arena_get(self->arena));
|
351
352
|
return ret;
|
352
353
|
}
|
353
354
|
|
@@ -359,11 +360,11 @@ static VALUE RepeatedField_pop_one(VALUE _self) {
|
|
359
360
|
*/
|
360
361
|
static VALUE RepeatedField_replace(VALUE _self, VALUE list) {
|
361
362
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
362
|
-
|
363
|
+
upb_Array* array = RepeatedField_GetMutable(_self);
|
363
364
|
int i;
|
364
365
|
|
365
366
|
Check_Type(list, T_ARRAY);
|
366
|
-
|
367
|
+
upb_Array_Resize(array, 0, Arena_get(self->arena));
|
367
368
|
|
368
369
|
for (i = 0; i < RARRAY_LEN(list); i++) {
|
369
370
|
RepeatedField_push(_self, rb_ary_entry(list, i));
|
@@ -380,8 +381,8 @@ static VALUE RepeatedField_replace(VALUE _self, VALUE list) {
|
|
380
381
|
*/
|
381
382
|
static VALUE RepeatedField_clear(VALUE _self) {
|
382
383
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
383
|
-
|
384
|
-
|
384
|
+
upb_Array* array = RepeatedField_GetMutable(_self);
|
385
|
+
upb_Array_Resize(array, 0, Arena_get(self->arena));
|
385
386
|
return _self;
|
386
387
|
}
|
387
388
|
|
@@ -393,7 +394,7 @@ static VALUE RepeatedField_clear(VALUE _self) {
|
|
393
394
|
*/
|
394
395
|
static VALUE RepeatedField_length(VALUE _self) {
|
395
396
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
396
|
-
return INT2NUM(
|
397
|
+
return INT2NUM(upb_Array_Size(self->array));
|
397
398
|
}
|
398
399
|
|
399
400
|
/*
|
@@ -407,16 +408,16 @@ static VALUE RepeatedField_dup(VALUE _self) {
|
|
407
408
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
408
409
|
VALUE new_rptfield = RepeatedField_new_this_type(self);
|
409
410
|
RepeatedField* new_rptfield_self = ruby_to_RepeatedField(new_rptfield);
|
410
|
-
|
411
|
-
|
412
|
-
int size =
|
411
|
+
upb_Array* new_array = RepeatedField_GetMutable(new_rptfield);
|
412
|
+
upb_Arena* arena = Arena_get(new_rptfield_self->arena);
|
413
|
+
int size = upb_Array_Size(self->array);
|
413
414
|
int i;
|
414
415
|
|
415
|
-
|
416
|
+
Arena_fuse(self->arena, arena);
|
416
417
|
|
417
418
|
for (i = 0; i < size; i++) {
|
418
|
-
|
419
|
-
|
419
|
+
upb_MessageValue msgval = upb_Array_Get(self->array, i);
|
420
|
+
upb_Array_Append(new_array, msgval, arena);
|
420
421
|
}
|
421
422
|
|
422
423
|
return new_rptfield;
|
@@ -431,12 +432,12 @@ static VALUE RepeatedField_dup(VALUE _self) {
|
|
431
432
|
*/
|
432
433
|
VALUE RepeatedField_to_ary(VALUE _self) {
|
433
434
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
434
|
-
int size =
|
435
|
+
int size = upb_Array_Size(self->array);
|
435
436
|
VALUE ary = rb_ary_new2(size);
|
436
437
|
int i;
|
437
438
|
|
438
439
|
for (i = 0; i < size; i++) {
|
439
|
-
|
440
|
+
upb_MessageValue msgval = upb_Array_Get(self->array, i);
|
440
441
|
VALUE val = Convert_UpbToRuby(msgval, self->type_info, self->arena);
|
441
442
|
rb_ary_push(ary, val);
|
442
443
|
}
|
@@ -472,17 +473,17 @@ VALUE RepeatedField_eq(VALUE _self, VALUE _other) {
|
|
472
473
|
|
473
474
|
self = ruby_to_RepeatedField(_self);
|
474
475
|
other = ruby_to_RepeatedField(_other);
|
475
|
-
size_t n =
|
476
|
+
size_t n = upb_Array_Size(self->array);
|
476
477
|
|
477
478
|
if (self->type_info.type != other->type_info.type ||
|
478
479
|
self->type_class != other->type_class ||
|
479
|
-
|
480
|
+
upb_Array_Size(other->array) != n) {
|
480
481
|
return Qfalse;
|
481
482
|
}
|
482
483
|
|
483
484
|
for (size_t i = 0; i < n; i++) {
|
484
|
-
|
485
|
-
|
485
|
+
upb_MessageValue val1 = upb_Array_Get(self->array, i);
|
486
|
+
upb_MessageValue val2 = upb_Array_Get(other->array, i);
|
486
487
|
if (!Msgval_IsEqual(val1, val2, self->type_info)) {
|
487
488
|
return Qfalse;
|
488
489
|
}
|
@@ -516,10 +517,10 @@ static VALUE RepeatedField_freeze(VALUE _self) {
|
|
516
517
|
VALUE RepeatedField_hash(VALUE _self) {
|
517
518
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
518
519
|
uint64_t hash = 0;
|
519
|
-
size_t n =
|
520
|
+
size_t n = upb_Array_Size(self->array);
|
520
521
|
|
521
522
|
for (size_t i = 0; i < n; i++) {
|
522
|
-
|
523
|
+
upb_MessageValue val = upb_Array_Get(self->array, i);
|
523
524
|
hash = Msgval_GetHash(val, self->type_info, hash);
|
524
525
|
}
|
525
526
|
|
@@ -548,9 +549,10 @@ VALUE RepeatedField_plus(VALUE _self, VALUE list) {
|
|
548
549
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
549
550
|
RepeatedField* list_rptfield = ruby_to_RepeatedField(list);
|
550
551
|
RepeatedField* dupped = ruby_to_RepeatedField(dupped_);
|
551
|
-
|
552
|
-
|
553
|
-
|
552
|
+
upb_Array* dupped_array = RepeatedField_GetMutable(dupped_);
|
553
|
+
upb_Arena* arena = Arena_get(dupped->arena);
|
554
|
+
Arena_fuse(list_rptfield->arena, arena);
|
555
|
+
int size = upb_Array_Size(list_rptfield->array);
|
554
556
|
int i;
|
555
557
|
|
556
558
|
if (self->type_info.type != list_rptfield->type_info.type ||
|
@@ -560,8 +562,8 @@ VALUE RepeatedField_plus(VALUE _self, VALUE list) {
|
|
560
562
|
}
|
561
563
|
|
562
564
|
for (i = 0; i < size; i++) {
|
563
|
-
|
564
|
-
|
565
|
+
upb_MessageValue msgval = upb_Array_Get(list_rptfield->array, i);
|
566
|
+
upb_Array_Append(dupped_array, msgval, arena);
|
565
567
|
}
|
566
568
|
} else {
|
567
569
|
rb_raise(rb_eArgError, "Unknown type appending to RepeatedField");
|
@@ -599,7 +601,7 @@ VALUE RepeatedField_concat(VALUE _self, VALUE list) {
|
|
599
601
|
*/
|
600
602
|
VALUE RepeatedField_init(int argc, VALUE* argv, VALUE _self) {
|
601
603
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
602
|
-
|
604
|
+
upb_Arena* arena;
|
603
605
|
VALUE ary = Qnil;
|
604
606
|
|
605
607
|
self->arena = Arena_new();
|
@@ -610,7 +612,7 @@ VALUE RepeatedField_init(int argc, VALUE* argv, VALUE _self) {
|
|
610
612
|
}
|
611
613
|
|
612
614
|
self->type_info = TypeInfo_FromClass(argc, argv, 0, &self->type_class, &ary);
|
613
|
-
self->array =
|
615
|
+
self->array = upb_Array_New(arena, self->type_info.type);
|
614
616
|
ObjectCache_Add(self->array, _self);
|
615
617
|
|
616
618
|
if (ary != Qnil) {
|
@@ -625,14 +627,12 @@ VALUE RepeatedField_init(int argc, VALUE* argv, VALUE _self) {
|
|
625
627
|
}
|
626
628
|
|
627
629
|
void RepeatedField_register(VALUE module) {
|
628
|
-
VALUE klass = rb_define_class_under(
|
629
|
-
module, "RepeatedField", rb_cObject);
|
630
|
+
VALUE klass = rb_define_class_under(module, "RepeatedField", rb_cObject);
|
630
631
|
rb_define_alloc_func(klass, RepeatedField_alloc);
|
631
632
|
rb_gc_register_address(&cRepeatedField);
|
632
633
|
cRepeatedField = klass;
|
633
634
|
|
634
|
-
rb_define_method(klass, "initialize",
|
635
|
-
RepeatedField_init, -1);
|
635
|
+
rb_define_method(klass, "initialize", RepeatedField_init, -1);
|
636
636
|
rb_define_method(klass, "each", RepeatedField_each, 0);
|
637
637
|
rb_define_method(klass, "[]", RepeatedField_index, -1);
|
638
638
|
rb_define_method(klass, "at", RepeatedField_index, -1);
|
@@ -36,18 +36,19 @@
|
|
36
36
|
#include "protobuf.h"
|
37
37
|
#include "ruby-upb.h"
|
38
38
|
|
39
|
-
// Returns a Ruby wrapper object for the given
|
39
|
+
// Returns a Ruby wrapper object for the given upb_Array, which will be created
|
40
40
|
// if one does not exist already.
|
41
|
-
VALUE RepeatedField_GetRubyWrapper(
|
41
|
+
VALUE RepeatedField_GetRubyWrapper(upb_Array* msg, TypeInfo type_info,
|
42
42
|
VALUE arena);
|
43
43
|
|
44
|
-
// Gets the underlying
|
44
|
+
// Gets the underlying upb_Array for this Ruby RepeatedField object, which must
|
45
45
|
// have a type that matches |f|. If this is not a repeated field or the type
|
46
46
|
// doesn't match, raises an exception.
|
47
|
-
const
|
47
|
+
const upb_Array* RepeatedField_GetUpbArray(VALUE value, const upb_FieldDef* f,
|
48
|
+
upb_Arena* arena);
|
48
49
|
|
49
50
|
// Implements #inspect for this repeated field by appending its contents to |b|.
|
50
|
-
void RepeatedField_Inspect(StringBuilder* b, const
|
51
|
+
void RepeatedField_Inspect(StringBuilder* b, const upb_Array* array,
|
51
52
|
TypeInfo info);
|
52
53
|
|
53
54
|
// Returns a deep copy of this RepeatedField object.
|