// // This is a port of InvokeUtil::CanPrimitiveWiden() in the desktop runtime. This is used by various apis such as Array.SetValue() // and Delegate.DynamicInvoke() which allow value-preserving widenings from one primitive type to another. // public bool CanWidenTo(RuntimeImports.RhCorElementType targetElementType) { // Caller expected to ensure that both sides are primitive before calling us. Debug.Assert(this.IsPrimitive); Debug.Assert(GetRhCorElementTypeInfo(targetElementType).IsPrimitive); // Once we've asserted that the target is a primitive, we can also assert that it is >= ET_BOOLEAN. Debug.Assert(targetElementType >= RuntimeImports.RhCorElementType.ELEMENT_TYPE_BOOLEAN); byte targetElementTypeAsByte = (byte)targetElementType; ushort mask = (ushort)(1 << targetElementTypeAsByte); // This is expected to overflow on larger ET_I and ET_U - this is ok and anticipated. if (0 != (_widenMask & mask)) return true; return false; }
internal static RhCorElementTypeInfo GetRhCorElementTypeInfo(RuntimeImports.RhCorElementType elementType) { // The _lookupTable array only covers a subset of RhCorElementTypes, so we return a default // info when someone asks for an elementType which does not have an entry in the table. if ((int)elementType > s_lookupTable.Length) return default(RhCorElementTypeInfo); return s_lookupTable[(int)elementType]; }
internal static RhCorElementTypeInfo GetRhCorElementTypeInfo(RuntimeImports.RhCorElementType elementType) { return RhCorElementTypeInfo.GetRhCorElementTypeInfo(elementType); }