google-protobuf 3.23.3 → 4.31.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/google/protobuf_c/Rakefile +3 -0
- data/ext/google/protobuf_c/convert.c +60 -86
- data/ext/google/protobuf_c/convert.h +3 -28
- data/ext/google/protobuf_c/defs.c +702 -60
- data/ext/google/protobuf_c/defs.h +3 -28
- data/ext/google/protobuf_c/extconf.rb +20 -3
- data/ext/google/protobuf_c/glue.c +135 -0
- data/ext/google/protobuf_c/map.c +91 -47
- data/ext/google/protobuf_c/map.h +12 -30
- data/ext/google/protobuf_c/message.c +158 -166
- data/ext/google/protobuf_c/message.h +11 -33
- data/ext/google/protobuf_c/protobuf.c +62 -187
- data/ext/google/protobuf_c/protobuf.h +21 -39
- data/ext/google/protobuf_c/repeated_field.c +72 -38
- data/ext/google/protobuf_c/repeated_field.h +11 -29
- data/ext/google/protobuf_c/ruby-upb.c +15568 -11237
- data/ext/google/protobuf_c/ruby-upb.h +10632 -6097
- data/ext/google/protobuf_c/shared_convert.c +69 -0
- data/ext/google/protobuf_c/shared_convert.h +26 -0
- data/ext/google/protobuf_c/shared_message.c +37 -0
- data/ext/google/protobuf_c/shared_message.h +21 -0
- data/ext/google/protobuf_c/third_party/utf8_range/utf8_range.c +207 -0
- data/ext/google/protobuf_c/third_party/utf8_range/utf8_range.h +9 -8
- data/ext/google/protobuf_c/third_party/utf8_range/utf8_range_neon.inc +117 -0
- data/ext/google/protobuf_c/third_party/utf8_range/utf8_range_sse.inc +272 -0
- data/ext/google/protobuf_c/wrap_memcpy.c +3 -26
- data/lib/google/protobuf/any_pb.rb +2 -23
- data/lib/google/protobuf/api_pb.rb +2 -25
- data/lib/google/protobuf/descriptor_pb.rb +19 -24
- data/lib/google/protobuf/duration_pb.rb +2 -23
- data/lib/google/protobuf/empty_pb.rb +2 -23
- data/lib/google/protobuf/ffi/descriptor.rb +175 -0
- data/lib/google/protobuf/ffi/descriptor_pool.rb +79 -0
- data/lib/google/protobuf/ffi/enum_descriptor.rb +183 -0
- data/lib/google/protobuf/ffi/ffi.rb +214 -0
- data/lib/google/protobuf/ffi/field_descriptor.rb +346 -0
- data/lib/google/protobuf/ffi/file_descriptor.rb +85 -0
- data/lib/google/protobuf/ffi/internal/arena.rb +60 -0
- data/lib/google/protobuf/ffi/internal/convert.rb +292 -0
- data/lib/google/protobuf/ffi/internal/pointer_helper.rb +36 -0
- data/lib/google/protobuf/ffi/internal/type_safety.rb +25 -0
- data/lib/google/protobuf/ffi/map.rb +433 -0
- data/lib/google/protobuf/ffi/message.rb +783 -0
- data/lib/google/protobuf/ffi/method_descriptor.rb +124 -0
- data/lib/google/protobuf/ffi/object_cache.rb +30 -0
- data/lib/google/protobuf/ffi/oneof_descriptor.rb +107 -0
- data/lib/google/protobuf/ffi/repeated_field.rb +411 -0
- data/lib/google/protobuf/ffi/service_descriptor.rb +117 -0
- data/lib/google/protobuf/field_mask_pb.rb +2 -23
- data/lib/google/protobuf/internal/object_cache.rb +99 -0
- data/lib/google/protobuf/message_exts.rb +7 -26
- data/lib/google/protobuf/plugin_pb.rb +3 -25
- data/lib/google/protobuf/repeated_field.rb +7 -31
- data/lib/google/protobuf/source_context_pb.rb +2 -23
- data/lib/google/protobuf/struct_pb.rb +2 -23
- data/lib/google/protobuf/timestamp_pb.rb +2 -23
- data/lib/google/protobuf/type_pb.rb +2 -25
- data/lib/google/protobuf/well_known_types.rb +5 -34
- data/lib/google/protobuf/wrappers_pb.rb +2 -23
- data/lib/google/protobuf.rb +27 -45
- data/lib/google/protobuf_ffi.rb +52 -0
- data/lib/google/protobuf_native.rb +19 -0
- data/lib/google/tasks/ffi.rake +100 -0
- metadata +99 -16
- data/ext/google/protobuf_c/third_party/utf8_range/naive.c +0 -92
- data/ext/google/protobuf_c/third_party/utf8_range/range2-neon.c +0 -157
- data/ext/google/protobuf_c/third_party/utf8_range/range2-sse.c +0 -170
- data/lib/google/protobuf/descriptor_dsl.rb +0 -465
@@ -1,36 +1,12 @@
|
|
1
1
|
// Protocol Buffers - Google's data interchange format
|
2
2
|
// Copyright 2014 Google Inc. All rights reserved.
|
3
|
-
// https://developers.google.com/protocol-buffers/
|
4
3
|
//
|
5
|
-
//
|
6
|
-
//
|
7
|
-
//
|
8
|
-
//
|
9
|
-
// * Redistributions of source code must retain the above copyright
|
10
|
-
// notice, this list of conditions and the following disclaimer.
|
11
|
-
// * Redistributions in binary form must reproduce the above
|
12
|
-
// copyright notice, this list of conditions and the following disclaimer
|
13
|
-
// in the documentation and/or other materials provided with the
|
14
|
-
// distribution.
|
15
|
-
// * Neither the name of Google Inc. nor the names of its
|
16
|
-
// contributors may be used to endorse or promote products derived from
|
17
|
-
// this software without specific prior written permission.
|
18
|
-
//
|
19
|
-
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
20
|
-
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
21
|
-
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
22
|
-
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
23
|
-
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
24
|
-
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
25
|
-
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
26
|
-
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
27
|
-
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
28
|
-
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
29
|
-
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
4
|
+
// Use of this source code is governed by a BSD-style
|
5
|
+
// license that can be found in the LICENSE file or at
|
6
|
+
// https://developers.google.com/open-source/licenses/bsd
|
30
7
|
|
31
8
|
#include <ctype.h>
|
32
9
|
#include <errno.h>
|
33
|
-
#include <ruby/version.h>
|
34
10
|
|
35
11
|
#include "convert.h"
|
36
12
|
#include "message.h"
|
@@ -46,6 +22,9 @@ static VALUE get_enumdef_obj(VALUE descriptor_pool, const upb_EnumDef* def);
|
|
46
22
|
static VALUE get_fielddef_obj(VALUE descriptor_pool, const upb_FieldDef* def);
|
47
23
|
static VALUE get_filedef_obj(VALUE descriptor_pool, const upb_FileDef* def);
|
48
24
|
static VALUE get_oneofdef_obj(VALUE descriptor_pool, const upb_OneofDef* def);
|
25
|
+
static VALUE get_servicedef_obj(VALUE descriptor_pool,
|
26
|
+
const upb_ServiceDef* def);
|
27
|
+
static VALUE get_methoddef_obj(VALUE descriptor_pool, const upb_MethodDef* def);
|
49
28
|
|
50
29
|
// A distinct object that is not accessible from Ruby. We use this as a
|
51
30
|
// constructor argument to enforce that certain objects cannot be created from
|
@@ -67,12 +46,14 @@ static VALUE rb_str_maybe_null(const char* s) {
|
|
67
46
|
}
|
68
47
|
return rb_str_new2(s);
|
69
48
|
}
|
70
|
-
|
49
|
+
static ID options_instancevar_interned;
|
71
50
|
// -----------------------------------------------------------------------------
|
72
51
|
// DescriptorPool.
|
73
52
|
// -----------------------------------------------------------------------------
|
74
53
|
|
75
54
|
typedef struct {
|
55
|
+
// IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
|
56
|
+
// macro to update VALUE references, as to trigger write barriers.
|
76
57
|
VALUE def_to_descriptor; // Hash table of def* -> Ruby descriptor.
|
77
58
|
upb_DefPool* symtab;
|
78
59
|
} DescriptorPool;
|
@@ -97,7 +78,7 @@ static void DescriptorPool_free(void* _self) {
|
|
97
78
|
static const rb_data_type_t DescriptorPool_type = {
|
98
79
|
"Google::Protobuf::DescriptorPool",
|
99
80
|
{DescriptorPool_mark, DescriptorPool_free, NULL},
|
100
|
-
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
81
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
101
82
|
};
|
102
83
|
|
103
84
|
static DescriptorPool* ruby_to_DescriptorPool(VALUE val) {
|
@@ -125,11 +106,9 @@ static VALUE DescriptorPool_alloc(VALUE klass) {
|
|
125
106
|
self->def_to_descriptor = Qnil;
|
126
107
|
ret = TypedData_Wrap_Struct(klass, &DescriptorPool_type, self);
|
127
108
|
|
128
|
-
self->def_to_descriptor
|
109
|
+
RB_OBJ_WRITE(ret, &self->def_to_descriptor, rb_hash_new());
|
129
110
|
self->symtab = upb_DefPool_New();
|
130
|
-
|
131
|
-
|
132
|
-
return ret;
|
111
|
+
return ObjectCache_TryAdd(self->symtab, ret);
|
133
112
|
}
|
134
113
|
|
135
114
|
/*
|
@@ -167,25 +146,43 @@ VALUE DescriptorPool_add_serialized_file(VALUE _self,
|
|
167
146
|
* call-seq:
|
168
147
|
* DescriptorPool.lookup(name) => descriptor
|
169
148
|
*
|
170
|
-
* Finds a Descriptor
|
171
|
-
* exists with the given name.
|
149
|
+
* Finds a Descriptor, EnumDescriptor, FieldDescriptor or ServiceDescriptor by
|
150
|
+
* name and returns it, or nil if none exists with the given name.
|
172
151
|
*/
|
173
152
|
static VALUE DescriptorPool_lookup(VALUE _self, VALUE name) {
|
174
153
|
DescriptorPool* self = ruby_to_DescriptorPool(_self);
|
175
154
|
const char* name_str = get_str(name);
|
176
155
|
const upb_MessageDef* msgdef;
|
177
156
|
const upb_EnumDef* enumdef;
|
157
|
+
const upb_FieldDef* fielddef;
|
158
|
+
const upb_ServiceDef* servicedef;
|
159
|
+
const upb_FileDef* filedef;
|
178
160
|
|
179
161
|
msgdef = upb_DefPool_FindMessageByName(self->symtab, name_str);
|
180
162
|
if (msgdef) {
|
181
163
|
return get_msgdef_obj(_self, msgdef);
|
182
164
|
}
|
183
165
|
|
166
|
+
fielddef = upb_DefPool_FindExtensionByName(self->symtab, name_str);
|
167
|
+
if (fielddef) {
|
168
|
+
return get_fielddef_obj(_self, fielddef);
|
169
|
+
}
|
170
|
+
|
184
171
|
enumdef = upb_DefPool_FindEnumByName(self->symtab, name_str);
|
185
172
|
if (enumdef) {
|
186
173
|
return get_enumdef_obj(_self, enumdef);
|
187
174
|
}
|
188
175
|
|
176
|
+
servicedef = upb_DefPool_FindServiceByName(self->symtab, name_str);
|
177
|
+
if (servicedef) {
|
178
|
+
return get_servicedef_obj(_self, servicedef);
|
179
|
+
}
|
180
|
+
|
181
|
+
filedef = upb_DefPool_FindFileByName(self->symtab, name_str);
|
182
|
+
if (filedef) {
|
183
|
+
return get_filedef_obj(_self, filedef);
|
184
|
+
}
|
185
|
+
|
189
186
|
return Qnil;
|
190
187
|
}
|
191
188
|
|
@@ -215,6 +212,7 @@ static void DescriptorPool_register(VALUE module) {
|
|
215
212
|
|
216
213
|
rb_gc_register_address(&generated_pool);
|
217
214
|
generated_pool = rb_class_new_instance(0, NULL, klass);
|
215
|
+
options_instancevar_interned = rb_intern("options");
|
218
216
|
}
|
219
217
|
|
220
218
|
// -----------------------------------------------------------------------------
|
@@ -249,6 +247,48 @@ static Descriptor* ruby_to_Descriptor(VALUE val) {
|
|
249
247
|
return ret;
|
250
248
|
}
|
251
249
|
|
250
|
+
// Decode and return a frozen instance of a Descriptor Option for the given pool
|
251
|
+
static VALUE decode_options(VALUE self, const char* option_type, int size,
|
252
|
+
const char* bytes, VALUE descriptor_pool) {
|
253
|
+
VALUE options_rb = rb_ivar_get(self, options_instancevar_interned);
|
254
|
+
if (options_rb != Qnil) {
|
255
|
+
return options_rb;
|
256
|
+
}
|
257
|
+
|
258
|
+
static const char* prefix = "google.protobuf.";
|
259
|
+
char fullname
|
260
|
+
[/*strlen(prefix)*/ 16 +
|
261
|
+
/*strln(longest option type supported e.g. "MessageOptions")*/ 14 +
|
262
|
+
/*null terminator*/ 1];
|
263
|
+
|
264
|
+
snprintf(fullname, sizeof(fullname), "%s%s", prefix, option_type);
|
265
|
+
const upb_MessageDef* msgdef = upb_DefPool_FindMessageByName(
|
266
|
+
ruby_to_DescriptorPool(descriptor_pool)->symtab, fullname);
|
267
|
+
if (!msgdef) {
|
268
|
+
rb_raise(rb_eRuntimeError, "Cannot find %s in DescriptorPool", option_type);
|
269
|
+
}
|
270
|
+
|
271
|
+
VALUE desc_rb = get_msgdef_obj(descriptor_pool, msgdef);
|
272
|
+
const Descriptor* desc = ruby_to_Descriptor(desc_rb);
|
273
|
+
|
274
|
+
options_rb = Message_decode_bytes(size, bytes, 0, desc->klass, false);
|
275
|
+
|
276
|
+
// Strip features from the options proto to keep it internal.
|
277
|
+
const upb_MessageDef* decoded_desc = NULL;
|
278
|
+
upb_Message* options = Message_GetMutable(options_rb, &decoded_desc);
|
279
|
+
PBRUBY_ASSERT(options != NULL);
|
280
|
+
PBRUBY_ASSERT(decoded_desc == msgdef);
|
281
|
+
const upb_FieldDef* field =
|
282
|
+
upb_MessageDef_FindFieldByName(decoded_desc, "features");
|
283
|
+
PBRUBY_ASSERT(field != NULL);
|
284
|
+
upb_Message_ClearFieldByDef(options, field);
|
285
|
+
|
286
|
+
Message_freeze(options_rb);
|
287
|
+
|
288
|
+
rb_ivar_set(self, options_instancevar_interned, options_rb);
|
289
|
+
return options_rb;
|
290
|
+
}
|
291
|
+
|
252
292
|
/*
|
253
293
|
* call-seq:
|
254
294
|
* Descriptor.new => descriptor
|
@@ -397,6 +437,47 @@ static VALUE Descriptor_msgclass(VALUE _self) {
|
|
397
437
|
return self->klass;
|
398
438
|
}
|
399
439
|
|
440
|
+
/*
|
441
|
+
* call-seq:
|
442
|
+
* Descriptor.options => options
|
443
|
+
*
|
444
|
+
* Returns the `MessageOptions` for this `Descriptor`.
|
445
|
+
*/
|
446
|
+
static VALUE Descriptor_options(VALUE _self) {
|
447
|
+
Descriptor* self = ruby_to_Descriptor(_self);
|
448
|
+
const google_protobuf_MessageOptions* opts =
|
449
|
+
upb_MessageDef_Options(self->msgdef);
|
450
|
+
upb_Arena* arena = upb_Arena_New();
|
451
|
+
size_t size;
|
452
|
+
char* serialized =
|
453
|
+
google_protobuf_MessageOptions_serialize(opts, arena, &size);
|
454
|
+
VALUE message_options = decode_options(_self, "MessageOptions", size,
|
455
|
+
serialized, self->descriptor_pool);
|
456
|
+
upb_Arena_Free(arena);
|
457
|
+
return message_options;
|
458
|
+
}
|
459
|
+
|
460
|
+
/*
|
461
|
+
* call-seq:
|
462
|
+
* Descriptor.to_proto => DescriptorProto
|
463
|
+
*
|
464
|
+
* Returns the `DescriptorProto` of this `Descriptor`.
|
465
|
+
*/
|
466
|
+
static VALUE Descriptor_to_proto(VALUE _self) {
|
467
|
+
Descriptor* self = ruby_to_Descriptor(_self);
|
468
|
+
upb_Arena* arena = upb_Arena_New();
|
469
|
+
google_protobuf_DescriptorProto* proto =
|
470
|
+
upb_MessageDef_ToProto(self->msgdef, arena);
|
471
|
+
size_t size;
|
472
|
+
const char* serialized =
|
473
|
+
google_protobuf_DescriptorProto_serialize(proto, arena, &size);
|
474
|
+
VALUE proto_class = rb_path2class("Google::Protobuf::DescriptorProto");
|
475
|
+
VALUE proto_rb =
|
476
|
+
Message_decode_bytes(size, serialized, 0, proto_class, false);
|
477
|
+
upb_Arena_Free(arena);
|
478
|
+
return proto_rb;
|
479
|
+
}
|
480
|
+
|
400
481
|
static void Descriptor_register(VALUE module) {
|
401
482
|
VALUE klass = rb_define_class_under(module, "Descriptor", rb_cObject);
|
402
483
|
rb_define_alloc_func(klass, Descriptor_alloc);
|
@@ -408,6 +489,8 @@ static void Descriptor_register(VALUE module) {
|
|
408
489
|
rb_define_method(klass, "msgclass", Descriptor_msgclass, 0);
|
409
490
|
rb_define_method(klass, "name", Descriptor_name, 0);
|
410
491
|
rb_define_method(klass, "file_descriptor", Descriptor_file_descriptor, 0);
|
492
|
+
rb_define_method(klass, "options", Descriptor_options, 0);
|
493
|
+
rb_define_method(klass, "to_proto", Descriptor_to_proto, 0);
|
411
494
|
rb_include_module(klass, rb_mEnumerable);
|
412
495
|
rb_gc_register_address(&cDescriptor);
|
413
496
|
cDescriptor = klass;
|
@@ -455,7 +538,7 @@ static VALUE FileDescriptor_alloc(VALUE klass) {
|
|
455
538
|
* call-seq:
|
456
539
|
* FileDescriptor.new => file
|
457
540
|
*
|
458
|
-
* Returns a new file descriptor.
|
541
|
+
* Returns a new file descriptor. May
|
459
542
|
* to a builder.
|
460
543
|
*/
|
461
544
|
static VALUE FileDescriptor_initialize(VALUE _self, VALUE cookie,
|
@@ -487,24 +570,44 @@ static VALUE FileDescriptor_name(VALUE _self) {
|
|
487
570
|
|
488
571
|
/*
|
489
572
|
* call-seq:
|
490
|
-
* FileDescriptor.
|
573
|
+
* FileDescriptor.options => options
|
491
574
|
*
|
492
|
-
* Returns
|
575
|
+
* Returns the `FileOptions` for this `FileDescriptor`.
|
576
|
+
*/
|
577
|
+
static VALUE FileDescriptor_options(VALUE _self) {
|
578
|
+
FileDescriptor* self = ruby_to_FileDescriptor(_self);
|
579
|
+
const google_protobuf_FileOptions* opts = upb_FileDef_Options(self->filedef);
|
580
|
+
upb_Arena* arena = upb_Arena_New();
|
581
|
+
size_t size;
|
582
|
+
char* serialized = google_protobuf_FileOptions_serialize(opts, arena, &size);
|
583
|
+
VALUE file_options = decode_options(_self, "FileOptions", size, serialized,
|
584
|
+
self->descriptor_pool);
|
585
|
+
upb_Arena_Free(arena);
|
586
|
+
return file_options;
|
587
|
+
}
|
588
|
+
|
589
|
+
/*
|
590
|
+
* call-seq:
|
591
|
+
* FileDescriptor.to_proto => FileDescriptorProto
|
493
592
|
*
|
494
|
-
*
|
495
|
-
* :proto2 or :proto3.
|
593
|
+
* Returns the `FileDescriptorProto` of this `FileDescriptor`.
|
496
594
|
*/
|
497
|
-
static VALUE
|
595
|
+
static VALUE FileDescriptor_to_proto(VALUE _self) {
|
498
596
|
FileDescriptor* self = ruby_to_FileDescriptor(_self);
|
597
|
+
upb_Arena* arena = upb_Arena_New();
|
598
|
+
google_protobuf_FileDescriptorProto* file_proto =
|
599
|
+
upb_FileDef_ToProto(self->filedef, arena);
|
499
600
|
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
601
|
+
size_t size;
|
602
|
+
const char* serialized =
|
603
|
+
google_protobuf_FileDescriptorProto_serialize(file_proto, arena, &size);
|
604
|
+
|
605
|
+
VALUE file_proto_class =
|
606
|
+
rb_path2class("Google::Protobuf::FileDescriptorProto");
|
607
|
+
VALUE proto_rb =
|
608
|
+
Message_decode_bytes(size, serialized, 0, file_proto_class, false);
|
609
|
+
upb_Arena_Free(arena);
|
610
|
+
return proto_rb;
|
508
611
|
}
|
509
612
|
|
510
613
|
static void FileDescriptor_register(VALUE module) {
|
@@ -512,7 +615,8 @@ static void FileDescriptor_register(VALUE module) {
|
|
512
615
|
rb_define_alloc_func(klass, FileDescriptor_alloc);
|
513
616
|
rb_define_method(klass, "initialize", FileDescriptor_initialize, 3);
|
514
617
|
rb_define_method(klass, "name", FileDescriptor_name, 0);
|
515
|
-
rb_define_method(klass, "
|
618
|
+
rb_define_method(klass, "options", FileDescriptor_options, 0);
|
619
|
+
rb_define_method(klass, "to_proto", FileDescriptor_to_proto, 0);
|
516
620
|
rb_gc_register_address(&cFileDescriptor);
|
517
621
|
cFileDescriptor = klass;
|
518
622
|
}
|
@@ -563,7 +667,7 @@ static VALUE FieldDescriptor_alloc(VALUE klass) {
|
|
563
667
|
|
564
668
|
/*
|
565
669
|
* call-seq:
|
566
|
-
*
|
670
|
+
* FieldDescriptor.new(c_only_cookie, pool, ptr) => FieldDescriptor
|
567
671
|
*
|
568
672
|
* Creates a descriptor wrapper object. May only be called from C.
|
569
673
|
*/
|
@@ -601,7 +705,7 @@ upb_CType ruby_to_fieldtype(VALUE type) {
|
|
601
705
|
|
602
706
|
#define CONVERT(upb, ruby) \
|
603
707
|
if (SYM2ID(type) == rb_intern(#ruby)) { \
|
604
|
-
return kUpb_CType_##upb;
|
708
|
+
return kUpb_CType_##upb; \
|
605
709
|
}
|
606
710
|
|
607
711
|
CONVERT(Float, float);
|
@@ -624,7 +728,7 @@ upb_CType ruby_to_fieldtype(VALUE type) {
|
|
624
728
|
|
625
729
|
static VALUE descriptortype_to_ruby(upb_FieldType type) {
|
626
730
|
switch (type) {
|
627
|
-
#define CONVERT(upb, ruby)
|
731
|
+
#define CONVERT(upb, ruby) \
|
628
732
|
case kUpb_FieldType_##upb: \
|
629
733
|
return ID2SYM(rb_intern(#ruby));
|
630
734
|
CONVERT(Float, float);
|
@@ -674,7 +778,7 @@ static VALUE FieldDescriptor__type(VALUE _self) {
|
|
674
778
|
static VALUE FieldDescriptor_default(VALUE _self) {
|
675
779
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
676
780
|
const upb_FieldDef* f = self->fielddef;
|
677
|
-
upb_MessageValue default_val =
|
781
|
+
upb_MessageValue default_val = upb_MessageValue_Zero();
|
678
782
|
if (upb_FieldDef_IsSubMessage(f)) {
|
679
783
|
return Qnil;
|
680
784
|
} else if (!upb_FieldDef_IsRepeated(f)) {
|
@@ -683,6 +787,50 @@ static VALUE FieldDescriptor_default(VALUE _self) {
|
|
683
787
|
return Convert_UpbToRuby(default_val, TypeInfo_get(self->fielddef), Qnil);
|
684
788
|
}
|
685
789
|
|
790
|
+
/*
|
791
|
+
* call-seq:
|
792
|
+
* FieldDescriptor.has_presence? => bool
|
793
|
+
*
|
794
|
+
* Returns whether this field tracks presence.
|
795
|
+
*/
|
796
|
+
static VALUE FieldDescriptor_has_presence(VALUE _self) {
|
797
|
+
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
798
|
+
return upb_FieldDef_HasPresence(self->fielddef) ? Qtrue : Qfalse;
|
799
|
+
}
|
800
|
+
|
801
|
+
/*
|
802
|
+
* call-seq:
|
803
|
+
* FieldDescriptor.required? => bool
|
804
|
+
*
|
805
|
+
* Returns whether this is a required field.
|
806
|
+
*/
|
807
|
+
static VALUE FieldDescriptor_is_required(VALUE _self) {
|
808
|
+
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
809
|
+
return upb_FieldDef_IsRequired(self->fielddef) ? Qtrue : Qfalse;
|
810
|
+
}
|
811
|
+
|
812
|
+
/*
|
813
|
+
* call-seq:
|
814
|
+
* FieldDescriptor.repeated? => bool
|
815
|
+
*
|
816
|
+
* Returns whether this is a repeated field.
|
817
|
+
*/
|
818
|
+
static VALUE FieldDescriptor_is_repeated(VALUE _self) {
|
819
|
+
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
820
|
+
return upb_FieldDef_IsRepeated(self->fielddef) ? Qtrue : Qfalse;
|
821
|
+
}
|
822
|
+
|
823
|
+
/*
|
824
|
+
* call-seq:
|
825
|
+
* FieldDescriptor.is_packed? => bool
|
826
|
+
*
|
827
|
+
* Returns whether this is a repeated field that uses packed encoding.
|
828
|
+
*/
|
829
|
+
static VALUE FieldDescriptor_is_packed(VALUE _self) {
|
830
|
+
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
831
|
+
return upb_FieldDef_IsPacked(self->fielddef) ? Qtrue : Qfalse;
|
832
|
+
}
|
833
|
+
|
686
834
|
/*
|
687
835
|
* call-seq:
|
688
836
|
* FieldDescriptor.json_name => json_name
|
@@ -697,6 +845,8 @@ static VALUE FieldDescriptor_json_name(VALUE _self) {
|
|
697
845
|
}
|
698
846
|
|
699
847
|
/*
|
848
|
+
* DEPRECATED: Use repeated? or required? instead.
|
849
|
+
*
|
700
850
|
* call-seq:
|
701
851
|
* FieldDescriptor.label => label
|
702
852
|
*
|
@@ -709,7 +859,7 @@ static VALUE FieldDescriptor_label(VALUE _self) {
|
|
709
859
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
710
860
|
switch (upb_FieldDef_Label(self->fielddef)) {
|
711
861
|
#define CONVERT(upb, ruby) \
|
712
|
-
case kUpb_Label_##upb:
|
862
|
+
case kUpb_Label_##upb: \
|
713
863
|
return ID2SYM(rb_intern(#ruby));
|
714
864
|
|
715
865
|
CONVERT(Optional, optional);
|
@@ -809,7 +959,7 @@ static VALUE FieldDescriptor_get(VALUE _self, VALUE msg_rb) {
|
|
809
959
|
static VALUE FieldDescriptor_has(VALUE _self, VALUE msg_rb) {
|
810
960
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
811
961
|
const upb_MessageDef* m;
|
812
|
-
const
|
962
|
+
const upb_Message* msg = Message_Get(msg_rb, &m);
|
813
963
|
|
814
964
|
if (m != upb_FieldDef_ContainingType(self->fielddef)) {
|
815
965
|
rb_raise(cTypeError, "has method called on wrong message type");
|
@@ -829,7 +979,7 @@ static VALUE FieldDescriptor_has(VALUE _self, VALUE msg_rb) {
|
|
829
979
|
static VALUE FieldDescriptor_clear(VALUE _self, VALUE msg_rb) {
|
830
980
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
831
981
|
const upb_MessageDef* m;
|
832
|
-
|
982
|
+
upb_Message* msg = Message_GetMutable(msg_rb, &m);
|
833
983
|
|
834
984
|
if (m != upb_FieldDef_ContainingType(self->fielddef)) {
|
835
985
|
rb_raise(cTypeError, "has method called on wrong message type");
|
@@ -850,7 +1000,7 @@ static VALUE FieldDescriptor_clear(VALUE _self, VALUE msg_rb) {
|
|
850
1000
|
static VALUE FieldDescriptor_set(VALUE _self, VALUE msg_rb, VALUE value) {
|
851
1001
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
852
1002
|
const upb_MessageDef* m;
|
853
|
-
|
1003
|
+
upb_Message* msg = Message_GetMutable(msg_rb, &m);
|
854
1004
|
upb_Arena* arena = Arena_get(Message_GetArena(msg_rb));
|
855
1005
|
upb_MessageValue msgval;
|
856
1006
|
|
@@ -864,6 +1014,46 @@ static VALUE FieldDescriptor_set(VALUE _self, VALUE msg_rb, VALUE value) {
|
|
864
1014
|
return Qnil;
|
865
1015
|
}
|
866
1016
|
|
1017
|
+
/*
|
1018
|
+
* call-seq:
|
1019
|
+
* FieldDescriptor.options => options
|
1020
|
+
*
|
1021
|
+
* Returns the `FieldOptions` for this `FieldDescriptor`.
|
1022
|
+
*/
|
1023
|
+
static VALUE FieldDescriptor_options(VALUE _self) {
|
1024
|
+
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
1025
|
+
const google_protobuf_FieldOptions* opts =
|
1026
|
+
upb_FieldDef_Options(self->fielddef);
|
1027
|
+
upb_Arena* arena = upb_Arena_New();
|
1028
|
+
size_t size;
|
1029
|
+
char* serialized = google_protobuf_FieldOptions_serialize(opts, arena, &size);
|
1030
|
+
VALUE field_options = decode_options(_self, "FieldOptions", size, serialized,
|
1031
|
+
self->descriptor_pool);
|
1032
|
+
upb_Arena_Free(arena);
|
1033
|
+
return field_options;
|
1034
|
+
}
|
1035
|
+
|
1036
|
+
/*
|
1037
|
+
* call-seq:
|
1038
|
+
* FieldDescriptor.to_proto => FieldDescriptorProto
|
1039
|
+
*
|
1040
|
+
* Returns the `FieldDescriptorProto` of this `FieldDescriptor`.
|
1041
|
+
*/
|
1042
|
+
static VALUE FieldDescriptor_to_proto(VALUE _self) {
|
1043
|
+
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
1044
|
+
upb_Arena* arena = upb_Arena_New();
|
1045
|
+
google_protobuf_FieldDescriptorProto* proto =
|
1046
|
+
upb_FieldDef_ToProto(self->fielddef, arena);
|
1047
|
+
size_t size;
|
1048
|
+
const char* serialized =
|
1049
|
+
google_protobuf_FieldDescriptorProto_serialize(proto, arena, &size);
|
1050
|
+
VALUE proto_class = rb_path2class("Google::Protobuf::FieldDescriptorProto");
|
1051
|
+
VALUE proto_rb =
|
1052
|
+
Message_decode_bytes(size, serialized, 0, proto_class, false);
|
1053
|
+
upb_Arena_Free(arena);
|
1054
|
+
return proto_rb;
|
1055
|
+
}
|
1056
|
+
|
867
1057
|
static void FieldDescriptor_register(VALUE module) {
|
868
1058
|
VALUE klass = rb_define_class_under(module, "FieldDescriptor", rb_cObject);
|
869
1059
|
rb_define_alloc_func(klass, FieldDescriptor_alloc);
|
@@ -871,6 +1061,10 @@ static void FieldDescriptor_register(VALUE module) {
|
|
871
1061
|
rb_define_method(klass, "name", FieldDescriptor_name, 0);
|
872
1062
|
rb_define_method(klass, "type", FieldDescriptor__type, 0);
|
873
1063
|
rb_define_method(klass, "default", FieldDescriptor_default, 0);
|
1064
|
+
rb_define_method(klass, "has_presence?", FieldDescriptor_has_presence, 0);
|
1065
|
+
rb_define_method(klass, "required?", FieldDescriptor_is_required, 0);
|
1066
|
+
rb_define_method(klass, "repeated?", FieldDescriptor_is_repeated, 0);
|
1067
|
+
rb_define_method(klass, "is_packed?", FieldDescriptor_is_packed, 0);
|
874
1068
|
rb_define_method(klass, "json_name", FieldDescriptor_json_name, 0);
|
875
1069
|
rb_define_method(klass, "label", FieldDescriptor_label, 0);
|
876
1070
|
rb_define_method(klass, "number", FieldDescriptor_number, 0);
|
@@ -880,6 +1074,8 @@ static void FieldDescriptor_register(VALUE module) {
|
|
880
1074
|
rb_define_method(klass, "clear", FieldDescriptor_clear, 1);
|
881
1075
|
rb_define_method(klass, "get", FieldDescriptor_get, 1);
|
882
1076
|
rb_define_method(klass, "set", FieldDescriptor_set, 2);
|
1077
|
+
rb_define_method(klass, "options", FieldDescriptor_options, 0);
|
1078
|
+
rb_define_method(klass, "to_proto", FieldDescriptor_to_proto, 0);
|
883
1079
|
rb_gc_register_address(&cFieldDescriptor);
|
884
1080
|
cFieldDescriptor = klass;
|
885
1081
|
}
|
@@ -979,12 +1175,54 @@ static VALUE OneofDescriptor_each(VALUE _self) {
|
|
979
1175
|
return Qnil;
|
980
1176
|
}
|
981
1177
|
|
1178
|
+
/*
|
1179
|
+
* call-seq:
|
1180
|
+
* OneofDescriptor.options => options
|
1181
|
+
*
|
1182
|
+
* Returns the `OneofOptions` for this `OneofDescriptor`.
|
1183
|
+
*/
|
1184
|
+
static VALUE OneOfDescriptor_options(VALUE _self) {
|
1185
|
+
OneofDescriptor* self = ruby_to_OneofDescriptor(_self);
|
1186
|
+
const google_protobuf_OneofOptions* opts =
|
1187
|
+
upb_OneofDef_Options(self->oneofdef);
|
1188
|
+
upb_Arena* arena = upb_Arena_New();
|
1189
|
+
size_t size;
|
1190
|
+
char* serialized = google_protobuf_OneofOptions_serialize(opts, arena, &size);
|
1191
|
+
VALUE oneof_options = decode_options(_self, "OneofOptions", size, serialized,
|
1192
|
+
self->descriptor_pool);
|
1193
|
+
upb_Arena_Free(arena);
|
1194
|
+
return oneof_options;
|
1195
|
+
}
|
1196
|
+
|
1197
|
+
/*
|
1198
|
+
* call-seq:
|
1199
|
+
* OneofDescriptor.to_proto => OneofDescriptorProto
|
1200
|
+
*
|
1201
|
+
* Returns the `OneofDescriptorProto` of this `OneofDescriptor`.
|
1202
|
+
*/
|
1203
|
+
static VALUE OneOfDescriptor_to_proto(VALUE _self) {
|
1204
|
+
OneofDescriptor* self = ruby_to_OneofDescriptor(_self);
|
1205
|
+
upb_Arena* arena = upb_Arena_New();
|
1206
|
+
google_protobuf_OneofDescriptorProto* proto =
|
1207
|
+
upb_OneofDef_ToProto(self->oneofdef, arena);
|
1208
|
+
size_t size;
|
1209
|
+
const char* serialized =
|
1210
|
+
google_protobuf_OneofDescriptorProto_serialize(proto, arena, &size);
|
1211
|
+
VALUE proto_class = rb_path2class("Google::Protobuf::OneofDescriptorProto");
|
1212
|
+
VALUE proto_rb =
|
1213
|
+
Message_decode_bytes(size, serialized, 0, proto_class, false);
|
1214
|
+
upb_Arena_Free(arena);
|
1215
|
+
return proto_rb;
|
1216
|
+
}
|
1217
|
+
|
982
1218
|
static void OneofDescriptor_register(VALUE module) {
|
983
1219
|
VALUE klass = rb_define_class_under(module, "OneofDescriptor", rb_cObject);
|
984
1220
|
rb_define_alloc_func(klass, OneofDescriptor_alloc);
|
985
1221
|
rb_define_method(klass, "initialize", OneofDescriptor_initialize, 3);
|
986
1222
|
rb_define_method(klass, "name", OneofDescriptor_name, 0);
|
987
1223
|
rb_define_method(klass, "each", OneofDescriptor_each, 0);
|
1224
|
+
rb_define_method(klass, "options", OneOfDescriptor_options, 0);
|
1225
|
+
rb_define_method(klass, "to_proto", OneOfDescriptor_to_proto, 0);
|
988
1226
|
rb_include_module(klass, rb_mEnumerable);
|
989
1227
|
rb_gc_register_address(&cOneofDescriptor);
|
990
1228
|
cOneofDescriptor = klass;
|
@@ -1070,6 +1308,17 @@ static VALUE EnumDescriptor_file_descriptor(VALUE _self) {
|
|
1070
1308
|
upb_EnumDef_File(self->enumdef));
|
1071
1309
|
}
|
1072
1310
|
|
1311
|
+
/*
|
1312
|
+
* call-seq:
|
1313
|
+
* EnumDescriptor.is_closed? => bool
|
1314
|
+
*
|
1315
|
+
* Returns whether this enum is open or closed.
|
1316
|
+
*/
|
1317
|
+
static VALUE EnumDescriptor_is_closed(VALUE _self) {
|
1318
|
+
EnumDescriptor* self = ruby_to_EnumDescriptor(_self);
|
1319
|
+
return upb_EnumDef_IsClosed(self->enumdef) ? Qtrue : Qfalse;
|
1320
|
+
}
|
1321
|
+
|
1073
1322
|
/*
|
1074
1323
|
* call-seq:
|
1075
1324
|
* EnumDescriptor.name => name
|
@@ -1091,7 +1340,7 @@ static VALUE EnumDescriptor_name(VALUE _self) {
|
|
1091
1340
|
static VALUE EnumDescriptor_lookup_name(VALUE _self, VALUE name) {
|
1092
1341
|
EnumDescriptor* self = ruby_to_EnumDescriptor(_self);
|
1093
1342
|
const char* name_str = rb_id2name(SYM2ID(name));
|
1094
|
-
const upb_EnumValueDef
|
1343
|
+
const upb_EnumValueDef* ev =
|
1095
1344
|
upb_EnumDef_FindValueByName(self->enumdef, name_str);
|
1096
1345
|
if (ev) {
|
1097
1346
|
return INT2NUM(upb_EnumValueDef_Number(ev));
|
@@ -1110,7 +1359,8 @@ static VALUE EnumDescriptor_lookup_name(VALUE _self, VALUE name) {
|
|
1110
1359
|
static VALUE EnumDescriptor_lookup_value(VALUE _self, VALUE number) {
|
1111
1360
|
EnumDescriptor* self = ruby_to_EnumDescriptor(_self);
|
1112
1361
|
int32_t val = NUM2INT(number);
|
1113
|
-
const upb_EnumValueDef* ev =
|
1362
|
+
const upb_EnumValueDef* ev =
|
1363
|
+
upb_EnumDef_FindValueByNumber(self->enumdef, val);
|
1114
1364
|
if (ev) {
|
1115
1365
|
return ID2SYM(rb_intern(upb_EnumValueDef_Name(ev)));
|
1116
1366
|
} else {
|
@@ -1153,6 +1403,47 @@ static VALUE EnumDescriptor_enummodule(VALUE _self) {
|
|
1153
1403
|
return self->module;
|
1154
1404
|
}
|
1155
1405
|
|
1406
|
+
/*
|
1407
|
+
* call-seq:
|
1408
|
+
* EnumDescriptor.options => options
|
1409
|
+
*
|
1410
|
+
* Returns the `EnumOptions` for this `EnumDescriptor`.
|
1411
|
+
*/
|
1412
|
+
static VALUE EnumDescriptor_options(VALUE _self) {
|
1413
|
+
EnumDescriptor* self = ruby_to_EnumDescriptor(_self);
|
1414
|
+
const google_protobuf_EnumOptions* opts = upb_EnumDef_Options(self->enumdef);
|
1415
|
+
upb_Arena* arena = upb_Arena_New();
|
1416
|
+
size_t size;
|
1417
|
+
char* serialized = google_protobuf_EnumOptions_serialize(opts, arena, &size);
|
1418
|
+
VALUE enum_options = decode_options(_self, "EnumOptions", size, serialized,
|
1419
|
+
self->descriptor_pool);
|
1420
|
+
upb_Arena_Free(arena);
|
1421
|
+
return enum_options;
|
1422
|
+
}
|
1423
|
+
|
1424
|
+
/*
|
1425
|
+
* call-seq:
|
1426
|
+
* EnumDescriptor.to_proto => EnumDescriptorProto
|
1427
|
+
*
|
1428
|
+
* Returns the `EnumDescriptorProto` of this `EnumDescriptor`.
|
1429
|
+
*/
|
1430
|
+
static VALUE EnumDescriptor_to_proto(VALUE _self) {
|
1431
|
+
EnumDescriptor* self = ruby_to_EnumDescriptor(_self);
|
1432
|
+
upb_Arena* arena = upb_Arena_New();
|
1433
|
+
google_protobuf_EnumDescriptorProto* proto =
|
1434
|
+
upb_EnumDef_ToProto(self->enumdef, arena);
|
1435
|
+
|
1436
|
+
size_t size;
|
1437
|
+
const char* serialized =
|
1438
|
+
google_protobuf_EnumDescriptorProto_serialize(proto, arena, &size);
|
1439
|
+
|
1440
|
+
VALUE proto_class = rb_path2class("Google::Protobuf::EnumDescriptorProto");
|
1441
|
+
VALUE proto_rb =
|
1442
|
+
Message_decode_bytes(size, serialized, 0, proto_class, false);
|
1443
|
+
upb_Arena_Free(arena);
|
1444
|
+
return proto_rb;
|
1445
|
+
}
|
1446
|
+
|
1156
1447
|
static void EnumDescriptor_register(VALUE module) {
|
1157
1448
|
VALUE klass = rb_define_class_under(module, "EnumDescriptor", rb_cObject);
|
1158
1449
|
rb_define_alloc_func(klass, EnumDescriptor_alloc);
|
@@ -1163,11 +1454,350 @@ static void EnumDescriptor_register(VALUE module) {
|
|
1163
1454
|
rb_define_method(klass, "each", EnumDescriptor_each, 0);
|
1164
1455
|
rb_define_method(klass, "enummodule", EnumDescriptor_enummodule, 0);
|
1165
1456
|
rb_define_method(klass, "file_descriptor", EnumDescriptor_file_descriptor, 0);
|
1457
|
+
rb_define_method(klass, "is_closed?", EnumDescriptor_is_closed, 0);
|
1458
|
+
rb_define_method(klass, "options", EnumDescriptor_options, 0);
|
1459
|
+
rb_define_method(klass, "to_proto", EnumDescriptor_to_proto, 0);
|
1166
1460
|
rb_include_module(klass, rb_mEnumerable);
|
1167
1461
|
rb_gc_register_address(&cEnumDescriptor);
|
1168
1462
|
cEnumDescriptor = klass;
|
1169
1463
|
}
|
1170
1464
|
|
1465
|
+
// -----------------------------------------------------------------------------
|
1466
|
+
// ServiceDescriptor
|
1467
|
+
// -----------------------------------------------------------------------------
|
1468
|
+
|
1469
|
+
typedef struct {
|
1470
|
+
const upb_ServiceDef* servicedef;
|
1471
|
+
// IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
|
1472
|
+
// macro to update VALUE references, as to trigger write barriers.
|
1473
|
+
VALUE module; // begins as nil
|
1474
|
+
VALUE descriptor_pool; // Owns the upb_ServiceDef.
|
1475
|
+
} ServiceDescriptor;
|
1476
|
+
|
1477
|
+
static VALUE cServiceDescriptor = Qnil;
|
1478
|
+
|
1479
|
+
static void ServiceDescriptor_mark(void* _self) {
|
1480
|
+
ServiceDescriptor* self = _self;
|
1481
|
+
rb_gc_mark(self->module);
|
1482
|
+
rb_gc_mark(self->descriptor_pool);
|
1483
|
+
}
|
1484
|
+
|
1485
|
+
static const rb_data_type_t ServiceDescriptor_type = {
|
1486
|
+
"Google::Protobuf::ServicDescriptor",
|
1487
|
+
{ServiceDescriptor_mark, RUBY_DEFAULT_FREE, NULL},
|
1488
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
1489
|
+
};
|
1490
|
+
|
1491
|
+
static ServiceDescriptor* ruby_to_ServiceDescriptor(VALUE val) {
|
1492
|
+
ServiceDescriptor* ret;
|
1493
|
+
TypedData_Get_Struct(val, ServiceDescriptor, &ServiceDescriptor_type, ret);
|
1494
|
+
return ret;
|
1495
|
+
}
|
1496
|
+
|
1497
|
+
static VALUE ServiceDescriptor_alloc(VALUE klass) {
|
1498
|
+
ServiceDescriptor* self = ALLOC(ServiceDescriptor);
|
1499
|
+
VALUE ret = TypedData_Wrap_Struct(klass, &ServiceDescriptor_type, self);
|
1500
|
+
self->servicedef = NULL;
|
1501
|
+
self->module = Qnil;
|
1502
|
+
self->descriptor_pool = Qnil;
|
1503
|
+
return ret;
|
1504
|
+
}
|
1505
|
+
|
1506
|
+
/*
|
1507
|
+
* call-seq:
|
1508
|
+
* ServiceDescriptor.new(c_only_cookie, ptr) => ServiceDescriptor
|
1509
|
+
*
|
1510
|
+
* Creates a descriptor wrapper object. May only be called from C.
|
1511
|
+
*/
|
1512
|
+
static VALUE ServiceDescriptor_initialize(VALUE _self, VALUE cookie,
|
1513
|
+
VALUE descriptor_pool, VALUE ptr) {
|
1514
|
+
ServiceDescriptor* self = ruby_to_ServiceDescriptor(_self);
|
1515
|
+
|
1516
|
+
if (cookie != c_only_cookie) {
|
1517
|
+
rb_raise(rb_eRuntimeError,
|
1518
|
+
"Descriptor objects may not be created from Ruby.");
|
1519
|
+
}
|
1520
|
+
|
1521
|
+
RB_OBJ_WRITE(_self, &self->descriptor_pool, descriptor_pool);
|
1522
|
+
self->servicedef = (const upb_ServiceDef*)NUM2ULL(ptr);
|
1523
|
+
|
1524
|
+
return Qnil;
|
1525
|
+
}
|
1526
|
+
|
1527
|
+
/*
|
1528
|
+
* call-seq:
|
1529
|
+
* ServiceDescriptor.name => name
|
1530
|
+
*
|
1531
|
+
* Returns the name of this service.
|
1532
|
+
*/
|
1533
|
+
static VALUE ServiceDescriptor_name(VALUE _self) {
|
1534
|
+
ServiceDescriptor* self = ruby_to_ServiceDescriptor(_self);
|
1535
|
+
return rb_str_maybe_null(upb_ServiceDef_FullName(self->servicedef));
|
1536
|
+
}
|
1537
|
+
|
1538
|
+
/*
|
1539
|
+
* call-seq:
|
1540
|
+
* ServiceDescriptor.file_descriptor
|
1541
|
+
*
|
1542
|
+
* Returns the FileDescriptor object this service belongs to.
|
1543
|
+
*/
|
1544
|
+
static VALUE ServiceDescriptor_file_descriptor(VALUE _self) {
|
1545
|
+
ServiceDescriptor* self = ruby_to_ServiceDescriptor(_self);
|
1546
|
+
return get_filedef_obj(self->descriptor_pool,
|
1547
|
+
upb_ServiceDef_File(self->servicedef));
|
1548
|
+
}
|
1549
|
+
|
1550
|
+
/*
|
1551
|
+
* call-seq:
|
1552
|
+
* ServiceDescriptor.each(&block)
|
1553
|
+
*
|
1554
|
+
* Iterates over methods in this service, yielding to the block on each one.
|
1555
|
+
*/
|
1556
|
+
static VALUE ServiceDescriptor_each(VALUE _self) {
|
1557
|
+
ServiceDescriptor* self = ruby_to_ServiceDescriptor(_self);
|
1558
|
+
|
1559
|
+
int n = upb_ServiceDef_MethodCount(self->servicedef);
|
1560
|
+
for (int i = 0; i < n; i++) {
|
1561
|
+
const upb_MethodDef* method = upb_ServiceDef_Method(self->servicedef, i);
|
1562
|
+
VALUE obj = get_methoddef_obj(self->descriptor_pool, method);
|
1563
|
+
rb_yield(obj);
|
1564
|
+
}
|
1565
|
+
return Qnil;
|
1566
|
+
}
|
1567
|
+
|
1568
|
+
/*
|
1569
|
+
* call-seq:
|
1570
|
+
* ServiceDescriptor.options => options
|
1571
|
+
*
|
1572
|
+
* Returns the `ServiceOptions` for this `ServiceDescriptor`.
|
1573
|
+
*/
|
1574
|
+
static VALUE ServiceDescriptor_options(VALUE _self) {
|
1575
|
+
ServiceDescriptor* self = ruby_to_ServiceDescriptor(_self);
|
1576
|
+
const google_protobuf_ServiceOptions* opts =
|
1577
|
+
upb_ServiceDef_Options(self->servicedef);
|
1578
|
+
upb_Arena* arena = upb_Arena_New();
|
1579
|
+
size_t size;
|
1580
|
+
char* serialized =
|
1581
|
+
google_protobuf_ServiceOptions_serialize(opts, arena, &size);
|
1582
|
+
VALUE service_options = decode_options(_self, "ServiceOptions", size,
|
1583
|
+
serialized, self->descriptor_pool);
|
1584
|
+
upb_Arena_Free(arena);
|
1585
|
+
return service_options;
|
1586
|
+
}
|
1587
|
+
|
1588
|
+
/*
|
1589
|
+
* call-seq:
|
1590
|
+
* ServiceDescriptor.to_proto => ServiceDescriptorProto
|
1591
|
+
*
|
1592
|
+
* Returns the `ServiceDescriptorProto` of this `ServiceDescriptor`.
|
1593
|
+
*/
|
1594
|
+
static VALUE ServiceDescriptor_to_proto(VALUE _self) {
|
1595
|
+
ServiceDescriptor* self = ruby_to_ServiceDescriptor(_self);
|
1596
|
+
upb_Arena* arena = upb_Arena_New();
|
1597
|
+
google_protobuf_ServiceDescriptorProto* proto =
|
1598
|
+
upb_ServiceDef_ToProto(self->servicedef, arena);
|
1599
|
+
size_t size;
|
1600
|
+
const char* serialized =
|
1601
|
+
google_protobuf_ServiceDescriptorProto_serialize(proto, arena, &size);
|
1602
|
+
VALUE proto_class = rb_path2class("Google::Protobuf::ServiceDescriptorProto");
|
1603
|
+
VALUE proto_rb =
|
1604
|
+
Message_decode_bytes(size, serialized, 0, proto_class, false);
|
1605
|
+
upb_Arena_Free(arena);
|
1606
|
+
return proto_rb;
|
1607
|
+
}
|
1608
|
+
|
1609
|
+
static void ServiceDescriptor_register(VALUE module) {
|
1610
|
+
VALUE klass = rb_define_class_under(module, "ServiceDescriptor", rb_cObject);
|
1611
|
+
rb_define_alloc_func(klass, ServiceDescriptor_alloc);
|
1612
|
+
rb_define_method(klass, "initialize", ServiceDescriptor_initialize, 3);
|
1613
|
+
rb_define_method(klass, "name", ServiceDescriptor_name, 0);
|
1614
|
+
rb_define_method(klass, "each", ServiceDescriptor_each, 0);
|
1615
|
+
rb_define_method(klass, "file_descriptor", ServiceDescriptor_file_descriptor,
|
1616
|
+
0);
|
1617
|
+
rb_define_method(klass, "options", ServiceDescriptor_options, 0);
|
1618
|
+
rb_define_method(klass, "to_proto", ServiceDescriptor_to_proto, 0);
|
1619
|
+
rb_include_module(klass, rb_mEnumerable);
|
1620
|
+
rb_gc_register_address(&cServiceDescriptor);
|
1621
|
+
cServiceDescriptor = klass;
|
1622
|
+
}
|
1623
|
+
|
1624
|
+
// -----------------------------------------------------------------------------
|
1625
|
+
// MethodDescriptor
|
1626
|
+
// -----------------------------------------------------------------------------
|
1627
|
+
|
1628
|
+
typedef struct {
|
1629
|
+
const upb_MethodDef* methoddef;
|
1630
|
+
// IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
|
1631
|
+
// macro to update VALUE references, as to trigger write barriers.
|
1632
|
+
VALUE module; // begins as nil
|
1633
|
+
VALUE descriptor_pool; // Owns the upb_MethodDef.
|
1634
|
+
} MethodDescriptor;
|
1635
|
+
|
1636
|
+
static VALUE cMethodDescriptor = Qnil;
|
1637
|
+
|
1638
|
+
static void MethodDescriptor_mark(void* _self) {
|
1639
|
+
MethodDescriptor* self = _self;
|
1640
|
+
rb_gc_mark(self->module);
|
1641
|
+
rb_gc_mark(self->descriptor_pool);
|
1642
|
+
}
|
1643
|
+
|
1644
|
+
static const rb_data_type_t MethodDescriptor_type = {
|
1645
|
+
"Google::Protobuf::MethodDescriptor",
|
1646
|
+
{MethodDescriptor_mark, RUBY_DEFAULT_FREE, NULL},
|
1647
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
1648
|
+
};
|
1649
|
+
|
1650
|
+
static MethodDescriptor* ruby_to_MethodDescriptor(VALUE val) {
|
1651
|
+
MethodDescriptor* ret;
|
1652
|
+
TypedData_Get_Struct(val, MethodDescriptor, &MethodDescriptor_type, ret);
|
1653
|
+
return ret;
|
1654
|
+
}
|
1655
|
+
|
1656
|
+
static VALUE MethodDescriptor_alloc(VALUE klass) {
|
1657
|
+
MethodDescriptor* self = ALLOC(MethodDescriptor);
|
1658
|
+
VALUE ret = TypedData_Wrap_Struct(klass, &MethodDescriptor_type, self);
|
1659
|
+
self->methoddef = NULL;
|
1660
|
+
self->module = Qnil;
|
1661
|
+
self->descriptor_pool = Qnil;
|
1662
|
+
return ret;
|
1663
|
+
}
|
1664
|
+
|
1665
|
+
/*
|
1666
|
+
* call-seq:
|
1667
|
+
* MethodDescriptor.new(c_only_cookie, ptr) => MethodDescriptor
|
1668
|
+
*
|
1669
|
+
* Creates a descriptor wrapper object. May only be called from C.
|
1670
|
+
*/
|
1671
|
+
static VALUE MethodDescriptor_initialize(VALUE _self, VALUE cookie,
|
1672
|
+
VALUE descriptor_pool, VALUE ptr) {
|
1673
|
+
MethodDescriptor* self = ruby_to_MethodDescriptor(_self);
|
1674
|
+
|
1675
|
+
if (cookie != c_only_cookie) {
|
1676
|
+
rb_raise(rb_eRuntimeError,
|
1677
|
+
"Descriptor objects may not be created from Ruby.");
|
1678
|
+
}
|
1679
|
+
|
1680
|
+
RB_OBJ_WRITE(_self, &self->descriptor_pool, descriptor_pool);
|
1681
|
+
self->methoddef = (const upb_MethodDef*)NUM2ULL(ptr);
|
1682
|
+
|
1683
|
+
return Qnil;
|
1684
|
+
}
|
1685
|
+
|
1686
|
+
/*
|
1687
|
+
* call-seq:
|
1688
|
+
* MethodDescriptor.name => name
|
1689
|
+
*
|
1690
|
+
* Returns the name of this method
|
1691
|
+
*/
|
1692
|
+
static VALUE MethodDescriptor_name(VALUE _self) {
|
1693
|
+
MethodDescriptor* self = ruby_to_MethodDescriptor(_self);
|
1694
|
+
return rb_str_maybe_null(upb_MethodDef_Name(self->methoddef));
|
1695
|
+
}
|
1696
|
+
|
1697
|
+
/*
|
1698
|
+
* call-seq:
|
1699
|
+
* MethodDescriptor.options => options
|
1700
|
+
*
|
1701
|
+
* Returns the `MethodOptions` for this `MethodDescriptor`.
|
1702
|
+
*/
|
1703
|
+
static VALUE MethodDescriptor_options(VALUE _self) {
|
1704
|
+
MethodDescriptor* self = ruby_to_MethodDescriptor(_self);
|
1705
|
+
const google_protobuf_MethodOptions* opts =
|
1706
|
+
upb_MethodDef_Options(self->methoddef);
|
1707
|
+
upb_Arena* arena = upb_Arena_New();
|
1708
|
+
size_t size;
|
1709
|
+
char* serialized =
|
1710
|
+
google_protobuf_MethodOptions_serialize(opts, arena, &size);
|
1711
|
+
VALUE method_options = decode_options(_self, "MethodOptions", size,
|
1712
|
+
serialized, self->descriptor_pool);
|
1713
|
+
upb_Arena_Free(arena);
|
1714
|
+
return method_options;
|
1715
|
+
}
|
1716
|
+
|
1717
|
+
/*
|
1718
|
+
* call-seq:
|
1719
|
+
* MethodDescriptor.input_type => Descriptor
|
1720
|
+
*
|
1721
|
+
* Returns the `Descriptor` for the request message type of this method
|
1722
|
+
*/
|
1723
|
+
static VALUE MethodDescriptor_input_type(VALUE _self) {
|
1724
|
+
MethodDescriptor* self = ruby_to_MethodDescriptor(_self);
|
1725
|
+
const upb_MessageDef* type = upb_MethodDef_InputType(self->methoddef);
|
1726
|
+
return get_msgdef_obj(self->descriptor_pool, type);
|
1727
|
+
}
|
1728
|
+
|
1729
|
+
/*
|
1730
|
+
* call-seq:
|
1731
|
+
* MethodDescriptor.output_type => Descriptor
|
1732
|
+
*
|
1733
|
+
* Returns the `Descriptor` for the response message type of this method
|
1734
|
+
*/
|
1735
|
+
static VALUE MethodDescriptor_output_type(VALUE _self) {
|
1736
|
+
MethodDescriptor* self = ruby_to_MethodDescriptor(_self);
|
1737
|
+
const upb_MessageDef* type = upb_MethodDef_OutputType(self->methoddef);
|
1738
|
+
return get_msgdef_obj(self->descriptor_pool, type);
|
1739
|
+
}
|
1740
|
+
|
1741
|
+
/*
|
1742
|
+
* call-seq:
|
1743
|
+
* MethodDescriptor.client_streaming => bool
|
1744
|
+
*
|
1745
|
+
* Returns whether or not this is a streaming request method
|
1746
|
+
*/
|
1747
|
+
static VALUE MethodDescriptor_client_streaming(VALUE _self) {
|
1748
|
+
MethodDescriptor* self = ruby_to_MethodDescriptor(_self);
|
1749
|
+
return upb_MethodDef_ClientStreaming(self->methoddef) ? Qtrue : Qfalse;
|
1750
|
+
}
|
1751
|
+
|
1752
|
+
/*
|
1753
|
+
* call-seq:
|
1754
|
+
* MethodDescriptor.to_proto => MethodDescriptorProto
|
1755
|
+
*
|
1756
|
+
* Returns the `MethodDescriptorProto` of this `MethodDescriptor`.
|
1757
|
+
*/
|
1758
|
+
static VALUE MethodDescriptor_to_proto(VALUE _self) {
|
1759
|
+
MethodDescriptor* self = ruby_to_MethodDescriptor(_self);
|
1760
|
+
upb_Arena* arena = upb_Arena_New();
|
1761
|
+
google_protobuf_MethodDescriptorProto* proto =
|
1762
|
+
upb_MethodDef_ToProto(self->methoddef, arena);
|
1763
|
+
size_t size;
|
1764
|
+
const char* serialized =
|
1765
|
+
google_protobuf_MethodDescriptorProto_serialize(proto, arena, &size);
|
1766
|
+
VALUE proto_class = rb_path2class("Google::Protobuf::MethodDescriptorProto");
|
1767
|
+
VALUE proto_rb =
|
1768
|
+
Message_decode_bytes(size, serialized, 0, proto_class, false);
|
1769
|
+
upb_Arena_Free(arena);
|
1770
|
+
return proto_rb;
|
1771
|
+
}
|
1772
|
+
|
1773
|
+
/*
|
1774
|
+
* call-seq:
|
1775
|
+
* MethodDescriptor.server_streaming => bool
|
1776
|
+
*
|
1777
|
+
* Returns whether or not this is a streaming response method
|
1778
|
+
*/
|
1779
|
+
static VALUE MethodDescriptor_server_streaming(VALUE _self) {
|
1780
|
+
MethodDescriptor* self = ruby_to_MethodDescriptor(_self);
|
1781
|
+
return upb_MethodDef_ServerStreaming(self->methoddef) ? Qtrue : Qfalse;
|
1782
|
+
}
|
1783
|
+
|
1784
|
+
static void MethodDescriptor_register(VALUE module) {
|
1785
|
+
VALUE klass = rb_define_class_under(module, "MethodDescriptor", rb_cObject);
|
1786
|
+
rb_define_alloc_func(klass, MethodDescriptor_alloc);
|
1787
|
+
rb_define_method(klass, "initialize", MethodDescriptor_initialize, 3);
|
1788
|
+
rb_define_method(klass, "name", MethodDescriptor_name, 0);
|
1789
|
+
rb_define_method(klass, "options", MethodDescriptor_options, 0);
|
1790
|
+
rb_define_method(klass, "input_type", MethodDescriptor_input_type, 0);
|
1791
|
+
rb_define_method(klass, "output_type", MethodDescriptor_output_type, 0);
|
1792
|
+
rb_define_method(klass, "client_streaming", MethodDescriptor_client_streaming,
|
1793
|
+
0);
|
1794
|
+
rb_define_method(klass, "server_streaming", MethodDescriptor_server_streaming,
|
1795
|
+
0);
|
1796
|
+
rb_define_method(klass, "to_proto", MethodDescriptor_to_proto, 0);
|
1797
|
+
rb_gc_register_address(&cMethodDescriptor);
|
1798
|
+
cMethodDescriptor = klass;
|
1799
|
+
}
|
1800
|
+
|
1171
1801
|
static VALUE get_def_obj(VALUE _descriptor_pool, const void* ptr, VALUE klass) {
|
1172
1802
|
DescriptorPool* descriptor_pool = ruby_to_DescriptorPool(_descriptor_pool);
|
1173
1803
|
VALUE key = ULL2NUM((intptr_t)ptr);
|
@@ -1209,6 +1839,16 @@ static VALUE get_oneofdef_obj(VALUE descriptor_pool, const upb_OneofDef* def) {
|
|
1209
1839
|
return get_def_obj(descriptor_pool, def, cOneofDescriptor);
|
1210
1840
|
}
|
1211
1841
|
|
1842
|
+
static VALUE get_servicedef_obj(VALUE descriptor_pool,
|
1843
|
+
const upb_ServiceDef* def) {
|
1844
|
+
return get_def_obj(descriptor_pool, def, cServiceDescriptor);
|
1845
|
+
}
|
1846
|
+
|
1847
|
+
static VALUE get_methoddef_obj(VALUE descriptor_pool,
|
1848
|
+
const upb_MethodDef* def) {
|
1849
|
+
return get_def_obj(descriptor_pool, def, cMethodDescriptor);
|
1850
|
+
}
|
1851
|
+
|
1212
1852
|
// -----------------------------------------------------------------------------
|
1213
1853
|
// Shared functions
|
1214
1854
|
// -----------------------------------------------------------------------------
|
@@ -1284,6 +1924,8 @@ void Defs_register(VALUE module) {
|
|
1284
1924
|
FieldDescriptor_register(module);
|
1285
1925
|
OneofDescriptor_register(module);
|
1286
1926
|
EnumDescriptor_register(module);
|
1927
|
+
ServiceDescriptor_register(module);
|
1928
|
+
MethodDescriptor_register(module);
|
1287
1929
|
|
1288
1930
|
rb_gc_register_address(&c_only_cookie);
|
1289
1931
|
c_only_cookie = rb_class_new_instance(0, NULL, rb_cObject);
|