|
|
|
@ -86,14 +86,14 @@ public class RubyMessage extends RubyObject { |
|
|
|
|
|
|
|
|
|
if (Utils.isMapEntry(fieldDescriptor)) { |
|
|
|
|
if (!(value instanceof RubyHash)) |
|
|
|
|
throw runtime.newArgumentError("Expected Hash object as initializer value for map field."); |
|
|
|
|
throw runtime.newArgumentError("Expected Hash object as initializer value for map field '" + key.asJavaString() + "'."); |
|
|
|
|
|
|
|
|
|
final RubyMap map = newMapForField(context, fieldDescriptor); |
|
|
|
|
map.mergeIntoSelf(context, value); |
|
|
|
|
maps.put(fieldDescriptor, map); |
|
|
|
|
} else if (fieldDescriptor.isRepeated()) { |
|
|
|
|
if (!(value instanceof RubyArray)) |
|
|
|
|
throw runtime.newTypeError("Expected array as initializer var for repeated field."); |
|
|
|
|
throw runtime.newArgumentError("Expected array as initializer value for repeated field '" + key.asJavaString() + "'."); |
|
|
|
|
RubyRepeatedField repeatedField = rubyToRepeatedField(context, fieldDescriptor, value); |
|
|
|
|
addRepeatedField(fieldDescriptor, repeatedField); |
|
|
|
|
} else { |
|
|
|
@ -217,6 +217,9 @@ public class RubyMessage extends RubyObject { |
|
|
|
|
RubyDescriptor rubyDescriptor = (RubyDescriptor) getDescriptor(context, metaClass); |
|
|
|
|
IRubyObject oneofDescriptor = rubyDescriptor.lookupOneof(context, args[0]); |
|
|
|
|
if (oneofDescriptor.isNil()) { |
|
|
|
|
if (!hasField(args[0])) { |
|
|
|
|
return Helpers.invokeSuper(context, this, metaClass, "method_missing", args, Block.NULL_BLOCK); |
|
|
|
|
} |
|
|
|
|
return index(context, args[0]); |
|
|
|
|
} |
|
|
|
|
RubyOneofDescriptor rubyOneofDescriptor = (RubyOneofDescriptor) oneofDescriptor; |
|
|
|
@ -233,6 +236,10 @@ public class RubyMessage extends RubyObject { |
|
|
|
|
if (field.end_with_p(context, equalSign).isTrue()) { |
|
|
|
|
field.chomp_bang(context, equalSign); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!hasField(field)) { |
|
|
|
|
return Helpers.invokeSuper(context, this, metaClass, "method_missing", args, Block.NULL_BLOCK); |
|
|
|
|
} |
|
|
|
|
return indexSet(context, field, args[1]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -435,6 +442,11 @@ public class RubyMessage extends RubyObject { |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private boolean hasField(IRubyObject fieldName) { |
|
|
|
|
String nameStr = fieldName.asJavaString(); |
|
|
|
|
return this.descriptor.findFieldByName(Utils.escapeIdentifier(nameStr)) != null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void checkRepeatedFieldType(ThreadContext context, IRubyObject value, |
|
|
|
|
Descriptors.FieldDescriptor fieldDescriptor) { |
|
|
|
|
Ruby runtime = context.runtime; |
|
|
|
|