diff options
author | Josh Haberman <jhaberman@gmail.com> | 2016-04-22 14:11:39 -0700 |
---|---|---|
committer | Josh Haberman <jhaberman@gmail.com> | 2016-04-22 14:12:10 -0700 |
commit | d419ca10b4521e87d0be62f6df4ede97d63c7ee2 (patch) | |
tree | 4da6a8beebd8d2d94497465f5e4b80a89490fb5a /ruby/ext/google/protobuf_c/message.c | |
parent | 40574479978f80bd86caf44edae5b0a22d596c79 (diff) | |
download | protobuf-d419ca10b4521e87d0be62f6df4ede97d63c7ee2.tar.gz protobuf-d419ca10b4521e87d0be62f6df4ede97d63c7ee2.tar.bz2 protobuf-d419ca10b4521e87d0be62f6df4ede97d63c7ee2.zip |
Updated upb and simplified ruby code a bit with new upb method.
Diffstat (limited to 'ruby/ext/google/protobuf_c/message.c')
-rw-r--r-- | ruby/ext/google/protobuf_c/message.c | 38 |
1 files changed, 18 insertions, 20 deletions
diff --git a/ruby/ext/google/protobuf_c/message.c b/ruby/ext/google/protobuf_c/message.c index 3a51fe47..e16250f3 100644 --- a/ruby/ext/google/protobuf_c/message.c +++ b/ruby/ext/google/protobuf_c/message.c @@ -151,32 +151,30 @@ VALUE Message_method_missing(int argc, VALUE* argv, VALUE _self) { name_len--; } - // Check for a oneof name first. - o = upb_msgdef_ntoo(self->descriptor->msgdef, - name, name_len); + // See if this name corresponds to either a oneof or field in this message. + if (!upb_msgdef_lookupname(self->descriptor->msgdef, name, name_len, &f, + &o)) { + return rb_call_super(argc, argv); + } + if (o != NULL) { + // This is a oneof -- return which field inside the oneof is set. if (setter) { rb_raise(rb_eRuntimeError, "Oneof accessors are read-only."); } return which_oneof_field(self, o); - } - - // Otherwise, check for a field with that name. - f = upb_msgdef_ntof(self->descriptor->msgdef, - name, name_len); - - if (f == NULL) { - return rb_call_super(argc, argv); - } - - if (setter) { - if (argc < 2) { - rb_raise(rb_eArgError, "No value provided to setter."); - } - layout_set(self->descriptor->layout, Message_data(self), f, argv[1]); - return Qnil; } else { - return layout_get(self->descriptor->layout, Message_data(self), f); + // This is a field -- get or set the field's value. + assert(f); + if (setter) { + if (argc < 2) { + rb_raise(rb_eArgError, "No value provided to setter."); + } + layout_set(self->descriptor->layout, Message_data(self), f, argv[1]); + return Qnil; + } else { + return layout_get(self->descriptor->layout, Message_data(self), f); + } } } |