aboutsummaryrefslogtreecommitdiff
path: root/ruby/ext/google/protobuf_c/message.c
diff options
context:
space:
mode:
authorJisi Liu <jisi.liu@gmail.com>2016-04-28 14:43:08 -0700
committerJisi Liu <jisi.liu@gmail.com>2016-04-28 14:43:08 -0700
commit12fdeb9b41cb5ce2a13a6f10f0626d6e67e9f237 (patch)
tree82b9820ae26decd6ac41bd8a06185d978980ee3c /ruby/ext/google/protobuf_c/message.c
parentcf14183bcd5485b4a71541599ddce0b35eb71352 (diff)
parentb53417c7356deab70f44b60bd7e6270023ddc3b6 (diff)
downloadprotobuf-12fdeb9b41cb5ce2a13a6f10f0626d6e67e9f237.tar.gz
protobuf-12fdeb9b41cb5ce2a13a6f10f0626d6e67e9f237.tar.bz2
protobuf-12fdeb9b41cb5ce2a13a6f10f0626d6e67e9f237.zip
Merge branch 'master' of github.com:google/protobuf
Diffstat (limited to 'ruby/ext/google/protobuf_c/message.c')
-rw-r--r--ruby/ext/google/protobuf_c/message.c38
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);
+ }
}
}