if ((fa & FieldAttributes.Literal) != 0) {
Constant c = field_type.Kind == MemberKind.MissingType ?
new NullConstant (InternalType.ErrorType, Location.Null) :
- Constant.CreateConstantFromValue (field_type, fi.GetRawConstantValue (), Location.Null);
+ CreateConstantFromValue (field_type, fi);
return new ConstSpec (declaringType, definition, field_type, fi, mod, c);
}
return new FieldSpec (declaringType, definition, field_type, fi, mod);
}
+ Constant CreateConstantFromValue (TypeSpec fieldType, FieldInfo fi)
+ {
+ var value = fi.GetRawConstantValue ();
+ //
+ // Metadata value can be encoded using different constant value type
+ // than is actual field type
+ //
+ // e.g. unsigned int16 CONSTANT = int16 (0x0000ffff)
+ //
+ if (value != null && !fieldType.IsEnum) {
+ var c = ImportConstant (value);
+ if (c != null) {
+ return fieldType == c.Type ? c : c.ConvertExplicitly (false, fieldType);
+ }
+ }
+
+ return Constant.CreateConstantFromValue (fieldType, value, Location.Null);
+ }
+
public EventSpec CreateEvent (EventInfo ei, TypeSpec declaringType, MethodSpec add, MethodSpec remove)
{
add.IsAccessor = true;
if (value == null) {
default_value = Constant.CreateConstantFromValue (ptype, null, Location.Null);
} else {
- default_value = ImportParameterConstant (value);
+ default_value = ImportConstant (value);
if (ptype.IsEnum) {
default_value = new EnumConstant ((Constant) default_value, ptype);
} else if (value == null) {
default_value = new DefaultValueExpression (new TypeExpression (ptype, Location.Null), Location.Null);
} else if (ptype.BuiltinType == BuiltinTypeSpec.Type.Decimal) {
- default_value = ImportParameterConstant (value);
+ default_value = ImportConstant (value);
}
}
}
spec.TypeArguments = tparams.ToArray ();
}
- Constant ImportParameterConstant (object value)
+ Constant ImportConstant (object value)
{
//
// Get type of underlying value as int constant can be used for object
</method>\r
</type>\r
</test>\r
+ <test name="test-912.cs">\r
+ <type name="Bar">\r
+ <method name="Int32 Main()" attrs="150">\r
+ <size>20</size>\r
+ </method>\r
+ <method name="Void .ctor()" attrs="6278">\r
+ <size>7</size>\r
+ </method>\r
+ </type>\r
+ </test>\r
<test name="test-92.cs">\r
<type name="Outer">\r
<method name="Void .ctor()" attrs="6278">\r
</method>\r
</type>\r
</test>\r
+ <test name="test-anon-173.cs">\r
+ <type name="MainClass">\r
+ <method name="Void Main()" attrs="150">\r
+ <size>36</size>\r
+ </method>\r
+ <method name="Void SomeMethod(System.Action)" attrs="145">\r
+ <size>2</size>\r
+ </method>\r
+ <method name="Void <Main>m__0()" attrs="145">\r
+ <size>36</size>\r
+ </method>\r
+ <method name="Int32 <Main>m__1(Int32)" attrs="145">\r
+ <size>9</size>\r
+ </method>\r
+ <method name="Void .ctor()" attrs="6278">\r
+ <size>7</size>\r
+ </method>\r
+ </type>\r
+ </test>\r
<test name="test-anon-18.cs">\r
<type name="A">\r
<method name="Void Invoke()" attrs="454">\r