|
@@ -659,14 +659,14 @@ public class RubyMessage extends RubyObject {
|
|
|
} else {
|
|
|
Descriptors.FieldDescriptor.Type fieldType = fieldDescriptor.getType();
|
|
|
IRubyObject typeClass = context.runtime.getObject();
|
|
|
+ boolean addValue = true;
|
|
|
if (fieldType == Descriptors.FieldDescriptor.Type.MESSAGE) {
|
|
|
typeClass = ((RubyDescriptor) getDescriptorForField(context, fieldDescriptor)).msgclass(context);
|
|
|
+ if (value.isNil()){
|
|
|
+ addValue = false;
|
|
|
+ }
|
|
|
} else if (fieldType == Descriptors.FieldDescriptor.Type.ENUM) {
|
|
|
typeClass = ((RubyEnumDescriptor) getDescriptorForField(context, fieldDescriptor)).enummodule(context);
|
|
|
- }
|
|
|
- Utils.checkType(context, fieldType, value, (RubyModule) typeClass);
|
|
|
- // Convert integer enum to symbol
|
|
|
- if (fieldType == Descriptors.FieldDescriptor.Type.ENUM) {
|
|
|
Descriptors.EnumDescriptor enumDescriptor = fieldDescriptor.getEnumType();
|
|
|
if (Utils.isRubyNum(value)) {
|
|
|
Descriptors.EnumValueDescriptor val =
|
|
@@ -674,7 +674,12 @@ public class RubyMessage extends RubyObject {
|
|
|
if (val.getIndex() != -1) value = context.runtime.newSymbol(val.getName());
|
|
|
}
|
|
|
}
|
|
|
- this.fields.put(fieldDescriptor, value);
|
|
|
+ if (addValue) {
|
|
|
+ Utils.checkType(context, fieldType, value, (RubyModule) typeClass);
|
|
|
+ this.fields.put(fieldDescriptor, value);
|
|
|
+ } else {
|
|
|
+ this.fields.remove(fieldDescriptor);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
return context.runtime.getNil();
|