google-protobuf 3.21.2 → 4.29.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 +67 -86
- data/ext/google/protobuf_c/convert.h +3 -28
- data/ext/google/protobuf_c/defs.c +538 -77
- data/ext/google/protobuf_c/defs.h +3 -28
- data/ext/google/protobuf_c/extconf.rb +4 -4
- data/ext/google/protobuf_c/glue.c +72 -0
- data/ext/google/protobuf_c/map.c +114 -85
- data/ext/google/protobuf_c/map.h +12 -30
- data/ext/google/protobuf_c/message.c +264 -238
- data/ext/google/protobuf_c/message.h +11 -33
- data/ext/google/protobuf_c/protobuf.c +63 -187
- data/ext/google/protobuf_c/protobuf.h +27 -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 +13783 -8236
- data/ext/google/protobuf_c/ruby-upb.h +14077 -4495
- 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/LICENSE +1 -0
- 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 +20 -7
- data/ext/google/protobuf_c/wrap_memcpy.c +3 -26
- data/lib/google/protobuf/any_pb.rb +6 -8
- data/lib/google/protobuf/api_pb.rb +6 -26
- data/lib/google/protobuf/descriptor_pb.rb +23 -226
- data/lib/google/protobuf/duration_pb.rb +6 -8
- data/lib/google/protobuf/empty_pb.rb +6 -6
- data/lib/google/protobuf/ffi/descriptor.rb +165 -0
- data/lib/google/protobuf/ffi/descriptor_pool.rb +77 -0
- data/lib/google/protobuf/ffi/enum_descriptor.rb +173 -0
- data/lib/google/protobuf/ffi/ffi.rb +215 -0
- data/lib/google/protobuf/ffi/field_descriptor.rb +330 -0
- data/lib/google/protobuf/ffi/file_descriptor.rb +49 -0
- data/lib/google/protobuf/ffi/internal/arena.rb +60 -0
- data/lib/google/protobuf/ffi/internal/convert.rb +296 -0
- data/lib/google/protobuf/ffi/internal/pointer_helper.rb +35 -0
- data/lib/google/protobuf/ffi/internal/type_safety.rb +25 -0
- data/lib/google/protobuf/ffi/map.rb +433 -0
- data/lib/google/protobuf/ffi/message.rb +785 -0
- data/lib/google/protobuf/ffi/method_descriptor.rb +114 -0
- data/lib/google/protobuf/ffi/object_cache.rb +30 -0
- data/lib/google/protobuf/ffi/oneof_descriptor.rb +97 -0
- data/lib/google/protobuf/ffi/repeated_field.rb +411 -0
- data/lib/google/protobuf/ffi/service_descriptor.rb +107 -0
- data/lib/google/protobuf/field_mask_pb.rb +6 -7
- data/lib/google/protobuf/internal/object_cache.rb +99 -0
- data/lib/google/protobuf/message_exts.rb +8 -26
- data/lib/google/protobuf/plugin_pb.rb +25 -0
- data/lib/google/protobuf/repeated_field.rb +7 -31
- data/lib/google/protobuf/source_context_pb.rb +6 -7
- data/lib/google/protobuf/struct_pb.rb +6 -23
- data/lib/google/protobuf/timestamp_pb.rb +6 -8
- data/lib/google/protobuf/type_pb.rb +6 -71
- data/lib/google/protobuf/well_known_types.rb +5 -34
- data/lib/google/protobuf/wrappers_pb.rb +6 -31
- data/lib/google/protobuf.rb +27 -45
- data/lib/google/protobuf_ffi.rb +51 -0
- data/lib/google/protobuf_native.rb +19 -0
- data/lib/google/tasks/ffi.rake +100 -0
- metadata +92 -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
- data/tests/basic.rb +0 -739
- data/tests/generated_code_test.rb +0 -23
- data/tests/stress.rb +0 -38
| @@ -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,37 @@ VALUE DescriptorPool_add_serialized_file(VALUE _self, | |
| 167 146 | 
             
             * call-seq:
         | 
| 168 147 | 
             
             *     DescriptorPool.lookup(name) => descriptor
         | 
| 169 148 | 
             
             *
         | 
| 170 | 
            -
             * Finds a Descriptor or  | 
| 171 | 
            -
             * 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.
         | 
| 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;
         | 
| 178 159 |  | 
| 179 160 | 
             
              msgdef = upb_DefPool_FindMessageByName(self->symtab, name_str);
         | 
| 180 161 | 
             
              if (msgdef) {
         | 
| 181 162 | 
             
                return get_msgdef_obj(_self, msgdef);
         | 
| 182 163 | 
             
              }
         | 
| 183 164 |  | 
| 165 | 
            +
              fielddef = upb_DefPool_FindExtensionByName(self->symtab, name_str);
         | 
| 166 | 
            +
              if (fielddef) {
         | 
| 167 | 
            +
                return get_fielddef_obj(_self, fielddef);
         | 
| 168 | 
            +
              }
         | 
| 169 | 
            +
             | 
| 184 170 | 
             
              enumdef = upb_DefPool_FindEnumByName(self->symtab, name_str);
         | 
| 185 171 | 
             
              if (enumdef) {
         | 
| 186 172 | 
             
                return get_enumdef_obj(_self, enumdef);
         | 
| 187 173 | 
             
              }
         | 
| 188 174 |  | 
| 175 | 
            +
              servicedef = upb_DefPool_FindServiceByName(self->symtab, name_str);
         | 
| 176 | 
            +
              if (servicedef) {
         | 
| 177 | 
            +
                return get_servicedef_obj(_self, servicedef);
         | 
| 178 | 
            +
              }
         | 
| 179 | 
            +
             | 
| 189 180 | 
             
              return Qnil;
         | 
| 190 181 | 
             
            }
         | 
| 191 182 |  | 
| @@ -215,6 +206,7 @@ static void DescriptorPool_register(VALUE module) { | |
| 215 206 |  | 
| 216 207 | 
             
              rb_gc_register_address(&generated_pool);
         | 
| 217 208 | 
             
              generated_pool = rb_class_new_instance(0, NULL, klass);
         | 
| 209 | 
            +
              options_instancevar_interned = rb_intern("options");
         | 
| 218 210 | 
             
            }
         | 
| 219 211 |  | 
| 220 212 | 
             
            // -----------------------------------------------------------------------------
         | 
| @@ -223,6 +215,8 @@ static void DescriptorPool_register(VALUE module) { | |
| 223 215 |  | 
| 224 216 | 
             
            typedef struct {
         | 
| 225 217 | 
             
              const upb_MessageDef* msgdef;
         | 
| 218 | 
            +
              // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
         | 
| 219 | 
            +
              // macro to update VALUE references, as to trigger write barriers.
         | 
| 226 220 | 
             
              VALUE klass;
         | 
| 227 221 | 
             
              VALUE descriptor_pool;
         | 
| 228 222 | 
             
            } Descriptor;
         | 
| @@ -238,7 +232,7 @@ static void Descriptor_mark(void* _self) { | |
| 238 232 | 
             
            static const rb_data_type_t Descriptor_type = {
         | 
| 239 233 | 
             
                "Google::Protobuf::Descriptor",
         | 
| 240 234 | 
             
                {Descriptor_mark, RUBY_DEFAULT_FREE, NULL},
         | 
| 241 | 
            -
                .flags = RUBY_TYPED_FREE_IMMEDIATELY,
         | 
| 235 | 
            +
                .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
         | 
| 242 236 | 
             
            };
         | 
| 243 237 |  | 
| 244 238 | 
             
            static Descriptor* ruby_to_Descriptor(VALUE val) {
         | 
| @@ -247,6 +241,48 @@ static Descriptor* ruby_to_Descriptor(VALUE val) { | |
| 247 241 | 
             
              return ret;
         | 
| 248 242 | 
             
            }
         | 
| 249 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 | 
            +
             | 
| 250 286 | 
             
            /*
         | 
| 251 287 | 
             
             * call-seq:
         | 
| 252 288 | 
             
             *     Descriptor.new => descriptor
         | 
| @@ -280,7 +316,7 @@ static VALUE Descriptor_initialize(VALUE _self, VALUE cookie, | |
| 280 316 | 
             
                         "Descriptor objects may not be created from Ruby.");
         | 
| 281 317 | 
             
              }
         | 
| 282 318 |  | 
| 283 | 
            -
              self->descriptor_pool  | 
| 319 | 
            +
              RB_OBJ_WRITE(_self, &self->descriptor_pool, descriptor_pool);
         | 
| 284 320 | 
             
              self->msgdef = (const upb_MessageDef*)NUM2ULL(ptr);
         | 
| 285 321 |  | 
| 286 322 | 
             
              return Qnil;
         | 
| @@ -390,11 +426,31 @@ static VALUE Descriptor_lookup_oneof(VALUE _self, VALUE name) { | |
| 390 426 | 
             
            static VALUE Descriptor_msgclass(VALUE _self) {
         | 
| 391 427 | 
             
              Descriptor* self = ruby_to_Descriptor(_self);
         | 
| 392 428 | 
             
              if (self->klass == Qnil) {
         | 
| 393 | 
            -
                self->klass  | 
| 429 | 
            +
                RB_OBJ_WRITE(_self, &self->klass, build_class_from_descriptor(_self));
         | 
| 394 430 | 
             
              }
         | 
| 395 431 | 
             
              return self->klass;
         | 
| 396 432 | 
             
            }
         | 
| 397 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 | 
            +
             | 
| 398 454 | 
             
            static void Descriptor_register(VALUE module) {
         | 
| 399 455 | 
             
              VALUE klass = rb_define_class_under(module, "Descriptor", rb_cObject);
         | 
| 400 456 | 
             
              rb_define_alloc_func(klass, Descriptor_alloc);
         | 
| @@ -406,6 +462,7 @@ static void Descriptor_register(VALUE module) { | |
| 406 462 | 
             
              rb_define_method(klass, "msgclass", Descriptor_msgclass, 0);
         | 
| 407 463 | 
             
              rb_define_method(klass, "name", Descriptor_name, 0);
         | 
| 408 464 | 
             
              rb_define_method(klass, "file_descriptor", Descriptor_file_descriptor, 0);
         | 
| 465 | 
            +
              rb_define_method(klass, "options", Descriptor_options, 0);
         | 
| 409 466 | 
             
              rb_include_module(klass, rb_mEnumerable);
         | 
| 410 467 | 
             
              rb_gc_register_address(&cDescriptor);
         | 
| 411 468 | 
             
              cDescriptor = klass;
         | 
| @@ -417,6 +474,8 @@ static void Descriptor_register(VALUE module) { | |
| 417 474 |  | 
| 418 475 | 
             
            typedef struct {
         | 
| 419 476 | 
             
              const upb_FileDef* filedef;
         | 
| 477 | 
            +
              // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
         | 
| 478 | 
            +
              // macro to update VALUE references, as to trigger write barriers.
         | 
| 420 479 | 
             
              VALUE descriptor_pool;  // Owns the upb_FileDef.
         | 
| 421 480 | 
             
            } FileDescriptor;
         | 
| 422 481 |  | 
| @@ -430,7 +489,7 @@ static void FileDescriptor_mark(void* _self) { | |
| 430 489 | 
             
            static const rb_data_type_t FileDescriptor_type = {
         | 
| 431 490 | 
             
                "Google::Protobuf::FileDescriptor",
         | 
| 432 491 | 
             
                {FileDescriptor_mark, RUBY_DEFAULT_FREE, NULL},
         | 
| 433 | 
            -
                .flags = RUBY_TYPED_FREE_IMMEDIATELY,
         | 
| 492 | 
            +
                .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
         | 
| 434 493 | 
             
            };
         | 
| 435 494 |  | 
| 436 495 | 
             
            static FileDescriptor* ruby_to_FileDescriptor(VALUE val) {
         | 
| @@ -451,7 +510,7 @@ static VALUE FileDescriptor_alloc(VALUE klass) { | |
| 451 510 | 
             
             * call-seq:
         | 
| 452 511 | 
             
             *     FileDescriptor.new => file
         | 
| 453 512 | 
             
             *
         | 
| 454 | 
            -
             * Returns a new file descriptor.  | 
| 513 | 
            +
             * Returns a new file descriptor. May
         | 
| 455 514 | 
             
             * to a builder.
         | 
| 456 515 | 
             
             */
         | 
| 457 516 | 
             
            static VALUE FileDescriptor_initialize(VALUE _self, VALUE cookie,
         | 
| @@ -463,7 +522,7 @@ static VALUE FileDescriptor_initialize(VALUE _self, VALUE cookie, | |
| 463 522 | 
             
                         "Descriptor objects may not be created from Ruby.");
         | 
| 464 523 | 
             
              }
         | 
| 465 524 |  | 
| 466 | 
            -
              self->descriptor_pool  | 
| 525 | 
            +
              RB_OBJ_WRITE(_self, &self->descriptor_pool, descriptor_pool);
         | 
| 467 526 | 
             
              self->filedef = (const upb_FileDef*)NUM2ULL(ptr);
         | 
| 468 527 |  | 
| 469 528 | 
             
              return Qnil;
         | 
| @@ -483,24 +542,20 @@ static VALUE FileDescriptor_name(VALUE _self) { | |
| 483 542 |  | 
| 484 543 | 
             
            /*
         | 
| 485 544 | 
             
             * call-seq:
         | 
| 486 | 
            -
             *     FileDescriptor. | 
| 545 | 
            +
             *     FileDescriptor.options => options
         | 
| 487 546 | 
             
             *
         | 
| 488 | 
            -
             * Returns  | 
| 489 | 
            -
             *
         | 
| 490 | 
            -
             * Valid syntax versions are:
         | 
| 491 | 
            -
             *     :proto2 or :proto3.
         | 
| 547 | 
            +
             * Returns the `FileOptions` for this `FileDescriptor`.
         | 
| 492 548 | 
             
             */
         | 
| 493 | 
            -
            static VALUE  | 
| 549 | 
            +
            static VALUE FileDescriptor_options(VALUE _self) {
         | 
| 494 550 | 
             
              FileDescriptor* self = ruby_to_FileDescriptor(_self);
         | 
| 495 | 
            -
             | 
| 496 | 
            -
               | 
| 497 | 
            -
             | 
| 498 | 
            -
             | 
| 499 | 
            -
             | 
| 500 | 
            -
             | 
| 501 | 
            -
             | 
| 502 | 
            -
             | 
| 503 | 
            -
              }
         | 
| 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;
         | 
| 504 559 | 
             
            }
         | 
| 505 560 |  | 
| 506 561 | 
             
            static void FileDescriptor_register(VALUE module) {
         | 
| @@ -508,7 +563,7 @@ static void FileDescriptor_register(VALUE module) { | |
| 508 563 | 
             
              rb_define_alloc_func(klass, FileDescriptor_alloc);
         | 
| 509 564 | 
             
              rb_define_method(klass, "initialize", FileDescriptor_initialize, 3);
         | 
| 510 565 | 
             
              rb_define_method(klass, "name", FileDescriptor_name, 0);
         | 
| 511 | 
            -
              rb_define_method(klass, " | 
| 566 | 
            +
              rb_define_method(klass, "options", FileDescriptor_options, 0);
         | 
| 512 567 | 
             
              rb_gc_register_address(&cFileDescriptor);
         | 
| 513 568 | 
             
              cFileDescriptor = klass;
         | 
| 514 569 | 
             
            }
         | 
| @@ -519,6 +574,8 @@ static void FileDescriptor_register(VALUE module) { | |
| 519 574 |  | 
| 520 575 | 
             
            typedef struct {
         | 
| 521 576 | 
             
              const upb_FieldDef* fielddef;
         | 
| 577 | 
            +
              // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
         | 
| 578 | 
            +
              // macro to update VALUE references, as to trigger write barriers.
         | 
| 522 579 | 
             
              VALUE descriptor_pool;  // Owns the upb_FieldDef.
         | 
| 523 580 | 
             
            } FieldDescriptor;
         | 
| 524 581 |  | 
| @@ -532,7 +589,7 @@ static void FieldDescriptor_mark(void* _self) { | |
| 532 589 | 
             
            static const rb_data_type_t FieldDescriptor_type = {
         | 
| 533 590 | 
             
                "Google::Protobuf::FieldDescriptor",
         | 
| 534 591 | 
             
                {FieldDescriptor_mark, RUBY_DEFAULT_FREE, NULL},
         | 
| 535 | 
            -
                .flags = RUBY_TYPED_FREE_IMMEDIATELY,
         | 
| 592 | 
            +
                .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
         | 
| 536 593 | 
             
            };
         | 
| 537 594 |  | 
| 538 595 | 
             
            static FieldDescriptor* ruby_to_FieldDescriptor(VALUE val) {
         | 
| @@ -557,7 +614,7 @@ static VALUE FieldDescriptor_alloc(VALUE klass) { | |
| 557 614 |  | 
| 558 615 | 
             
            /*
         | 
| 559 616 | 
             
             * call-seq:
         | 
| 560 | 
            -
             *     | 
| 617 | 
            +
             *    FieldDescriptor.new(c_only_cookie, pool, ptr) => FieldDescriptor
         | 
| 561 618 | 
             
             *
         | 
| 562 619 | 
             
             * Creates a descriptor wrapper object.  May only be called from C.
         | 
| 563 620 | 
             
             */
         | 
| @@ -570,7 +627,7 @@ static VALUE FieldDescriptor_initialize(VALUE _self, VALUE cookie, | |
| 570 627 | 
             
                         "Descriptor objects may not be created from Ruby.");
         | 
| 571 628 | 
             
              }
         | 
| 572 629 |  | 
| 573 | 
            -
              self->descriptor_pool  | 
| 630 | 
            +
              RB_OBJ_WRITE(_self, &self->descriptor_pool, descriptor_pool);
         | 
| 574 631 | 
             
              self->fielddef = (const upb_FieldDef*)NUM2ULL(ptr);
         | 
| 575 632 |  | 
| 576 633 | 
             
              return Qnil;
         | 
| @@ -595,7 +652,7 @@ upb_CType ruby_to_fieldtype(VALUE type) { | |
| 595 652 |  | 
| 596 653 | 
             
            #define CONVERT(upb, ruby)                \
         | 
| 597 654 | 
             
              if (SYM2ID(type) == rb_intern(#ruby)) { \
         | 
| 598 | 
            -
                return kUpb_CType_##upb; | 
| 655 | 
            +
                return kUpb_CType_##upb;              \
         | 
| 599 656 | 
             
              }
         | 
| 600 657 |  | 
| 601 658 | 
             
              CONVERT(Float, float);
         | 
| @@ -618,7 +675,7 @@ upb_CType ruby_to_fieldtype(VALUE type) { | |
| 618 675 |  | 
| 619 676 | 
             
            static VALUE descriptortype_to_ruby(upb_FieldType type) {
         | 
| 620 677 | 
             
              switch (type) {
         | 
| 621 | 
            -
            #define CONVERT(upb, ruby) | 
| 678 | 
            +
            #define CONVERT(upb, ruby)   \
         | 
| 622 679 | 
             
              case kUpb_FieldType_##upb: \
         | 
| 623 680 | 
             
                return ID2SYM(rb_intern(#ruby));
         | 
| 624 681 | 
             
                CONVERT(Float, float);
         | 
| @@ -668,7 +725,7 @@ static VALUE FieldDescriptor__type(VALUE _self) { | |
| 668 725 | 
             
            static VALUE FieldDescriptor_default(VALUE _self) {
         | 
| 669 726 | 
             
              FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
         | 
| 670 727 | 
             
              const upb_FieldDef* f = self->fielddef;
         | 
| 671 | 
            -
              upb_MessageValue default_val =  | 
| 728 | 
            +
              upb_MessageValue default_val = upb_MessageValue_Zero();
         | 
| 672 729 | 
             
              if (upb_FieldDef_IsSubMessage(f)) {
         | 
| 673 730 | 
             
                return Qnil;
         | 
| 674 731 | 
             
              } else if (!upb_FieldDef_IsRepeated(f)) {
         | 
| @@ -677,6 +734,28 @@ static VALUE FieldDescriptor_default(VALUE _self) { | |
| 677 734 | 
             
              return Convert_UpbToRuby(default_val, TypeInfo_get(self->fielddef), Qnil);
         | 
| 678 735 | 
             
            }
         | 
| 679 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 | 
            +
             | 
| 680 759 | 
             
            /*
         | 
| 681 760 | 
             
             * call-seq:
         | 
| 682 761 | 
             
             *     FieldDescriptor.json_name => json_name
         | 
| @@ -703,7 +782,7 @@ static VALUE FieldDescriptor_label(VALUE _self) { | |
| 703 782 | 
             
              FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
         | 
| 704 783 | 
             
              switch (upb_FieldDef_Label(self->fielddef)) {
         | 
| 705 784 | 
             
            #define CONVERT(upb, ruby) \
         | 
| 706 | 
            -
              case kUpb_Label_##upb: | 
| 785 | 
            +
              case kUpb_Label_##upb:   \
         | 
| 707 786 | 
             
                return ID2SYM(rb_intern(#ruby));
         | 
| 708 787 |  | 
| 709 788 | 
             
                CONVERT(Optional, optional);
         | 
| @@ -803,7 +882,7 @@ static VALUE FieldDescriptor_get(VALUE _self, VALUE msg_rb) { | |
| 803 882 | 
             
            static VALUE FieldDescriptor_has(VALUE _self, VALUE msg_rb) {
         | 
| 804 883 | 
             
              FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
         | 
| 805 884 | 
             
              const upb_MessageDef* m;
         | 
| 806 | 
            -
              const  | 
| 885 | 
            +
              const upb_Message* msg = Message_Get(msg_rb, &m);
         | 
| 807 886 |  | 
| 808 887 | 
             
              if (m != upb_FieldDef_ContainingType(self->fielddef)) {
         | 
| 809 888 | 
             
                rb_raise(cTypeError, "has method called on wrong message type");
         | 
| @@ -811,7 +890,7 @@ static VALUE FieldDescriptor_has(VALUE _self, VALUE msg_rb) { | |
| 811 890 | 
             
                rb_raise(rb_eArgError, "does not track presence");
         | 
| 812 891 | 
             
              }
         | 
| 813 892 |  | 
| 814 | 
            -
              return  | 
| 893 | 
            +
              return upb_Message_HasFieldByDef(msg, self->fielddef) ? Qtrue : Qfalse;
         | 
| 815 894 | 
             
            }
         | 
| 816 895 |  | 
| 817 896 | 
             
            /*
         | 
| @@ -823,13 +902,13 @@ static VALUE FieldDescriptor_has(VALUE _self, VALUE msg_rb) { | |
| 823 902 | 
             
            static VALUE FieldDescriptor_clear(VALUE _self, VALUE msg_rb) {
         | 
| 824 903 | 
             
              FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
         | 
| 825 904 | 
             
              const upb_MessageDef* m;
         | 
| 826 | 
            -
               | 
| 905 | 
            +
              upb_Message* msg = Message_GetMutable(msg_rb, &m);
         | 
| 827 906 |  | 
| 828 907 | 
             
              if (m != upb_FieldDef_ContainingType(self->fielddef)) {
         | 
| 829 908 | 
             
                rb_raise(cTypeError, "has method called on wrong message type");
         | 
| 830 909 | 
             
              }
         | 
| 831 910 |  | 
| 832 | 
            -
               | 
| 911 | 
            +
              upb_Message_ClearFieldByDef(msg, self->fielddef);
         | 
| 833 912 | 
             
              return Qnil;
         | 
| 834 913 | 
             
            }
         | 
| 835 914 |  | 
| @@ -844,7 +923,7 @@ static VALUE FieldDescriptor_clear(VALUE _self, VALUE msg_rb) { | |
| 844 923 | 
             
            static VALUE FieldDescriptor_set(VALUE _self, VALUE msg_rb, VALUE value) {
         | 
| 845 924 | 
             
              FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
         | 
| 846 925 | 
             
              const upb_MessageDef* m;
         | 
| 847 | 
            -
               | 
| 926 | 
            +
              upb_Message* msg = Message_GetMutable(msg_rb, &m);
         | 
| 848 927 | 
             
              upb_Arena* arena = Arena_get(Message_GetArena(msg_rb));
         | 
| 849 928 | 
             
              upb_MessageValue msgval;
         | 
| 850 929 |  | 
| @@ -854,10 +933,29 @@ static VALUE FieldDescriptor_set(VALUE _self, VALUE msg_rb, VALUE value) { | |
| 854 933 |  | 
| 855 934 | 
             
              msgval = Convert_RubyToUpb(value, upb_FieldDef_Name(self->fielddef),
         | 
| 856 935 | 
             
                                         TypeInfo_get(self->fielddef), arena);
         | 
| 857 | 
            -
               | 
| 936 | 
            +
              upb_Message_SetFieldByDef(msg, self->fielddef, msgval, arena);
         | 
| 858 937 | 
             
              return Qnil;
         | 
| 859 938 | 
             
            }
         | 
| 860 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 | 
            +
             | 
| 861 959 | 
             
            static void FieldDescriptor_register(VALUE module) {
         | 
| 862 960 | 
             
              VALUE klass = rb_define_class_under(module, "FieldDescriptor", rb_cObject);
         | 
| 863 961 | 
             
              rb_define_alloc_func(klass, FieldDescriptor_alloc);
         | 
| @@ -865,6 +963,8 @@ static void FieldDescriptor_register(VALUE module) { | |
| 865 963 | 
             
              rb_define_method(klass, "name", FieldDescriptor_name, 0);
         | 
| 866 964 | 
             
              rb_define_method(klass, "type", FieldDescriptor__type, 0);
         | 
| 867 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);
         | 
| 868 968 | 
             
              rb_define_method(klass, "json_name", FieldDescriptor_json_name, 0);
         | 
| 869 969 | 
             
              rb_define_method(klass, "label", FieldDescriptor_label, 0);
         | 
| 870 970 | 
             
              rb_define_method(klass, "number", FieldDescriptor_number, 0);
         | 
| @@ -874,6 +974,7 @@ static void FieldDescriptor_register(VALUE module) { | |
| 874 974 | 
             
              rb_define_method(klass, "clear", FieldDescriptor_clear, 1);
         | 
| 875 975 | 
             
              rb_define_method(klass, "get", FieldDescriptor_get, 1);
         | 
| 876 976 | 
             
              rb_define_method(klass, "set", FieldDescriptor_set, 2);
         | 
| 977 | 
            +
              rb_define_method(klass, "options", FieldDescriptor_options, 0);
         | 
| 877 978 | 
             
              rb_gc_register_address(&cFieldDescriptor);
         | 
| 878 979 | 
             
              cFieldDescriptor = klass;
         | 
| 879 980 | 
             
            }
         | 
| @@ -884,6 +985,8 @@ static void FieldDescriptor_register(VALUE module) { | |
| 884 985 |  | 
| 885 986 | 
             
            typedef struct {
         | 
| 886 987 | 
             
              const upb_OneofDef* oneofdef;
         | 
| 988 | 
            +
              // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
         | 
| 989 | 
            +
              // macro to update VALUE references, as to trigger write barriers.
         | 
| 887 990 | 
             
              VALUE descriptor_pool;  // Owns the upb_OneofDef.
         | 
| 888 991 | 
             
            } OneofDescriptor;
         | 
| 889 992 |  | 
| @@ -897,7 +1000,7 @@ static void OneofDescriptor_mark(void* _self) { | |
| 897 1000 | 
             
            static const rb_data_type_t OneofDescriptor_type = {
         | 
| 898 1001 | 
             
                "Google::Protobuf::OneofDescriptor",
         | 
| 899 1002 | 
             
                {OneofDescriptor_mark, RUBY_DEFAULT_FREE, NULL},
         | 
| 900 | 
            -
                .flags = RUBY_TYPED_FREE_IMMEDIATELY,
         | 
| 1003 | 
            +
                .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
         | 
| 901 1004 | 
             
            };
         | 
| 902 1005 |  | 
| 903 1006 | 
             
            static OneofDescriptor* ruby_to_OneofDescriptor(VALUE val) {
         | 
| @@ -936,7 +1039,7 @@ static VALUE OneofDescriptor_initialize(VALUE _self, VALUE cookie, | |
| 936 1039 | 
             
                         "Descriptor objects may not be created from Ruby.");
         | 
| 937 1040 | 
             
              }
         | 
| 938 1041 |  | 
| 939 | 
            -
              self->descriptor_pool  | 
| 1042 | 
            +
              RB_OBJ_WRITE(_self, &self->descriptor_pool, descriptor_pool);
         | 
| 940 1043 | 
             
              self->oneofdef = (const upb_OneofDef*)NUM2ULL(ptr);
         | 
| 941 1044 |  | 
| 942 1045 | 
             
              return Qnil;
         | 
| @@ -971,12 +1074,32 @@ static VALUE OneofDescriptor_each(VALUE _self) { | |
| 971 1074 | 
             
              return Qnil;
         | 
| 972 1075 | 
             
            }
         | 
| 973 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 | 
            +
             | 
| 974 1096 | 
             
            static void OneofDescriptor_register(VALUE module) {
         | 
| 975 1097 | 
             
              VALUE klass = rb_define_class_under(module, "OneofDescriptor", rb_cObject);
         | 
| 976 1098 | 
             
              rb_define_alloc_func(klass, OneofDescriptor_alloc);
         | 
| 977 1099 | 
             
              rb_define_method(klass, "initialize", OneofDescriptor_initialize, 3);
         | 
| 978 1100 | 
             
              rb_define_method(klass, "name", OneofDescriptor_name, 0);
         | 
| 979 1101 | 
             
              rb_define_method(klass, "each", OneofDescriptor_each, 0);
         | 
| 1102 | 
            +
              rb_define_method(klass, "options", OneOfDescriptor_options, 0);
         | 
| 980 1103 | 
             
              rb_include_module(klass, rb_mEnumerable);
         | 
| 981 1104 | 
             
              rb_gc_register_address(&cOneofDescriptor);
         | 
| 982 1105 | 
             
              cOneofDescriptor = klass;
         | 
| @@ -988,6 +1111,8 @@ static void OneofDescriptor_register(VALUE module) { | |
| 988 1111 |  | 
| 989 1112 | 
             
            typedef struct {
         | 
| 990 1113 | 
             
              const upb_EnumDef* enumdef;
         | 
| 1114 | 
            +
              // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
         | 
| 1115 | 
            +
              // macro to update VALUE references, as to trigger write barriers.
         | 
| 991 1116 | 
             
              VALUE module;           // begins as nil
         | 
| 992 1117 | 
             
              VALUE descriptor_pool;  // Owns the upb_EnumDef.
         | 
| 993 1118 | 
             
            } EnumDescriptor;
         | 
| @@ -1003,7 +1128,7 @@ static void EnumDescriptor_mark(void* _self) { | |
| 1003 1128 | 
             
            static const rb_data_type_t EnumDescriptor_type = {
         | 
| 1004 1129 | 
             
                "Google::Protobuf::EnumDescriptor",
         | 
| 1005 1130 | 
             
                {EnumDescriptor_mark, RUBY_DEFAULT_FREE, NULL},
         | 
| 1006 | 
            -
                .flags = RUBY_TYPED_FREE_IMMEDIATELY,
         | 
| 1131 | 
            +
                .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
         | 
| 1007 1132 | 
             
            };
         | 
| 1008 1133 |  | 
| 1009 1134 | 
             
            static EnumDescriptor* ruby_to_EnumDescriptor(VALUE val) {
         | 
| @@ -1042,7 +1167,7 @@ static VALUE EnumDescriptor_initialize(VALUE _self, VALUE cookie, | |
| 1042 1167 | 
             
                         "Descriptor objects may not be created from Ruby.");
         | 
| 1043 1168 | 
             
              }
         | 
| 1044 1169 |  | 
| 1045 | 
            -
              self->descriptor_pool  | 
| 1170 | 
            +
              RB_OBJ_WRITE(_self, &self->descriptor_pool, descriptor_pool);
         | 
| 1046 1171 | 
             
              self->enumdef = (const upb_EnumDef*)NUM2ULL(ptr);
         | 
| 1047 1172 |  | 
| 1048 1173 | 
             
              return Qnil;
         | 
| @@ -1060,6 +1185,17 @@ static VALUE EnumDescriptor_file_descriptor(VALUE _self) { | |
| 1060 1185 | 
             
                                     upb_EnumDef_File(self->enumdef));
         | 
| 1061 1186 | 
             
            }
         | 
| 1062 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 | 
            +
             | 
| 1063 1199 | 
             
            /*
         | 
| 1064 1200 | 
             
             * call-seq:
         | 
| 1065 1201 | 
             
             *     EnumDescriptor.name => name
         | 
| @@ -1081,7 +1217,7 @@ static VALUE EnumDescriptor_name(VALUE _self) { | |
| 1081 1217 | 
             
            static VALUE EnumDescriptor_lookup_name(VALUE _self, VALUE name) {
         | 
| 1082 1218 | 
             
              EnumDescriptor* self = ruby_to_EnumDescriptor(_self);
         | 
| 1083 1219 | 
             
              const char* name_str = rb_id2name(SYM2ID(name));
         | 
| 1084 | 
            -
              const upb_EnumValueDef  | 
| 1220 | 
            +
              const upb_EnumValueDef* ev =
         | 
| 1085 1221 | 
             
                  upb_EnumDef_FindValueByName(self->enumdef, name_str);
         | 
| 1086 1222 | 
             
              if (ev) {
         | 
| 1087 1223 | 
             
                return INT2NUM(upb_EnumValueDef_Number(ev));
         | 
| @@ -1100,7 +1236,8 @@ static VALUE EnumDescriptor_lookup_name(VALUE _self, VALUE name) { | |
| 1100 1236 | 
             
            static VALUE EnumDescriptor_lookup_value(VALUE _self, VALUE number) {
         | 
| 1101 1237 | 
             
              EnumDescriptor* self = ruby_to_EnumDescriptor(_self);
         | 
| 1102 1238 | 
             
              int32_t val = NUM2INT(number);
         | 
| 1103 | 
            -
              const upb_EnumValueDef* ev = | 
| 1239 | 
            +
              const upb_EnumValueDef* ev =
         | 
| 1240 | 
            +
                  upb_EnumDef_FindValueByNumber(self->enumdef, val);
         | 
| 1104 1241 | 
             
              if (ev) {
         | 
| 1105 1242 | 
             
                return ID2SYM(rb_intern(upb_EnumValueDef_Name(ev)));
         | 
| 1106 1243 | 
             
              } else {
         | 
| @@ -1138,11 +1275,29 @@ static VALUE EnumDescriptor_each(VALUE _self) { | |
| 1138 1275 | 
             
            static VALUE EnumDescriptor_enummodule(VALUE _self) {
         | 
| 1139 1276 | 
             
              EnumDescriptor* self = ruby_to_EnumDescriptor(_self);
         | 
| 1140 1277 | 
             
              if (self->module == Qnil) {
         | 
| 1141 | 
            -
                self->module  | 
| 1278 | 
            +
                RB_OBJ_WRITE(_self, &self->module, build_module_from_enumdesc(_self));
         | 
| 1142 1279 | 
             
              }
         | 
| 1143 1280 | 
             
              return self->module;
         | 
| 1144 1281 | 
             
            }
         | 
| 1145 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 | 
            +
             | 
| 1146 1301 | 
             
            static void EnumDescriptor_register(VALUE module) {
         | 
| 1147 1302 | 
             
              VALUE klass = rb_define_class_under(module, "EnumDescriptor", rb_cObject);
         | 
| 1148 1303 | 
             
              rb_define_alloc_func(klass, EnumDescriptor_alloc);
         | 
| @@ -1153,11 +1308,305 @@ static void EnumDescriptor_register(VALUE module) { | |
| 1153 1308 | 
             
              rb_define_method(klass, "each", EnumDescriptor_each, 0);
         | 
| 1154 1309 | 
             
              rb_define_method(klass, "enummodule", EnumDescriptor_enummodule, 0);
         | 
| 1155 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);
         | 
| 1156 1313 | 
             
              rb_include_module(klass, rb_mEnumerable);
         | 
| 1157 1314 | 
             
              rb_gc_register_address(&cEnumDescriptor);
         | 
| 1158 1315 | 
             
              cEnumDescriptor = klass;
         | 
| 1159 1316 | 
             
            }
         | 
| 1160 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 | 
            +
             | 
| 1161 1610 | 
             
            static VALUE get_def_obj(VALUE _descriptor_pool, const void* ptr, VALUE klass) {
         | 
| 1162 1611 | 
             
              DescriptorPool* descriptor_pool = ruby_to_DescriptorPool(_descriptor_pool);
         | 
| 1163 1612 | 
             
              VALUE key = ULL2NUM((intptr_t)ptr);
         | 
| @@ -1199,6 +1648,16 @@ static VALUE get_oneofdef_obj(VALUE descriptor_pool, const upb_OneofDef* def) { | |
| 1199 1648 | 
             
              return get_def_obj(descriptor_pool, def, cOneofDescriptor);
         | 
| 1200 1649 | 
             
            }
         | 
| 1201 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 | 
            +
             | 
| 1202 1661 | 
             
            // -----------------------------------------------------------------------------
         | 
| 1203 1662 | 
             
            // Shared functions
         | 
| 1204 1663 | 
             
            // -----------------------------------------------------------------------------
         | 
| @@ -1274,6 +1733,8 @@ void Defs_register(VALUE module) { | |
| 1274 1733 | 
             
              FieldDescriptor_register(module);
         | 
| 1275 1734 | 
             
              OneofDescriptor_register(module);
         | 
| 1276 1735 | 
             
              EnumDescriptor_register(module);
         | 
| 1736 | 
            +
              ServiceDescriptor_register(module);
         | 
| 1737 | 
            +
              MethodDescriptor_register(module);
         | 
| 1277 1738 |  | 
| 1278 1739 | 
             
              rb_gc_register_address(&c_only_cookie);
         | 
| 1279 1740 | 
             
              c_only_cookie = rb_class_new_instance(0, NULL, rb_cObject);
         |