diff options
author | Josh Haberman <jhaberman@gmail.com> | 2016-05-18 15:39:29 -0700 |
---|---|---|
committer | Josh Haberman <jhaberman@gmail.com> | 2016-05-18 15:39:29 -0700 |
commit | 2d514ce2d8b1f5fb00c6031a1a8e4dab968e4927 (patch) | |
tree | 3fcda3102a191c257fcefefede684f87d9507d56 /ruby/ext/google/protobuf_c/storage.c | |
parent | 545527e8cfedc43dc6b862af23691affcb1285f7 (diff) | |
download | protobuf-2d514ce2d8b1f5fb00c6031a1a8e4dab968e4927.tar.gz protobuf-2d514ce2d8b1f5fb00c6031a1a8e4dab968e4927.tar.bz2 protobuf-2d514ce2d8b1f5fb00c6031a1a8e4dab968e4927.zip |
Fixed oneof behavior for enums and fixed JRuby.
Diffstat (limited to 'ruby/ext/google/protobuf_c/storage.c')
-rw-r--r-- | ruby/ext/google/protobuf_c/storage.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/ruby/ext/google/protobuf_c/storage.c b/ruby/ext/google/protobuf_c/storage.c index 5dae5aec..1c839781 100644 --- a/ruby/ext/google/protobuf_c/storage.c +++ b/ruby/ext/google/protobuf_c/storage.c @@ -57,14 +57,23 @@ size_t native_slot_size(upb_fieldtype_t type) { } } -VALUE value_from_default(const upb_fielddef *field) { +static VALUE value_from_default(const upb_fielddef *field) { switch (upb_fielddef_type(field)) { case UPB_TYPE_FLOAT: return DBL2NUM(upb_fielddef_defaultfloat(field)); case UPB_TYPE_DOUBLE: return DBL2NUM(upb_fielddef_defaultdouble(field)); case UPB_TYPE_BOOL: return upb_fielddef_defaultbool(field) ? Qtrue : Qfalse; case UPB_TYPE_MESSAGE: return Qnil; - case UPB_TYPE_ENUM: return INT2NUM(upb_fielddef_defaultint32(field)); + case UPB_TYPE_ENUM: { + const upb_enumdef *enumdef = upb_fielddef_enumsubdef(field); + int32_t num = upb_fielddef_defaultint32(field); + const char *label = upb_enumdef_iton(enumdef, num); + if (label) { + return ID2SYM(rb_intern(label)); + } else { + return INT2NUM(num); + } + } case UPB_TYPE_INT32: return INT2NUM(upb_fielddef_defaultint32(field)); case UPB_TYPE_INT64: return LL2NUM(upb_fielddef_defaultint64(field));; case UPB_TYPE_UINT32: return UINT2NUM(upb_fielddef_defaultuint32(field)); |