google-protobuf 3.25.0 → 4.29.2
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/convert.c +46 -18
- data/ext/google/protobuf_c/defs.c +499 -26
- data/ext/google/protobuf_c/extconf.rb +1 -1
- data/ext/google/protobuf_c/glue.c +53 -2
- data/ext/google/protobuf_c/map.c +82 -17
- data/ext/google/protobuf_c/map.h +9 -2
- data/ext/google/protobuf_c/message.c +144 -104
- data/ext/google/protobuf_c/message.h +8 -5
- data/ext/google/protobuf_c/protobuf.c +30 -17
- data/ext/google/protobuf_c/protobuf.h +3 -7
- data/ext/google/protobuf_c/repeated_field.c +64 -10
- data/ext/google/protobuf_c/repeated_field.h +8 -1
- data/ext/google/protobuf_c/ruby-upb.c +13774 -11526
- data/ext/google/protobuf_c/ruby-upb.h +11198 -9048
- data/ext/google/protobuf_c/shared_convert.c +10 -5
- data/ext/google/protobuf_c/shared_convert.h +2 -2
- data/ext/google/protobuf_c/shared_message.c +3 -31
- data/ext/google/protobuf_c/shared_message.h +0 -4
- data/ext/google/protobuf_c/third_party/utf8_range/utf8_range.c +467 -0
- data/ext/google/protobuf_c/third_party/utf8_range/utf8_range.h +9 -8
- data/lib/google/protobuf/any_pb.rb +1 -22
- data/lib/google/protobuf/api_pb.rb +1 -24
- data/lib/google/protobuf/descriptor_pb.rb +3 -23
- data/lib/google/protobuf/duration_pb.rb +1 -22
- data/lib/google/protobuf/empty_pb.rb +1 -22
- data/lib/google/protobuf/ffi/descriptor.rb +13 -2
- data/lib/google/protobuf/ffi/descriptor_pool.rb +16 -9
- data/lib/google/protobuf/ffi/enum_descriptor.rb +13 -1
- data/lib/google/protobuf/ffi/ffi.rb +8 -6
- data/lib/google/protobuf/ffi/field_descriptor.rb +37 -16
- data/lib/google/protobuf/ffi/file_descriptor.rb +13 -12
- data/lib/google/protobuf/ffi/internal/arena.rb +0 -6
- data/lib/google/protobuf/ffi/internal/convert.rb +21 -30
- data/lib/google/protobuf/ffi/map.rb +50 -13
- data/lib/google/protobuf/ffi/message.rb +202 -58
- data/lib/google/protobuf/ffi/method_descriptor.rb +114 -0
- data/lib/google/protobuf/ffi/object_cache.rb +3 -3
- data/lib/google/protobuf/ffi/oneof_descriptor.rb +20 -11
- data/lib/google/protobuf/ffi/repeated_field.rb +50 -142
- data/lib/google/protobuf/ffi/service_descriptor.rb +107 -0
- data/lib/google/protobuf/field_mask_pb.rb +1 -22
- data/lib/google/protobuf/internal/object_cache.rb +99 -0
- data/lib/google/protobuf/plugin_pb.rb +2 -24
- data/lib/google/protobuf/repeated_field.rb +4 -5
- data/lib/google/protobuf/source_context_pb.rb +1 -22
- data/lib/google/protobuf/struct_pb.rb +1 -22
- data/lib/google/protobuf/timestamp_pb.rb +1 -22
- data/lib/google/protobuf/type_pb.rb +1 -24
- data/lib/google/protobuf/wrappers_pb.rb +1 -22
- data/lib/google/protobuf.rb +1 -1
- data/lib/google/protobuf_ffi.rb +3 -2
- data/lib/google/protobuf_native.rb +0 -1
- data/lib/google/tasks/ffi.rake +1 -3
- metadata +25 -12
- 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
- data/lib/google/protobuf/object_cache.rb +0 -97
@@ -7,7 +7,6 @@
|
|
7
7
|
|
8
8
|
#include <ctype.h>
|
9
9
|
#include <errno.h>
|
10
|
-
#include <ruby/version.h>
|
11
10
|
|
12
11
|
#include "convert.h"
|
13
12
|
#include "message.h"
|
@@ -23,6 +22,9 @@ static VALUE get_enumdef_obj(VALUE descriptor_pool, const upb_EnumDef* def);
|
|
23
22
|
static VALUE get_fielddef_obj(VALUE descriptor_pool, const upb_FieldDef* def);
|
24
23
|
static VALUE get_filedef_obj(VALUE descriptor_pool, const upb_FileDef* def);
|
25
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);
|
26
28
|
|
27
29
|
// A distinct object that is not accessible from Ruby. We use this as a
|
28
30
|
// constructor argument to enforce that certain objects cannot be created from
|
@@ -44,7 +46,7 @@ static VALUE rb_str_maybe_null(const char* s) {
|
|
44
46
|
}
|
45
47
|
return rb_str_new2(s);
|
46
48
|
}
|
47
|
-
|
49
|
+
static ID options_instancevar_interned;
|
48
50
|
// -----------------------------------------------------------------------------
|
49
51
|
// DescriptorPool.
|
50
52
|
// -----------------------------------------------------------------------------
|
@@ -144,25 +146,37 @@ VALUE DescriptorPool_add_serialized_file(VALUE _self,
|
|
144
146
|
* call-seq:
|
145
147
|
* DescriptorPool.lookup(name) => descriptor
|
146
148
|
*
|
147
|
-
* Finds a Descriptor or
|
148
|
-
* exists with the given name.
|
149
|
+
* Finds a Descriptor, EnumDescriptor or FieldDescriptor by name and returns it,
|
150
|
+
* or nil if none exists with the given name.
|
149
151
|
*/
|
150
152
|
static VALUE DescriptorPool_lookup(VALUE _self, VALUE name) {
|
151
153
|
DescriptorPool* self = ruby_to_DescriptorPool(_self);
|
152
154
|
const char* name_str = get_str(name);
|
153
155
|
const upb_MessageDef* msgdef;
|
154
156
|
const upb_EnumDef* enumdef;
|
157
|
+
const upb_FieldDef* fielddef;
|
158
|
+
const upb_ServiceDef* servicedef;
|
155
159
|
|
156
160
|
msgdef = upb_DefPool_FindMessageByName(self->symtab, name_str);
|
157
161
|
if (msgdef) {
|
158
162
|
return get_msgdef_obj(_self, msgdef);
|
159
163
|
}
|
160
164
|
|
165
|
+
fielddef = upb_DefPool_FindExtensionByName(self->symtab, name_str);
|
166
|
+
if (fielddef) {
|
167
|
+
return get_fielddef_obj(_self, fielddef);
|
168
|
+
}
|
169
|
+
|
161
170
|
enumdef = upb_DefPool_FindEnumByName(self->symtab, name_str);
|
162
171
|
if (enumdef) {
|
163
172
|
return get_enumdef_obj(_self, enumdef);
|
164
173
|
}
|
165
174
|
|
175
|
+
servicedef = upb_DefPool_FindServiceByName(self->symtab, name_str);
|
176
|
+
if (servicedef) {
|
177
|
+
return get_servicedef_obj(_self, servicedef);
|
178
|
+
}
|
179
|
+
|
166
180
|
return Qnil;
|
167
181
|
}
|
168
182
|
|
@@ -192,6 +206,7 @@ static void DescriptorPool_register(VALUE module) {
|
|
192
206
|
|
193
207
|
rb_gc_register_address(&generated_pool);
|
194
208
|
generated_pool = rb_class_new_instance(0, NULL, klass);
|
209
|
+
options_instancevar_interned = rb_intern("options");
|
195
210
|
}
|
196
211
|
|
197
212
|
// -----------------------------------------------------------------------------
|
@@ -226,6 +241,48 @@ static Descriptor* ruby_to_Descriptor(VALUE val) {
|
|
226
241
|
return ret;
|
227
242
|
}
|
228
243
|
|
244
|
+
// Decode and return a frozen instance of a Descriptor Option for the given pool
|
245
|
+
static VALUE decode_options(VALUE self, const char* option_type, int size,
|
246
|
+
const char* bytes, VALUE descriptor_pool) {
|
247
|
+
VALUE options_rb = rb_ivar_get(self, options_instancevar_interned);
|
248
|
+
if (options_rb != Qnil) {
|
249
|
+
return options_rb;
|
250
|
+
}
|
251
|
+
|
252
|
+
static const char* prefix = "google.protobuf.";
|
253
|
+
char fullname
|
254
|
+
[/*strlen(prefix)*/ 16 +
|
255
|
+
/*strln(longest option type supported e.g. "MessageOptions")*/ 14 +
|
256
|
+
/*null terminator*/ 1];
|
257
|
+
|
258
|
+
snprintf(fullname, sizeof(fullname), "%s%s", prefix, option_type);
|
259
|
+
const upb_MessageDef* msgdef = upb_DefPool_FindMessageByName(
|
260
|
+
ruby_to_DescriptorPool(descriptor_pool)->symtab, fullname);
|
261
|
+
if (!msgdef) {
|
262
|
+
rb_raise(rb_eRuntimeError, "Cannot find %s in DescriptorPool", option_type);
|
263
|
+
}
|
264
|
+
|
265
|
+
VALUE desc_rb = get_msgdef_obj(descriptor_pool, msgdef);
|
266
|
+
const Descriptor* desc = ruby_to_Descriptor(desc_rb);
|
267
|
+
|
268
|
+
options_rb = Message_decode_bytes(size, bytes, 0, desc->klass, false);
|
269
|
+
|
270
|
+
// Strip features from the options proto to keep it internal.
|
271
|
+
const upb_MessageDef* decoded_desc = NULL;
|
272
|
+
upb_Message* options = Message_GetMutable(options_rb, &decoded_desc);
|
273
|
+
PBRUBY_ASSERT(options != NULL);
|
274
|
+
PBRUBY_ASSERT(decoded_desc == msgdef);
|
275
|
+
const upb_FieldDef* field =
|
276
|
+
upb_MessageDef_FindFieldByName(decoded_desc, "features");
|
277
|
+
PBRUBY_ASSERT(field != NULL);
|
278
|
+
upb_Message_ClearFieldByDef(options, field);
|
279
|
+
|
280
|
+
Message_freeze(options_rb);
|
281
|
+
|
282
|
+
rb_ivar_set(self, options_instancevar_interned, options_rb);
|
283
|
+
return options_rb;
|
284
|
+
}
|
285
|
+
|
229
286
|
/*
|
230
287
|
* call-seq:
|
231
288
|
* Descriptor.new => descriptor
|
@@ -374,6 +431,26 @@ static VALUE Descriptor_msgclass(VALUE _self) {
|
|
374
431
|
return self->klass;
|
375
432
|
}
|
376
433
|
|
434
|
+
/*
|
435
|
+
* call-seq:
|
436
|
+
* Descriptor.options => options
|
437
|
+
*
|
438
|
+
* Returns the `MessageOptions` for this `Descriptor`.
|
439
|
+
*/
|
440
|
+
static VALUE Descriptor_options(VALUE _self) {
|
441
|
+
Descriptor* self = ruby_to_Descriptor(_self);
|
442
|
+
const google_protobuf_MessageOptions* opts =
|
443
|
+
upb_MessageDef_Options(self->msgdef);
|
444
|
+
upb_Arena* arena = upb_Arena_New();
|
445
|
+
size_t size;
|
446
|
+
char* serialized =
|
447
|
+
google_protobuf_MessageOptions_serialize(opts, arena, &size);
|
448
|
+
VALUE message_options = decode_options(_self, "MessageOptions", size,
|
449
|
+
serialized, self->descriptor_pool);
|
450
|
+
upb_Arena_Free(arena);
|
451
|
+
return message_options;
|
452
|
+
}
|
453
|
+
|
377
454
|
static void Descriptor_register(VALUE module) {
|
378
455
|
VALUE klass = rb_define_class_under(module, "Descriptor", rb_cObject);
|
379
456
|
rb_define_alloc_func(klass, Descriptor_alloc);
|
@@ -385,6 +462,7 @@ static void Descriptor_register(VALUE module) {
|
|
385
462
|
rb_define_method(klass, "msgclass", Descriptor_msgclass, 0);
|
386
463
|
rb_define_method(klass, "name", Descriptor_name, 0);
|
387
464
|
rb_define_method(klass, "file_descriptor", Descriptor_file_descriptor, 0);
|
465
|
+
rb_define_method(klass, "options", Descriptor_options, 0);
|
388
466
|
rb_include_module(klass, rb_mEnumerable);
|
389
467
|
rb_gc_register_address(&cDescriptor);
|
390
468
|
cDescriptor = klass;
|
@@ -432,7 +510,7 @@ static VALUE FileDescriptor_alloc(VALUE klass) {
|
|
432
510
|
* call-seq:
|
433
511
|
* FileDescriptor.new => file
|
434
512
|
*
|
435
|
-
* Returns a new file descriptor.
|
513
|
+
* Returns a new file descriptor. May
|
436
514
|
* to a builder.
|
437
515
|
*/
|
438
516
|
static VALUE FileDescriptor_initialize(VALUE _self, VALUE cookie,
|
@@ -464,24 +542,20 @@ static VALUE FileDescriptor_name(VALUE _self) {
|
|
464
542
|
|
465
543
|
/*
|
466
544
|
* call-seq:
|
467
|
-
* FileDescriptor.
|
468
|
-
*
|
469
|
-
* Returns this file descriptors syntax.
|
545
|
+
* FileDescriptor.options => options
|
470
546
|
*
|
471
|
-
*
|
472
|
-
* :proto2 or :proto3.
|
547
|
+
* Returns the `FileOptions` for this `FileDescriptor`.
|
473
548
|
*/
|
474
|
-
static VALUE
|
549
|
+
static VALUE FileDescriptor_options(VALUE _self) {
|
475
550
|
FileDescriptor* self = ruby_to_FileDescriptor(_self);
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
}
|
551
|
+
const google_protobuf_FileOptions* opts = upb_FileDef_Options(self->filedef);
|
552
|
+
upb_Arena* arena = upb_Arena_New();
|
553
|
+
size_t size;
|
554
|
+
char* serialized = google_protobuf_FileOptions_serialize(opts, arena, &size);
|
555
|
+
VALUE file_options = decode_options(_self, "FileOptions", size, serialized,
|
556
|
+
self->descriptor_pool);
|
557
|
+
upb_Arena_Free(arena);
|
558
|
+
return file_options;
|
485
559
|
}
|
486
560
|
|
487
561
|
static void FileDescriptor_register(VALUE module) {
|
@@ -489,7 +563,7 @@ static void FileDescriptor_register(VALUE module) {
|
|
489
563
|
rb_define_alloc_func(klass, FileDescriptor_alloc);
|
490
564
|
rb_define_method(klass, "initialize", FileDescriptor_initialize, 3);
|
491
565
|
rb_define_method(klass, "name", FileDescriptor_name, 0);
|
492
|
-
rb_define_method(klass, "
|
566
|
+
rb_define_method(klass, "options", FileDescriptor_options, 0);
|
493
567
|
rb_gc_register_address(&cFileDescriptor);
|
494
568
|
cFileDescriptor = klass;
|
495
569
|
}
|
@@ -540,7 +614,7 @@ static VALUE FieldDescriptor_alloc(VALUE klass) {
|
|
540
614
|
|
541
615
|
/*
|
542
616
|
* call-seq:
|
543
|
-
*
|
617
|
+
* FieldDescriptor.new(c_only_cookie, pool, ptr) => FieldDescriptor
|
544
618
|
*
|
545
619
|
* Creates a descriptor wrapper object. May only be called from C.
|
546
620
|
*/
|
@@ -651,7 +725,7 @@ static VALUE FieldDescriptor__type(VALUE _self) {
|
|
651
725
|
static VALUE FieldDescriptor_default(VALUE _self) {
|
652
726
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
653
727
|
const upb_FieldDef* f = self->fielddef;
|
654
|
-
upb_MessageValue default_val =
|
728
|
+
upb_MessageValue default_val = upb_MessageValue_Zero();
|
655
729
|
if (upb_FieldDef_IsSubMessage(f)) {
|
656
730
|
return Qnil;
|
657
731
|
} else if (!upb_FieldDef_IsRepeated(f)) {
|
@@ -660,6 +734,28 @@ static VALUE FieldDescriptor_default(VALUE _self) {
|
|
660
734
|
return Convert_UpbToRuby(default_val, TypeInfo_get(self->fielddef), Qnil);
|
661
735
|
}
|
662
736
|
|
737
|
+
/*
|
738
|
+
* call-seq:
|
739
|
+
* FieldDescriptor.has_presence? => bool
|
740
|
+
*
|
741
|
+
* Returns whether this field tracks presence.
|
742
|
+
*/
|
743
|
+
static VALUE FieldDescriptor_has_presence(VALUE _self) {
|
744
|
+
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
745
|
+
return upb_FieldDef_HasPresence(self->fielddef) ? Qtrue : Qfalse;
|
746
|
+
}
|
747
|
+
|
748
|
+
/*
|
749
|
+
* call-seq:
|
750
|
+
* FieldDescriptor.is_packed? => bool
|
751
|
+
*
|
752
|
+
* Returns whether this is a repeated field that uses packed encoding.
|
753
|
+
*/
|
754
|
+
static VALUE FieldDescriptor_is_packed(VALUE _self) {
|
755
|
+
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
756
|
+
return upb_FieldDef_IsPacked(self->fielddef) ? Qtrue : Qfalse;
|
757
|
+
}
|
758
|
+
|
663
759
|
/*
|
664
760
|
* call-seq:
|
665
761
|
* FieldDescriptor.json_name => json_name
|
@@ -786,7 +882,7 @@ static VALUE FieldDescriptor_get(VALUE _self, VALUE msg_rb) {
|
|
786
882
|
static VALUE FieldDescriptor_has(VALUE _self, VALUE msg_rb) {
|
787
883
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
788
884
|
const upb_MessageDef* m;
|
789
|
-
const
|
885
|
+
const upb_Message* msg = Message_Get(msg_rb, &m);
|
790
886
|
|
791
887
|
if (m != upb_FieldDef_ContainingType(self->fielddef)) {
|
792
888
|
rb_raise(cTypeError, "has method called on wrong message type");
|
@@ -806,7 +902,7 @@ static VALUE FieldDescriptor_has(VALUE _self, VALUE msg_rb) {
|
|
806
902
|
static VALUE FieldDescriptor_clear(VALUE _self, VALUE msg_rb) {
|
807
903
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
808
904
|
const upb_MessageDef* m;
|
809
|
-
|
905
|
+
upb_Message* msg = Message_GetMutable(msg_rb, &m);
|
810
906
|
|
811
907
|
if (m != upb_FieldDef_ContainingType(self->fielddef)) {
|
812
908
|
rb_raise(cTypeError, "has method called on wrong message type");
|
@@ -827,7 +923,7 @@ static VALUE FieldDescriptor_clear(VALUE _self, VALUE msg_rb) {
|
|
827
923
|
static VALUE FieldDescriptor_set(VALUE _self, VALUE msg_rb, VALUE value) {
|
828
924
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
829
925
|
const upb_MessageDef* m;
|
830
|
-
|
926
|
+
upb_Message* msg = Message_GetMutable(msg_rb, &m);
|
831
927
|
upb_Arena* arena = Arena_get(Message_GetArena(msg_rb));
|
832
928
|
upb_MessageValue msgval;
|
833
929
|
|
@@ -841,6 +937,25 @@ static VALUE FieldDescriptor_set(VALUE _self, VALUE msg_rb, VALUE value) {
|
|
841
937
|
return Qnil;
|
842
938
|
}
|
843
939
|
|
940
|
+
/*
|
941
|
+
* call-seq:
|
942
|
+
* FieldDescriptor.options => options
|
943
|
+
*
|
944
|
+
* Returns the `FieldOptions` for this `FieldDescriptor`.
|
945
|
+
*/
|
946
|
+
static VALUE FieldDescriptor_options(VALUE _self) {
|
947
|
+
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
948
|
+
const google_protobuf_FieldOptions* opts =
|
949
|
+
upb_FieldDef_Options(self->fielddef);
|
950
|
+
upb_Arena* arena = upb_Arena_New();
|
951
|
+
size_t size;
|
952
|
+
char* serialized = google_protobuf_FieldOptions_serialize(opts, arena, &size);
|
953
|
+
VALUE field_options = decode_options(_self, "FieldOptions", size, serialized,
|
954
|
+
self->descriptor_pool);
|
955
|
+
upb_Arena_Free(arena);
|
956
|
+
return field_options;
|
957
|
+
}
|
958
|
+
|
844
959
|
static void FieldDescriptor_register(VALUE module) {
|
845
960
|
VALUE klass = rb_define_class_under(module, "FieldDescriptor", rb_cObject);
|
846
961
|
rb_define_alloc_func(klass, FieldDescriptor_alloc);
|
@@ -848,6 +963,8 @@ static void FieldDescriptor_register(VALUE module) {
|
|
848
963
|
rb_define_method(klass, "name", FieldDescriptor_name, 0);
|
849
964
|
rb_define_method(klass, "type", FieldDescriptor__type, 0);
|
850
965
|
rb_define_method(klass, "default", FieldDescriptor_default, 0);
|
966
|
+
rb_define_method(klass, "has_presence?", FieldDescriptor_has_presence, 0);
|
967
|
+
rb_define_method(klass, "is_packed?", FieldDescriptor_is_packed, 0);
|
851
968
|
rb_define_method(klass, "json_name", FieldDescriptor_json_name, 0);
|
852
969
|
rb_define_method(klass, "label", FieldDescriptor_label, 0);
|
853
970
|
rb_define_method(klass, "number", FieldDescriptor_number, 0);
|
@@ -857,6 +974,7 @@ static void FieldDescriptor_register(VALUE module) {
|
|
857
974
|
rb_define_method(klass, "clear", FieldDescriptor_clear, 1);
|
858
975
|
rb_define_method(klass, "get", FieldDescriptor_get, 1);
|
859
976
|
rb_define_method(klass, "set", FieldDescriptor_set, 2);
|
977
|
+
rb_define_method(klass, "options", FieldDescriptor_options, 0);
|
860
978
|
rb_gc_register_address(&cFieldDescriptor);
|
861
979
|
cFieldDescriptor = klass;
|
862
980
|
}
|
@@ -956,12 +1074,32 @@ static VALUE OneofDescriptor_each(VALUE _self) {
|
|
956
1074
|
return Qnil;
|
957
1075
|
}
|
958
1076
|
|
1077
|
+
/*
|
1078
|
+
* call-seq:
|
1079
|
+
* OneofDescriptor.options => options
|
1080
|
+
*
|
1081
|
+
* Returns the `OneofOptions` for this `OneofDescriptor`.
|
1082
|
+
*/
|
1083
|
+
static VALUE OneOfDescriptor_options(VALUE _self) {
|
1084
|
+
OneofDescriptor* self = ruby_to_OneofDescriptor(_self);
|
1085
|
+
const google_protobuf_OneofOptions* opts =
|
1086
|
+
upb_OneofDef_Options(self->oneofdef);
|
1087
|
+
upb_Arena* arena = upb_Arena_New();
|
1088
|
+
size_t size;
|
1089
|
+
char* serialized = google_protobuf_OneofOptions_serialize(opts, arena, &size);
|
1090
|
+
VALUE oneof_options = decode_options(_self, "OneofOptions", size, serialized,
|
1091
|
+
self->descriptor_pool);
|
1092
|
+
upb_Arena_Free(arena);
|
1093
|
+
return oneof_options;
|
1094
|
+
}
|
1095
|
+
|
959
1096
|
static void OneofDescriptor_register(VALUE module) {
|
960
1097
|
VALUE klass = rb_define_class_under(module, "OneofDescriptor", rb_cObject);
|
961
1098
|
rb_define_alloc_func(klass, OneofDescriptor_alloc);
|
962
1099
|
rb_define_method(klass, "initialize", OneofDescriptor_initialize, 3);
|
963
1100
|
rb_define_method(klass, "name", OneofDescriptor_name, 0);
|
964
1101
|
rb_define_method(klass, "each", OneofDescriptor_each, 0);
|
1102
|
+
rb_define_method(klass, "options", OneOfDescriptor_options, 0);
|
965
1103
|
rb_include_module(klass, rb_mEnumerable);
|
966
1104
|
rb_gc_register_address(&cOneofDescriptor);
|
967
1105
|
cOneofDescriptor = klass;
|
@@ -1047,6 +1185,17 @@ static VALUE EnumDescriptor_file_descriptor(VALUE _self) {
|
|
1047
1185
|
upb_EnumDef_File(self->enumdef));
|
1048
1186
|
}
|
1049
1187
|
|
1188
|
+
/*
|
1189
|
+
* call-seq:
|
1190
|
+
* EnumDescriptor.is_closed? => bool
|
1191
|
+
*
|
1192
|
+
* Returns whether this enum is open or closed.
|
1193
|
+
*/
|
1194
|
+
static VALUE EnumDescriptor_is_closed(VALUE _self) {
|
1195
|
+
EnumDescriptor* self = ruby_to_EnumDescriptor(_self);
|
1196
|
+
return upb_EnumDef_IsClosed(self->enumdef) ? Qtrue : Qfalse;
|
1197
|
+
}
|
1198
|
+
|
1050
1199
|
/*
|
1051
1200
|
* call-seq:
|
1052
1201
|
* EnumDescriptor.name => name
|
@@ -1131,6 +1280,24 @@ static VALUE EnumDescriptor_enummodule(VALUE _self) {
|
|
1131
1280
|
return self->module;
|
1132
1281
|
}
|
1133
1282
|
|
1283
|
+
/*
|
1284
|
+
* call-seq:
|
1285
|
+
* EnumDescriptor.options => options
|
1286
|
+
*
|
1287
|
+
* Returns the `EnumOptions` for this `EnumDescriptor`.
|
1288
|
+
*/
|
1289
|
+
static VALUE EnumDescriptor_options(VALUE _self) {
|
1290
|
+
EnumDescriptor* self = ruby_to_EnumDescriptor(_self);
|
1291
|
+
const google_protobuf_EnumOptions* opts = upb_EnumDef_Options(self->enumdef);
|
1292
|
+
upb_Arena* arena = upb_Arena_New();
|
1293
|
+
size_t size;
|
1294
|
+
char* serialized = google_protobuf_EnumOptions_serialize(opts, arena, &size);
|
1295
|
+
VALUE enum_options = decode_options(_self, "EnumOptions", size, serialized,
|
1296
|
+
self->descriptor_pool);
|
1297
|
+
upb_Arena_Free(arena);
|
1298
|
+
return enum_options;
|
1299
|
+
}
|
1300
|
+
|
1134
1301
|
static void EnumDescriptor_register(VALUE module) {
|
1135
1302
|
VALUE klass = rb_define_class_under(module, "EnumDescriptor", rb_cObject);
|
1136
1303
|
rb_define_alloc_func(klass, EnumDescriptor_alloc);
|
@@ -1141,11 +1308,305 @@ static void EnumDescriptor_register(VALUE module) {
|
|
1141
1308
|
rb_define_method(klass, "each", EnumDescriptor_each, 0);
|
1142
1309
|
rb_define_method(klass, "enummodule", EnumDescriptor_enummodule, 0);
|
1143
1310
|
rb_define_method(klass, "file_descriptor", EnumDescriptor_file_descriptor, 0);
|
1311
|
+
rb_define_method(klass, "is_closed?", EnumDescriptor_is_closed, 0);
|
1312
|
+
rb_define_method(klass, "options", EnumDescriptor_options, 0);
|
1144
1313
|
rb_include_module(klass, rb_mEnumerable);
|
1145
1314
|
rb_gc_register_address(&cEnumDescriptor);
|
1146
1315
|
cEnumDescriptor = klass;
|
1147
1316
|
}
|
1148
1317
|
|
1318
|
+
// -----------------------------------------------------------------------------
|
1319
|
+
// ServiceDescriptor
|
1320
|
+
// -----------------------------------------------------------------------------
|
1321
|
+
|
1322
|
+
typedef struct {
|
1323
|
+
const upb_ServiceDef* servicedef;
|
1324
|
+
// IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
|
1325
|
+
// macro to update VALUE references, as to trigger write barriers.
|
1326
|
+
VALUE module; // begins as nil
|
1327
|
+
VALUE descriptor_pool; // Owns the upb_ServiceDef.
|
1328
|
+
} ServiceDescriptor;
|
1329
|
+
|
1330
|
+
static VALUE cServiceDescriptor = Qnil;
|
1331
|
+
|
1332
|
+
static void ServiceDescriptor_mark(void* _self) {
|
1333
|
+
ServiceDescriptor* self = _self;
|
1334
|
+
rb_gc_mark(self->module);
|
1335
|
+
rb_gc_mark(self->descriptor_pool);
|
1336
|
+
}
|
1337
|
+
|
1338
|
+
static const rb_data_type_t ServiceDescriptor_type = {
|
1339
|
+
"Google::Protobuf::ServicDescriptor",
|
1340
|
+
{ServiceDescriptor_mark, RUBY_DEFAULT_FREE, NULL},
|
1341
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
1342
|
+
};
|
1343
|
+
|
1344
|
+
static ServiceDescriptor* ruby_to_ServiceDescriptor(VALUE val) {
|
1345
|
+
ServiceDescriptor* ret;
|
1346
|
+
TypedData_Get_Struct(val, ServiceDescriptor, &ServiceDescriptor_type, ret);
|
1347
|
+
return ret;
|
1348
|
+
}
|
1349
|
+
|
1350
|
+
static VALUE ServiceDescriptor_alloc(VALUE klass) {
|
1351
|
+
ServiceDescriptor* self = ALLOC(ServiceDescriptor);
|
1352
|
+
VALUE ret = TypedData_Wrap_Struct(klass, &ServiceDescriptor_type, self);
|
1353
|
+
self->servicedef = NULL;
|
1354
|
+
self->module = Qnil;
|
1355
|
+
self->descriptor_pool = Qnil;
|
1356
|
+
return ret;
|
1357
|
+
}
|
1358
|
+
|
1359
|
+
/*
|
1360
|
+
* call-seq:
|
1361
|
+
* ServiceDescriptor.new(c_only_cookie, ptr) => ServiceDescriptor
|
1362
|
+
*
|
1363
|
+
* Creates a descriptor wrapper object. May only be called from C.
|
1364
|
+
*/
|
1365
|
+
static VALUE ServiceDescriptor_initialize(VALUE _self, VALUE cookie,
|
1366
|
+
VALUE descriptor_pool, VALUE ptr) {
|
1367
|
+
ServiceDescriptor* self = ruby_to_ServiceDescriptor(_self);
|
1368
|
+
|
1369
|
+
if (cookie != c_only_cookie) {
|
1370
|
+
rb_raise(rb_eRuntimeError,
|
1371
|
+
"Descriptor objects may not be created from Ruby.");
|
1372
|
+
}
|
1373
|
+
|
1374
|
+
RB_OBJ_WRITE(_self, &self->descriptor_pool, descriptor_pool);
|
1375
|
+
self->servicedef = (const upb_ServiceDef*)NUM2ULL(ptr);
|
1376
|
+
|
1377
|
+
return Qnil;
|
1378
|
+
}
|
1379
|
+
|
1380
|
+
/*
|
1381
|
+
* call-seq:
|
1382
|
+
* ServiceDescriptor.name => name
|
1383
|
+
*
|
1384
|
+
* Returns the name of this service.
|
1385
|
+
*/
|
1386
|
+
static VALUE ServiceDescriptor_name(VALUE _self) {
|
1387
|
+
ServiceDescriptor* self = ruby_to_ServiceDescriptor(_self);
|
1388
|
+
return rb_str_maybe_null(upb_ServiceDef_FullName(self->servicedef));
|
1389
|
+
}
|
1390
|
+
|
1391
|
+
/*
|
1392
|
+
* call-seq:
|
1393
|
+
* ServiceDescriptor.file_descriptor
|
1394
|
+
*
|
1395
|
+
* Returns the FileDescriptor object this service belongs to.
|
1396
|
+
*/
|
1397
|
+
static VALUE ServiceDescriptor_file_descriptor(VALUE _self) {
|
1398
|
+
ServiceDescriptor* self = ruby_to_ServiceDescriptor(_self);
|
1399
|
+
return get_filedef_obj(self->descriptor_pool,
|
1400
|
+
upb_ServiceDef_File(self->servicedef));
|
1401
|
+
}
|
1402
|
+
|
1403
|
+
/*
|
1404
|
+
* call-seq:
|
1405
|
+
* ServiceDescriptor.each(&block)
|
1406
|
+
*
|
1407
|
+
* Iterates over methods in this service, yielding to the block on each one.
|
1408
|
+
*/
|
1409
|
+
static VALUE ServiceDescriptor_each(VALUE _self) {
|
1410
|
+
ServiceDescriptor* self = ruby_to_ServiceDescriptor(_self);
|
1411
|
+
|
1412
|
+
int n = upb_ServiceDef_MethodCount(self->servicedef);
|
1413
|
+
for (int i = 0; i < n; i++) {
|
1414
|
+
const upb_MethodDef* method = upb_ServiceDef_Method(self->servicedef, i);
|
1415
|
+
VALUE obj = get_methoddef_obj(self->descriptor_pool, method);
|
1416
|
+
rb_yield(obj);
|
1417
|
+
}
|
1418
|
+
return Qnil;
|
1419
|
+
}
|
1420
|
+
|
1421
|
+
/*
|
1422
|
+
* call-seq:
|
1423
|
+
* ServiceDescriptor.options => options
|
1424
|
+
*
|
1425
|
+
* Returns the `ServiceOptions` for this `ServiceDescriptor`.
|
1426
|
+
*/
|
1427
|
+
static VALUE ServiceDescriptor_options(VALUE _self) {
|
1428
|
+
ServiceDescriptor* self = ruby_to_ServiceDescriptor(_self);
|
1429
|
+
const google_protobuf_ServiceOptions* opts =
|
1430
|
+
upb_ServiceDef_Options(self->servicedef);
|
1431
|
+
upb_Arena* arena = upb_Arena_New();
|
1432
|
+
size_t size;
|
1433
|
+
char* serialized =
|
1434
|
+
google_protobuf_ServiceOptions_serialize(opts, arena, &size);
|
1435
|
+
VALUE service_options = decode_options(_self, "ServiceOptions", size,
|
1436
|
+
serialized, self->descriptor_pool);
|
1437
|
+
upb_Arena_Free(arena);
|
1438
|
+
return service_options;
|
1439
|
+
}
|
1440
|
+
|
1441
|
+
static void ServiceDescriptor_register(VALUE module) {
|
1442
|
+
VALUE klass = rb_define_class_under(module, "ServiceDescriptor", rb_cObject);
|
1443
|
+
rb_define_alloc_func(klass, ServiceDescriptor_alloc);
|
1444
|
+
rb_define_method(klass, "initialize", ServiceDescriptor_initialize, 3);
|
1445
|
+
rb_define_method(klass, "name", ServiceDescriptor_name, 0);
|
1446
|
+
rb_define_method(klass, "each", ServiceDescriptor_each, 0);
|
1447
|
+
rb_define_method(klass, "file_descriptor", ServiceDescriptor_file_descriptor,
|
1448
|
+
0);
|
1449
|
+
rb_define_method(klass, "options", ServiceDescriptor_options, 0);
|
1450
|
+
rb_include_module(klass, rb_mEnumerable);
|
1451
|
+
rb_gc_register_address(&cServiceDescriptor);
|
1452
|
+
cServiceDescriptor = klass;
|
1453
|
+
}
|
1454
|
+
|
1455
|
+
// -----------------------------------------------------------------------------
|
1456
|
+
// MethodDescriptor
|
1457
|
+
// -----------------------------------------------------------------------------
|
1458
|
+
|
1459
|
+
typedef struct {
|
1460
|
+
const upb_MethodDef* methoddef;
|
1461
|
+
// IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
|
1462
|
+
// macro to update VALUE references, as to trigger write barriers.
|
1463
|
+
VALUE module; // begins as nil
|
1464
|
+
VALUE descriptor_pool; // Owns the upb_MethodDef.
|
1465
|
+
} MethodDescriptor;
|
1466
|
+
|
1467
|
+
static VALUE cMethodDescriptor = Qnil;
|
1468
|
+
|
1469
|
+
static void MethodDescriptor_mark(void* _self) {
|
1470
|
+
MethodDescriptor* self = _self;
|
1471
|
+
rb_gc_mark(self->module);
|
1472
|
+
rb_gc_mark(self->descriptor_pool);
|
1473
|
+
}
|
1474
|
+
|
1475
|
+
static const rb_data_type_t MethodDescriptor_type = {
|
1476
|
+
"Google::Protobuf::MethodDescriptor",
|
1477
|
+
{MethodDescriptor_mark, RUBY_DEFAULT_FREE, NULL},
|
1478
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
1479
|
+
};
|
1480
|
+
|
1481
|
+
static MethodDescriptor* ruby_to_MethodDescriptor(VALUE val) {
|
1482
|
+
MethodDescriptor* ret;
|
1483
|
+
TypedData_Get_Struct(val, MethodDescriptor, &MethodDescriptor_type, ret);
|
1484
|
+
return ret;
|
1485
|
+
}
|
1486
|
+
|
1487
|
+
static VALUE MethodDescriptor_alloc(VALUE klass) {
|
1488
|
+
MethodDescriptor* self = ALLOC(MethodDescriptor);
|
1489
|
+
VALUE ret = TypedData_Wrap_Struct(klass, &MethodDescriptor_type, self);
|
1490
|
+
self->methoddef = NULL;
|
1491
|
+
self->module = Qnil;
|
1492
|
+
self->descriptor_pool = Qnil;
|
1493
|
+
return ret;
|
1494
|
+
}
|
1495
|
+
|
1496
|
+
/*
|
1497
|
+
* call-seq:
|
1498
|
+
* MethodDescriptor.new(c_only_cookie, ptr) => MethodDescriptor
|
1499
|
+
*
|
1500
|
+
* Creates a descriptor wrapper object. May only be called from C.
|
1501
|
+
*/
|
1502
|
+
static VALUE MethodDescriptor_initialize(VALUE _self, VALUE cookie,
|
1503
|
+
VALUE descriptor_pool, VALUE ptr) {
|
1504
|
+
MethodDescriptor* self = ruby_to_MethodDescriptor(_self);
|
1505
|
+
|
1506
|
+
if (cookie != c_only_cookie) {
|
1507
|
+
rb_raise(rb_eRuntimeError,
|
1508
|
+
"Descriptor objects may not be created from Ruby.");
|
1509
|
+
}
|
1510
|
+
|
1511
|
+
RB_OBJ_WRITE(_self, &self->descriptor_pool, descriptor_pool);
|
1512
|
+
self->methoddef = (const upb_MethodDef*)NUM2ULL(ptr);
|
1513
|
+
|
1514
|
+
return Qnil;
|
1515
|
+
}
|
1516
|
+
|
1517
|
+
/*
|
1518
|
+
* call-seq:
|
1519
|
+
* MethodDescriptor.name => name
|
1520
|
+
*
|
1521
|
+
* Returns the name of this method
|
1522
|
+
*/
|
1523
|
+
static VALUE MethodDescriptor_name(VALUE _self) {
|
1524
|
+
MethodDescriptor* self = ruby_to_MethodDescriptor(_self);
|
1525
|
+
return rb_str_maybe_null(upb_MethodDef_Name(self->methoddef));
|
1526
|
+
}
|
1527
|
+
|
1528
|
+
/*
|
1529
|
+
* call-seq:
|
1530
|
+
* MethodDescriptor.options => options
|
1531
|
+
*
|
1532
|
+
* Returns the `MethodOptions` for this `MethodDescriptor`.
|
1533
|
+
*/
|
1534
|
+
static VALUE MethodDescriptor_options(VALUE _self) {
|
1535
|
+
MethodDescriptor* self = ruby_to_MethodDescriptor(_self);
|
1536
|
+
const google_protobuf_MethodOptions* opts =
|
1537
|
+
upb_MethodDef_Options(self->methoddef);
|
1538
|
+
upb_Arena* arena = upb_Arena_New();
|
1539
|
+
size_t size;
|
1540
|
+
char* serialized =
|
1541
|
+
google_protobuf_MethodOptions_serialize(opts, arena, &size);
|
1542
|
+
VALUE method_options = decode_options(_self, "MethodOptions", size,
|
1543
|
+
serialized, self->descriptor_pool);
|
1544
|
+
upb_Arena_Free(arena);
|
1545
|
+
return method_options;
|
1546
|
+
}
|
1547
|
+
|
1548
|
+
/*
|
1549
|
+
* call-seq:
|
1550
|
+
* MethodDescriptor.input_type => Descriptor
|
1551
|
+
*
|
1552
|
+
* Returns the `Descriptor` for the request message type of this method
|
1553
|
+
*/
|
1554
|
+
static VALUE MethodDescriptor_input_type(VALUE _self) {
|
1555
|
+
MethodDescriptor* self = ruby_to_MethodDescriptor(_self);
|
1556
|
+
const upb_MessageDef* type = upb_MethodDef_InputType(self->methoddef);
|
1557
|
+
return get_msgdef_obj(self->descriptor_pool, type);
|
1558
|
+
}
|
1559
|
+
|
1560
|
+
/*
|
1561
|
+
* call-seq:
|
1562
|
+
* MethodDescriptor.output_type => Descriptor
|
1563
|
+
*
|
1564
|
+
* Returns the `Descriptor` for the response message type of this method
|
1565
|
+
*/
|
1566
|
+
static VALUE MethodDescriptor_output_type(VALUE _self) {
|
1567
|
+
MethodDescriptor* self = ruby_to_MethodDescriptor(_self);
|
1568
|
+
const upb_MessageDef* type = upb_MethodDef_OutputType(self->methoddef);
|
1569
|
+
return get_msgdef_obj(self->descriptor_pool, type);
|
1570
|
+
}
|
1571
|
+
|
1572
|
+
/*
|
1573
|
+
* call-seq:
|
1574
|
+
* MethodDescriptor.client_streaming => bool
|
1575
|
+
*
|
1576
|
+
* Returns whether or not this is a streaming request method
|
1577
|
+
*/
|
1578
|
+
static VALUE MethodDescriptor_client_streaming(VALUE _self) {
|
1579
|
+
MethodDescriptor* self = ruby_to_MethodDescriptor(_self);
|
1580
|
+
return upb_MethodDef_ClientStreaming(self->methoddef) ? Qtrue : Qfalse;
|
1581
|
+
}
|
1582
|
+
|
1583
|
+
/*
|
1584
|
+
* call-seq:
|
1585
|
+
* MethodDescriptor.server_streaming => bool
|
1586
|
+
*
|
1587
|
+
* Returns whether or not this is a streaming response method
|
1588
|
+
*/
|
1589
|
+
static VALUE MethodDescriptor_server_streaming(VALUE _self) {
|
1590
|
+
MethodDescriptor* self = ruby_to_MethodDescriptor(_self);
|
1591
|
+
return upb_MethodDef_ServerStreaming(self->methoddef) ? Qtrue : Qfalse;
|
1592
|
+
}
|
1593
|
+
|
1594
|
+
static void MethodDescriptor_register(VALUE module) {
|
1595
|
+
VALUE klass = rb_define_class_under(module, "MethodDescriptor", rb_cObject);
|
1596
|
+
rb_define_alloc_func(klass, MethodDescriptor_alloc);
|
1597
|
+
rb_define_method(klass, "initialize", MethodDescriptor_initialize, 3);
|
1598
|
+
rb_define_method(klass, "name", MethodDescriptor_name, 0);
|
1599
|
+
rb_define_method(klass, "options", MethodDescriptor_options, 0);
|
1600
|
+
rb_define_method(klass, "input_type", MethodDescriptor_input_type, 0);
|
1601
|
+
rb_define_method(klass, "output_type", MethodDescriptor_output_type, 0);
|
1602
|
+
rb_define_method(klass, "client_streaming", MethodDescriptor_client_streaming,
|
1603
|
+
0);
|
1604
|
+
rb_define_method(klass, "server_streaming", MethodDescriptor_server_streaming,
|
1605
|
+
0);
|
1606
|
+
rb_gc_register_address(&cMethodDescriptor);
|
1607
|
+
cMethodDescriptor = klass;
|
1608
|
+
}
|
1609
|
+
|
1149
1610
|
static VALUE get_def_obj(VALUE _descriptor_pool, const void* ptr, VALUE klass) {
|
1150
1611
|
DescriptorPool* descriptor_pool = ruby_to_DescriptorPool(_descriptor_pool);
|
1151
1612
|
VALUE key = ULL2NUM((intptr_t)ptr);
|
@@ -1187,6 +1648,16 @@ static VALUE get_oneofdef_obj(VALUE descriptor_pool, const upb_OneofDef* def) {
|
|
1187
1648
|
return get_def_obj(descriptor_pool, def, cOneofDescriptor);
|
1188
1649
|
}
|
1189
1650
|
|
1651
|
+
static VALUE get_servicedef_obj(VALUE descriptor_pool,
|
1652
|
+
const upb_ServiceDef* def) {
|
1653
|
+
return get_def_obj(descriptor_pool, def, cServiceDescriptor);
|
1654
|
+
}
|
1655
|
+
|
1656
|
+
static VALUE get_methoddef_obj(VALUE descriptor_pool,
|
1657
|
+
const upb_MethodDef* def) {
|
1658
|
+
return get_def_obj(descriptor_pool, def, cMethodDescriptor);
|
1659
|
+
}
|
1660
|
+
|
1190
1661
|
// -----------------------------------------------------------------------------
|
1191
1662
|
// Shared functions
|
1192
1663
|
// -----------------------------------------------------------------------------
|
@@ -1262,6 +1733,8 @@ void Defs_register(VALUE module) {
|
|
1262
1733
|
FieldDescriptor_register(module);
|
1263
1734
|
OneofDescriptor_register(module);
|
1264
1735
|
EnumDescriptor_register(module);
|
1736
|
+
ServiceDescriptor_register(module);
|
1737
|
+
MethodDescriptor_register(module);
|
1265
1738
|
|
1266
1739
|
rb_gc_register_address(&c_only_cookie);
|
1267
1740
|
c_only_cookie = rb_class_new_instance(0, NULL, rb_cObject);
|