summaryrefslogtreecommitdiff
path: root/src/classlibnative
diff options
context:
space:
mode:
authorJan Kotas <jkotas@microsoft.com>2017-04-27 13:49:10 -0700
committerJan Kotas <jkotas@microsoft.com>2017-04-27 15:39:38 -0700
commit24df2436dfb8cfdbca7d3f9e088234a7c303e6fa (patch)
treeab02730ef622ce69399914722bca5468f601ff9a /src/classlibnative
parent7c57f98183491e431ac3913d5d4b70ea82886c0a (diff)
downloadcoreclr-24df2436dfb8cfdbca7d3f9e088234a7c303e6fa.tar.gz
coreclr-24df2436dfb8cfdbca7d3f9e088234a7c303e6fa.tar.bz2
coreclr-24df2436dfb8cfdbca7d3f9e088234a7c303e6fa.zip
Allow conversions between enum and underlying type
Fixes https://github.com/dotnet/corefx/issues/13816
Diffstat (limited to 'src/classlibnative')
-rw-r--r--src/classlibnative/bcltype/arraynative.cpp24
1 files changed, 10 insertions, 14 deletions
diff --git a/src/classlibnative/bcltype/arraynative.cpp b/src/classlibnative/bcltype/arraynative.cpp
index c54d2f3c31..232f59dfca 100644
--- a/src/classlibnative/bcltype/arraynative.cpp
+++ b/src/classlibnative/bcltype/arraynative.cpp
@@ -319,14 +319,16 @@ ArrayNative::AssignArrayEnum ArrayNative::CanAssignArrayTypeNoGC(const BASEARRAY
return AssignDontKnow;
}
- const CorElementType srcElType = srcTH.GetSignatureCorElementType();
- const CorElementType destElType = destTH.GetSignatureCorElementType();
+ const CorElementType srcElType = srcTH.GetVerifierCorElementType();
+ const CorElementType destElType = destTH.GetVerifierCorElementType();
_ASSERTE(srcElType < ELEMENT_TYPE_MAX);
_ASSERTE(destElType < ELEMENT_TYPE_MAX);
// Copying primitives from one type to another
if (CorTypeInfo::IsPrimitiveType_NoThrow(srcElType) && CorTypeInfo::IsPrimitiveType_NoThrow(destElType))
{
+ if (srcElType == destElType)
+ return AssignWillWork;
if (InvokeUtil::CanPrimitiveWiden(destElType, srcElType))
return AssignPrimitiveWiden;
else
@@ -349,10 +351,6 @@ ArrayNative::AssignArrayEnum ArrayNative::CanAssignArrayTypeNoGC(const BASEARRAY
if (srcTH.IsInterface() && destElType != ELEMENT_TYPE_VALUETYPE)
return AssignMustCast;
- // Enum is stored as a primitive of type dest.
- if (srcTH.IsEnum() && srcTH.GetInternalCorElementType() == destElType)
- return AssignWillWork;
-
return AssignDontKnow;
}
@@ -405,14 +403,16 @@ ArrayNative::AssignArrayEnum ArrayNative::CanAssignArrayType(const BASEARRAYREF
return AssignWrongType;
}
- const CorElementType srcElType = srcTH.GetSignatureCorElementType();
- const CorElementType destElType = destTH.GetSignatureCorElementType();
+ const CorElementType srcElType = srcTH.GetVerifierCorElementType();
+ const CorElementType destElType = destTH.GetVerifierCorElementType();
_ASSERTE(srcElType < ELEMENT_TYPE_MAX);
_ASSERTE(destElType < ELEMENT_TYPE_MAX);
// Copying primitives from one type to another
if (CorTypeInfo::IsPrimitiveType_NoThrow(srcElType) && CorTypeInfo::IsPrimitiveType_NoThrow(destElType))
{
+ if (srcElType == destElType)
+ return AssignWillWork;
if (InvokeUtil::CanPrimitiveWiden(destElType, srcElType))
return AssignPrimitiveWiden;
else
@@ -435,10 +435,6 @@ ArrayNative::AssignArrayEnum ArrayNative::CanAssignArrayType(const BASEARRAYREF
if (srcTH.IsInterface() && destElType != ELEMENT_TYPE_VALUETYPE)
return AssignMustCast;
- // Enum is stored as a primitive of type dest.
- if (srcTH.IsEnum() && srcTH.GetInternalCorElementType() == destElType)
- return AssignWillWork;
-
return AssignWrongType;
}
@@ -631,8 +627,8 @@ void ArrayNative::PrimitiveWiden(BASEARRAYREF pSrc, unsigned int srcIndex, BASEA
TypeHandle srcTH = pSrc->GetArrayElementTypeHandle();
TypeHandle destTH = pDest->GetArrayElementTypeHandle();
- const CorElementType srcElType = srcTH.GetSignatureCorElementType();
- const CorElementType destElType = destTH.GetSignatureCorElementType();
+ const CorElementType srcElType = srcTH.GetVerifierCorElementType();
+ const CorElementType destElType = destTH.GetVerifierCorElementType();
const unsigned int srcSize = GetSizeForCorElementType(srcElType);
const unsigned int destSize = GetSizeForCorElementType(destElType);