|
@@ -64,8 +64,8 @@ public class Utils {
|
|
return context.runtime.newSymbol(typeName.replace("TYPE_", "").toLowerCase());
|
|
return context.runtime.newSymbol(typeName.replace("TYPE_", "").toLowerCase());
|
|
}
|
|
}
|
|
|
|
|
|
- public static void checkType(ThreadContext context, Descriptors.FieldDescriptor.Type fieldType,
|
|
|
|
- IRubyObject value, RubyModule typeClass) {
|
|
|
|
|
|
+ public static IRubyObject checkType(ThreadContext context, Descriptors.FieldDescriptor.Type fieldType,
|
|
|
|
+ IRubyObject value, RubyModule typeClass) {
|
|
Ruby runtime = context.runtime;
|
|
Ruby runtime = context.runtime;
|
|
Object val;
|
|
Object val;
|
|
switch(fieldType) {
|
|
switch(fieldType) {
|
|
@@ -106,7 +106,7 @@ public class Utils {
|
|
break;
|
|
break;
|
|
case BYTES:
|
|
case BYTES:
|
|
case STRING:
|
|
case STRING:
|
|
- validateStringEncoding(context.runtime, fieldType, value);
|
|
|
|
|
|
+ value = validateStringEncoding(context, fieldType, value);
|
|
break;
|
|
break;
|
|
case MESSAGE:
|
|
case MESSAGE:
|
|
if (value.getMetaClass() != typeClass) {
|
|
if (value.getMetaClass() != typeClass) {
|
|
@@ -127,6 +127,7 @@ public class Utils {
|
|
default:
|
|
default:
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
+ return value;
|
|
}
|
|
}
|
|
|
|
|
|
public static IRubyObject wrapPrimaryValue(ThreadContext context, Descriptors.FieldDescriptor.Type fieldType, Object value) {
|
|
public static IRubyObject wrapPrimaryValue(ThreadContext context, Descriptors.FieldDescriptor.Type fieldType, Object value) {
|
|
@@ -148,10 +149,16 @@ public class Utils {
|
|
return runtime.newFloat((Double) value);
|
|
return runtime.newFloat((Double) value);
|
|
case BOOL:
|
|
case BOOL:
|
|
return (Boolean) value ? runtime.getTrue() : runtime.getFalse();
|
|
return (Boolean) value ? runtime.getTrue() : runtime.getFalse();
|
|
- case BYTES:
|
|
|
|
- return runtime.newString(((ByteString) value).toStringUtf8());
|
|
|
|
- case STRING:
|
|
|
|
- return runtime.newString(value.toString());
|
|
|
|
|
|
+ case BYTES: {
|
|
|
|
+ IRubyObject wrapped = runtime.newString(((ByteString) value).toStringUtf8());
|
|
|
|
+ wrapped.setFrozen(true);
|
|
|
|
+ return wrapped;
|
|
|
|
+ }
|
|
|
|
+ case STRING: {
|
|
|
|
+ IRubyObject wrapped = runtime.newString(value.toString());
|
|
|
|
+ wrapped.setFrozen(true);
|
|
|
|
+ return wrapped;
|
|
|
|
+ }
|
|
default:
|
|
default:
|
|
return runtime.getNil();
|
|
return runtime.getNil();
|
|
}
|
|
}
|
|
@@ -180,25 +187,21 @@ public class Utils {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- public static void validateStringEncoding(Ruby runtime, Descriptors.FieldDescriptor.Type type, IRubyObject value) {
|
|
|
|
|
|
+ public static IRubyObject validateStringEncoding(ThreadContext context, Descriptors.FieldDescriptor.Type type, IRubyObject value) {
|
|
if (!(value instanceof RubyString))
|
|
if (!(value instanceof RubyString))
|
|
- throw runtime.newTypeError("Invalid argument for string field.");
|
|
|
|
- Encoding encoding = ((RubyString) value).getEncoding();
|
|
|
|
|
|
+ throw context.runtime.newTypeError("Invalid argument for string field.");
|
|
switch(type) {
|
|
switch(type) {
|
|
case BYTES:
|
|
case BYTES:
|
|
- if (encoding != ASCIIEncoding.INSTANCE)
|
|
|
|
- throw runtime.newTypeError("Encoding for bytes fields" +
|
|
|
|
- " must be \"ASCII-8BIT\", but was " + encoding);
|
|
|
|
|
|
+ value = ((RubyString)value).encode(context, context.runtime.evalScriptlet("Encoding::ASCII_8BIT"));
|
|
break;
|
|
break;
|
|
case STRING:
|
|
case STRING:
|
|
- if (encoding != UTF8Encoding.INSTANCE
|
|
|
|
- && encoding != USASCIIEncoding.INSTANCE)
|
|
|
|
- throw runtime.newTypeError("Encoding for string fields" +
|
|
|
|
- " must be \"UTF-8\" or \"ASCII\", but was " + encoding);
|
|
|
|
|
|
+ value = ((RubyString)value).encode(context, context.runtime.evalScriptlet("Encoding::UTF_8"));
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
+ value.setFrozen(true);
|
|
|
|
+ return value;
|
|
}
|
|
}
|
|
|
|
|
|
public static void checkNameAvailability(ThreadContext context, String name) {
|
|
public static void checkNameAvailability(ThreadContext context, String name) {
|