|  | @@ -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);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 |