google-protobuf 3.14.0 → 3.25.8
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 +4 -4
- data/ext/google/protobuf_c/Rakefile +3 -0
- data/ext/google/protobuf_c/convert.c +317 -0
- data/ext/google/protobuf_c/convert.h +50 -0
- data/ext/google/protobuf_c/defs.c +743 -1706
- data/ext/google/protobuf_c/defs.h +82 -0
- data/ext/google/protobuf_c/extconf.rb +15 -8
- data/ext/google/protobuf_c/glue.c +56 -0
- data/ext/google/protobuf_c/map.c +336 -486
- data/ext/google/protobuf_c/map.h +44 -0
- data/ext/google/protobuf_c/message.c +1088 -518
- data/ext/google/protobuf_c/message.h +86 -0
- data/ext/google/protobuf_c/protobuf.c +301 -94
- data/ext/google/protobuf_c/protobuf.h +66 -621
- data/ext/google/protobuf_c/repeated_field.c +323 -353
- data/ext/google/protobuf_c/repeated_field.h +41 -0
- data/ext/google/protobuf_c/ruby-upb.c +14440 -0
- data/ext/google/protobuf_c/ruby-upb.h +13044 -0
- data/ext/google/protobuf_c/shared_convert.c +64 -0
- data/ext/google/protobuf_c/shared_convert.h +26 -0
- data/ext/google/protobuf_c/shared_message.c +66 -0
- data/ext/google/protobuf_c/shared_message.h +25 -0
- 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 +7 -29
- 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 +86 -0
- data/lib/google/protobuf/duration_pb.rb +24 -5
- data/lib/google/protobuf/empty_pb.rb +24 -3
- data/lib/google/protobuf/ffi/descriptor.rb +165 -0
- data/lib/google/protobuf/ffi/descriptor_pool.rb +75 -0
- data/lib/google/protobuf/ffi/enum_descriptor.rb +171 -0
- data/lib/google/protobuf/ffi/ffi.rb +213 -0
- data/lib/google/protobuf/ffi/field_descriptor.rb +319 -0
- data/lib/google/protobuf/ffi/file_descriptor.rb +59 -0
- data/lib/google/protobuf/ffi/internal/arena.rb +66 -0
- data/lib/google/protobuf/ffi/internal/convert.rb +305 -0
- data/lib/google/protobuf/ffi/internal/pointer_helper.rb +35 -0
- data/lib/google/protobuf/ffi/internal/type_safety.rb +25 -0
- data/lib/google/protobuf/ffi/map.rb +407 -0
- data/lib/google/protobuf/ffi/message.rb +662 -0
- data/lib/google/protobuf/ffi/object_cache.rb +30 -0
- data/lib/google/protobuf/ffi/oneof_descriptor.rb +95 -0
- data/lib/google/protobuf/ffi/repeated_field.rb +383 -0
- data/lib/google/protobuf/field_mask_pb.rb +24 -4
- data/lib/google/protobuf/message_exts.rb +10 -28
- data/lib/google/protobuf/object_cache.rb +97 -0
- data/lib/google/protobuf/plugin_pb.rb +47 -0
- data/lib/google/protobuf/repeated_field.rb +18 -28
- 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 +17 -36
- data/lib/google/protobuf/wrappers_pb.rb +24 -28
- data/lib/google/protobuf.rb +32 -118
- data/lib/google/protobuf_ffi.rb +50 -0
- data/lib/google/protobuf_native.rb +20 -0
- data/lib/google/tasks/ffi.rake +102 -0
- metadata +92 -38
- data/ext/google/protobuf_c/encode_decode.c +0 -1795
- data/ext/google/protobuf_c/storage.c +0 -1198
- data/ext/google/protobuf_c/upb.c +0 -13817
- data/ext/google/protobuf_c/upb.h +0 -6777
- data/tests/basic.rb +0 -543
- data/tests/generated_code_test.rb +0 -23
- data/tests/stress.rb +0 -38
@@ -1,76 +1,169 @@
|
|
1
1
|
// Protocol Buffers - Google's data interchange format
|
2
2
|
// Copyright 2014 Google Inc. All rights reserved.
|
3
|
-
// https://developers.google.com/protocol-buffers/
|
4
3
|
//
|
5
|
-
//
|
6
|
-
//
|
7
|
-
//
|
8
|
-
|
9
|
-
|
10
|
-
// notice, this list of conditions and the following disclaimer.
|
11
|
-
// * Redistributions in binary form must reproduce the above
|
12
|
-
// copyright notice, this list of conditions and the following disclaimer
|
13
|
-
// in the documentation and/or other materials provided with the
|
14
|
-
// distribution.
|
15
|
-
// * Neither the name of Google Inc. nor the names of its
|
16
|
-
// contributors may be used to endorse or promote products derived from
|
17
|
-
// this software without specific prior written permission.
|
18
|
-
//
|
19
|
-
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
20
|
-
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
21
|
-
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
22
|
-
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
23
|
-
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
24
|
-
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
25
|
-
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
26
|
-
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
27
|
-
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
28
|
-
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
29
|
-
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
4
|
+
// Use of this source code is governed by a BSD-style
|
5
|
+
// license that can be found in the LICENSE file or at
|
6
|
+
// https://developers.google.com/open-source/licenses/bsd
|
7
|
+
|
8
|
+
#include "repeated_field.h"
|
30
9
|
|
10
|
+
#include "convert.h"
|
11
|
+
#include "defs.h"
|
12
|
+
#include "message.h"
|
31
13
|
#include "protobuf.h"
|
32
14
|
|
33
15
|
// -----------------------------------------------------------------------------
|
34
16
|
// Repeated field container type.
|
35
17
|
// -----------------------------------------------------------------------------
|
36
18
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
19
|
+
typedef struct {
|
20
|
+
const upb_Array* array; // Can get as mutable when non-frozen.
|
21
|
+
TypeInfo type_info;
|
22
|
+
VALUE type_class; // To GC-root the msgdef/enumdef in type_info.
|
23
|
+
VALUE arena; // To GC-root the upb_Array.
|
24
|
+
} RepeatedField;
|
41
25
|
|
42
26
|
VALUE cRepeatedField;
|
43
27
|
|
44
|
-
|
28
|
+
static void RepeatedField_mark(void* _self) {
|
29
|
+
RepeatedField* self = (RepeatedField*)_self;
|
30
|
+
rb_gc_mark(self->type_class);
|
31
|
+
rb_gc_mark(self->arena);
|
32
|
+
}
|
33
|
+
|
34
|
+
const rb_data_type_t RepeatedField_type = {
|
35
|
+
"Google::Protobuf::RepeatedField",
|
36
|
+
{RepeatedField_mark, RUBY_DEFAULT_FREE, NULL},
|
37
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
38
|
+
};
|
39
|
+
|
40
|
+
static RepeatedField* ruby_to_RepeatedField(VALUE _self) {
|
45
41
|
RepeatedField* self;
|
46
42
|
TypedData_Get_Struct(_self, RepeatedField, &RepeatedField_type, self);
|
47
43
|
return self;
|
48
44
|
}
|
49
45
|
|
50
|
-
|
51
|
-
|
46
|
+
static upb_Array* RepeatedField_GetMutable(VALUE _self) {
|
47
|
+
rb_check_frozen(_self);
|
48
|
+
return (upb_Array*)ruby_to_RepeatedField(_self)->array;
|
49
|
+
}
|
50
|
+
|
51
|
+
VALUE RepeatedField_alloc(VALUE klass) {
|
52
|
+
RepeatedField* self = ALLOC(RepeatedField);
|
53
|
+
self->arena = Qnil;
|
54
|
+
self->type_class = Qnil;
|
55
|
+
self->array = NULL;
|
56
|
+
return TypedData_Wrap_Struct(klass, &RepeatedField_type, self);
|
57
|
+
}
|
58
|
+
|
59
|
+
VALUE RepeatedField_GetRubyWrapper(upb_Array* array, TypeInfo type_info,
|
60
|
+
VALUE arena) {
|
61
|
+
PBRUBY_ASSERT(array);
|
62
|
+
VALUE val = ObjectCache_Get(array);
|
63
|
+
|
64
|
+
if (val == Qnil) {
|
65
|
+
val = RepeatedField_alloc(cRepeatedField);
|
66
|
+
RepeatedField* self;
|
67
|
+
TypedData_Get_Struct(val, RepeatedField, &RepeatedField_type, self);
|
68
|
+
self->array = array;
|
69
|
+
self->arena = arena;
|
70
|
+
self->type_info = type_info;
|
71
|
+
if (self->type_info.type == kUpb_CType_Message) {
|
72
|
+
self->type_class = Descriptor_DefToClass(type_info.def.msgdef);
|
73
|
+
}
|
74
|
+
val = ObjectCache_TryAdd(array, val);
|
75
|
+
}
|
76
|
+
|
77
|
+
PBRUBY_ASSERT(ruby_to_RepeatedField(val)->type_info.type == type_info.type);
|
78
|
+
PBRUBY_ASSERT(ruby_to_RepeatedField(val)->type_info.def.msgdef ==
|
79
|
+
type_info.def.msgdef);
|
80
|
+
PBRUBY_ASSERT(ruby_to_RepeatedField(val)->array == array);
|
81
|
+
|
82
|
+
return val;
|
83
|
+
}
|
84
|
+
|
85
|
+
static VALUE RepeatedField_new_this_type(RepeatedField* from) {
|
86
|
+
VALUE arena_rb = Arena_new();
|
87
|
+
upb_Array* array = upb_Array_New(Arena_get(arena_rb), from->type_info.type);
|
88
|
+
VALUE ret = RepeatedField_GetRubyWrapper(array, from->type_info, arena_rb);
|
89
|
+
PBRUBY_ASSERT(ruby_to_RepeatedField(ret)->type_class == from->type_class);
|
90
|
+
return ret;
|
91
|
+
}
|
92
|
+
|
93
|
+
void RepeatedField_Inspect(StringBuilder* b, const upb_Array* array,
|
94
|
+
TypeInfo info) {
|
95
|
+
bool first = true;
|
96
|
+
StringBuilder_Printf(b, "[");
|
97
|
+
size_t n = array ? upb_Array_Size(array) : 0;
|
98
|
+
for (size_t i = 0; i < n; i++) {
|
99
|
+
if (first) {
|
100
|
+
first = false;
|
101
|
+
} else {
|
102
|
+
StringBuilder_Printf(b, ", ");
|
103
|
+
}
|
104
|
+
StringBuilder_PrintMsgval(b, upb_Array_Get(array, i), info);
|
105
|
+
}
|
106
|
+
StringBuilder_Printf(b, "]");
|
107
|
+
}
|
108
|
+
|
109
|
+
VALUE RepeatedField_deep_copy(VALUE _self) {
|
110
|
+
RepeatedField* self = ruby_to_RepeatedField(_self);
|
111
|
+
VALUE new_rptfield = RepeatedField_new_this_type(self);
|
112
|
+
RepeatedField* new_self = ruby_to_RepeatedField(new_rptfield);
|
113
|
+
VALUE arena_rb = new_self->arena;
|
114
|
+
upb_Array* new_array = RepeatedField_GetMutable(new_rptfield);
|
115
|
+
upb_Arena* arena = Arena_get(arena_rb);
|
116
|
+
size_t elements = upb_Array_Size(self->array);
|
117
|
+
|
118
|
+
upb_Array_Resize(new_array, elements, arena);
|
119
|
+
|
120
|
+
size_t size = upb_Array_Size(self->array);
|
121
|
+
for (size_t i = 0; i < size; i++) {
|
122
|
+
upb_MessageValue msgval = upb_Array_Get(self->array, i);
|
123
|
+
upb_MessageValue copy = Msgval_DeepCopy(msgval, self->type_info, arena);
|
124
|
+
upb_Array_Set(new_array, i, copy);
|
125
|
+
}
|
126
|
+
|
127
|
+
return new_rptfield;
|
128
|
+
}
|
129
|
+
|
130
|
+
const upb_Array* RepeatedField_GetUpbArray(VALUE val, const upb_FieldDef* field,
|
131
|
+
upb_Arena* arena) {
|
132
|
+
RepeatedField* self;
|
133
|
+
TypeInfo type_info = TypeInfo_get(field);
|
134
|
+
|
135
|
+
if (!RB_TYPE_P(val, T_DATA) || !RTYPEDDATA_P(val) ||
|
136
|
+
RTYPEDDATA_TYPE(val) != &RepeatedField_type) {
|
137
|
+
rb_raise(cTypeError, "Expected repeated field array");
|
138
|
+
}
|
139
|
+
|
140
|
+
self = ruby_to_RepeatedField(val);
|
141
|
+
if (self->type_info.type != type_info.type) {
|
142
|
+
rb_raise(cTypeError, "Repeated field array has wrong element type");
|
143
|
+
}
|
144
|
+
|
145
|
+
if (self->type_info.def.msgdef != type_info.def.msgdef) {
|
146
|
+
rb_raise(cTypeError, "Repeated field array has wrong message/enum class");
|
147
|
+
}
|
148
|
+
|
149
|
+
Arena_fuse(self->arena, arena);
|
150
|
+
return self->array;
|
52
151
|
}
|
53
152
|
|
54
153
|
static int index_position(VALUE _index, RepeatedField* repeated_field) {
|
55
154
|
int index = NUM2INT(_index);
|
56
|
-
if (index < 0
|
57
|
-
index = repeated_field->size + index;
|
58
|
-
}
|
155
|
+
if (index < 0) index += upb_Array_Size(repeated_field->array);
|
59
156
|
return index;
|
60
157
|
}
|
61
158
|
|
62
|
-
VALUE RepeatedField_subarray(
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
VALUE field_type_class = self->field_type_class;
|
67
|
-
size_t off = beg * element_size;
|
68
|
-
VALUE ary = rb_ary_new2(len);
|
69
|
-
int i;
|
159
|
+
static VALUE RepeatedField_subarray(RepeatedField* self, long beg, long len) {
|
160
|
+
size_t size = upb_Array_Size(self->array);
|
161
|
+
VALUE ary = rb_ary_new2(size);
|
162
|
+
long i;
|
70
163
|
|
71
|
-
for (i = beg; i < beg + len; i
|
72
|
-
|
73
|
-
VALUE elem =
|
164
|
+
for (i = beg; i < beg + len; i++) {
|
165
|
+
upb_MessageValue msgval = upb_Array_Get(self->array, i);
|
166
|
+
VALUE elem = Convert_UpbToRuby(msgval, self->type_info, self->arena);
|
74
167
|
rb_ary_push(ary, elem);
|
75
168
|
}
|
76
169
|
return ary;
|
@@ -84,70 +177,65 @@ VALUE RepeatedField_subarray(VALUE _self, long beg, long len) {
|
|
84
177
|
* also includes Enumerable; combined with this method, the repeated field thus
|
85
178
|
* acts like an ordinary Ruby sequence.
|
86
179
|
*/
|
87
|
-
VALUE RepeatedField_each(VALUE _self) {
|
180
|
+
static VALUE RepeatedField_each(VALUE _self) {
|
88
181
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
89
|
-
|
90
|
-
VALUE field_type_class = self->field_type_class;
|
91
|
-
int element_size = native_slot_size(field_type);
|
92
|
-
size_t off = 0;
|
182
|
+
int size = upb_Array_Size(self->array);
|
93
183
|
int i;
|
94
184
|
|
95
|
-
for (i = 0; i <
|
96
|
-
|
97
|
-
VALUE val =
|
185
|
+
for (i = 0; i < size; i++) {
|
186
|
+
upb_MessageValue msgval = upb_Array_Get(self->array, i);
|
187
|
+
VALUE val = Convert_UpbToRuby(msgval, self->type_info, self->arena);
|
98
188
|
rb_yield(val);
|
99
189
|
}
|
100
190
|
return _self;
|
101
191
|
}
|
102
192
|
|
103
|
-
|
104
193
|
/*
|
105
194
|
* call-seq:
|
106
195
|
* RepeatedField.[](index) => value
|
107
196
|
*
|
108
197
|
* Accesses the element at the given index. Returns nil on out-of-bounds
|
109
198
|
*/
|
110
|
-
VALUE RepeatedField_index(int argc, VALUE* argv, VALUE _self) {
|
199
|
+
static VALUE RepeatedField_index(int argc, VALUE* argv, VALUE _self) {
|
111
200
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
112
|
-
|
113
|
-
upb_fieldtype_t field_type = self->field_type;
|
114
|
-
VALUE field_type_class = self->field_type_class;
|
201
|
+
long size = upb_Array_Size(self->array);
|
115
202
|
|
116
203
|
VALUE arg = argv[0];
|
117
204
|
long beg, len;
|
118
205
|
|
119
|
-
if (argc == 1){
|
206
|
+
if (argc == 1) {
|
120
207
|
if (FIXNUM_P(arg)) {
|
121
208
|
/* standard case */
|
122
|
-
|
209
|
+
upb_MessageValue msgval;
|
123
210
|
int index = index_position(argv[0], self);
|
124
|
-
if (index < 0 || index >= self->
|
211
|
+
if (index < 0 || (size_t)index >= upb_Array_Size(self->array)) {
|
125
212
|
return Qnil;
|
126
213
|
}
|
127
|
-
|
128
|
-
return
|
129
|
-
}else{
|
214
|
+
msgval = upb_Array_Get(self->array, index);
|
215
|
+
return Convert_UpbToRuby(msgval, self->type_info, self->arena);
|
216
|
+
} else {
|
130
217
|
/* check if idx is Range */
|
131
|
-
switch (rb_range_beg_len(arg, &beg, &len,
|
218
|
+
switch (rb_range_beg_len(arg, &beg, &len, size, 0)) {
|
132
219
|
case Qfalse:
|
133
220
|
break;
|
134
221
|
case Qnil:
|
135
222
|
return Qnil;
|
136
223
|
default:
|
137
|
-
return RepeatedField_subarray(
|
224
|
+
return RepeatedField_subarray(self, beg, len);
|
138
225
|
}
|
139
226
|
}
|
140
227
|
}
|
228
|
+
|
141
229
|
/* assume 2 arguments */
|
142
230
|
beg = NUM2LONG(argv[0]);
|
143
231
|
len = NUM2LONG(argv[1]);
|
144
232
|
if (beg < 0) {
|
145
|
-
beg +=
|
233
|
+
beg += size;
|
146
234
|
}
|
147
|
-
if (beg >=
|
235
|
+
if (beg >= size) {
|
148
236
|
return Qnil;
|
149
237
|
}
|
150
|
-
return RepeatedField_subarray(
|
238
|
+
return RepeatedField_subarray(self, beg, len);
|
151
239
|
}
|
152
240
|
|
153
241
|
/*
|
@@ -157,128 +245,89 @@ VALUE RepeatedField_index(int argc, VALUE* argv, VALUE _self) {
|
|
157
245
|
* Sets the element at the given index. On out-of-bounds assignments, extends
|
158
246
|
* the array and fills the hole (if any) with default values.
|
159
247
|
*/
|
160
|
-
VALUE RepeatedField_index_set(VALUE _self, VALUE _index, VALUE val) {
|
248
|
+
static VALUE RepeatedField_index_set(VALUE _self, VALUE _index, VALUE val) {
|
161
249
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
250
|
+
int size = upb_Array_Size(self->array);
|
251
|
+
upb_Array* array = RepeatedField_GetMutable(_self);
|
252
|
+
upb_Arena* arena = Arena_get(self->arena);
|
253
|
+
upb_MessageValue msgval = Convert_RubyToUpb(val, "", self->type_info, arena);
|
166
254
|
|
167
255
|
int index = index_position(_index, self);
|
168
256
|
if (index < 0 || index >= (INT_MAX - 1)) {
|
169
257
|
return Qnil;
|
170
258
|
}
|
171
|
-
if (index >= self->size) {
|
172
|
-
upb_fieldtype_t field_type = self->field_type;
|
173
|
-
int element_size = native_slot_size(field_type);
|
174
|
-
int i;
|
175
259
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
260
|
+
if (index >= size) {
|
261
|
+
upb_Array_Resize(array, index + 1, arena);
|
262
|
+
upb_MessageValue fill;
|
263
|
+
memset(&fill, 0, sizeof(fill));
|
264
|
+
for (int i = size; i < index; i++) {
|
265
|
+
// Fill default values.
|
266
|
+
// TODO: should this happen at the upb level?
|
267
|
+
upb_Array_Set(array, i, fill);
|
180
268
|
}
|
181
|
-
self->size = index + 1;
|
182
269
|
}
|
183
270
|
|
184
|
-
|
185
|
-
native_slot_set("", field_type, field_type_class, memory, val);
|
271
|
+
upb_Array_Set(array, index, msgval);
|
186
272
|
return Qnil;
|
187
273
|
}
|
188
274
|
|
189
|
-
static int kInitialSize = 8;
|
190
|
-
|
191
|
-
void RepeatedField_reserve(RepeatedField* self, int new_size) {
|
192
|
-
void* old_elems = self->elements;
|
193
|
-
int elem_size = native_slot_size(self->field_type);
|
194
|
-
if (new_size <= self->capacity) {
|
195
|
-
return;
|
196
|
-
}
|
197
|
-
if (self->capacity == 0) {
|
198
|
-
self->capacity = kInitialSize;
|
199
|
-
}
|
200
|
-
while (self->capacity < new_size) {
|
201
|
-
self->capacity *= 2;
|
202
|
-
}
|
203
|
-
self->elements = ALLOC_N(uint8_t, elem_size * self->capacity);
|
204
|
-
if (old_elems != NULL) {
|
205
|
-
memcpy(self->elements, old_elems, self->size * elem_size);
|
206
|
-
xfree(old_elems);
|
207
|
-
}
|
208
|
-
}
|
209
|
-
|
210
275
|
/*
|
211
276
|
* call-seq:
|
212
|
-
* RepeatedField.push(value)
|
277
|
+
* RepeatedField.push(value, ...)
|
213
278
|
*
|
214
279
|
* Adds a new element to the repeated field.
|
215
280
|
*/
|
216
|
-
VALUE
|
281
|
+
static VALUE RepeatedField_push_vararg(int argc, VALUE* argv, VALUE _self) {
|
217
282
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
218
|
-
|
219
|
-
|
220
|
-
void* memory;
|
221
|
-
|
222
|
-
RepeatedField_reserve(self, self->size + 1);
|
223
|
-
memory = (void *) (((uint8_t *)self->elements) + self->size * element_size);
|
224
|
-
native_slot_set("", field_type, self->field_type_class, memory, val);
|
225
|
-
// native_slot_set may raise an error; bump size only after set.
|
226
|
-
self->size++;
|
227
|
-
return _self;
|
228
|
-
}
|
229
|
-
|
230
|
-
VALUE RepeatedField_push_vararg(VALUE _self, VALUE args) {
|
283
|
+
upb_Arena* arena = Arena_get(self->arena);
|
284
|
+
upb_Array* array = RepeatedField_GetMutable(_self);
|
231
285
|
int i;
|
232
|
-
|
233
|
-
|
286
|
+
|
287
|
+
for (i = 0; i < argc; i++) {
|
288
|
+
upb_MessageValue msgval =
|
289
|
+
Convert_RubyToUpb(argv[i], "", self->type_info, arena);
|
290
|
+
upb_Array_Append(array, msgval, arena);
|
234
291
|
}
|
292
|
+
|
235
293
|
return _self;
|
236
294
|
}
|
237
295
|
|
238
|
-
|
239
|
-
|
296
|
+
/*
|
297
|
+
* call-seq:
|
298
|
+
* RepeatedField.<<(value)
|
299
|
+
*
|
300
|
+
* Adds a new element to the repeated field.
|
301
|
+
*/
|
302
|
+
static VALUE RepeatedField_push(VALUE _self, VALUE val) {
|
240
303
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
241
|
-
|
242
|
-
|
243
|
-
void* memory;
|
244
|
-
|
245
|
-
RepeatedField_reserve(self, self->size + 1);
|
246
|
-
memory = (void *) (((uint8_t *)self->elements) + self->size * element_size);
|
247
|
-
memcpy(memory, data, element_size);
|
248
|
-
self->size++;
|
249
|
-
}
|
304
|
+
upb_Arena* arena = Arena_get(self->arena);
|
305
|
+
upb_Array* array = RepeatedField_GetMutable(_self);
|
250
306
|
|
251
|
-
|
252
|
-
|
253
|
-
upb_fieldtype_t field_type = self->field_type;
|
254
|
-
int element_size = native_slot_size(field_type);
|
255
|
-
return RepeatedField_memoryat(self, index, element_size);
|
256
|
-
}
|
307
|
+
upb_MessageValue msgval = Convert_RubyToUpb(val, "", self->type_info, arena);
|
308
|
+
upb_Array_Append(array, msgval, arena);
|
257
309
|
|
258
|
-
|
259
|
-
RepeatedField* self = ruby_to_RepeatedField(_self);
|
260
|
-
return self->size;
|
310
|
+
return _self;
|
261
311
|
}
|
262
312
|
|
263
313
|
/*
|
264
314
|
* Private ruby method, used by RepeatedField.pop
|
265
315
|
*/
|
266
|
-
VALUE RepeatedField_pop_one(VALUE _self) {
|
316
|
+
static VALUE RepeatedField_pop_one(VALUE _self) {
|
267
317
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
int index;
|
272
|
-
void* memory;
|
318
|
+
size_t size = upb_Array_Size(self->array);
|
319
|
+
upb_Array* array = RepeatedField_GetMutable(_self);
|
320
|
+
upb_MessageValue last;
|
273
321
|
VALUE ret;
|
274
322
|
|
275
|
-
if (
|
323
|
+
if (size == 0) {
|
276
324
|
return Qnil;
|
277
325
|
}
|
278
|
-
|
279
|
-
|
280
|
-
ret =
|
281
|
-
|
326
|
+
|
327
|
+
last = upb_Array_Get(self->array, size - 1);
|
328
|
+
ret = Convert_UpbToRuby(last, self->type_info, self->arena);
|
329
|
+
|
330
|
+
upb_Array_Resize(array, size - 1, Arena_get(self->arena));
|
282
331
|
return ret;
|
283
332
|
}
|
284
333
|
|
@@ -288,15 +337,18 @@ VALUE RepeatedField_pop_one(VALUE _self) {
|
|
288
337
|
*
|
289
338
|
* Replaces the contents of the repeated field with the given list of elements.
|
290
339
|
*/
|
291
|
-
VALUE RepeatedField_replace(VALUE _self, VALUE list) {
|
340
|
+
static VALUE RepeatedField_replace(VALUE _self, VALUE list) {
|
292
341
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
342
|
+
upb_Array* array = RepeatedField_GetMutable(_self);
|
293
343
|
int i;
|
294
344
|
|
295
345
|
Check_Type(list, T_ARRAY);
|
296
|
-
self->
|
346
|
+
upb_Array_Resize(array, 0, Arena_get(self->arena));
|
347
|
+
|
297
348
|
for (i = 0; i < RARRAY_LEN(list); i++) {
|
298
349
|
RepeatedField_push(_self, rb_ary_entry(list, i));
|
299
350
|
}
|
351
|
+
|
300
352
|
return list;
|
301
353
|
}
|
302
354
|
|
@@ -306,9 +358,10 @@ VALUE RepeatedField_replace(VALUE _self, VALUE list) {
|
|
306
358
|
*
|
307
359
|
* Clears (removes all elements from) this repeated field.
|
308
360
|
*/
|
309
|
-
VALUE RepeatedField_clear(VALUE _self) {
|
361
|
+
static VALUE RepeatedField_clear(VALUE _self) {
|
310
362
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
311
|
-
|
363
|
+
upb_Array* array = RepeatedField_GetMutable(_self);
|
364
|
+
upb_Array_Resize(array, 0, Arena_get(self->arena));
|
312
365
|
return _self;
|
313
366
|
}
|
314
367
|
|
@@ -318,23 +371,9 @@ VALUE RepeatedField_clear(VALUE _self) {
|
|
318
371
|
*
|
319
372
|
* Returns the length of this repeated field.
|
320
373
|
*/
|
321
|
-
VALUE RepeatedField_length(VALUE _self) {
|
374
|
+
static VALUE RepeatedField_length(VALUE _self) {
|
322
375
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
323
|
-
return INT2NUM(self->
|
324
|
-
}
|
325
|
-
|
326
|
-
VALUE RepeatedField_new_this_type(VALUE _self) {
|
327
|
-
RepeatedField* self = ruby_to_RepeatedField(_self);
|
328
|
-
VALUE new_rptfield = Qnil;
|
329
|
-
VALUE element_type = fieldtype_to_ruby(self->field_type);
|
330
|
-
if (self->field_type_class != Qnil) {
|
331
|
-
new_rptfield = rb_funcall(CLASS_OF(_self), rb_intern("new"), 2,
|
332
|
-
element_type, self->field_type_class);
|
333
|
-
} else {
|
334
|
-
new_rptfield = rb_funcall(CLASS_OF(_self), rb_intern("new"), 1,
|
335
|
-
element_type);
|
336
|
-
}
|
337
|
-
return new_rptfield;
|
376
|
+
return INT2NUM(upb_Array_Size(self->array));
|
338
377
|
}
|
339
378
|
|
340
379
|
/*
|
@@ -344,42 +383,20 @@ VALUE RepeatedField_new_this_type(VALUE _self) {
|
|
344
383
|
* Duplicates this repeated field with a shallow copy. References to all
|
345
384
|
* non-primitive element objects (e.g., submessages) are shared.
|
346
385
|
*/
|
347
|
-
VALUE RepeatedField_dup(VALUE _self) {
|
386
|
+
static VALUE RepeatedField_dup(VALUE _self) {
|
348
387
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
349
|
-
VALUE new_rptfield = RepeatedField_new_this_type(
|
388
|
+
VALUE new_rptfield = RepeatedField_new_this_type(self);
|
350
389
|
RepeatedField* new_rptfield_self = ruby_to_RepeatedField(new_rptfield);
|
351
|
-
|
352
|
-
|
353
|
-
|
390
|
+
upb_Array* new_array = RepeatedField_GetMutable(new_rptfield);
|
391
|
+
upb_Arena* arena = Arena_get(new_rptfield_self->arena);
|
392
|
+
int size = upb_Array_Size(self->array);
|
354
393
|
int i;
|
355
394
|
|
356
|
-
|
357
|
-
for (i = 0; i < self->size; i++, off += elem_size) {
|
358
|
-
void* to_mem = (uint8_t *)new_rptfield_self->elements + off;
|
359
|
-
void* from_mem = (uint8_t *)self->elements + off;
|
360
|
-
native_slot_dup(field_type, to_mem, from_mem);
|
361
|
-
new_rptfield_self->size++;
|
362
|
-
}
|
363
|
-
|
364
|
-
return new_rptfield;
|
365
|
-
}
|
395
|
+
Arena_fuse(self->arena, arena);
|
366
396
|
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
VALUE new_rptfield = RepeatedField_new_this_type(_self);
|
371
|
-
RepeatedField* new_rptfield_self = ruby_to_RepeatedField(new_rptfield);
|
372
|
-
upb_fieldtype_t field_type = self->field_type;
|
373
|
-
size_t elem_size = native_slot_size(field_type);
|
374
|
-
size_t off = 0;
|
375
|
-
int i;
|
376
|
-
|
377
|
-
RepeatedField_reserve(new_rptfield_self, self->size);
|
378
|
-
for (i = 0; i < self->size; i++, off += elem_size) {
|
379
|
-
void* to_mem = (uint8_t *)new_rptfield_self->elements + off;
|
380
|
-
void* from_mem = (uint8_t *)self->elements + off;
|
381
|
-
native_slot_deep_copy(field_type, self->field_type_class, to_mem, from_mem);
|
382
|
-
new_rptfield_self->size++;
|
397
|
+
for (i = 0; i < size; i++) {
|
398
|
+
upb_MessageValue msgval = upb_Array_Get(self->array, i);
|
399
|
+
upb_Array_Append(new_array, msgval, arena);
|
383
400
|
}
|
384
401
|
|
385
402
|
return new_rptfield;
|
@@ -394,17 +411,16 @@ VALUE RepeatedField_deep_copy(VALUE _self) {
|
|
394
411
|
*/
|
395
412
|
VALUE RepeatedField_to_ary(VALUE _self) {
|
396
413
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
397
|
-
|
398
|
-
|
399
|
-
size_t off = 0;
|
400
|
-
VALUE ary = rb_ary_new2(self->size);
|
414
|
+
int size = upb_Array_Size(self->array);
|
415
|
+
VALUE ary = rb_ary_new2(size);
|
401
416
|
int i;
|
402
417
|
|
403
|
-
for (i = 0; i <
|
404
|
-
|
405
|
-
VALUE
|
406
|
-
rb_ary_push(ary,
|
418
|
+
for (i = 0; i < size; i++) {
|
419
|
+
upb_MessageValue msgval = upb_Array_Get(self->array, i);
|
420
|
+
VALUE val = Convert_UpbToRuby(msgval, self->type_info, self->arena);
|
421
|
+
rb_ary_push(ary, val);
|
407
422
|
}
|
423
|
+
|
408
424
|
return ary;
|
409
425
|
}
|
410
426
|
|
@@ -436,28 +452,58 @@ VALUE RepeatedField_eq(VALUE _self, VALUE _other) {
|
|
436
452
|
|
437
453
|
self = ruby_to_RepeatedField(_self);
|
438
454
|
other = ruby_to_RepeatedField(_other);
|
439
|
-
|
440
|
-
|
441
|
-
|
455
|
+
size_t n = upb_Array_Size(self->array);
|
456
|
+
|
457
|
+
if (self->type_info.type != other->type_info.type ||
|
458
|
+
self->type_class != other->type_class ||
|
459
|
+
upb_Array_Size(other->array) != n) {
|
442
460
|
return Qfalse;
|
443
461
|
}
|
444
462
|
|
445
|
-
{
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
463
|
+
for (size_t i = 0; i < n; i++) {
|
464
|
+
upb_MessageValue val1 = upb_Array_Get(self->array, i);
|
465
|
+
upb_MessageValue val2 = upb_Array_Get(other->array, i);
|
466
|
+
if (!Msgval_IsEqual(val1, val2, self->type_info)) {
|
467
|
+
return Qfalse;
|
468
|
+
}
|
469
|
+
}
|
450
470
|
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
471
|
+
return Qtrue;
|
472
|
+
}
|
473
|
+
|
474
|
+
/*
|
475
|
+
* call-seq:
|
476
|
+
* RepeatedField.freeze => self
|
477
|
+
*
|
478
|
+
* Freezes the repeated field. We have to intercept this so we can pin the Ruby
|
479
|
+
* object into memory so we don't forget it's frozen.
|
480
|
+
*/
|
481
|
+
static VALUE RepeatedField_freeze(VALUE _self) {
|
482
|
+
RepeatedField* self = ruby_to_RepeatedField(_self);
|
483
|
+
if (!RB_OBJ_FROZEN(_self)) {
|
484
|
+
Arena_Pin(self->arena, _self);
|
485
|
+
RB_OBJ_FREEZE(_self);
|
486
|
+
}
|
487
|
+
return _self;
|
488
|
+
}
|
489
|
+
|
490
|
+
/*
|
491
|
+
* Deep freezes the repeated field and values recursively.
|
492
|
+
* Internal use only.
|
493
|
+
*/
|
494
|
+
VALUE RepeatedField_internal_deep_freeze(VALUE _self) {
|
495
|
+
RepeatedField* self = ruby_to_RepeatedField(_self);
|
496
|
+
RepeatedField_freeze(_self);
|
497
|
+
if (self->type_info.type == kUpb_CType_Message) {
|
498
|
+
int size = upb_Array_Size(self->array);
|
499
|
+
int i;
|
500
|
+
for (i = 0; i < size; i++) {
|
501
|
+
upb_MessageValue msgval = upb_Array_Get(self->array, i);
|
502
|
+
VALUE val = Convert_UpbToRuby(msgval, self->type_info, self->arena);
|
503
|
+
Message_internal_deep_freeze(val);
|
458
504
|
}
|
459
|
-
return Qtrue;
|
460
505
|
}
|
506
|
+
return _self;
|
461
507
|
}
|
462
508
|
|
463
509
|
/*
|
@@ -468,22 +514,15 @@ VALUE RepeatedField_eq(VALUE _self, VALUE _other) {
|
|
468
514
|
*/
|
469
515
|
VALUE RepeatedField_hash(VALUE _self) {
|
470
516
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
471
|
-
|
472
|
-
|
473
|
-
upb_fieldtype_t field_type = self->field_type;
|
474
|
-
VALUE field_type_class = self->field_type_class;
|
475
|
-
size_t elem_size = native_slot_size(field_type);
|
476
|
-
size_t off = 0;
|
477
|
-
int i;
|
517
|
+
uint64_t hash = 0;
|
518
|
+
size_t n = upb_Array_Size(self->array);
|
478
519
|
|
479
|
-
for (i = 0; i <
|
480
|
-
|
481
|
-
|
482
|
-
h = rb_hash_uint(h, NUM2LONG(rb_funcall(elem, hash_sym, 0)));
|
520
|
+
for (size_t i = 0; i < n; i++) {
|
521
|
+
upb_MessageValue val = upb_Array_Get(self->array, i);
|
522
|
+
hash = Msgval_GetHash(val, self->type_info, hash);
|
483
523
|
}
|
484
|
-
h = rb_hash_end(h);
|
485
524
|
|
486
|
-
return
|
525
|
+
return LL2NUM(hash);
|
487
526
|
}
|
488
527
|
|
489
528
|
/*
|
@@ -495,34 +534,40 @@ VALUE RepeatedField_hash(VALUE _self) {
|
|
495
534
|
* be either another repeated field or a Ruby array.
|
496
535
|
*/
|
497
536
|
VALUE RepeatedField_plus(VALUE _self, VALUE list) {
|
498
|
-
VALUE
|
537
|
+
VALUE dupped_ = RepeatedField_dup(_self);
|
499
538
|
|
500
539
|
if (TYPE(list) == T_ARRAY) {
|
501
540
|
int i;
|
502
541
|
for (i = 0; i < RARRAY_LEN(list); i++) {
|
503
542
|
VALUE elem = rb_ary_entry(list, i);
|
504
|
-
RepeatedField_push(
|
543
|
+
RepeatedField_push(dupped_, elem);
|
505
544
|
}
|
506
545
|
} else if (RB_TYPE_P(list, T_DATA) && RTYPEDDATA_P(list) &&
|
507
546
|
RTYPEDDATA_TYPE(list) == &RepeatedField_type) {
|
508
547
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
509
548
|
RepeatedField* list_rptfield = ruby_to_RepeatedField(list);
|
549
|
+
RepeatedField* dupped = ruby_to_RepeatedField(dupped_);
|
550
|
+
upb_Array* dupped_array = RepeatedField_GetMutable(dupped_);
|
551
|
+
upb_Arena* arena = Arena_get(dupped->arena);
|
552
|
+
Arena_fuse(list_rptfield->arena, arena);
|
553
|
+
int size = upb_Array_Size(list_rptfield->array);
|
510
554
|
int i;
|
511
555
|
|
512
|
-
if (self->
|
513
|
-
self->
|
556
|
+
if (self->type_info.type != list_rptfield->type_info.type ||
|
557
|
+
self->type_class != list_rptfield->type_class) {
|
514
558
|
rb_raise(rb_eArgError,
|
515
559
|
"Attempt to append RepeatedField with different element type.");
|
516
560
|
}
|
517
|
-
|
518
|
-
|
519
|
-
|
561
|
+
|
562
|
+
for (i = 0; i < size; i++) {
|
563
|
+
upb_MessageValue msgval = upb_Array_Get(list_rptfield->array, i);
|
564
|
+
upb_Array_Append(dupped_array, msgval, arena);
|
520
565
|
}
|
521
566
|
} else {
|
522
567
|
rb_raise(rb_eArgError, "Unknown type appending to RepeatedField");
|
523
568
|
}
|
524
569
|
|
525
|
-
return
|
570
|
+
return dupped_;
|
526
571
|
}
|
527
572
|
|
528
573
|
/*
|
@@ -541,133 +586,57 @@ VALUE RepeatedField_concat(VALUE _self, VALUE list) {
|
|
541
586
|
return _self;
|
542
587
|
}
|
543
588
|
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
}
|
557
|
-
if (rb_get_alloc_func(klass) != &Message_alloc) {
|
558
|
-
rb_raise(rb_eArgError,
|
559
|
-
"Message class was not returned by the DescriptorPool.");
|
560
|
-
}
|
561
|
-
} else if (type == UPB_TYPE_ENUM) {
|
562
|
-
VALUE enumdesc = rb_ivar_get(klass, descriptor_instancevar_interned);
|
563
|
-
if (!RB_TYPE_P(enumdesc, T_DATA) || !RTYPEDDATA_P(enumdesc) ||
|
564
|
-
RTYPEDDATA_TYPE(enumdesc) != &_EnumDescriptor_type) {
|
565
|
-
rb_raise(rb_eArgError, "Descriptor has an incorrect type.");
|
566
|
-
}
|
567
|
-
}
|
568
|
-
}
|
569
|
-
|
570
|
-
void RepeatedField_init_args(int argc, VALUE* argv,
|
571
|
-
VALUE _self) {
|
589
|
+
/*
|
590
|
+
* call-seq:
|
591
|
+
* RepeatedField.new(type, type_class = nil, initial_elems = [])
|
592
|
+
*
|
593
|
+
* Creates a new repeated field. The provided type must be a Ruby symbol, and
|
594
|
+
* can take on the same values as those accepted by FieldDescriptor#type=. If
|
595
|
+
* the type is :message or :enum, type_class must be non-nil, and must be the
|
596
|
+
* Ruby class or module returned by Descriptor#msgclass or
|
597
|
+
* EnumDescriptor#enummodule, respectively. An initial list of elements may also
|
598
|
+
* be provided.
|
599
|
+
*/
|
600
|
+
VALUE RepeatedField_init(int argc, VALUE* argv, VALUE _self) {
|
572
601
|
RepeatedField* self = ruby_to_RepeatedField(_self);
|
602
|
+
upb_Arena* arena;
|
573
603
|
VALUE ary = Qnil;
|
604
|
+
|
605
|
+
self->arena = Arena_new();
|
606
|
+
arena = Arena_get(self->arena);
|
607
|
+
|
574
608
|
if (argc < 1) {
|
575
609
|
rb_raise(rb_eArgError, "Expected at least 1 argument.");
|
576
610
|
}
|
577
|
-
self->field_type = ruby_to_fieldtype(argv[0]);
|
578
611
|
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
}
|
584
|
-
self->field_type_class = argv[1];
|
585
|
-
if (argc > 2) {
|
586
|
-
ary = argv[2];
|
587
|
-
}
|
588
|
-
validate_type_class(self->field_type, self->field_type_class);
|
589
|
-
} else {
|
590
|
-
if (argc > 2) {
|
591
|
-
rb_raise(rb_eArgError, "Too many arguments: expected 1 or 2.");
|
592
|
-
}
|
593
|
-
if (argc > 1) {
|
594
|
-
ary = argv[1];
|
595
|
-
}
|
596
|
-
}
|
612
|
+
self->type_info = TypeInfo_FromClass(argc, argv, 0, &self->type_class, &ary);
|
613
|
+
self->array = upb_Array_New(arena, self->type_info.type);
|
614
|
+
VALUE stored_val = ObjectCache_TryAdd(self->array, _self);
|
615
|
+
PBRUBY_ASSERT(stored_val == _self);
|
597
616
|
|
598
617
|
if (ary != Qnil) {
|
599
|
-
int i;
|
600
|
-
|
601
618
|
if (!RB_TYPE_P(ary, T_ARRAY)) {
|
602
619
|
rb_raise(rb_eArgError, "Expected array as initialize argument");
|
603
620
|
}
|
604
|
-
for (i = 0; i < RARRAY_LEN(ary); i++) {
|
621
|
+
for (int i = 0; i < RARRAY_LEN(ary); i++) {
|
605
622
|
RepeatedField_push(_self, rb_ary_entry(ary, i));
|
606
623
|
}
|
607
624
|
}
|
608
|
-
}
|
609
|
-
|
610
|
-
// Mark, free, alloc, init and class setup functions.
|
611
|
-
|
612
|
-
void RepeatedField_mark(void* _self) {
|
613
|
-
RepeatedField* self = (RepeatedField*)_self;
|
614
|
-
upb_fieldtype_t field_type = self->field_type;
|
615
|
-
int element_size = native_slot_size(field_type);
|
616
|
-
int i;
|
617
|
-
|
618
|
-
rb_gc_mark(self->field_type_class);
|
619
|
-
for (i = 0; i < self->size; i++) {
|
620
|
-
void* memory = (((uint8_t *)self->elements) + i * element_size);
|
621
|
-
native_slot_mark(self->field_type, memory);
|
622
|
-
}
|
623
|
-
}
|
624
|
-
|
625
|
-
void RepeatedField_free(void* _self) {
|
626
|
-
RepeatedField* self = (RepeatedField*)_self;
|
627
|
-
xfree(self->elements);
|
628
|
-
xfree(self);
|
629
|
-
}
|
630
|
-
|
631
|
-
/*
|
632
|
-
* call-seq:
|
633
|
-
* RepeatedField.new(type, type_class = nil, initial_elems = [])
|
634
|
-
*
|
635
|
-
* Creates a new repeated field. The provided type must be a Ruby symbol, and
|
636
|
-
* can take on the same values as those accepted by FieldDescriptor#type=. If
|
637
|
-
* the type is :message or :enum, type_class must be non-nil, and must be the
|
638
|
-
* Ruby class or module returned by Descriptor#msgclass or
|
639
|
-
* EnumDescriptor#enummodule, respectively. An initial list of elements may also
|
640
|
-
* be provided.
|
641
|
-
*/
|
642
|
-
VALUE RepeatedField_alloc(VALUE klass) {
|
643
|
-
RepeatedField* self = ALLOC(RepeatedField);
|
644
|
-
self->elements = NULL;
|
645
|
-
self->size = 0;
|
646
|
-
self->capacity = 0;
|
647
|
-
self->field_type = -1;
|
648
|
-
self->field_type_class = Qnil;
|
649
|
-
return TypedData_Wrap_Struct(klass, &RepeatedField_type, self);
|
650
|
-
}
|
651
|
-
|
652
|
-
VALUE RepeatedField_init(int argc, VALUE* argv, VALUE self) {
|
653
|
-
RepeatedField_init_args(argc, argv, self);
|
654
625
|
return Qnil;
|
655
626
|
}
|
656
627
|
|
657
628
|
void RepeatedField_register(VALUE module) {
|
658
|
-
VALUE klass = rb_define_class_under(
|
659
|
-
module, "RepeatedField", rb_cObject);
|
629
|
+
VALUE klass = rb_define_class_under(module, "RepeatedField", rb_cObject);
|
660
630
|
rb_define_alloc_func(klass, RepeatedField_alloc);
|
661
631
|
rb_gc_register_address(&cRepeatedField);
|
662
632
|
cRepeatedField = klass;
|
663
633
|
|
664
|
-
rb_define_method(klass, "initialize",
|
665
|
-
RepeatedField_init, -1);
|
634
|
+
rb_define_method(klass, "initialize", RepeatedField_init, -1);
|
666
635
|
rb_define_method(klass, "each", RepeatedField_each, 0);
|
667
636
|
rb_define_method(klass, "[]", RepeatedField_index, -1);
|
668
637
|
rb_define_method(klass, "at", RepeatedField_index, -1);
|
669
638
|
rb_define_method(klass, "[]=", RepeatedField_index_set, 2);
|
670
|
-
rb_define_method(klass, "push", RepeatedField_push_vararg, -
|
639
|
+
rb_define_method(klass, "push", RepeatedField_push_vararg, -1);
|
671
640
|
rb_define_method(klass, "<<", RepeatedField_push, 1);
|
672
641
|
rb_define_private_method(klass, "pop_one", RepeatedField_pop_one, 0);
|
673
642
|
rb_define_method(klass, "replace", RepeatedField_replace, 1);
|
@@ -679,6 +648,7 @@ void RepeatedField_register(VALUE module) {
|
|
679
648
|
rb_define_method(klass, "clone", RepeatedField_dup, 0);
|
680
649
|
rb_define_method(klass, "==", RepeatedField_eq, 1);
|
681
650
|
rb_define_method(klass, "to_ary", RepeatedField_to_ary, 0);
|
651
|
+
rb_define_method(klass, "freeze", RepeatedField_freeze, 0);
|
682
652
|
rb_define_method(klass, "hash", RepeatedField_hash, 0);
|
683
653
|
rb_define_method(klass, "+", RepeatedField_plus, 1);
|
684
654
|
rb_define_method(klass, "concat", RepeatedField_concat, 1);
|