google-protobuf 3.17.3 → 3.22.1-arm64-darwin
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 +217 -1521
- 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 +105 -109
- data/ext/google/protobuf_c/map.h +7 -8
- data/ext/google/protobuf_c/message.c +438 -341
- data/ext/google/protobuf_c/message.h +22 -19
- data/ext/google/protobuf_c/protobuf.c +68 -58
- data/ext/google/protobuf_c/protobuf.h +13 -10
- data/ext/google/protobuf_c/repeated_field.c +83 -85
- data/ext/google/protobuf_c/repeated_field.h +6 -6
- data/ext/google/protobuf_c/ruby-upb.c +11782 -6714
- data/ext/google/protobuf_c/ruby-upb.h +9668 -3406
- 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/2.6/protobuf_c.bundle +0 -0
- data/lib/google/2.7/protobuf_c.bundle +0 -0
- data/lib/google/3.0/protobuf_c.bundle +0 -0
- data/lib/google/3.1/protobuf_c.bundle +0 -0
- data/lib/google/3.2/protobuf_c.bundle +0 -0
- data/lib/google/protobuf/any_pb.rb +0 -0
- data/lib/google/protobuf/api_pb.rb +1 -0
- data/lib/google/protobuf/descriptor_dsl.rb +465 -0
- data/lib/google/protobuf/descriptor_pb.rb +298 -0
- data/lib/google/protobuf/duration_pb.rb +0 -0
- data/lib/google/protobuf/empty_pb.rb +0 -0
- data/lib/google/protobuf/field_mask_pb.rb +0 -0
- data/lib/google/protobuf/message_exts.rb +7 -2
- data/lib/google/protobuf/plugin_pb.rb +50 -0
- data/lib/google/protobuf/repeated_field.rb +15 -2
- data/lib/google/protobuf/source_context_pb.rb +0 -0
- data/lib/google/protobuf/struct_pb.rb +0 -0
- data/lib/google/protobuf/timestamp_pb.rb +0 -0
- data/lib/google/protobuf/type_pb.rb +1 -0
- data/lib/google/protobuf/well_known_types.rb +12 -2
- data/lib/google/protobuf/wrappers_pb.rb +0 -0
- data/lib/google/protobuf.rb +5 -73
- metadata +28 -40
- data/ext/google/protobuf_c/third_party/wyhash/wyhash.h +0 -145
- data/tests/basic.rb +0 -611
- data/tests/generated_code_test.rb +0 -23
- data/tests/stress.rb +0 -38
@@ -36,23 +36,16 @@
|
|
36
36
|
#include "message.h"
|
37
37
|
#include "protobuf.h"
|
38
38
|
|
39
|
-
static VALUE Builder_build(VALUE _self);
|
40
|
-
|
41
|
-
static VALUE cMessageBuilderContext;
|
42
|
-
static VALUE cOneofBuilderContext;
|
43
|
-
static VALUE cEnumBuilderContext;
|
44
|
-
static VALUE cBuilder;
|
45
|
-
|
46
39
|
// -----------------------------------------------------------------------------
|
47
40
|
// Global map from upb {msg,enum}defs to wrapper Descriptor/EnumDescriptor
|
48
41
|
// instances.
|
49
42
|
// -----------------------------------------------------------------------------
|
50
43
|
|
51
|
-
static VALUE get_msgdef_obj(VALUE descriptor_pool, const
|
52
|
-
static VALUE get_enumdef_obj(VALUE descriptor_pool, const
|
53
|
-
static VALUE get_fielddef_obj(VALUE descriptor_pool, const
|
54
|
-
static VALUE get_filedef_obj(VALUE descriptor_pool, const
|
55
|
-
static VALUE get_oneofdef_obj(VALUE descriptor_pool, const
|
44
|
+
static VALUE get_msgdef_obj(VALUE descriptor_pool, const upb_MessageDef* def);
|
45
|
+
static VALUE get_enumdef_obj(VALUE descriptor_pool, const upb_EnumDef* def);
|
46
|
+
static VALUE get_fielddef_obj(VALUE descriptor_pool, const upb_FieldDef* def);
|
47
|
+
static VALUE get_filedef_obj(VALUE descriptor_pool, const upb_FileDef* def);
|
48
|
+
static VALUE get_oneofdef_obj(VALUE descriptor_pool, const upb_OneofDef* def);
|
56
49
|
|
57
50
|
// A distinct object that is not accessible from Ruby. We use this as a
|
58
51
|
// constructor argument to enforce that certain objects cannot be created from
|
@@ -75,174 +68,13 @@ static VALUE rb_str_maybe_null(const char* s) {
|
|
75
68
|
return rb_str_new2(s);
|
76
69
|
}
|
77
70
|
|
78
|
-
// -----------------------------------------------------------------------------
|
79
|
-
// Backward compatibility code.
|
80
|
-
// -----------------------------------------------------------------------------
|
81
|
-
|
82
|
-
static void rewrite_enum_default(const upb_symtab* symtab,
|
83
|
-
google_protobuf_FileDescriptorProto* file,
|
84
|
-
google_protobuf_FieldDescriptorProto* field) {
|
85
|
-
upb_strview defaultval;
|
86
|
-
const char *type_name_str;
|
87
|
-
char *end;
|
88
|
-
long val;
|
89
|
-
const upb_enumdef *e;
|
90
|
-
upb_strview type_name;
|
91
|
-
|
92
|
-
/* Look for TYPE_ENUM fields that have a default. */
|
93
|
-
if (google_protobuf_FieldDescriptorProto_type(field) !=
|
94
|
-
google_protobuf_FieldDescriptorProto_TYPE_ENUM ||
|
95
|
-
!google_protobuf_FieldDescriptorProto_has_default_value(field) ||
|
96
|
-
!google_protobuf_FieldDescriptorProto_has_type_name(field)) {
|
97
|
-
return;
|
98
|
-
}
|
99
|
-
|
100
|
-
defaultval = google_protobuf_FieldDescriptorProto_default_value(field);
|
101
|
-
type_name = google_protobuf_FieldDescriptorProto_type_name(field);
|
102
|
-
|
103
|
-
if (defaultval.size == 0 || !isdigit(defaultval.data[0])) {
|
104
|
-
return;
|
105
|
-
}
|
106
|
-
|
107
|
-
if (type_name.size == 0 || type_name.data[0] != '.') {
|
108
|
-
return;
|
109
|
-
}
|
110
|
-
|
111
|
-
type_name_str = type_name.data + 1;
|
112
|
-
|
113
|
-
errno = 0;
|
114
|
-
val = strtol(defaultval.data, &end, 10);
|
115
|
-
|
116
|
-
if (errno != 0 || *end != 0 || val < INT32_MIN || val > INT32_MAX) {
|
117
|
-
return;
|
118
|
-
}
|
119
|
-
|
120
|
-
/* Now find the corresponding enum definition. */
|
121
|
-
e = upb_symtab_lookupenum(symtab, type_name_str);
|
122
|
-
if (e) {
|
123
|
-
/* Look in previously loaded files. */
|
124
|
-
const char *label = upb_enumdef_iton(e, val);
|
125
|
-
if (!label) {
|
126
|
-
return;
|
127
|
-
}
|
128
|
-
google_protobuf_FieldDescriptorProto_set_default_value(
|
129
|
-
field, upb_strview_makez(label));
|
130
|
-
} else {
|
131
|
-
/* Look in enums defined in this file. */
|
132
|
-
const google_protobuf_EnumDescriptorProto* matching_enum = NULL;
|
133
|
-
size_t i, n;
|
134
|
-
const google_protobuf_EnumDescriptorProto* const* enums =
|
135
|
-
google_protobuf_FileDescriptorProto_enum_type(file, &n);
|
136
|
-
const google_protobuf_EnumValueDescriptorProto* const* values;
|
137
|
-
|
138
|
-
for (i = 0; i < n; i++) {
|
139
|
-
if (upb_strview_eql(google_protobuf_EnumDescriptorProto_name(enums[i]),
|
140
|
-
upb_strview_makez(type_name_str))) {
|
141
|
-
matching_enum = enums[i];
|
142
|
-
break;
|
143
|
-
}
|
144
|
-
}
|
145
|
-
|
146
|
-
if (!matching_enum) {
|
147
|
-
return;
|
148
|
-
}
|
149
|
-
|
150
|
-
values = google_protobuf_EnumDescriptorProto_value(matching_enum, &n);
|
151
|
-
for (i = 0; i < n; i++) {
|
152
|
-
if (google_protobuf_EnumValueDescriptorProto_number(values[i]) == val) {
|
153
|
-
google_protobuf_FieldDescriptorProto_set_default_value(
|
154
|
-
field, google_protobuf_EnumValueDescriptorProto_name(values[i]));
|
155
|
-
return;
|
156
|
-
}
|
157
|
-
}
|
158
|
-
|
159
|
-
/* We failed to find an enum default. But we'll just leave the enum
|
160
|
-
* untouched and let the normal def-building code catch it. */
|
161
|
-
}
|
162
|
-
}
|
163
|
-
|
164
|
-
/* Historically we allowed enum defaults to be specified as a number. In
|
165
|
-
* retrospect this was a mistake as descriptors require defaults to be
|
166
|
-
* specified as a label. This can make a difference if multiple labels have the
|
167
|
-
* same number.
|
168
|
-
*
|
169
|
-
* Here we do a pass over all enum defaults and rewrite numeric defaults by
|
170
|
-
* looking up their labels. This is complicated by the fact that the enum
|
171
|
-
* definition can live in either the symtab or the file_proto.
|
172
|
-
* */
|
173
|
-
static void rewrite_enum_defaults(
|
174
|
-
const upb_symtab* symtab, google_protobuf_FileDescriptorProto* file_proto) {
|
175
|
-
size_t i, n;
|
176
|
-
google_protobuf_DescriptorProto** msgs =
|
177
|
-
google_protobuf_FileDescriptorProto_mutable_message_type(file_proto, &n);
|
178
|
-
|
179
|
-
for (i = 0; i < n; i++) {
|
180
|
-
size_t j, m;
|
181
|
-
google_protobuf_FieldDescriptorProto** fields =
|
182
|
-
google_protobuf_DescriptorProto_mutable_field(msgs[i], &m);
|
183
|
-
for (j = 0; j < m; j++) {
|
184
|
-
rewrite_enum_default(symtab, file_proto, fields[j]);
|
185
|
-
}
|
186
|
-
}
|
187
|
-
}
|
188
|
-
|
189
|
-
static void remove_path(upb_strview *name) {
|
190
|
-
const char* last = strrchr(name->data, '.');
|
191
|
-
if (last) {
|
192
|
-
size_t remove = last - name->data + 1;
|
193
|
-
name->data += remove;
|
194
|
-
name->size -= remove;
|
195
|
-
}
|
196
|
-
}
|
197
|
-
|
198
|
-
static void rewrite_nesting(VALUE msg_ent, google_protobuf_DescriptorProto* msg,
|
199
|
-
google_protobuf_DescriptorProto* const* msgs,
|
200
|
-
google_protobuf_EnumDescriptorProto* const* enums,
|
201
|
-
upb_arena *arena) {
|
202
|
-
VALUE submsgs = rb_hash_aref(msg_ent, ID2SYM(rb_intern("msgs")));
|
203
|
-
VALUE enum_pos = rb_hash_aref(msg_ent, ID2SYM(rb_intern("enums")));
|
204
|
-
int submsg_count;
|
205
|
-
int enum_count;
|
206
|
-
int i;
|
207
|
-
google_protobuf_DescriptorProto** msg_msgs;
|
208
|
-
google_protobuf_EnumDescriptorProto** msg_enums;
|
209
|
-
|
210
|
-
Check_Type(submsgs, T_ARRAY);
|
211
|
-
Check_Type(enum_pos, T_ARRAY);
|
212
|
-
|
213
|
-
submsg_count = RARRAY_LEN(submsgs);
|
214
|
-
enum_count = RARRAY_LEN(enum_pos);
|
215
|
-
|
216
|
-
msg_msgs = google_protobuf_DescriptorProto_resize_nested_type(
|
217
|
-
msg, submsg_count, arena);
|
218
|
-
msg_enums =
|
219
|
-
google_protobuf_DescriptorProto_resize_enum_type(msg, enum_count, arena);
|
220
|
-
|
221
|
-
for (i = 0; i < submsg_count; i++) {
|
222
|
-
VALUE submsg_ent = RARRAY_PTR(submsgs)[i];
|
223
|
-
VALUE pos = rb_hash_aref(submsg_ent, ID2SYM(rb_intern("pos")));
|
224
|
-
upb_strview name;
|
225
|
-
|
226
|
-
msg_msgs[i] = msgs[NUM2INT(pos)];
|
227
|
-
name = google_protobuf_DescriptorProto_name(msg_msgs[i]);
|
228
|
-
remove_path(&name);
|
229
|
-
google_protobuf_DescriptorProto_set_name(msg_msgs[i], name);
|
230
|
-
rewrite_nesting(submsg_ent, msg_msgs[i], msgs, enums, arena);
|
231
|
-
}
|
232
|
-
|
233
|
-
for (i = 0; i < enum_count; i++) {
|
234
|
-
VALUE pos = RARRAY_PTR(enum_pos)[i];
|
235
|
-
msg_enums[i] = enums[NUM2INT(pos)];
|
236
|
-
}
|
237
|
-
}
|
238
|
-
|
239
71
|
// -----------------------------------------------------------------------------
|
240
72
|
// DescriptorPool.
|
241
73
|
// -----------------------------------------------------------------------------
|
242
74
|
|
243
75
|
typedef struct {
|
244
76
|
VALUE def_to_descriptor; // Hash table of def* -> Ruby descriptor.
|
245
|
-
|
77
|
+
upb_DefPool* symtab;
|
246
78
|
} DescriptorPool;
|
247
79
|
|
248
80
|
VALUE cDescriptorPool = Qnil;
|
@@ -258,14 +90,14 @@ static void DescriptorPool_mark(void* _self) {
|
|
258
90
|
|
259
91
|
static void DescriptorPool_free(void* _self) {
|
260
92
|
DescriptorPool* self = _self;
|
261
|
-
|
93
|
+
upb_DefPool_Free(self->symtab);
|
262
94
|
xfree(self);
|
263
95
|
}
|
264
96
|
|
265
97
|
static const rb_data_type_t DescriptorPool_type = {
|
266
|
-
|
267
|
-
|
268
|
-
|
98
|
+
"Google::Protobuf::DescriptorPool",
|
99
|
+
{DescriptorPool_mark, DescriptorPool_free, NULL},
|
100
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
269
101
|
};
|
270
102
|
|
271
103
|
static DescriptorPool* ruby_to_DescriptorPool(VALUE val) {
|
@@ -275,8 +107,8 @@ static DescriptorPool* ruby_to_DescriptorPool(VALUE val) {
|
|
275
107
|
}
|
276
108
|
|
277
109
|
// Exposed to other modules in defs.h.
|
278
|
-
const
|
279
|
-
DescriptorPool
|
110
|
+
const upb_DefPool* DescriptorPool_GetSymtab(VALUE desc_pool_rb) {
|
111
|
+
DescriptorPool* pool = ruby_to_DescriptorPool(desc_pool_rb);
|
280
112
|
return pool->symtab;
|
281
113
|
}
|
282
114
|
|
@@ -294,7 +126,7 @@ static VALUE DescriptorPool_alloc(VALUE klass) {
|
|
294
126
|
ret = TypedData_Wrap_Struct(klass, &DescriptorPool_type, self);
|
295
127
|
|
296
128
|
self->def_to_descriptor = rb_hash_new();
|
297
|
-
self->symtab =
|
129
|
+
self->symtab = upb_DefPool_New();
|
298
130
|
ObjectCache_Add(self->symtab, ret);
|
299
131
|
|
300
132
|
return ret;
|
@@ -302,20 +134,33 @@ static VALUE DescriptorPool_alloc(VALUE klass) {
|
|
302
134
|
|
303
135
|
/*
|
304
136
|
* call-seq:
|
305
|
-
* DescriptorPool.
|
137
|
+
* DescriptorPool.add_serialized_file(serialized_file_proto)
|
306
138
|
*
|
307
|
-
*
|
308
|
-
* added within the block are committed to the pool atomically, and may refer
|
309
|
-
* (co)recursively to each other. The user should call Builder#add_message and
|
310
|
-
* Builder#add_enum within the block as appropriate. This is the recommended,
|
311
|
-
* idiomatic way to define new message and enum types.
|
139
|
+
* Adds the given serialized FileDescriptorProto to the pool.
|
312
140
|
*/
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
141
|
+
VALUE DescriptorPool_add_serialized_file(VALUE _self,
|
142
|
+
VALUE serialized_file_proto) {
|
143
|
+
DescriptorPool* self = ruby_to_DescriptorPool(_self);
|
144
|
+
Check_Type(serialized_file_proto, T_STRING);
|
145
|
+
VALUE arena_rb = Arena_new();
|
146
|
+
upb_Arena* arena = Arena_get(arena_rb);
|
147
|
+
google_protobuf_FileDescriptorProto* file_proto =
|
148
|
+
google_protobuf_FileDescriptorProto_parse(
|
149
|
+
RSTRING_PTR(serialized_file_proto),
|
150
|
+
RSTRING_LEN(serialized_file_proto), arena);
|
151
|
+
if (!file_proto) {
|
152
|
+
rb_raise(rb_eArgError, "Unable to parse FileDescriptorProto");
|
153
|
+
}
|
154
|
+
upb_Status status;
|
155
|
+
upb_Status_Clear(&status);
|
156
|
+
const upb_FileDef* filedef =
|
157
|
+
upb_DefPool_AddFile(self->symtab, file_proto, &status);
|
158
|
+
if (!filedef) {
|
159
|
+
rb_raise(cTypeError, "Unable to build file to DescriptorPool: %s",
|
160
|
+
upb_Status_ErrorMessage(&status));
|
161
|
+
}
|
162
|
+
RB_GC_GUARD(arena_rb);
|
163
|
+
return get_filedef_obj(_self, filedef);
|
319
164
|
}
|
320
165
|
|
321
166
|
/*
|
@@ -328,15 +173,15 @@ static VALUE DescriptorPool_build(int argc, VALUE* argv, VALUE _self) {
|
|
328
173
|
static VALUE DescriptorPool_lookup(VALUE _self, VALUE name) {
|
329
174
|
DescriptorPool* self = ruby_to_DescriptorPool(_self);
|
330
175
|
const char* name_str = get_str(name);
|
331
|
-
const
|
332
|
-
const
|
176
|
+
const upb_MessageDef* msgdef;
|
177
|
+
const upb_EnumDef* enumdef;
|
333
178
|
|
334
|
-
msgdef =
|
179
|
+
msgdef = upb_DefPool_FindMessageByName(self->symtab, name_str);
|
335
180
|
if (msgdef) {
|
336
181
|
return get_msgdef_obj(_self, msgdef);
|
337
182
|
}
|
338
183
|
|
339
|
-
enumdef =
|
184
|
+
enumdef = upb_DefPool_FindEnumByName(self->symtab, name_str);
|
340
185
|
if (enumdef) {
|
341
186
|
return get_enumdef_obj(_self, enumdef);
|
342
187
|
}
|
@@ -358,10 +203,10 @@ static VALUE DescriptorPool_generated_pool(VALUE _self) {
|
|
358
203
|
}
|
359
204
|
|
360
205
|
static void DescriptorPool_register(VALUE module) {
|
361
|
-
VALUE klass = rb_define_class_under(
|
362
|
-
module, "DescriptorPool", rb_cObject);
|
206
|
+
VALUE klass = rb_define_class_under(module, "DescriptorPool", rb_cObject);
|
363
207
|
rb_define_alloc_func(klass, DescriptorPool_alloc);
|
364
|
-
rb_define_method(klass, "
|
208
|
+
rb_define_method(klass, "add_serialized_file",
|
209
|
+
DescriptorPool_add_serialized_file, 1);
|
365
210
|
rb_define_method(klass, "lookup", DescriptorPool_lookup, 1);
|
366
211
|
rb_define_singleton_method(klass, "generated_pool",
|
367
212
|
DescriptorPool_generated_pool, 0);
|
@@ -377,7 +222,7 @@ static void DescriptorPool_register(VALUE module) {
|
|
377
222
|
// -----------------------------------------------------------------------------
|
378
223
|
|
379
224
|
typedef struct {
|
380
|
-
const
|
225
|
+
const upb_MessageDef* msgdef;
|
381
226
|
VALUE klass;
|
382
227
|
VALUE descriptor_pool;
|
383
228
|
} Descriptor;
|
@@ -391,9 +236,9 @@ static void Descriptor_mark(void* _self) {
|
|
391
236
|
}
|
392
237
|
|
393
238
|
static const rb_data_type_t Descriptor_type = {
|
394
|
-
|
395
|
-
|
396
|
-
|
239
|
+
"Google::Protobuf::Descriptor",
|
240
|
+
{Descriptor_mark, RUBY_DEFAULT_FREE, NULL},
|
241
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
397
242
|
};
|
398
243
|
|
399
244
|
static Descriptor* ruby_to_Descriptor(VALUE val) {
|
@@ -436,7 +281,7 @@ static VALUE Descriptor_initialize(VALUE _self, VALUE cookie,
|
|
436
281
|
}
|
437
282
|
|
438
283
|
self->descriptor_pool = descriptor_pool;
|
439
|
-
self->msgdef = (const
|
284
|
+
self->msgdef = (const upb_MessageDef*)NUM2ULL(ptr);
|
440
285
|
|
441
286
|
return Qnil;
|
442
287
|
}
|
@@ -449,7 +294,8 @@ static VALUE Descriptor_initialize(VALUE _self, VALUE cookie,
|
|
449
294
|
*/
|
450
295
|
static VALUE Descriptor_file_descriptor(VALUE _self) {
|
451
296
|
Descriptor* self = ruby_to_Descriptor(_self);
|
452
|
-
return get_filedef_obj(self->descriptor_pool,
|
297
|
+
return get_filedef_obj(self->descriptor_pool,
|
298
|
+
upb_MessageDef_File(self->msgdef));
|
453
299
|
}
|
454
300
|
|
455
301
|
/*
|
@@ -461,7 +307,7 @@ static VALUE Descriptor_file_descriptor(VALUE _self) {
|
|
461
307
|
*/
|
462
308
|
static VALUE Descriptor_name(VALUE _self) {
|
463
309
|
Descriptor* self = ruby_to_Descriptor(_self);
|
464
|
-
return rb_str_maybe_null(
|
310
|
+
return rb_str_maybe_null(upb_MessageDef_FullName(self->msgdef));
|
465
311
|
}
|
466
312
|
|
467
313
|
/*
|
@@ -473,11 +319,9 @@ static VALUE Descriptor_name(VALUE _self) {
|
|
473
319
|
static VALUE Descriptor_each(VALUE _self) {
|
474
320
|
Descriptor* self = ruby_to_Descriptor(_self);
|
475
321
|
|
476
|
-
|
477
|
-
for (
|
478
|
-
|
479
|
-
upb_msg_field_next(&it)) {
|
480
|
-
const upb_fielddef* field = upb_msg_iter_field(&it);
|
322
|
+
int n = upb_MessageDef_FieldCount(self->msgdef);
|
323
|
+
for (int i = 0; i < n; i++) {
|
324
|
+
const upb_FieldDef* field = upb_MessageDef_Field(self->msgdef, i);
|
481
325
|
VALUE obj = get_fielddef_obj(self->descriptor_pool, field);
|
482
326
|
rb_yield(obj);
|
483
327
|
}
|
@@ -494,7 +338,7 @@ static VALUE Descriptor_each(VALUE _self) {
|
|
494
338
|
static VALUE Descriptor_lookup(VALUE _self, VALUE name) {
|
495
339
|
Descriptor* self = ruby_to_Descriptor(_self);
|
496
340
|
const char* s = get_str(name);
|
497
|
-
const
|
341
|
+
const upb_FieldDef* field = upb_MessageDef_FindFieldByName(self->msgdef, s);
|
498
342
|
if (field == NULL) {
|
499
343
|
return Qnil;
|
500
344
|
}
|
@@ -511,11 +355,9 @@ static VALUE Descriptor_lookup(VALUE _self, VALUE name) {
|
|
511
355
|
static VALUE Descriptor_each_oneof(VALUE _self) {
|
512
356
|
Descriptor* self = ruby_to_Descriptor(_self);
|
513
357
|
|
514
|
-
|
515
|
-
for (
|
516
|
-
|
517
|
-
upb_msg_oneof_next(&it)) {
|
518
|
-
const upb_oneofdef* oneof = upb_msg_iter_oneof(&it);
|
358
|
+
int n = upb_MessageDef_OneofCount(self->msgdef);
|
359
|
+
for (int i = 0; i < n; i++) {
|
360
|
+
const upb_OneofDef* oneof = upb_MessageDef_Oneof(self->msgdef, i);
|
519
361
|
VALUE obj = get_oneofdef_obj(self->descriptor_pool, oneof);
|
520
362
|
rb_yield(obj);
|
521
363
|
}
|
@@ -532,7 +374,7 @@ static VALUE Descriptor_each_oneof(VALUE _self) {
|
|
532
374
|
static VALUE Descriptor_lookup_oneof(VALUE _self, VALUE name) {
|
533
375
|
Descriptor* self = ruby_to_Descriptor(_self);
|
534
376
|
const char* s = get_str(name);
|
535
|
-
const
|
377
|
+
const upb_OneofDef* oneof = upb_MessageDef_FindOneofByName(self->msgdef, s);
|
536
378
|
if (oneof == NULL) {
|
537
379
|
return Qnil;
|
538
380
|
}
|
@@ -554,8 +396,7 @@ static VALUE Descriptor_msgclass(VALUE _self) {
|
|
554
396
|
}
|
555
397
|
|
556
398
|
static void Descriptor_register(VALUE module) {
|
557
|
-
VALUE klass = rb_define_class_under(
|
558
|
-
module, "Descriptor", rb_cObject);
|
399
|
+
VALUE klass = rb_define_class_under(module, "Descriptor", rb_cObject);
|
559
400
|
rb_define_alloc_func(klass, Descriptor_alloc);
|
560
401
|
rb_define_method(klass, "initialize", Descriptor_initialize, 3);
|
561
402
|
rb_define_method(klass, "each", Descriptor_each, 0);
|
@@ -575,8 +416,8 @@ static void Descriptor_register(VALUE module) {
|
|
575
416
|
// -----------------------------------------------------------------------------
|
576
417
|
|
577
418
|
typedef struct {
|
578
|
-
const
|
579
|
-
VALUE descriptor_pool; // Owns the
|
419
|
+
const upb_FileDef* filedef;
|
420
|
+
VALUE descriptor_pool; // Owns the upb_FileDef.
|
580
421
|
} FileDescriptor;
|
581
422
|
|
582
423
|
static VALUE cFileDescriptor = Qnil;
|
@@ -587,9 +428,9 @@ static void FileDescriptor_mark(void* _self) {
|
|
587
428
|
}
|
588
429
|
|
589
430
|
static const rb_data_type_t FileDescriptor_type = {
|
590
|
-
|
591
|
-
|
592
|
-
|
431
|
+
"Google::Protobuf::FileDescriptor",
|
432
|
+
{FileDescriptor_mark, RUBY_DEFAULT_FREE, NULL},
|
433
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
593
434
|
};
|
594
435
|
|
595
436
|
static FileDescriptor* ruby_to_FileDescriptor(VALUE val) {
|
@@ -614,7 +455,7 @@ static VALUE FileDescriptor_alloc(VALUE klass) {
|
|
614
455
|
* to a builder.
|
615
456
|
*/
|
616
457
|
static VALUE FileDescriptor_initialize(VALUE _self, VALUE cookie,
|
617
|
-
|
458
|
+
VALUE descriptor_pool, VALUE ptr) {
|
618
459
|
FileDescriptor* self = ruby_to_FileDescriptor(_self);
|
619
460
|
|
620
461
|
if (cookie != c_only_cookie) {
|
@@ -623,7 +464,7 @@ static VALUE FileDescriptor_initialize(VALUE _self, VALUE cookie,
|
|
623
464
|
}
|
624
465
|
|
625
466
|
self->descriptor_pool = descriptor_pool;
|
626
|
-
self->filedef = (const
|
467
|
+
self->filedef = (const upb_FileDef*)NUM2ULL(ptr);
|
627
468
|
|
628
469
|
return Qnil;
|
629
470
|
}
|
@@ -636,7 +477,7 @@ static VALUE FileDescriptor_initialize(VALUE _self, VALUE cookie,
|
|
636
477
|
*/
|
637
478
|
static VALUE FileDescriptor_name(VALUE _self) {
|
638
479
|
FileDescriptor* self = ruby_to_FileDescriptor(_self);
|
639
|
-
const char* name =
|
480
|
+
const char* name = upb_FileDef_Name(self->filedef);
|
640
481
|
return name == NULL ? Qnil : rb_str_new2(name);
|
641
482
|
}
|
642
483
|
|
@@ -652,16 +493,18 @@ static VALUE FileDescriptor_name(VALUE _self) {
|
|
652
493
|
static VALUE FileDescriptor_syntax(VALUE _self) {
|
653
494
|
FileDescriptor* self = ruby_to_FileDescriptor(_self);
|
654
495
|
|
655
|
-
switch (
|
656
|
-
case
|
657
|
-
|
658
|
-
|
496
|
+
switch (upb_FileDef_Syntax(self->filedef)) {
|
497
|
+
case kUpb_Syntax_Proto3:
|
498
|
+
return ID2SYM(rb_intern("proto3"));
|
499
|
+
case kUpb_Syntax_Proto2:
|
500
|
+
return ID2SYM(rb_intern("proto2"));
|
501
|
+
default:
|
502
|
+
return Qnil;
|
659
503
|
}
|
660
504
|
}
|
661
505
|
|
662
506
|
static void FileDescriptor_register(VALUE module) {
|
663
|
-
VALUE klass = rb_define_class_under(
|
664
|
-
module, "FileDescriptor", rb_cObject);
|
507
|
+
VALUE klass = rb_define_class_under(module, "FileDescriptor", rb_cObject);
|
665
508
|
rb_define_alloc_func(klass, FileDescriptor_alloc);
|
666
509
|
rb_define_method(klass, "initialize", FileDescriptor_initialize, 3);
|
667
510
|
rb_define_method(klass, "name", FileDescriptor_name, 0);
|
@@ -675,8 +518,8 @@ static void FileDescriptor_register(VALUE module) {
|
|
675
518
|
// -----------------------------------------------------------------------------
|
676
519
|
|
677
520
|
typedef struct {
|
678
|
-
const
|
679
|
-
VALUE descriptor_pool; // Owns the
|
521
|
+
const upb_FieldDef* fielddef;
|
522
|
+
VALUE descriptor_pool; // Owns the upb_FieldDef.
|
680
523
|
} FieldDescriptor;
|
681
524
|
|
682
525
|
static VALUE cFieldDescriptor = Qnil;
|
@@ -687,9 +530,9 @@ static void FieldDescriptor_mark(void* _self) {
|
|
687
530
|
}
|
688
531
|
|
689
532
|
static const rb_data_type_t FieldDescriptor_type = {
|
690
|
-
|
691
|
-
|
692
|
-
|
533
|
+
"Google::Protobuf::FieldDescriptor",
|
534
|
+
{FieldDescriptor_mark, RUBY_DEFAULT_FREE, NULL},
|
535
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
693
536
|
};
|
694
537
|
|
695
538
|
static FieldDescriptor* ruby_to_FieldDescriptor(VALUE val) {
|
@@ -728,7 +571,7 @@ static VALUE FieldDescriptor_initialize(VALUE _self, VALUE cookie,
|
|
728
571
|
}
|
729
572
|
|
730
573
|
self->descriptor_pool = descriptor_pool;
|
731
|
-
self->fielddef = (const
|
574
|
+
self->fielddef = (const upb_FieldDef*)NUM2ULL(ptr);
|
732
575
|
|
733
576
|
return Qnil;
|
734
577
|
}
|
@@ -741,31 +584,31 @@ static VALUE FieldDescriptor_initialize(VALUE _self, VALUE cookie,
|
|
741
584
|
*/
|
742
585
|
static VALUE FieldDescriptor_name(VALUE _self) {
|
743
586
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
744
|
-
return rb_str_maybe_null(
|
587
|
+
return rb_str_maybe_null(upb_FieldDef_Name(self->fielddef));
|
745
588
|
}
|
746
589
|
|
747
590
|
// Non-static, exposed to other .c files.
|
748
|
-
|
591
|
+
upb_CType ruby_to_fieldtype(VALUE type) {
|
749
592
|
if (TYPE(type) != T_SYMBOL) {
|
750
593
|
rb_raise(rb_eArgError, "Expected symbol for field type.");
|
751
594
|
}
|
752
595
|
|
753
|
-
#define CONVERT(upb, ruby)
|
754
|
-
if (SYM2ID(type) == rb_intern(
|
755
|
-
return
|
596
|
+
#define CONVERT(upb, ruby) \
|
597
|
+
if (SYM2ID(type) == rb_intern(#ruby)) { \
|
598
|
+
return kUpb_CType_##upb; \
|
756
599
|
}
|
757
600
|
|
758
|
-
CONVERT(
|
759
|
-
CONVERT(
|
760
|
-
CONVERT(
|
761
|
-
CONVERT(
|
762
|
-
CONVERT(
|
763
|
-
CONVERT(
|
764
|
-
CONVERT(
|
765
|
-
CONVERT(
|
766
|
-
CONVERT(
|
767
|
-
CONVERT(
|
768
|
-
CONVERT(
|
601
|
+
CONVERT(Float, float);
|
602
|
+
CONVERT(Double, double);
|
603
|
+
CONVERT(Bool, bool);
|
604
|
+
CONVERT(String, string);
|
605
|
+
CONVERT(Bytes, bytes);
|
606
|
+
CONVERT(Message, message);
|
607
|
+
CONVERT(Enum, enum);
|
608
|
+
CONVERT(Int32, int32);
|
609
|
+
CONVERT(Int64, int64);
|
610
|
+
CONVERT(UInt32, uint32);
|
611
|
+
CONVERT(UInt64, uint64);
|
769
612
|
|
770
613
|
#undef CONVERT
|
771
614
|
|
@@ -773,63 +616,29 @@ upb_fieldtype_t ruby_to_fieldtype(VALUE type) {
|
|
773
616
|
return 0;
|
774
617
|
}
|
775
618
|
|
776
|
-
static
|
777
|
-
if (TYPE(type) != T_SYMBOL) {
|
778
|
-
rb_raise(rb_eArgError, "Expected symbol for field type.");
|
779
|
-
}
|
780
|
-
|
781
|
-
#define CONVERT(upb, ruby) \
|
782
|
-
if (SYM2ID(type) == rb_intern( # ruby )) { \
|
783
|
-
return UPB_DESCRIPTOR_TYPE_ ## upb; \
|
784
|
-
}
|
785
|
-
|
786
|
-
CONVERT(FLOAT, float);
|
787
|
-
CONVERT(DOUBLE, double);
|
788
|
-
CONVERT(BOOL, bool);
|
789
|
-
CONVERT(STRING, string);
|
790
|
-
CONVERT(BYTES, bytes);
|
791
|
-
CONVERT(MESSAGE, message);
|
792
|
-
CONVERT(GROUP, group);
|
793
|
-
CONVERT(ENUM, enum);
|
794
|
-
CONVERT(INT32, int32);
|
795
|
-
CONVERT(INT64, int64);
|
796
|
-
CONVERT(UINT32, uint32);
|
797
|
-
CONVERT(UINT64, uint64);
|
798
|
-
CONVERT(SINT32, sint32);
|
799
|
-
CONVERT(SINT64, sint64);
|
800
|
-
CONVERT(FIXED32, fixed32);
|
801
|
-
CONVERT(FIXED64, fixed64);
|
802
|
-
CONVERT(SFIXED32, sfixed32);
|
803
|
-
CONVERT(SFIXED64, sfixed64);
|
804
|
-
|
805
|
-
#undef CONVERT
|
806
|
-
|
807
|
-
rb_raise(rb_eArgError, "Unknown field type.");
|
808
|
-
return 0;
|
809
|
-
}
|
810
|
-
|
811
|
-
static VALUE descriptortype_to_ruby(upb_descriptortype_t type) {
|
619
|
+
static VALUE descriptortype_to_ruby(upb_FieldType type) {
|
812
620
|
switch (type) {
|
813
|
-
#define CONVERT(upb, ruby)
|
814
|
-
|
815
|
-
|
816
|
-
CONVERT(
|
817
|
-
CONVERT(
|
818
|
-
CONVERT(
|
819
|
-
CONVERT(
|
820
|
-
CONVERT(
|
821
|
-
CONVERT(
|
822
|
-
CONVERT(
|
823
|
-
CONVERT(
|
824
|
-
CONVERT(
|
825
|
-
CONVERT(
|
826
|
-
CONVERT(
|
827
|
-
CONVERT(
|
828
|
-
CONVERT(
|
829
|
-
CONVERT(
|
830
|
-
CONVERT(
|
831
|
-
CONVERT(
|
832
|
-
CONVERT(
|
621
|
+
#define CONVERT(upb, ruby) \
|
622
|
+
case kUpb_FieldType_##upb: \
|
623
|
+
return ID2SYM(rb_intern(#ruby));
|
624
|
+
CONVERT(Float, float);
|
625
|
+
CONVERT(Double, double);
|
626
|
+
CONVERT(Bool, bool);
|
627
|
+
CONVERT(String, string);
|
628
|
+
CONVERT(Bytes, bytes);
|
629
|
+
CONVERT(Message, message);
|
630
|
+
CONVERT(Group, group);
|
631
|
+
CONVERT(Enum, enum);
|
632
|
+
CONVERT(Int32, int32);
|
633
|
+
CONVERT(Int64, int64);
|
634
|
+
CONVERT(UInt32, uint32);
|
635
|
+
CONVERT(UInt64, uint64);
|
636
|
+
CONVERT(SInt32, sint32);
|
637
|
+
CONVERT(SInt64, sint64);
|
638
|
+
CONVERT(Fixed32, fixed32);
|
639
|
+
CONVERT(Fixed64, fixed64);
|
640
|
+
CONVERT(SFixed32, sfixed32);
|
641
|
+
CONVERT(SFixed64, sfixed64);
|
833
642
|
#undef CONVERT
|
834
643
|
}
|
835
644
|
return Qnil;
|
@@ -847,7 +656,7 @@ static VALUE descriptortype_to_ruby(upb_descriptortype_t type) {
|
|
847
656
|
*/
|
848
657
|
static VALUE FieldDescriptor__type(VALUE _self) {
|
849
658
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
850
|
-
return descriptortype_to_ruby(
|
659
|
+
return descriptortype_to_ruby(upb_FieldDef_Type(self->fielddef));
|
851
660
|
}
|
852
661
|
|
853
662
|
/*
|
@@ -858,17 +667,16 @@ static VALUE FieldDescriptor__type(VALUE _self) {
|
|
858
667
|
*/
|
859
668
|
static VALUE FieldDescriptor_default(VALUE _self) {
|
860
669
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
861
|
-
const
|
862
|
-
|
863
|
-
if (
|
670
|
+
const upb_FieldDef* f = self->fielddef;
|
671
|
+
upb_MessageValue default_val = {0};
|
672
|
+
if (upb_FieldDef_IsSubMessage(f)) {
|
864
673
|
return Qnil;
|
865
|
-
} else if (!
|
866
|
-
default_val =
|
674
|
+
} else if (!upb_FieldDef_IsRepeated(f)) {
|
675
|
+
default_val = upb_FieldDef_Default(f);
|
867
676
|
}
|
868
677
|
return Convert_UpbToRuby(default_val, TypeInfo_get(self->fielddef), Qnil);
|
869
678
|
}
|
870
679
|
|
871
|
-
|
872
680
|
/*
|
873
681
|
* call-seq:
|
874
682
|
* FieldDescriptor.json_name => json_name
|
@@ -877,8 +685,8 @@ static VALUE FieldDescriptor_default(VALUE _self) {
|
|
877
685
|
*/
|
878
686
|
static VALUE FieldDescriptor_json_name(VALUE _self) {
|
879
687
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
880
|
-
const
|
881
|
-
const char
|
688
|
+
const upb_FieldDef* f = self->fielddef;
|
689
|
+
const char* json_name = upb_FieldDef_JsonName(f);
|
882
690
|
return rb_str_new2(json_name);
|
883
691
|
}
|
884
692
|
|
@@ -893,13 +701,14 @@ static VALUE FieldDescriptor_json_name(VALUE _self) {
|
|
893
701
|
*/
|
894
702
|
static VALUE FieldDescriptor_label(VALUE _self) {
|
895
703
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
896
|
-
switch (
|
897
|
-
#define CONVERT(upb, ruby)
|
898
|
-
|
704
|
+
switch (upb_FieldDef_Label(self->fielddef)) {
|
705
|
+
#define CONVERT(upb, ruby) \
|
706
|
+
case kUpb_Label_##upb: \
|
707
|
+
return ID2SYM(rb_intern(#ruby));
|
899
708
|
|
900
|
-
CONVERT(
|
901
|
-
CONVERT(
|
902
|
-
CONVERT(
|
709
|
+
CONVERT(Optional, optional);
|
710
|
+
CONVERT(Required, required);
|
711
|
+
CONVERT(Repeated, repeated);
|
903
712
|
|
904
713
|
#undef CONVERT
|
905
714
|
}
|
@@ -915,7 +724,7 @@ static VALUE FieldDescriptor_label(VALUE _self) {
|
|
915
724
|
*/
|
916
725
|
static VALUE FieldDescriptor_number(VALUE _self) {
|
917
726
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
918
|
-
return INT2NUM(
|
727
|
+
return INT2NUM(upb_FieldDef_Number(self->fielddef));
|
919
728
|
}
|
920
729
|
|
921
730
|
/*
|
@@ -929,13 +738,13 @@ static VALUE FieldDescriptor_number(VALUE _self) {
|
|
929
738
|
*/
|
930
739
|
static VALUE FieldDescriptor_submsg_name(VALUE _self) {
|
931
740
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
932
|
-
switch (
|
933
|
-
case
|
741
|
+
switch (upb_FieldDef_CType(self->fielddef)) {
|
742
|
+
case kUpb_CType_Enum:
|
934
743
|
return rb_str_new2(
|
935
|
-
|
936
|
-
case
|
744
|
+
upb_EnumDef_FullName(upb_FieldDef_EnumSubDef(self->fielddef)));
|
745
|
+
case kUpb_CType_Message:
|
937
746
|
return rb_str_new2(
|
938
|
-
|
747
|
+
upb_MessageDef_FullName(upb_FieldDef_MessageSubDef(self->fielddef)));
|
939
748
|
default:
|
940
749
|
return Qnil;
|
941
750
|
}
|
@@ -952,13 +761,13 @@ static VALUE FieldDescriptor_submsg_name(VALUE _self) {
|
|
952
761
|
*/
|
953
762
|
static VALUE FieldDescriptor_subtype(VALUE _self) {
|
954
763
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
955
|
-
switch (
|
956
|
-
case
|
764
|
+
switch (upb_FieldDef_CType(self->fielddef)) {
|
765
|
+
case kUpb_CType_Enum:
|
957
766
|
return get_enumdef_obj(self->descriptor_pool,
|
958
|
-
|
959
|
-
case
|
767
|
+
upb_FieldDef_EnumSubDef(self->fielddef));
|
768
|
+
case kUpb_CType_Message:
|
960
769
|
return get_msgdef_obj(self->descriptor_pool,
|
961
|
-
|
770
|
+
upb_FieldDef_MessageSubDef(self->fielddef));
|
962
771
|
default:
|
963
772
|
return Qnil;
|
964
773
|
}
|
@@ -973,11 +782,11 @@ static VALUE FieldDescriptor_subtype(VALUE _self) {
|
|
973
782
|
*/
|
974
783
|
static VALUE FieldDescriptor_get(VALUE _self, VALUE msg_rb) {
|
975
784
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
976
|
-
const
|
785
|
+
const upb_MessageDef* m;
|
977
786
|
|
978
787
|
Message_Get(msg_rb, &m);
|
979
788
|
|
980
|
-
if (m !=
|
789
|
+
if (m != upb_FieldDef_ContainingType(self->fielddef)) {
|
981
790
|
rb_raise(cTypeError, "get method called on wrong message type");
|
982
791
|
}
|
983
792
|
|
@@ -993,16 +802,16 @@ static VALUE FieldDescriptor_get(VALUE _self, VALUE msg_rb) {
|
|
993
802
|
*/
|
994
803
|
static VALUE FieldDescriptor_has(VALUE _self, VALUE msg_rb) {
|
995
804
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
996
|
-
const
|
997
|
-
const
|
805
|
+
const upb_MessageDef* m;
|
806
|
+
const upb_MessageDef* msg = Message_Get(msg_rb, &m);
|
998
807
|
|
999
|
-
if (m !=
|
808
|
+
if (m != upb_FieldDef_ContainingType(self->fielddef)) {
|
1000
809
|
rb_raise(cTypeError, "has method called on wrong message type");
|
1001
|
-
} else if (!
|
810
|
+
} else if (!upb_FieldDef_HasPresence(self->fielddef)) {
|
1002
811
|
rb_raise(rb_eArgError, "does not track presence");
|
1003
812
|
}
|
1004
813
|
|
1005
|
-
return
|
814
|
+
return upb_Message_HasFieldByDef(msg, self->fielddef) ? Qtrue : Qfalse;
|
1006
815
|
}
|
1007
816
|
|
1008
817
|
/*
|
@@ -1013,14 +822,14 @@ static VALUE FieldDescriptor_has(VALUE _self, VALUE msg_rb) {
|
|
1013
822
|
*/
|
1014
823
|
static VALUE FieldDescriptor_clear(VALUE _self, VALUE msg_rb) {
|
1015
824
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
1016
|
-
const
|
1017
|
-
|
825
|
+
const upb_MessageDef* m;
|
826
|
+
upb_MessageDef* msg = Message_GetMutable(msg_rb, &m);
|
1018
827
|
|
1019
|
-
if (m !=
|
828
|
+
if (m != upb_FieldDef_ContainingType(self->fielddef)) {
|
1020
829
|
rb_raise(cTypeError, "has method called on wrong message type");
|
1021
830
|
}
|
1022
831
|
|
1023
|
-
|
832
|
+
upb_Message_ClearFieldByDef(msg, self->fielddef);
|
1024
833
|
return Qnil;
|
1025
834
|
}
|
1026
835
|
|
@@ -1034,24 +843,23 @@ static VALUE FieldDescriptor_clear(VALUE _self, VALUE msg_rb) {
|
|
1034
843
|
*/
|
1035
844
|
static VALUE FieldDescriptor_set(VALUE _self, VALUE msg_rb, VALUE value) {
|
1036
845
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
1037
|
-
const
|
1038
|
-
|
1039
|
-
|
1040
|
-
|
846
|
+
const upb_MessageDef* m;
|
847
|
+
upb_MessageDef* msg = Message_GetMutable(msg_rb, &m);
|
848
|
+
upb_Arena* arena = Arena_get(Message_GetArena(msg_rb));
|
849
|
+
upb_MessageValue msgval;
|
1041
850
|
|
1042
|
-
if (m !=
|
851
|
+
if (m != upb_FieldDef_ContainingType(self->fielddef)) {
|
1043
852
|
rb_raise(cTypeError, "set method called on wrong message type");
|
1044
853
|
}
|
1045
854
|
|
1046
|
-
msgval = Convert_RubyToUpb(value,
|
855
|
+
msgval = Convert_RubyToUpb(value, upb_FieldDef_Name(self->fielddef),
|
1047
856
|
TypeInfo_get(self->fielddef), arena);
|
1048
|
-
|
857
|
+
upb_Message_SetFieldByDef(msg, self->fielddef, msgval, arena);
|
1049
858
|
return Qnil;
|
1050
859
|
}
|
1051
860
|
|
1052
861
|
static void FieldDescriptor_register(VALUE module) {
|
1053
|
-
VALUE klass = rb_define_class_under(
|
1054
|
-
module, "FieldDescriptor", rb_cObject);
|
862
|
+
VALUE klass = rb_define_class_under(module, "FieldDescriptor", rb_cObject);
|
1055
863
|
rb_define_alloc_func(klass, FieldDescriptor_alloc);
|
1056
864
|
rb_define_method(klass, "initialize", FieldDescriptor_initialize, 3);
|
1057
865
|
rb_define_method(klass, "name", FieldDescriptor_name, 0);
|
@@ -1075,8 +883,8 @@ static void FieldDescriptor_register(VALUE module) {
|
|
1075
883
|
// -----------------------------------------------------------------------------
|
1076
884
|
|
1077
885
|
typedef struct {
|
1078
|
-
const
|
1079
|
-
VALUE descriptor_pool; // Owns the
|
886
|
+
const upb_OneofDef* oneofdef;
|
887
|
+
VALUE descriptor_pool; // Owns the upb_OneofDef.
|
1080
888
|
} OneofDescriptor;
|
1081
889
|
|
1082
890
|
static VALUE cOneofDescriptor = Qnil;
|
@@ -1120,7 +928,7 @@ static VALUE OneofDescriptor_alloc(VALUE klass) {
|
|
1120
928
|
* Creates a descriptor wrapper object. May only be called from C.
|
1121
929
|
*/
|
1122
930
|
static VALUE OneofDescriptor_initialize(VALUE _self, VALUE cookie,
|
1123
|
-
|
931
|
+
VALUE descriptor_pool, VALUE ptr) {
|
1124
932
|
OneofDescriptor* self = ruby_to_OneofDescriptor(_self);
|
1125
933
|
|
1126
934
|
if (cookie != c_only_cookie) {
|
@@ -1129,7 +937,7 @@ static VALUE OneofDescriptor_initialize(VALUE _self, VALUE cookie,
|
|
1129
937
|
}
|
1130
938
|
|
1131
939
|
self->descriptor_pool = descriptor_pool;
|
1132
|
-
self->oneofdef = (const
|
940
|
+
self->oneofdef = (const upb_OneofDef*)NUM2ULL(ptr);
|
1133
941
|
|
1134
942
|
return Qnil;
|
1135
943
|
}
|
@@ -1142,7 +950,7 @@ static VALUE OneofDescriptor_initialize(VALUE _self, VALUE cookie,
|
|
1142
950
|
*/
|
1143
951
|
static VALUE OneofDescriptor_name(VALUE _self) {
|
1144
952
|
OneofDescriptor* self = ruby_to_OneofDescriptor(_self);
|
1145
|
-
return rb_str_maybe_null(
|
953
|
+
return rb_str_maybe_null(upb_OneofDef_Name(self->oneofdef));
|
1146
954
|
}
|
1147
955
|
|
1148
956
|
/*
|
@@ -1153,11 +961,10 @@ static VALUE OneofDescriptor_name(VALUE _self) {
|
|
1153
961
|
*/
|
1154
962
|
static VALUE OneofDescriptor_each(VALUE _self) {
|
1155
963
|
OneofDescriptor* self = ruby_to_OneofDescriptor(_self);
|
1156
|
-
|
1157
|
-
|
1158
|
-
|
1159
|
-
|
1160
|
-
const upb_fielddef* f = upb_oneof_iter_field(&it);
|
964
|
+
|
965
|
+
int n = upb_OneofDef_FieldCount(self->oneofdef);
|
966
|
+
for (int i = 0; i < n; i++) {
|
967
|
+
const upb_FieldDef* f = upb_OneofDef_Field(self->oneofdef, i);
|
1161
968
|
VALUE obj = get_fielddef_obj(self->descriptor_pool, f);
|
1162
969
|
rb_yield(obj);
|
1163
970
|
}
|
@@ -1165,8 +972,7 @@ static VALUE OneofDescriptor_each(VALUE _self) {
|
|
1165
972
|
}
|
1166
973
|
|
1167
974
|
static void OneofDescriptor_register(VALUE module) {
|
1168
|
-
VALUE klass = rb_define_class_under(
|
1169
|
-
module, "OneofDescriptor", rb_cObject);
|
975
|
+
VALUE klass = rb_define_class_under(module, "OneofDescriptor", rb_cObject);
|
1170
976
|
rb_define_alloc_func(klass, OneofDescriptor_alloc);
|
1171
977
|
rb_define_method(klass, "initialize", OneofDescriptor_initialize, 3);
|
1172
978
|
rb_define_method(klass, "name", OneofDescriptor_name, 0);
|
@@ -1181,9 +987,9 @@ static void OneofDescriptor_register(VALUE module) {
|
|
1181
987
|
// -----------------------------------------------------------------------------
|
1182
988
|
|
1183
989
|
typedef struct {
|
1184
|
-
const
|
1185
|
-
VALUE module;
|
1186
|
-
VALUE descriptor_pool; // Owns the
|
990
|
+
const upb_EnumDef* enumdef;
|
991
|
+
VALUE module; // begins as nil
|
992
|
+
VALUE descriptor_pool; // Owns the upb_EnumDef.
|
1187
993
|
} EnumDescriptor;
|
1188
994
|
|
1189
995
|
static VALUE cEnumDescriptor = Qnil;
|
@@ -1195,9 +1001,9 @@ static void EnumDescriptor_mark(void* _self) {
|
|
1195
1001
|
}
|
1196
1002
|
|
1197
1003
|
static const rb_data_type_t EnumDescriptor_type = {
|
1198
|
-
|
1199
|
-
|
1200
|
-
|
1004
|
+
"Google::Protobuf::EnumDescriptor",
|
1005
|
+
{EnumDescriptor_mark, RUBY_DEFAULT_FREE, NULL},
|
1006
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
1201
1007
|
};
|
1202
1008
|
|
1203
1009
|
static EnumDescriptor* ruby_to_EnumDescriptor(VALUE val) {
|
@@ -1216,8 +1022,8 @@ static VALUE EnumDescriptor_alloc(VALUE klass) {
|
|
1216
1022
|
}
|
1217
1023
|
|
1218
1024
|
// Exposed to other modules in defs.h.
|
1219
|
-
const
|
1220
|
-
EnumDescriptor
|
1025
|
+
const upb_EnumDef* EnumDescriptor_GetEnumDef(VALUE enum_desc_rb) {
|
1026
|
+
EnumDescriptor* desc = ruby_to_EnumDescriptor(enum_desc_rb);
|
1221
1027
|
return desc->enumdef;
|
1222
1028
|
}
|
1223
1029
|
|
@@ -1237,7 +1043,7 @@ static VALUE EnumDescriptor_initialize(VALUE _self, VALUE cookie,
|
|
1237
1043
|
}
|
1238
1044
|
|
1239
1045
|
self->descriptor_pool = descriptor_pool;
|
1240
|
-
self->enumdef = (const
|
1046
|
+
self->enumdef = (const upb_EnumDef*)NUM2ULL(ptr);
|
1241
1047
|
|
1242
1048
|
return Qnil;
|
1243
1049
|
}
|
@@ -1251,7 +1057,7 @@ static VALUE EnumDescriptor_initialize(VALUE _self, VALUE cookie,
|
|
1251
1057
|
static VALUE EnumDescriptor_file_descriptor(VALUE _self) {
|
1252
1058
|
EnumDescriptor* self = ruby_to_EnumDescriptor(_self);
|
1253
1059
|
return get_filedef_obj(self->descriptor_pool,
|
1254
|
-
|
1060
|
+
upb_EnumDef_File(self->enumdef));
|
1255
1061
|
}
|
1256
1062
|
|
1257
1063
|
/*
|
@@ -1262,7 +1068,7 @@ static VALUE EnumDescriptor_file_descriptor(VALUE _self) {
|
|
1262
1068
|
*/
|
1263
1069
|
static VALUE EnumDescriptor_name(VALUE _self) {
|
1264
1070
|
EnumDescriptor* self = ruby_to_EnumDescriptor(_self);
|
1265
|
-
return rb_str_maybe_null(
|
1071
|
+
return rb_str_maybe_null(upb_EnumDef_FullName(self->enumdef));
|
1266
1072
|
}
|
1267
1073
|
|
1268
1074
|
/*
|
@@ -1274,10 +1080,11 @@ static VALUE EnumDescriptor_name(VALUE _self) {
|
|
1274
1080
|
*/
|
1275
1081
|
static VALUE EnumDescriptor_lookup_name(VALUE _self, VALUE name) {
|
1276
1082
|
EnumDescriptor* self = ruby_to_EnumDescriptor(_self);
|
1277
|
-
const char* name_str= rb_id2name(SYM2ID(name));
|
1278
|
-
|
1279
|
-
|
1280
|
-
|
1083
|
+
const char* name_str = rb_id2name(SYM2ID(name));
|
1084
|
+
const upb_EnumValueDef *ev =
|
1085
|
+
upb_EnumDef_FindValueByName(self->enumdef, name_str);
|
1086
|
+
if (ev) {
|
1087
|
+
return INT2NUM(upb_EnumValueDef_Number(ev));
|
1281
1088
|
} else {
|
1282
1089
|
return Qnil;
|
1283
1090
|
}
|
@@ -1293,9 +1100,9 @@ static VALUE EnumDescriptor_lookup_name(VALUE _self, VALUE name) {
|
|
1293
1100
|
static VALUE EnumDescriptor_lookup_value(VALUE _self, VALUE number) {
|
1294
1101
|
EnumDescriptor* self = ruby_to_EnumDescriptor(_self);
|
1295
1102
|
int32_t val = NUM2INT(number);
|
1296
|
-
const
|
1297
|
-
if (
|
1298
|
-
return ID2SYM(rb_intern(
|
1103
|
+
const upb_EnumValueDef* ev = upb_EnumDef_FindValueByNumber(self->enumdef, val);
|
1104
|
+
if (ev) {
|
1105
|
+
return ID2SYM(rb_intern(upb_EnumValueDef_Name(ev)));
|
1299
1106
|
} else {
|
1300
1107
|
return Qnil;
|
1301
1108
|
}
|
@@ -1311,12 +1118,11 @@ static VALUE EnumDescriptor_lookup_value(VALUE _self, VALUE number) {
|
|
1311
1118
|
static VALUE EnumDescriptor_each(VALUE _self) {
|
1312
1119
|
EnumDescriptor* self = ruby_to_EnumDescriptor(_self);
|
1313
1120
|
|
1314
|
-
|
1315
|
-
for (
|
1316
|
-
|
1317
|
-
|
1318
|
-
VALUE
|
1319
|
-
VALUE number = INT2NUM(upb_enum_iter_number(&it));
|
1121
|
+
int n = upb_EnumDef_ValueCount(self->enumdef);
|
1122
|
+
for (int i = 0; i < n; i++) {
|
1123
|
+
const upb_EnumValueDef* ev = upb_EnumDef_Value(self->enumdef, i);
|
1124
|
+
VALUE key = ID2SYM(rb_intern(upb_EnumValueDef_Name(ev)));
|
1125
|
+
VALUE number = INT2NUM(upb_EnumValueDef_Number(ev));
|
1320
1126
|
rb_yield_values(2, key, number);
|
1321
1127
|
}
|
1322
1128
|
|
@@ -1338,8 +1144,7 @@ static VALUE EnumDescriptor_enummodule(VALUE _self) {
|
|
1338
1144
|
}
|
1339
1145
|
|
1340
1146
|
static void EnumDescriptor_register(VALUE module) {
|
1341
|
-
VALUE klass = rb_define_class_under(
|
1342
|
-
module, "EnumDescriptor", rb_cObject);
|
1147
|
+
VALUE klass = rb_define_class_under(module, "EnumDescriptor", rb_cObject);
|
1343
1148
|
rb_define_alloc_func(klass, EnumDescriptor_alloc);
|
1344
1149
|
rb_define_method(klass, "initialize", EnumDescriptor_initialize, 3);
|
1345
1150
|
rb_define_method(klass, "name", EnumDescriptor_name, 0);
|
@@ -1353,1111 +1158,6 @@ static void EnumDescriptor_register(VALUE module) {
|
|
1353
1158
|
cEnumDescriptor = klass;
|
1354
1159
|
}
|
1355
1160
|
|
1356
|
-
// -----------------------------------------------------------------------------
|
1357
|
-
// FileBuilderContext.
|
1358
|
-
// -----------------------------------------------------------------------------
|
1359
|
-
|
1360
|
-
typedef struct {
|
1361
|
-
upb_arena *arena;
|
1362
|
-
google_protobuf_FileDescriptorProto* file_proto;
|
1363
|
-
VALUE descriptor_pool;
|
1364
|
-
} FileBuilderContext;
|
1365
|
-
|
1366
|
-
static VALUE cFileBuilderContext = Qnil;
|
1367
|
-
|
1368
|
-
static void FileBuilderContext_mark(void* _self) {
|
1369
|
-
FileBuilderContext* self = _self;
|
1370
|
-
rb_gc_mark(self->descriptor_pool);
|
1371
|
-
}
|
1372
|
-
|
1373
|
-
static void FileBuilderContext_free(void* _self) {
|
1374
|
-
FileBuilderContext* self = _self;
|
1375
|
-
upb_arena_free(self->arena);
|
1376
|
-
xfree(self);
|
1377
|
-
}
|
1378
|
-
|
1379
|
-
static const rb_data_type_t FileBuilderContext_type = {
|
1380
|
-
"Google::Protobuf::Internal::FileBuilderContext",
|
1381
|
-
{FileBuilderContext_mark, FileBuilderContext_free, NULL},
|
1382
|
-
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
1383
|
-
};
|
1384
|
-
|
1385
|
-
static FileBuilderContext* ruby_to_FileBuilderContext(VALUE val) {
|
1386
|
-
FileBuilderContext* ret;
|
1387
|
-
TypedData_Get_Struct(val, FileBuilderContext, &FileBuilderContext_type, ret);
|
1388
|
-
return ret;
|
1389
|
-
}
|
1390
|
-
|
1391
|
-
static upb_strview FileBuilderContext_strdup2(VALUE _self, const char *str) {
|
1392
|
-
FileBuilderContext* self = ruby_to_FileBuilderContext(_self);
|
1393
|
-
upb_strview ret;
|
1394
|
-
char *data;
|
1395
|
-
|
1396
|
-
ret.size = strlen(str);
|
1397
|
-
data = upb_malloc(upb_arena_alloc(self->arena), ret.size + 1);
|
1398
|
-
ret.data = data;
|
1399
|
-
memcpy(data, str, ret.size);
|
1400
|
-
/* Null-terminate required by rewrite_enum_defaults() above. */
|
1401
|
-
data[ret.size] = '\0';
|
1402
|
-
return ret;
|
1403
|
-
}
|
1404
|
-
|
1405
|
-
static upb_strview FileBuilderContext_strdup(VALUE _self, VALUE rb_str) {
|
1406
|
-
return FileBuilderContext_strdup2(_self, get_str(rb_str));
|
1407
|
-
}
|
1408
|
-
|
1409
|
-
static upb_strview FileBuilderContext_strdup_sym(VALUE _self, VALUE rb_sym) {
|
1410
|
-
Check_Type(rb_sym, T_SYMBOL);
|
1411
|
-
return FileBuilderContext_strdup(_self, rb_id2str(SYM2ID(rb_sym)));
|
1412
|
-
}
|
1413
|
-
|
1414
|
-
static VALUE FileBuilderContext_alloc(VALUE klass) {
|
1415
|
-
FileBuilderContext* self = ALLOC(FileBuilderContext);
|
1416
|
-
VALUE ret = TypedData_Wrap_Struct(klass, &FileBuilderContext_type, self);
|
1417
|
-
self->arena = upb_arena_new();
|
1418
|
-
self->file_proto = google_protobuf_FileDescriptorProto_new(self->arena);
|
1419
|
-
self->descriptor_pool = Qnil;
|
1420
|
-
return ret;
|
1421
|
-
}
|
1422
|
-
|
1423
|
-
/*
|
1424
|
-
* call-seq:
|
1425
|
-
* FileBuilderContext.new(descriptor_pool) => context
|
1426
|
-
*
|
1427
|
-
* Create a new file builder context for the given file descriptor and
|
1428
|
-
* builder context. This class is intended to serve as a DSL context to be used
|
1429
|
-
* with #instance_eval.
|
1430
|
-
*/
|
1431
|
-
static VALUE FileBuilderContext_initialize(VALUE _self, VALUE descriptor_pool,
|
1432
|
-
VALUE name, VALUE options) {
|
1433
|
-
FileBuilderContext* self = ruby_to_FileBuilderContext(_self);
|
1434
|
-
self->descriptor_pool = descriptor_pool;
|
1435
|
-
|
1436
|
-
google_protobuf_FileDescriptorProto_set_name(
|
1437
|
-
self->file_proto, FileBuilderContext_strdup(_self, name));
|
1438
|
-
|
1439
|
-
// Default syntax for Ruby is proto3.
|
1440
|
-
google_protobuf_FileDescriptorProto_set_syntax(
|
1441
|
-
self->file_proto,
|
1442
|
-
FileBuilderContext_strdup(_self, rb_str_new2("proto3")));
|
1443
|
-
|
1444
|
-
if (options != Qnil) {
|
1445
|
-
VALUE syntax;
|
1446
|
-
|
1447
|
-
Check_Type(options, T_HASH);
|
1448
|
-
syntax = rb_hash_lookup2(options, ID2SYM(rb_intern("syntax")), Qnil);
|
1449
|
-
|
1450
|
-
if (syntax != Qnil) {
|
1451
|
-
VALUE syntax_str;
|
1452
|
-
|
1453
|
-
Check_Type(syntax, T_SYMBOL);
|
1454
|
-
syntax_str = rb_id2str(SYM2ID(syntax));
|
1455
|
-
google_protobuf_FileDescriptorProto_set_syntax(
|
1456
|
-
self->file_proto, FileBuilderContext_strdup(_self, syntax_str));
|
1457
|
-
}
|
1458
|
-
}
|
1459
|
-
|
1460
|
-
return Qnil;
|
1461
|
-
}
|
1462
|
-
|
1463
|
-
static void MessageBuilderContext_add_synthetic_oneofs(VALUE _self);
|
1464
|
-
|
1465
|
-
/*
|
1466
|
-
* call-seq:
|
1467
|
-
* FileBuilderContext.add_message(name, &block)
|
1468
|
-
*
|
1469
|
-
* Creates a new, empty descriptor with the given name, and invokes the block in
|
1470
|
-
* the context of a MessageBuilderContext on that descriptor. The block can then
|
1471
|
-
* call, e.g., MessageBuilderContext#optional and MessageBuilderContext#repeated
|
1472
|
-
* methods to define the message fields.
|
1473
|
-
*
|
1474
|
-
* This is the recommended, idiomatic way to build message definitions.
|
1475
|
-
*/
|
1476
|
-
static VALUE FileBuilderContext_add_message(VALUE _self, VALUE name) {
|
1477
|
-
VALUE args[2] = { _self, name };
|
1478
|
-
VALUE ctx = rb_class_new_instance(2, args, cMessageBuilderContext);
|
1479
|
-
VALUE block = rb_block_proc();
|
1480
|
-
rb_funcall_with_block(ctx, rb_intern("instance_eval"), 0, NULL, block);
|
1481
|
-
MessageBuilderContext_add_synthetic_oneofs(ctx);
|
1482
|
-
return Qnil;
|
1483
|
-
}
|
1484
|
-
|
1485
|
-
/* We have to do some relatively complicated logic here for backward
|
1486
|
-
* compatibility.
|
1487
|
-
*
|
1488
|
-
* In descriptor.proto, messages are nested inside other messages if that is
|
1489
|
-
* what the original .proto file looks like. For example, suppose we have this
|
1490
|
-
* foo.proto:
|
1491
|
-
*
|
1492
|
-
* package foo;
|
1493
|
-
* message Bar {
|
1494
|
-
* message Baz {}
|
1495
|
-
* }
|
1496
|
-
*
|
1497
|
-
* The descriptor for this must look like this:
|
1498
|
-
*
|
1499
|
-
* file {
|
1500
|
-
* name: "test.proto"
|
1501
|
-
* package: "foo"
|
1502
|
-
* message_type {
|
1503
|
-
* name: "Bar"
|
1504
|
-
* nested_type {
|
1505
|
-
* name: "Baz"
|
1506
|
-
* }
|
1507
|
-
* }
|
1508
|
-
* }
|
1509
|
-
*
|
1510
|
-
* However, the Ruby generated code has always generated messages in a flat,
|
1511
|
-
* non-nested way:
|
1512
|
-
*
|
1513
|
-
* Google::Protobuf::DescriptorPool.generated_pool.build do
|
1514
|
-
* add_message "foo.Bar" do
|
1515
|
-
* end
|
1516
|
-
* add_message "foo.Bar.Baz" do
|
1517
|
-
* end
|
1518
|
-
* end
|
1519
|
-
*
|
1520
|
-
* Here we need to do a translation where we turn this generated code into the
|
1521
|
-
* above descriptor. We need to infer that "foo" is the package name, and not
|
1522
|
-
* a message itself.
|
1523
|
-
*
|
1524
|
-
* We delegate to Ruby to compute the transformation, for more concice and
|
1525
|
-
* readable code than we can do in C */
|
1526
|
-
static void rewrite_names(VALUE _file_builder,
|
1527
|
-
google_protobuf_FileDescriptorProto* file_proto) {
|
1528
|
-
FileBuilderContext* file_builder = ruby_to_FileBuilderContext(_file_builder);
|
1529
|
-
upb_arena *arena = file_builder->arena;
|
1530
|
-
// Build params (package, msg_names, enum_names).
|
1531
|
-
VALUE package = Qnil;
|
1532
|
-
VALUE msg_names = rb_ary_new();
|
1533
|
-
VALUE enum_names = rb_ary_new();
|
1534
|
-
size_t msg_count, enum_count, i;
|
1535
|
-
VALUE new_package, nesting, msg_ents, enum_ents;
|
1536
|
-
google_protobuf_DescriptorProto** msgs;
|
1537
|
-
google_protobuf_EnumDescriptorProto** enums;
|
1538
|
-
|
1539
|
-
if (google_protobuf_FileDescriptorProto_has_package(file_proto)) {
|
1540
|
-
upb_strview package_str =
|
1541
|
-
google_protobuf_FileDescriptorProto_package(file_proto);
|
1542
|
-
package = rb_str_new(package_str.data, package_str.size);
|
1543
|
-
}
|
1544
|
-
|
1545
|
-
msgs = google_protobuf_FileDescriptorProto_mutable_message_type(file_proto,
|
1546
|
-
&msg_count);
|
1547
|
-
for (i = 0; i < msg_count; i++) {
|
1548
|
-
upb_strview name = google_protobuf_DescriptorProto_name(msgs[i]);
|
1549
|
-
rb_ary_push(msg_names, rb_str_new(name.data, name.size));
|
1550
|
-
}
|
1551
|
-
|
1552
|
-
enums = google_protobuf_FileDescriptorProto_mutable_enum_type(file_proto,
|
1553
|
-
&enum_count);
|
1554
|
-
for (i = 0; i < enum_count; i++) {
|
1555
|
-
upb_strview name = google_protobuf_EnumDescriptorProto_name(enums[i]);
|
1556
|
-
rb_ary_push(enum_names, rb_str_new(name.data, name.size));
|
1557
|
-
}
|
1558
|
-
|
1559
|
-
{
|
1560
|
-
// Call Ruby code to calculate package name and nesting.
|
1561
|
-
VALUE args[3] = { package, msg_names, enum_names };
|
1562
|
-
VALUE internal = rb_eval_string("Google::Protobuf::Internal");
|
1563
|
-
VALUE ret = rb_funcallv(internal, rb_intern("fixup_descriptor"), 3, args);
|
1564
|
-
|
1565
|
-
new_package = rb_ary_entry(ret, 0);
|
1566
|
-
nesting = rb_ary_entry(ret, 1);
|
1567
|
-
}
|
1568
|
-
|
1569
|
-
// Rewrite package and names.
|
1570
|
-
if (new_package != Qnil) {
|
1571
|
-
upb_strview new_package_str =
|
1572
|
-
FileBuilderContext_strdup(_file_builder, new_package);
|
1573
|
-
google_protobuf_FileDescriptorProto_set_package(file_proto,
|
1574
|
-
new_package_str);
|
1575
|
-
}
|
1576
|
-
|
1577
|
-
for (i = 0; i < msg_count; i++) {
|
1578
|
-
upb_strview name = google_protobuf_DescriptorProto_name(msgs[i]);
|
1579
|
-
remove_path(&name);
|
1580
|
-
google_protobuf_DescriptorProto_set_name(msgs[i], name);
|
1581
|
-
}
|
1582
|
-
|
1583
|
-
for (i = 0; i < enum_count; i++) {
|
1584
|
-
upb_strview name = google_protobuf_EnumDescriptorProto_name(enums[i]);
|
1585
|
-
remove_path(&name);
|
1586
|
-
google_protobuf_EnumDescriptorProto_set_name(enums[i], name);
|
1587
|
-
}
|
1588
|
-
|
1589
|
-
// Rewrite nesting.
|
1590
|
-
msg_ents = rb_hash_aref(nesting, ID2SYM(rb_intern("msgs")));
|
1591
|
-
enum_ents = rb_hash_aref(nesting, ID2SYM(rb_intern("enums")));
|
1592
|
-
|
1593
|
-
Check_Type(msg_ents, T_ARRAY);
|
1594
|
-
Check_Type(enum_ents, T_ARRAY);
|
1595
|
-
|
1596
|
-
for (i = 0; i < (size_t)RARRAY_LEN(msg_ents); i++) {
|
1597
|
-
VALUE msg_ent = rb_ary_entry(msg_ents, i);
|
1598
|
-
VALUE pos = rb_hash_aref(msg_ent, ID2SYM(rb_intern("pos")));
|
1599
|
-
msgs[i] = msgs[NUM2INT(pos)];
|
1600
|
-
rewrite_nesting(msg_ent, msgs[i], msgs, enums, arena);
|
1601
|
-
}
|
1602
|
-
|
1603
|
-
for (i = 0; i < (size_t)RARRAY_LEN(enum_ents); i++) {
|
1604
|
-
VALUE enum_pos = rb_ary_entry(enum_ents, i);
|
1605
|
-
enums[i] = enums[NUM2INT(enum_pos)];
|
1606
|
-
}
|
1607
|
-
|
1608
|
-
google_protobuf_FileDescriptorProto_resize_message_type(
|
1609
|
-
file_proto, RARRAY_LEN(msg_ents), arena);
|
1610
|
-
google_protobuf_FileDescriptorProto_resize_enum_type(
|
1611
|
-
file_proto, RARRAY_LEN(enum_ents), arena);
|
1612
|
-
}
|
1613
|
-
|
1614
|
-
/*
|
1615
|
-
* call-seq:
|
1616
|
-
* FileBuilderContext.add_enum(name, &block)
|
1617
|
-
*
|
1618
|
-
* Creates a new, empty enum descriptor with the given name, and invokes the
|
1619
|
-
* block in the context of an EnumBuilderContext on that descriptor. The block
|
1620
|
-
* can then call EnumBuilderContext#add_value to define the enum values.
|
1621
|
-
*
|
1622
|
-
* This is the recommended, idiomatic way to build enum definitions.
|
1623
|
-
*/
|
1624
|
-
static VALUE FileBuilderContext_add_enum(VALUE _self, VALUE name) {
|
1625
|
-
VALUE args[2] = { _self, name };
|
1626
|
-
VALUE ctx = rb_class_new_instance(2, args, cEnumBuilderContext);
|
1627
|
-
VALUE block = rb_block_proc();
|
1628
|
-
rb_funcall_with_block(ctx, rb_intern("instance_eval"), 0, NULL, block);
|
1629
|
-
return Qnil;
|
1630
|
-
}
|
1631
|
-
|
1632
|
-
static void FileBuilderContext_build(VALUE _self) {
|
1633
|
-
FileBuilderContext* self = ruby_to_FileBuilderContext(_self);
|
1634
|
-
DescriptorPool* pool = ruby_to_DescriptorPool(self->descriptor_pool);
|
1635
|
-
upb_status status;
|
1636
|
-
|
1637
|
-
rewrite_enum_defaults(pool->symtab, self->file_proto);
|
1638
|
-
rewrite_names(_self, self->file_proto);
|
1639
|
-
|
1640
|
-
upb_status_clear(&status);
|
1641
|
-
if (!upb_symtab_addfile(pool->symtab, self->file_proto, &status)) {
|
1642
|
-
rb_raise(cTypeError, "Unable to add defs to DescriptorPool: %s",
|
1643
|
-
upb_status_errmsg(&status));
|
1644
|
-
}
|
1645
|
-
}
|
1646
|
-
|
1647
|
-
static void FileBuilderContext_register(VALUE module) {
|
1648
|
-
VALUE klass = rb_define_class_under(module, "FileBuilderContext", rb_cObject);
|
1649
|
-
rb_define_alloc_func(klass, FileBuilderContext_alloc);
|
1650
|
-
rb_define_method(klass, "initialize", FileBuilderContext_initialize, 3);
|
1651
|
-
rb_define_method(klass, "add_message", FileBuilderContext_add_message, 1);
|
1652
|
-
rb_define_method(klass, "add_enum", FileBuilderContext_add_enum, 1);
|
1653
|
-
rb_gc_register_address(&cFileBuilderContext);
|
1654
|
-
cFileBuilderContext = klass;
|
1655
|
-
}
|
1656
|
-
|
1657
|
-
// -----------------------------------------------------------------------------
|
1658
|
-
// MessageBuilderContext.
|
1659
|
-
// -----------------------------------------------------------------------------
|
1660
|
-
|
1661
|
-
typedef struct {
|
1662
|
-
google_protobuf_DescriptorProto* msg_proto;
|
1663
|
-
VALUE file_builder;
|
1664
|
-
} MessageBuilderContext;
|
1665
|
-
|
1666
|
-
static VALUE cMessageBuilderContext = Qnil;
|
1667
|
-
|
1668
|
-
static void MessageBuilderContext_mark(void* _self) {
|
1669
|
-
MessageBuilderContext* self = _self;
|
1670
|
-
rb_gc_mark(self->file_builder);
|
1671
|
-
}
|
1672
|
-
|
1673
|
-
static const rb_data_type_t MessageBuilderContext_type = {
|
1674
|
-
"Google::Protobuf::Internal::MessageBuilderContext",
|
1675
|
-
{MessageBuilderContext_mark, RUBY_DEFAULT_FREE, NULL},
|
1676
|
-
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
1677
|
-
};
|
1678
|
-
|
1679
|
-
static MessageBuilderContext* ruby_to_MessageBuilderContext(VALUE val) {
|
1680
|
-
MessageBuilderContext* ret;
|
1681
|
-
TypedData_Get_Struct(val, MessageBuilderContext, &MessageBuilderContext_type,
|
1682
|
-
ret);
|
1683
|
-
return ret;
|
1684
|
-
}
|
1685
|
-
|
1686
|
-
static VALUE MessageBuilderContext_alloc(VALUE klass) {
|
1687
|
-
MessageBuilderContext* self = ALLOC(MessageBuilderContext);
|
1688
|
-
VALUE ret = TypedData_Wrap_Struct(klass, &MessageBuilderContext_type, self);
|
1689
|
-
self->file_builder = Qnil;
|
1690
|
-
return ret;
|
1691
|
-
}
|
1692
|
-
|
1693
|
-
/*
|
1694
|
-
* call-seq:
|
1695
|
-
* MessageBuilderContext.new(file_builder, name) => context
|
1696
|
-
*
|
1697
|
-
* Create a new message builder context around the given message descriptor and
|
1698
|
-
* builder context. This class is intended to serve as a DSL context to be used
|
1699
|
-
* with #instance_eval.
|
1700
|
-
*/
|
1701
|
-
static VALUE MessageBuilderContext_initialize(VALUE _self, VALUE _file_builder,
|
1702
|
-
VALUE name) {
|
1703
|
-
MessageBuilderContext* self = ruby_to_MessageBuilderContext(_self);
|
1704
|
-
FileBuilderContext* file_builder = ruby_to_FileBuilderContext(_file_builder);
|
1705
|
-
google_protobuf_FileDescriptorProto* file_proto = file_builder->file_proto;
|
1706
|
-
|
1707
|
-
self->file_builder = _file_builder;
|
1708
|
-
self->msg_proto = google_protobuf_FileDescriptorProto_add_message_type(
|
1709
|
-
file_proto, file_builder->arena);
|
1710
|
-
|
1711
|
-
google_protobuf_DescriptorProto_set_name(
|
1712
|
-
self->msg_proto, FileBuilderContext_strdup(_file_builder, name));
|
1713
|
-
|
1714
|
-
return Qnil;
|
1715
|
-
}
|
1716
|
-
|
1717
|
-
static void msgdef_add_field(VALUE msgbuilder_rb, upb_label_t label, VALUE name,
|
1718
|
-
VALUE type, VALUE number, VALUE type_class,
|
1719
|
-
VALUE options, int oneof_index,
|
1720
|
-
bool proto3_optional) {
|
1721
|
-
MessageBuilderContext* self = ruby_to_MessageBuilderContext(msgbuilder_rb);
|
1722
|
-
FileBuilderContext* file_context =
|
1723
|
-
ruby_to_FileBuilderContext(self->file_builder);
|
1724
|
-
google_protobuf_FieldDescriptorProto* field_proto;
|
1725
|
-
VALUE name_str;
|
1726
|
-
|
1727
|
-
field_proto = google_protobuf_DescriptorProto_add_field(self->msg_proto,
|
1728
|
-
file_context->arena);
|
1729
|
-
|
1730
|
-
Check_Type(name, T_SYMBOL);
|
1731
|
-
name_str = rb_id2str(SYM2ID(name));
|
1732
|
-
|
1733
|
-
google_protobuf_FieldDescriptorProto_set_name(
|
1734
|
-
field_proto, FileBuilderContext_strdup(self->file_builder, name_str));
|
1735
|
-
google_protobuf_FieldDescriptorProto_set_number(field_proto, NUM2INT(number));
|
1736
|
-
google_protobuf_FieldDescriptorProto_set_label(field_proto, (int)label);
|
1737
|
-
google_protobuf_FieldDescriptorProto_set_type(
|
1738
|
-
field_proto, (int)ruby_to_descriptortype(type));
|
1739
|
-
|
1740
|
-
if (proto3_optional) {
|
1741
|
-
google_protobuf_FieldDescriptorProto_set_proto3_optional(field_proto, true);
|
1742
|
-
}
|
1743
|
-
|
1744
|
-
if (type_class != Qnil) {
|
1745
|
-
Check_Type(type_class, T_STRING);
|
1746
|
-
|
1747
|
-
// Make it an absolute type name by prepending a dot.
|
1748
|
-
type_class = rb_str_append(rb_str_new2("."), type_class);
|
1749
|
-
google_protobuf_FieldDescriptorProto_set_type_name(
|
1750
|
-
field_proto, FileBuilderContext_strdup(self->file_builder, type_class));
|
1751
|
-
}
|
1752
|
-
|
1753
|
-
if (options != Qnil) {
|
1754
|
-
Check_Type(options, T_HASH);
|
1755
|
-
|
1756
|
-
if (rb_funcall(options, rb_intern("key?"), 1,
|
1757
|
-
ID2SYM(rb_intern("default"))) == Qtrue) {
|
1758
|
-
VALUE default_value =
|
1759
|
-
rb_hash_lookup(options, ID2SYM(rb_intern("default")));
|
1760
|
-
|
1761
|
-
/* Call #to_s since all defaults are strings in the descriptor. */
|
1762
|
-
default_value = rb_funcall(default_value, rb_intern("to_s"), 0);
|
1763
|
-
|
1764
|
-
google_protobuf_FieldDescriptorProto_set_default_value(
|
1765
|
-
field_proto,
|
1766
|
-
FileBuilderContext_strdup(self->file_builder, default_value));
|
1767
|
-
}
|
1768
|
-
|
1769
|
-
if (rb_funcall(options, rb_intern("key?"), 1,
|
1770
|
-
ID2SYM(rb_intern("json_name"))) == Qtrue) {
|
1771
|
-
VALUE json_name =
|
1772
|
-
rb_hash_lookup(options, ID2SYM(rb_intern("json_name")));
|
1773
|
-
|
1774
|
-
google_protobuf_FieldDescriptorProto_set_json_name(
|
1775
|
-
field_proto,
|
1776
|
-
FileBuilderContext_strdup(self->file_builder, json_name));
|
1777
|
-
}
|
1778
|
-
}
|
1779
|
-
|
1780
|
-
if (oneof_index >= 0) {
|
1781
|
-
google_protobuf_FieldDescriptorProto_set_oneof_index(field_proto,
|
1782
|
-
oneof_index);
|
1783
|
-
}
|
1784
|
-
}
|
1785
|
-
|
1786
|
-
#if RUBY_API_VERSION_CODE >= 20700
|
1787
|
-
static VALUE make_mapentry(VALUE _message_builder, VALUE types, int argc,
|
1788
|
-
const VALUE* argv, VALUE blockarg) {
|
1789
|
-
(void)blockarg;
|
1790
|
-
#else
|
1791
|
-
static VALUE make_mapentry(VALUE _message_builder, VALUE types, int argc,
|
1792
|
-
VALUE* argv) {
|
1793
|
-
#endif
|
1794
|
-
MessageBuilderContext* message_builder =
|
1795
|
-
ruby_to_MessageBuilderContext(_message_builder);
|
1796
|
-
VALUE type_class = rb_ary_entry(types, 2);
|
1797
|
-
FileBuilderContext* file_context =
|
1798
|
-
ruby_to_FileBuilderContext(message_builder->file_builder);
|
1799
|
-
google_protobuf_MessageOptions* options =
|
1800
|
-
google_protobuf_DescriptorProto_mutable_options(
|
1801
|
-
message_builder->msg_proto, file_context->arena);
|
1802
|
-
|
1803
|
-
google_protobuf_MessageOptions_set_map_entry(options, true);
|
1804
|
-
|
1805
|
-
// optional <type> key = 1;
|
1806
|
-
rb_funcall(_message_builder, rb_intern("optional"), 3,
|
1807
|
-
ID2SYM(rb_intern("key")), rb_ary_entry(types, 0), INT2NUM(1));
|
1808
|
-
|
1809
|
-
// optional <type> value = 2;
|
1810
|
-
if (type_class == Qnil) {
|
1811
|
-
rb_funcall(_message_builder, rb_intern("optional"), 3,
|
1812
|
-
ID2SYM(rb_intern("value")), rb_ary_entry(types, 1), INT2NUM(2));
|
1813
|
-
} else {
|
1814
|
-
rb_funcall(_message_builder, rb_intern("optional"), 4,
|
1815
|
-
ID2SYM(rb_intern("value")), rb_ary_entry(types, 1), INT2NUM(2),
|
1816
|
-
type_class);
|
1817
|
-
}
|
1818
|
-
|
1819
|
-
return Qnil;
|
1820
|
-
}
|
1821
|
-
|
1822
|
-
/*
|
1823
|
-
* call-seq:
|
1824
|
-
* MessageBuilderContext.optional(name, type, number, type_class = nil,
|
1825
|
-
* options = nil)
|
1826
|
-
*
|
1827
|
-
* Defines a new optional field on this message type with the given type, tag
|
1828
|
-
* number, and type class (for message and enum fields). The type must be a Ruby
|
1829
|
-
* symbol (as accepted by FieldDescriptor#type=) and the type_class must be a
|
1830
|
-
* string, if present (as accepted by FieldDescriptor#submsg_name=).
|
1831
|
-
*/
|
1832
|
-
VALUE MessageBuilderContext_optional(int argc, VALUE* argv, VALUE _self) {
|
1833
|
-
VALUE name, type, number;
|
1834
|
-
VALUE type_class, options = Qnil;
|
1835
|
-
|
1836
|
-
rb_scan_args(argc, argv, "32", &name, &type, &number, &type_class, &options);
|
1837
|
-
|
1838
|
-
// Allow passing (name, type, number, options) or
|
1839
|
-
// (name, type, number, type_class, options)
|
1840
|
-
if (argc == 4 && RB_TYPE_P(type_class, T_HASH)) {
|
1841
|
-
options = type_class;
|
1842
|
-
type_class = Qnil;
|
1843
|
-
}
|
1844
|
-
|
1845
|
-
msgdef_add_field(_self, UPB_LABEL_OPTIONAL, name, type, number, type_class,
|
1846
|
-
options, -1, false);
|
1847
|
-
|
1848
|
-
return Qnil;
|
1849
|
-
}
|
1850
|
-
|
1851
|
-
/*
|
1852
|
-
* call-seq:
|
1853
|
-
* MessageBuilderContext.proto3_optional(name, type, number,
|
1854
|
-
* type_class = nil, options = nil)
|
1855
|
-
*
|
1856
|
-
* Defines a true proto3 optional field (that tracks presence) on this message
|
1857
|
-
* type with the given type, tag number, and type class (for message and enum
|
1858
|
-
* fields). The type must be a Ruby symbol (as accepted by
|
1859
|
-
* FieldDescriptor#type=) and the type_class must be a string, if present (as
|
1860
|
-
* accepted by FieldDescriptor#submsg_name=).
|
1861
|
-
*/
|
1862
|
-
static VALUE MessageBuilderContext_proto3_optional(int argc, VALUE* argv,
|
1863
|
-
VALUE _self) {
|
1864
|
-
VALUE name, type, number;
|
1865
|
-
VALUE type_class, options = Qnil;
|
1866
|
-
|
1867
|
-
rb_scan_args(argc, argv, "32", &name, &type, &number, &type_class, &options);
|
1868
|
-
|
1869
|
-
// Allow passing (name, type, number, options) or
|
1870
|
-
// (name, type, number, type_class, options)
|
1871
|
-
if (argc == 4 && RB_TYPE_P(type_class, T_HASH)) {
|
1872
|
-
options = type_class;
|
1873
|
-
type_class = Qnil;
|
1874
|
-
}
|
1875
|
-
|
1876
|
-
msgdef_add_field(_self, UPB_LABEL_OPTIONAL, name, type, number, type_class,
|
1877
|
-
options, -1, true);
|
1878
|
-
|
1879
|
-
return Qnil;
|
1880
|
-
}
|
1881
|
-
|
1882
|
-
/*
|
1883
|
-
* call-seq:
|
1884
|
-
* MessageBuilderContext.required(name, type, number, type_class = nil,
|
1885
|
-
* options = nil)
|
1886
|
-
*
|
1887
|
-
* Defines a new required field on this message type with the given type, tag
|
1888
|
-
* number, and type class (for message and enum fields). The type must be a Ruby
|
1889
|
-
* symbol (as accepted by FieldDescriptor#type=) and the type_class must be a
|
1890
|
-
* string, if present (as accepted by FieldDescriptor#submsg_name=).
|
1891
|
-
*
|
1892
|
-
* Proto3 does not have required fields, but this method exists for
|
1893
|
-
* completeness. Any attempt to add a message type with required fields to a
|
1894
|
-
* pool will currently result in an error.
|
1895
|
-
*/
|
1896
|
-
static VALUE MessageBuilderContext_required(int argc, VALUE* argv,
|
1897
|
-
VALUE _self) {
|
1898
|
-
VALUE name, type, number;
|
1899
|
-
VALUE type_class, options = Qnil;
|
1900
|
-
|
1901
|
-
rb_scan_args(argc, argv, "32", &name, &type, &number, &type_class, &options);
|
1902
|
-
|
1903
|
-
// Allow passing (name, type, number, options) or
|
1904
|
-
// (name, type, number, type_class, options)
|
1905
|
-
if (argc == 4 && RB_TYPE_P(type_class, T_HASH)) {
|
1906
|
-
options = type_class;
|
1907
|
-
type_class = Qnil;
|
1908
|
-
}
|
1909
|
-
|
1910
|
-
msgdef_add_field(_self, UPB_LABEL_REQUIRED, name, type, number, type_class,
|
1911
|
-
options, -1, false);
|
1912
|
-
|
1913
|
-
return Qnil;
|
1914
|
-
}
|
1915
|
-
|
1916
|
-
/*
|
1917
|
-
* call-seq:
|
1918
|
-
* MessageBuilderContext.repeated(name, type, number, type_class = nil)
|
1919
|
-
*
|
1920
|
-
* Defines a new repeated field on this message type with the given type, tag
|
1921
|
-
* number, and type class (for message and enum fields). The type must be a Ruby
|
1922
|
-
* symbol (as accepted by FieldDescriptor#type=) and the type_class must be a
|
1923
|
-
* string, if present (as accepted by FieldDescriptor#submsg_name=).
|
1924
|
-
*/
|
1925
|
-
static VALUE MessageBuilderContext_repeated(int argc, VALUE* argv,
|
1926
|
-
VALUE _self) {
|
1927
|
-
VALUE name, type, number;
|
1928
|
-
VALUE type_class, options = Qnil;
|
1929
|
-
|
1930
|
-
rb_scan_args(argc, argv, "32", &name, &type, &number, &type_class, &options);
|
1931
|
-
|
1932
|
-
// Allow passing (name, type, number, options) or
|
1933
|
-
// (name, type, number, type_class, options)
|
1934
|
-
if (argc == 4 && RB_TYPE_P(type_class, T_HASH)) {
|
1935
|
-
options = type_class;
|
1936
|
-
type_class = Qnil;
|
1937
|
-
}
|
1938
|
-
|
1939
|
-
msgdef_add_field(_self, UPB_LABEL_REPEATED, name, type, number, type_class,
|
1940
|
-
options, -1, false);
|
1941
|
-
|
1942
|
-
return Qnil;
|
1943
|
-
}
|
1944
|
-
|
1945
|
-
/*
|
1946
|
-
* call-seq:
|
1947
|
-
* MessageBuilderContext.map(name, key_type, value_type, number,
|
1948
|
-
* value_type_class = nil)
|
1949
|
-
*
|
1950
|
-
* Defines a new map field on this message type with the given key and value
|
1951
|
-
* types, tag number, and type class (for message and enum value types). The key
|
1952
|
-
* type must be :int32/:uint32/:int64/:uint64, :bool, or :string. The value type
|
1953
|
-
* type must be a Ruby symbol (as accepted by FieldDescriptor#type=) and the
|
1954
|
-
* type_class must be a string, if present (as accepted by
|
1955
|
-
* FieldDescriptor#submsg_name=).
|
1956
|
-
*/
|
1957
|
-
static VALUE MessageBuilderContext_map(int argc, VALUE* argv, VALUE _self) {
|
1958
|
-
MessageBuilderContext* self = ruby_to_MessageBuilderContext(_self);
|
1959
|
-
VALUE name, key_type, value_type, number, type_class;
|
1960
|
-
VALUE mapentry_desc_name;
|
1961
|
-
FileBuilderContext* file_builder;
|
1962
|
-
upb_strview msg_name;
|
1963
|
-
|
1964
|
-
if (argc < 4) {
|
1965
|
-
rb_raise(rb_eArgError, "Expected at least 4 arguments.");
|
1966
|
-
}
|
1967
|
-
name = argv[0];
|
1968
|
-
key_type = argv[1];
|
1969
|
-
value_type = argv[2];
|
1970
|
-
number = argv[3];
|
1971
|
-
type_class = (argc > 4) ? argv[4] : Qnil;
|
1972
|
-
|
1973
|
-
// Validate the key type. We can't accept enums, messages, or floats/doubles
|
1974
|
-
// as map keys. (We exclude these explicitly, and the field-descriptor setter
|
1975
|
-
// below then ensures that the type is one of the remaining valid options.)
|
1976
|
-
if (SYM2ID(key_type) == rb_intern("float") ||
|
1977
|
-
SYM2ID(key_type) == rb_intern("double") ||
|
1978
|
-
SYM2ID(key_type) == rb_intern("enum") ||
|
1979
|
-
SYM2ID(key_type) == rb_intern("message")) {
|
1980
|
-
rb_raise(rb_eArgError,
|
1981
|
-
"Cannot add a map field with a float, double, enum, or message "
|
1982
|
-
"type.");
|
1983
|
-
}
|
1984
|
-
|
1985
|
-
file_builder = ruby_to_FileBuilderContext(self->file_builder);
|
1986
|
-
|
1987
|
-
// Create a new message descriptor for the map entry message, and create a
|
1988
|
-
// repeated submessage field here with that type.
|
1989
|
-
msg_name = google_protobuf_DescriptorProto_name(self->msg_proto);
|
1990
|
-
mapentry_desc_name = rb_str_new(msg_name.data, msg_name.size);
|
1991
|
-
mapentry_desc_name = rb_str_cat2(mapentry_desc_name, "_MapEntry_");
|
1992
|
-
mapentry_desc_name =
|
1993
|
-
rb_str_cat2(mapentry_desc_name, rb_id2name(SYM2ID(name)));
|
1994
|
-
|
1995
|
-
{
|
1996
|
-
// message <msgname>_MapEntry_ { /* ... */ }
|
1997
|
-
VALUE args[1] = {mapentry_desc_name};
|
1998
|
-
VALUE types = rb_ary_new3(3, key_type, value_type, type_class);
|
1999
|
-
rb_block_call(self->file_builder, rb_intern("add_message"), 1, args,
|
2000
|
-
make_mapentry, types);
|
2001
|
-
}
|
2002
|
-
|
2003
|
-
// If this file is in a package, we need to qualify the map entry type.
|
2004
|
-
if (google_protobuf_FileDescriptorProto_has_package(file_builder->file_proto)) {
|
2005
|
-
upb_strview package_view =
|
2006
|
-
google_protobuf_FileDescriptorProto_package(file_builder->file_proto);
|
2007
|
-
VALUE package = rb_str_new(package_view.data, package_view.size);
|
2008
|
-
package = rb_str_cat2(package, ".");
|
2009
|
-
mapentry_desc_name = rb_str_concat(package, mapentry_desc_name);
|
2010
|
-
}
|
2011
|
-
|
2012
|
-
// repeated MapEntry <name> = <number>;
|
2013
|
-
rb_funcall(_self, rb_intern("repeated"), 4, name,
|
2014
|
-
ID2SYM(rb_intern("message")), number, mapentry_desc_name);
|
2015
|
-
|
2016
|
-
return Qnil;
|
2017
|
-
}
|
2018
|
-
|
2019
|
-
/*
|
2020
|
-
* call-seq:
|
2021
|
-
* MessageBuilderContext.oneof(name, &block) => nil
|
2022
|
-
*
|
2023
|
-
* Creates a new OneofDescriptor with the given name, creates a
|
2024
|
-
* OneofBuilderContext attached to that OneofDescriptor, evaluates the given
|
2025
|
-
* block in the context of that OneofBuilderContext with #instance_eval, and
|
2026
|
-
* then adds the oneof to the message.
|
2027
|
-
*
|
2028
|
-
* This is the recommended, idiomatic way to build oneof definitions.
|
2029
|
-
*/
|
2030
|
-
static VALUE MessageBuilderContext_oneof(VALUE _self, VALUE name) {
|
2031
|
-
MessageBuilderContext* self = ruby_to_MessageBuilderContext(_self);
|
2032
|
-
size_t oneof_count;
|
2033
|
-
FileBuilderContext* file_context =
|
2034
|
-
ruby_to_FileBuilderContext(self->file_builder);
|
2035
|
-
google_protobuf_OneofDescriptorProto* oneof_proto;
|
2036
|
-
|
2037
|
-
// Existing oneof_count becomes oneof_index.
|
2038
|
-
google_protobuf_DescriptorProto_oneof_decl(self->msg_proto, &oneof_count);
|
2039
|
-
|
2040
|
-
// Create oneof_proto and set its name.
|
2041
|
-
oneof_proto = google_protobuf_DescriptorProto_add_oneof_decl(
|
2042
|
-
self->msg_proto, file_context->arena);
|
2043
|
-
google_protobuf_OneofDescriptorProto_set_name(
|
2044
|
-
oneof_proto, FileBuilderContext_strdup_sym(self->file_builder, name));
|
2045
|
-
|
2046
|
-
// Evaluate the block with the builder as argument.
|
2047
|
-
{
|
2048
|
-
VALUE args[2] = { INT2NUM(oneof_count), _self };
|
2049
|
-
VALUE ctx = rb_class_new_instance(2, args, cOneofBuilderContext);
|
2050
|
-
VALUE block = rb_block_proc();
|
2051
|
-
rb_funcall_with_block(ctx, rb_intern("instance_eval"), 0, NULL, block);
|
2052
|
-
}
|
2053
|
-
|
2054
|
-
return Qnil;
|
2055
|
-
}
|
2056
|
-
|
2057
|
-
static void MessageBuilderContext_add_synthetic_oneofs(VALUE _self) {
|
2058
|
-
MessageBuilderContext* self = ruby_to_MessageBuilderContext(_self);
|
2059
|
-
FileBuilderContext* file_context =
|
2060
|
-
ruby_to_FileBuilderContext(self->file_builder);
|
2061
|
-
size_t field_count, oneof_count;
|
2062
|
-
google_protobuf_FieldDescriptorProto** fields =
|
2063
|
-
google_protobuf_DescriptorProto_mutable_field(self->msg_proto, &field_count);
|
2064
|
-
const google_protobuf_OneofDescriptorProto*const* oneofs =
|
2065
|
-
google_protobuf_DescriptorProto_oneof_decl(self->msg_proto, &oneof_count);
|
2066
|
-
VALUE names = rb_hash_new();
|
2067
|
-
VALUE underscore = rb_str_new2("_");
|
2068
|
-
size_t i;
|
2069
|
-
|
2070
|
-
// We have to build a set of all names, to ensure that synthetic oneofs are
|
2071
|
-
// not creating conflicts.
|
2072
|
-
for (i = 0; i < field_count; i++) {
|
2073
|
-
upb_strview name = google_protobuf_FieldDescriptorProto_name(fields[i]);
|
2074
|
-
rb_hash_aset(names, rb_str_new(name.data, name.size), Qtrue);
|
2075
|
-
}
|
2076
|
-
for (i = 0; i < oneof_count; i++) {
|
2077
|
-
upb_strview name = google_protobuf_OneofDescriptorProto_name(oneofs[i]);
|
2078
|
-
rb_hash_aset(names, rb_str_new(name.data, name.size), Qtrue);
|
2079
|
-
}
|
2080
|
-
|
2081
|
-
for (i = 0; i < field_count; i++) {
|
2082
|
-
google_protobuf_OneofDescriptorProto* oneof_proto;
|
2083
|
-
VALUE oneof_name;
|
2084
|
-
upb_strview field_name;
|
2085
|
-
|
2086
|
-
if (!google_protobuf_FieldDescriptorProto_proto3_optional(fields[i])) {
|
2087
|
-
continue;
|
2088
|
-
}
|
2089
|
-
|
2090
|
-
// Prepend '_' until we are no longer conflicting.
|
2091
|
-
field_name = google_protobuf_FieldDescriptorProto_name(fields[i]);
|
2092
|
-
oneof_name = rb_str_new(field_name.data, field_name.size);
|
2093
|
-
while (rb_hash_lookup(names, oneof_name) != Qnil) {
|
2094
|
-
oneof_name = rb_str_plus(underscore, oneof_name);
|
2095
|
-
}
|
2096
|
-
|
2097
|
-
rb_hash_aset(names, oneof_name, Qtrue);
|
2098
|
-
google_protobuf_FieldDescriptorProto_set_oneof_index(fields[i],
|
2099
|
-
oneof_count++);
|
2100
|
-
oneof_proto = google_protobuf_DescriptorProto_add_oneof_decl(
|
2101
|
-
self->msg_proto, file_context->arena);
|
2102
|
-
google_protobuf_OneofDescriptorProto_set_name(
|
2103
|
-
oneof_proto, FileBuilderContext_strdup(self->file_builder, oneof_name));
|
2104
|
-
}
|
2105
|
-
}
|
2106
|
-
|
2107
|
-
static void MessageBuilderContext_register(VALUE module) {
|
2108
|
-
VALUE klass = rb_define_class_under(
|
2109
|
-
module, "MessageBuilderContext", rb_cObject);
|
2110
|
-
rb_define_alloc_func(klass, MessageBuilderContext_alloc);
|
2111
|
-
rb_define_method(klass, "initialize",
|
2112
|
-
MessageBuilderContext_initialize, 2);
|
2113
|
-
rb_define_method(klass, "optional", MessageBuilderContext_optional, -1);
|
2114
|
-
rb_define_method(klass, "proto3_optional", MessageBuilderContext_proto3_optional, -1);
|
2115
|
-
rb_define_method(klass, "required", MessageBuilderContext_required, -1);
|
2116
|
-
rb_define_method(klass, "repeated", MessageBuilderContext_repeated, -1);
|
2117
|
-
rb_define_method(klass, "map", MessageBuilderContext_map, -1);
|
2118
|
-
rb_define_method(klass, "oneof", MessageBuilderContext_oneof, 1);
|
2119
|
-
rb_gc_register_address(&cMessageBuilderContext);
|
2120
|
-
cMessageBuilderContext = klass;
|
2121
|
-
}
|
2122
|
-
|
2123
|
-
// -----------------------------------------------------------------------------
|
2124
|
-
// OneofBuilderContext.
|
2125
|
-
// -----------------------------------------------------------------------------
|
2126
|
-
|
2127
|
-
typedef struct {
|
2128
|
-
int oneof_index;
|
2129
|
-
VALUE message_builder;
|
2130
|
-
} OneofBuilderContext;
|
2131
|
-
|
2132
|
-
static VALUE cOneofBuilderContext = Qnil;
|
2133
|
-
|
2134
|
-
void OneofBuilderContext_mark(void* _self) {
|
2135
|
-
OneofBuilderContext* self = _self;
|
2136
|
-
rb_gc_mark(self->message_builder);
|
2137
|
-
}
|
2138
|
-
|
2139
|
-
static const rb_data_type_t OneofBuilderContext_type = {
|
2140
|
-
"Google::Protobuf::Internal::OneofBuilderContext",
|
2141
|
-
{OneofBuilderContext_mark, RUBY_DEFAULT_FREE, NULL},
|
2142
|
-
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
2143
|
-
};
|
2144
|
-
|
2145
|
-
static OneofBuilderContext* ruby_to_OneofBuilderContext(VALUE val) {
|
2146
|
-
OneofBuilderContext* ret;
|
2147
|
-
TypedData_Get_Struct(val, OneofBuilderContext, &OneofBuilderContext_type,
|
2148
|
-
ret);
|
2149
|
-
return ret;
|
2150
|
-
}
|
2151
|
-
|
2152
|
-
static VALUE OneofBuilderContext_alloc(VALUE klass) {
|
2153
|
-
OneofBuilderContext* self = ALLOC(OneofBuilderContext);
|
2154
|
-
VALUE ret = TypedData_Wrap_Struct(klass, &OneofBuilderContext_type, self);
|
2155
|
-
self->oneof_index = 0;
|
2156
|
-
self->message_builder = Qnil;
|
2157
|
-
return ret;
|
2158
|
-
}
|
2159
|
-
|
2160
|
-
/*
|
2161
|
-
* call-seq:
|
2162
|
-
* OneofBuilderContext.new(oneof_index, message_builder) => context
|
2163
|
-
*
|
2164
|
-
* Create a new oneof builder context around the given oneof descriptor and
|
2165
|
-
* builder context. This class is intended to serve as a DSL context to be used
|
2166
|
-
* with #instance_eval.
|
2167
|
-
*/
|
2168
|
-
static VALUE OneofBuilderContext_initialize(VALUE _self, VALUE oneof_index,
|
2169
|
-
VALUE message_builder) {
|
2170
|
-
OneofBuilderContext* self = ruby_to_OneofBuilderContext(_self);
|
2171
|
-
self->oneof_index = NUM2INT(oneof_index);
|
2172
|
-
self->message_builder = message_builder;
|
2173
|
-
return Qnil;
|
2174
|
-
}
|
2175
|
-
|
2176
|
-
/*
|
2177
|
-
* call-seq:
|
2178
|
-
* OneofBuilderContext.optional(name, type, number, type_class = nil,
|
2179
|
-
* default_value = nil)
|
2180
|
-
*
|
2181
|
-
* Defines a new optional field in this oneof with the given type, tag number,
|
2182
|
-
* and type class (for message and enum fields). The type must be a Ruby symbol
|
2183
|
-
* (as accepted by FieldDescriptor#type=) and the type_class must be a string,
|
2184
|
-
* if present (as accepted by FieldDescriptor#submsg_name=).
|
2185
|
-
*/
|
2186
|
-
static VALUE OneofBuilderContext_optional(int argc, VALUE* argv, VALUE _self) {
|
2187
|
-
OneofBuilderContext* self = ruby_to_OneofBuilderContext(_self);
|
2188
|
-
VALUE name, type, number;
|
2189
|
-
VALUE type_class, options = Qnil;
|
2190
|
-
|
2191
|
-
rb_scan_args(argc, argv, "32", &name, &type, &number, &type_class, &options);
|
2192
|
-
|
2193
|
-
msgdef_add_field(self->message_builder, UPB_LABEL_OPTIONAL, name, type,
|
2194
|
-
number, type_class, options, self->oneof_index, false);
|
2195
|
-
|
2196
|
-
return Qnil;
|
2197
|
-
}
|
2198
|
-
|
2199
|
-
static void OneofBuilderContext_register(VALUE module) {
|
2200
|
-
VALUE klass = rb_define_class_under(
|
2201
|
-
module, "OneofBuilderContext", rb_cObject);
|
2202
|
-
rb_define_alloc_func(klass, OneofBuilderContext_alloc);
|
2203
|
-
rb_define_method(klass, "initialize",
|
2204
|
-
OneofBuilderContext_initialize, 2);
|
2205
|
-
rb_define_method(klass, "optional", OneofBuilderContext_optional, -1);
|
2206
|
-
rb_gc_register_address(&cOneofBuilderContext);
|
2207
|
-
cOneofBuilderContext = klass;
|
2208
|
-
}
|
2209
|
-
|
2210
|
-
// -----------------------------------------------------------------------------
|
2211
|
-
// EnumBuilderContext.
|
2212
|
-
// -----------------------------------------------------------------------------
|
2213
|
-
|
2214
|
-
typedef struct {
|
2215
|
-
google_protobuf_EnumDescriptorProto* enum_proto;
|
2216
|
-
VALUE file_builder;
|
2217
|
-
} EnumBuilderContext;
|
2218
|
-
|
2219
|
-
static VALUE cEnumBuilderContext = Qnil;
|
2220
|
-
|
2221
|
-
void EnumBuilderContext_mark(void* _self) {
|
2222
|
-
EnumBuilderContext* self = _self;
|
2223
|
-
rb_gc_mark(self->file_builder);
|
2224
|
-
}
|
2225
|
-
|
2226
|
-
static const rb_data_type_t EnumBuilderContext_type = {
|
2227
|
-
"Google::Protobuf::Internal::EnumBuilderContext",
|
2228
|
-
{EnumBuilderContext_mark, RUBY_DEFAULT_FREE, NULL},
|
2229
|
-
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
2230
|
-
};
|
2231
|
-
|
2232
|
-
static EnumBuilderContext* ruby_to_EnumBuilderContext(VALUE val) {
|
2233
|
-
EnumBuilderContext* ret;
|
2234
|
-
TypedData_Get_Struct(val, EnumBuilderContext, &EnumBuilderContext_type, ret);
|
2235
|
-
return ret;
|
2236
|
-
}
|
2237
|
-
|
2238
|
-
static VALUE EnumBuilderContext_alloc(VALUE klass) {
|
2239
|
-
EnumBuilderContext* self = ALLOC(EnumBuilderContext);
|
2240
|
-
VALUE ret = TypedData_Wrap_Struct(klass, &EnumBuilderContext_type, self);
|
2241
|
-
self->enum_proto = NULL;
|
2242
|
-
self->file_builder = Qnil;
|
2243
|
-
return ret;
|
2244
|
-
}
|
2245
|
-
|
2246
|
-
/*
|
2247
|
-
* call-seq:
|
2248
|
-
* EnumBuilderContext.new(file_builder) => context
|
2249
|
-
*
|
2250
|
-
* Create a new builder context around the given enum descriptor. This class is
|
2251
|
-
* intended to serve as a DSL context to be used with #instance_eval.
|
2252
|
-
*/
|
2253
|
-
static VALUE EnumBuilderContext_initialize(VALUE _self, VALUE _file_builder,
|
2254
|
-
VALUE name) {
|
2255
|
-
EnumBuilderContext* self = ruby_to_EnumBuilderContext(_self);
|
2256
|
-
FileBuilderContext* file_builder = ruby_to_FileBuilderContext(_file_builder);
|
2257
|
-
google_protobuf_FileDescriptorProto* file_proto = file_builder->file_proto;
|
2258
|
-
|
2259
|
-
self->file_builder = _file_builder;
|
2260
|
-
self->enum_proto = google_protobuf_FileDescriptorProto_add_enum_type(
|
2261
|
-
file_proto, file_builder->arena);
|
2262
|
-
|
2263
|
-
google_protobuf_EnumDescriptorProto_set_name(
|
2264
|
-
self->enum_proto, FileBuilderContext_strdup(_file_builder, name));
|
2265
|
-
|
2266
|
-
return Qnil;
|
2267
|
-
}
|
2268
|
-
|
2269
|
-
/*
|
2270
|
-
* call-seq:
|
2271
|
-
* EnumBuilder.add_value(name, number)
|
2272
|
-
*
|
2273
|
-
* Adds the given name => number mapping to the enum type. Name must be a Ruby
|
2274
|
-
* symbol.
|
2275
|
-
*/
|
2276
|
-
static VALUE EnumBuilderContext_value(VALUE _self, VALUE name, VALUE number) {
|
2277
|
-
EnumBuilderContext* self = ruby_to_EnumBuilderContext(_self);
|
2278
|
-
FileBuilderContext* file_builder =
|
2279
|
-
ruby_to_FileBuilderContext(self->file_builder);
|
2280
|
-
google_protobuf_EnumValueDescriptorProto* enum_value;
|
2281
|
-
|
2282
|
-
enum_value = google_protobuf_EnumDescriptorProto_add_value(
|
2283
|
-
self->enum_proto, file_builder->arena);
|
2284
|
-
|
2285
|
-
google_protobuf_EnumValueDescriptorProto_set_name(
|
2286
|
-
enum_value, FileBuilderContext_strdup_sym(self->file_builder, name));
|
2287
|
-
google_protobuf_EnumValueDescriptorProto_set_number(enum_value,
|
2288
|
-
NUM2INT(number));
|
2289
|
-
|
2290
|
-
return Qnil;
|
2291
|
-
}
|
2292
|
-
|
2293
|
-
static void EnumBuilderContext_register(VALUE module) {
|
2294
|
-
VALUE klass = rb_define_class_under(
|
2295
|
-
module, "EnumBuilderContext", rb_cObject);
|
2296
|
-
rb_define_alloc_func(klass, EnumBuilderContext_alloc);
|
2297
|
-
rb_define_method(klass, "initialize", EnumBuilderContext_initialize, 2);
|
2298
|
-
rb_define_method(klass, "value", EnumBuilderContext_value, 2);
|
2299
|
-
rb_gc_register_address(&cEnumBuilderContext);
|
2300
|
-
cEnumBuilderContext = klass;
|
2301
|
-
}
|
2302
|
-
|
2303
|
-
// -----------------------------------------------------------------------------
|
2304
|
-
// Builder.
|
2305
|
-
// -----------------------------------------------------------------------------
|
2306
|
-
|
2307
|
-
typedef struct {
|
2308
|
-
VALUE descriptor_pool;
|
2309
|
-
VALUE default_file_builder;
|
2310
|
-
} Builder;
|
2311
|
-
|
2312
|
-
static VALUE cBuilder = Qnil;
|
2313
|
-
|
2314
|
-
static void Builder_mark(void* _self) {
|
2315
|
-
Builder* self = _self;
|
2316
|
-
rb_gc_mark(self->descriptor_pool);
|
2317
|
-
rb_gc_mark(self->default_file_builder);
|
2318
|
-
}
|
2319
|
-
|
2320
|
-
static const rb_data_type_t Builder_type = {
|
2321
|
-
"Google::Protobuf::Internal::Builder",
|
2322
|
-
{Builder_mark, RUBY_DEFAULT_FREE, NULL},
|
2323
|
-
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
2324
|
-
};
|
2325
|
-
|
2326
|
-
static Builder* ruby_to_Builder(VALUE val) {
|
2327
|
-
Builder* ret;
|
2328
|
-
TypedData_Get_Struct(val, Builder, &Builder_type, ret);
|
2329
|
-
return ret;
|
2330
|
-
}
|
2331
|
-
|
2332
|
-
static VALUE Builder_alloc(VALUE klass) {
|
2333
|
-
Builder* self = ALLOC(Builder);
|
2334
|
-
VALUE ret = TypedData_Wrap_Struct(klass, &Builder_type, self);
|
2335
|
-
self->descriptor_pool = Qnil;
|
2336
|
-
self->default_file_builder = Qnil;
|
2337
|
-
return ret;
|
2338
|
-
}
|
2339
|
-
|
2340
|
-
/*
|
2341
|
-
* call-seq:
|
2342
|
-
* Builder.new(descriptor_pool) => builder
|
2343
|
-
*
|
2344
|
-
* Creates a new Builder. A Builder can accumulate a set of new message and enum
|
2345
|
-
* descriptors and atomically register them into a pool in a way that allows for
|
2346
|
-
* (co)recursive type references.
|
2347
|
-
*/
|
2348
|
-
static VALUE Builder_initialize(VALUE _self, VALUE pool) {
|
2349
|
-
Builder* self = ruby_to_Builder(_self);
|
2350
|
-
self->descriptor_pool = pool;
|
2351
|
-
self->default_file_builder = Qnil; // Created lazily if needed.
|
2352
|
-
return Qnil;
|
2353
|
-
}
|
2354
|
-
|
2355
|
-
/*
|
2356
|
-
* call-seq:
|
2357
|
-
* Builder.add_file(name, options = nil, &block)
|
2358
|
-
*
|
2359
|
-
* Creates a new, file descriptor with the given name and options and invokes
|
2360
|
-
* the block in the context of a FileBuilderContext on that descriptor. The
|
2361
|
-
* block can then call FileBuilderContext#add_message or
|
2362
|
-
* FileBuilderContext#add_enum to define new messages or enums, respectively.
|
2363
|
-
*
|
2364
|
-
* This is the recommended, idiomatic way to build file descriptors.
|
2365
|
-
*/
|
2366
|
-
static VALUE Builder_add_file(int argc, VALUE* argv, VALUE _self) {
|
2367
|
-
Builder* self = ruby_to_Builder(_self);
|
2368
|
-
VALUE name, options;
|
2369
|
-
VALUE ctx;
|
2370
|
-
VALUE block;
|
2371
|
-
|
2372
|
-
rb_scan_args(argc, argv, "11", &name, &options);
|
2373
|
-
|
2374
|
-
{
|
2375
|
-
VALUE args[3] = { self->descriptor_pool, name, options };
|
2376
|
-
ctx = rb_class_new_instance(3, args, cFileBuilderContext);
|
2377
|
-
}
|
2378
|
-
|
2379
|
-
block = rb_block_proc();
|
2380
|
-
rb_funcall_with_block(ctx, rb_intern("instance_eval"), 0, NULL, block);
|
2381
|
-
FileBuilderContext_build(ctx);
|
2382
|
-
|
2383
|
-
return Qnil;
|
2384
|
-
}
|
2385
|
-
|
2386
|
-
static VALUE Builder_get_default_file(VALUE _self) {
|
2387
|
-
Builder* self = ruby_to_Builder(_self);
|
2388
|
-
|
2389
|
-
/* Lazily create only if legacy builder-level methods are called. */
|
2390
|
-
if (self->default_file_builder == Qnil) {
|
2391
|
-
VALUE name = rb_str_new2("ruby_default_file.proto");
|
2392
|
-
VALUE args [3] = { self->descriptor_pool, name, rb_hash_new() };
|
2393
|
-
self->default_file_builder =
|
2394
|
-
rb_class_new_instance(3, args, cFileBuilderContext);
|
2395
|
-
}
|
2396
|
-
|
2397
|
-
return self->default_file_builder;
|
2398
|
-
}
|
2399
|
-
|
2400
|
-
/*
|
2401
|
-
* call-seq:
|
2402
|
-
* Builder.add_message(name, &block)
|
2403
|
-
*
|
2404
|
-
* Old and deprecated way to create a new descriptor.
|
2405
|
-
* See FileBuilderContext.add_message for the recommended way.
|
2406
|
-
*
|
2407
|
-
* Exists for backwards compatibility to allow building descriptor pool for
|
2408
|
-
* files generated by protoc which don't add messages within "add_file" block.
|
2409
|
-
* Descriptors created this way get assigned to a default empty FileDescriptor.
|
2410
|
-
*/
|
2411
|
-
static VALUE Builder_add_message(VALUE _self, VALUE name) {
|
2412
|
-
VALUE file_builder = Builder_get_default_file(_self);
|
2413
|
-
rb_funcall_with_block(file_builder, rb_intern("add_message"), 1, &name,
|
2414
|
-
rb_block_proc());
|
2415
|
-
return Qnil;
|
2416
|
-
}
|
2417
|
-
|
2418
|
-
/*
|
2419
|
-
* call-seq:
|
2420
|
-
* Builder.add_enum(name, &block)
|
2421
|
-
*
|
2422
|
-
* Old and deprecated way to create a new enum descriptor.
|
2423
|
-
* See FileBuilderContext.add_enum for the recommended way.
|
2424
|
-
*
|
2425
|
-
* Exists for backwards compatibility to allow building descriptor pool for
|
2426
|
-
* files generated by protoc which don't add enums within "add_file" block.
|
2427
|
-
* Enum descriptors created this way get assigned to a default empty
|
2428
|
-
* FileDescriptor.
|
2429
|
-
*/
|
2430
|
-
static VALUE Builder_add_enum(VALUE _self, VALUE name) {
|
2431
|
-
VALUE file_builder = Builder_get_default_file(_self);
|
2432
|
-
rb_funcall_with_block(file_builder, rb_intern("add_enum"), 1, &name,
|
2433
|
-
rb_block_proc());
|
2434
|
-
return Qnil;
|
2435
|
-
}
|
2436
|
-
|
2437
|
-
/* This method is hidden from Ruby, and only called directly from
|
2438
|
-
* DescriptorPool_build(). */
|
2439
|
-
static VALUE Builder_build(VALUE _self) {
|
2440
|
-
Builder* self = ruby_to_Builder(_self);
|
2441
|
-
|
2442
|
-
if (self->default_file_builder != Qnil) {
|
2443
|
-
FileBuilderContext_build(self->default_file_builder);
|
2444
|
-
self->default_file_builder = Qnil;
|
2445
|
-
}
|
2446
|
-
|
2447
|
-
return Qnil;
|
2448
|
-
}
|
2449
|
-
|
2450
|
-
static void Builder_register(VALUE module) {
|
2451
|
-
VALUE klass = rb_define_class_under(module, "Builder", rb_cObject);
|
2452
|
-
rb_define_alloc_func(klass, Builder_alloc);
|
2453
|
-
rb_define_method(klass, "initialize", Builder_initialize, 1);
|
2454
|
-
rb_define_method(klass, "add_file", Builder_add_file, -1);
|
2455
|
-
rb_define_method(klass, "add_message", Builder_add_message, 1);
|
2456
|
-
rb_define_method(klass, "add_enum", Builder_add_enum, 1);
|
2457
|
-
rb_gc_register_address(&cBuilder);
|
2458
|
-
cBuilder = klass;
|
2459
|
-
}
|
2460
|
-
|
2461
1161
|
static VALUE get_def_obj(VALUE _descriptor_pool, const void* ptr, VALUE klass) {
|
2462
1162
|
DescriptorPool* descriptor_pool = ruby_to_DescriptorPool(_descriptor_pool);
|
2463
1163
|
VALUE key = ULL2NUM((intptr_t)ptr);
|
@@ -2471,7 +1171,7 @@ static VALUE get_def_obj(VALUE _descriptor_pool, const void* ptr, VALUE klass) {
|
|
2471
1171
|
|
2472
1172
|
if (def == Qnil) {
|
2473
1173
|
// Lazily create wrapper object.
|
2474
|
-
VALUE args[3] = {
|
1174
|
+
VALUE args[3] = {c_only_cookie, _descriptor_pool, key};
|
2475
1175
|
def = rb_class_new_instance(3, args, klass);
|
2476
1176
|
rb_hash_aset(descriptor_pool->def_to_descriptor, key, def);
|
2477
1177
|
}
|
@@ -2479,23 +1179,23 @@ static VALUE get_def_obj(VALUE _descriptor_pool, const void* ptr, VALUE klass) {
|
|
2479
1179
|
return def;
|
2480
1180
|
}
|
2481
1181
|
|
2482
|
-
static VALUE get_msgdef_obj(VALUE descriptor_pool, const
|
1182
|
+
static VALUE get_msgdef_obj(VALUE descriptor_pool, const upb_MessageDef* def) {
|
2483
1183
|
return get_def_obj(descriptor_pool, def, cDescriptor);
|
2484
1184
|
}
|
2485
1185
|
|
2486
|
-
static VALUE get_enumdef_obj(VALUE descriptor_pool, const
|
1186
|
+
static VALUE get_enumdef_obj(VALUE descriptor_pool, const upb_EnumDef* def) {
|
2487
1187
|
return get_def_obj(descriptor_pool, def, cEnumDescriptor);
|
2488
1188
|
}
|
2489
1189
|
|
2490
|
-
static VALUE get_fielddef_obj(VALUE descriptor_pool, const
|
1190
|
+
static VALUE get_fielddef_obj(VALUE descriptor_pool, const upb_FieldDef* def) {
|
2491
1191
|
return get_def_obj(descriptor_pool, def, cFieldDescriptor);
|
2492
1192
|
}
|
2493
1193
|
|
2494
|
-
static VALUE get_filedef_obj(VALUE descriptor_pool, const
|
1194
|
+
static VALUE get_filedef_obj(VALUE descriptor_pool, const upb_FileDef* def) {
|
2495
1195
|
return get_def_obj(descriptor_pool, def, cFileDescriptor);
|
2496
1196
|
}
|
2497
1197
|
|
2498
|
-
static VALUE get_oneofdef_obj(VALUE descriptor_pool, const
|
1198
|
+
static VALUE get_oneofdef_obj(VALUE descriptor_pool, const upb_OneofDef* def) {
|
2499
1199
|
return get_def_obj(descriptor_pool, def, cOneofDescriptor);
|
2500
1200
|
}
|
2501
1201
|
|
@@ -2505,8 +1205,8 @@ static VALUE get_oneofdef_obj(VALUE descriptor_pool, const upb_oneofdef* def) {
|
|
2505
1205
|
|
2506
1206
|
// Functions exposed to other modules in defs.h.
|
2507
1207
|
|
2508
|
-
VALUE Descriptor_DefToClass(const
|
2509
|
-
const
|
1208
|
+
VALUE Descriptor_DefToClass(const upb_MessageDef* m) {
|
1209
|
+
const upb_DefPool* symtab = upb_FileDef_Pool(upb_MessageDef_File(m));
|
2510
1210
|
VALUE pool = ObjectCache_Get(symtab);
|
2511
1211
|
PBRUBY_ASSERT(pool != Qnil);
|
2512
1212
|
VALUE desc_rb = get_msgdef_obj(pool, m);
|
@@ -2514,15 +1214,16 @@ VALUE Descriptor_DefToClass(const upb_msgdef *m) {
|
|
2514
1214
|
return desc->klass;
|
2515
1215
|
}
|
2516
1216
|
|
2517
|
-
const
|
1217
|
+
const upb_MessageDef* Descriptor_GetMsgDef(VALUE desc_rb) {
|
2518
1218
|
const Descriptor* desc = ruby_to_Descriptor(desc_rb);
|
2519
1219
|
return desc->msgdef;
|
2520
1220
|
}
|
2521
1221
|
|
2522
|
-
VALUE TypeInfo_InitArg(int argc, VALUE
|
1222
|
+
VALUE TypeInfo_InitArg(int argc, VALUE* argv, int skip_arg) {
|
2523
1223
|
if (argc > skip_arg) {
|
2524
1224
|
if (argc > 1 + skip_arg) {
|
2525
|
-
rb_raise(rb_eArgError, "Expected a maximum of %d arguments.",
|
1225
|
+
rb_raise(rb_eArgError, "Expected a maximum of %d arguments.",
|
1226
|
+
skip_arg + 1);
|
2526
1227
|
}
|
2527
1228
|
return argv[skip_arg];
|
2528
1229
|
} else {
|
@@ -2534,7 +1235,7 @@ TypeInfo TypeInfo_FromClass(int argc, VALUE* argv, int skip_arg,
|
|
2534
1235
|
VALUE* type_class, VALUE* init_arg) {
|
2535
1236
|
TypeInfo ret = {ruby_to_fieldtype(argv[skip_arg])};
|
2536
1237
|
|
2537
|
-
if (ret.type ==
|
1238
|
+
if (ret.type == kUpb_CType_Message || ret.type == kUpb_CType_Enum) {
|
2538
1239
|
*init_arg = TypeInfo_InitArg(argc, argv, skip_arg + 2);
|
2539
1240
|
|
2540
1241
|
if (argc < 2 + skip_arg) {
|
@@ -2552,11 +1253,11 @@ TypeInfo TypeInfo_FromClass(int argc, VALUE* argv, int skip_arg,
|
|
2552
1253
|
"class or enum as returned by the DescriptorPool.");
|
2553
1254
|
}
|
2554
1255
|
|
2555
|
-
if (ret.type ==
|
1256
|
+
if (ret.type == kUpb_CType_Message) {
|
2556
1257
|
ret.def.msgdef = ruby_to_Descriptor(desc)->msgdef;
|
2557
1258
|
Message_CheckClass(klass);
|
2558
1259
|
} else {
|
2559
|
-
PBRUBY_ASSERT(ret.type ==
|
1260
|
+
PBRUBY_ASSERT(ret.type == kUpb_CType_Enum);
|
2560
1261
|
ret.def.enumdef = ruby_to_EnumDescriptor(desc)->enumdef;
|
2561
1262
|
}
|
2562
1263
|
} else {
|
@@ -2573,11 +1274,6 @@ void Defs_register(VALUE module) {
|
|
2573
1274
|
FieldDescriptor_register(module);
|
2574
1275
|
OneofDescriptor_register(module);
|
2575
1276
|
EnumDescriptor_register(module);
|
2576
|
-
FileBuilderContext_register(module);
|
2577
|
-
MessageBuilderContext_register(module);
|
2578
|
-
OneofBuilderContext_register(module);
|
2579
|
-
EnumBuilderContext_register(module);
|
2580
|
-
Builder_register(module);
|
2581
1277
|
|
2582
1278
|
rb_gc_register_address(&c_only_cookie);
|
2583
1279
|
c_only_cookie = rb_class_new_instance(0, NULL, rb_cObject);
|