Bugfix for GC mark of oneof fields.
diff --git a/ruby/ext/google/protobuf_c/encode_decode.c b/ruby/ext/google/protobuf_c/encode_decode.c index f4d3de2..ad3d554 100644 --- a/ruby/ext/google/protobuf_c/encode_decode.c +++ b/ruby/ext/google/protobuf_c/encode_decode.c
@@ -155,6 +155,9 @@ // create a separate ID space. In addition, using the field tag number here // lets us easily look up the field in the oneof accessor. hd->oneof_case_num = upb_fielddef_number(f); + if (is_value_field(f)) { + hd->oneof_case_num |= ONEOF_CASE_MASK; + } hd->subklass = field_type_class(desc->layout, f); upb_handlers_addcleanup(h, hd, xfree); return hd;
diff --git a/ruby/ext/google/protobuf_c/protobuf.h b/ruby/ext/google/protobuf_c/protobuf.h index 0925185..b8aed5a 100644 --- a/ruby/ext/google/protobuf_c/protobuf.h +++ b/ruby/ext/google/protobuf_c/protobuf.h
@@ -370,6 +370,7 @@ void native_slot_check_int_range_precision(const char* name, upb_fieldtype_t type, VALUE value); uint32_t slot_read_oneof_case(MessageLayout* layout, const void* storage, const upb_oneofdef* oneof); +bool is_value_field(const upb_fielddef* f); extern rb_encoding* kRubyStringUtf8Encoding; extern rb_encoding* kRubyStringASCIIEncoding;
diff --git a/ruby/ext/google/protobuf_c/storage.c b/ruby/ext/google/protobuf_c/storage.c index 25628ed..e72fa10 100644 --- a/ruby/ext/google/protobuf_c/storage.c +++ b/ruby/ext/google/protobuf_c/storage.c
@@ -473,7 +473,7 @@ return (offset + granularity - 1) & ~(granularity - 1); } -static bool is_value_field(const upb_fielddef* f) { +bool is_value_field(const upb_fielddef* f) { return upb_fielddef_isseq(f) || upb_fielddef_issubmsg(f) || upb_fielddef_isstring(f); }