diff options
author | Jan Kotas <jkotas@microsoft.com> | 2017-04-27 13:49:10 -0700 |
---|---|---|
committer | Jan Kotas <jkotas@microsoft.com> | 2017-04-27 15:39:38 -0700 |
commit | 24df2436dfb8cfdbca7d3f9e088234a7c303e6fa (patch) | |
tree | ab02730ef622ce69399914722bca5468f601ff9a /src/classlibnative | |
parent | 7c57f98183491e431ac3913d5d4b70ea82886c0a (diff) | |
download | coreclr-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.cpp | 24 |
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); |