示例#1
0
文件: McgModule.cs 项目: tmds/corert
        /// <summary>
        /// Finds McgStructMarshalData for a struct if it is defined in this module
        /// </summary>
        /// <param name="structTypeHandle">TypeHandle for the safe struct</param>
        /// <param name="structMarshalData">McgStructMarshalData for the struct</param>
        /// <returns>True if the struct marshal data is available in this module</returns>
        internal bool TryGetStructMarshalData(RuntimeTypeHandle structTypeHandle, out McgStructMarshalData structMarshalData)
        {
            structMarshalData = default(McgStructMarshalData);

            if (m_structMarshalData == null)
            {
                return(false);
            }

            for (int i = 0; i < m_structMarshalData.Length; i++)
            {
                if (structTypeHandle.Equals(m_structMarshalData[i].SafeStructType))
                {
                    if (m_structMarshalData[i].HasInvalidLayout)
                    {
                        throw new ArgumentException(SR.Format(SR.Argument_MustHaveLayoutOrBeBlittable, structTypeHandle.GetDisplayName()));
                    }

                    structMarshalData = m_structMarshalData[i];

                    return(true);
                }
            }

            return(false);
        }
示例#2
0
文件: McgModule.cs 项目: tmds/corert
        /// <summary>
        /// Try to get offset data according to McgStructMarshalData's FieldOffsetStartIndex/NumOfFields
        /// </summary>
        /// <param name="structMarshalData">The Struct Marshal Data</param>
        /// <param name="fieldName">Name of field</param>
        /// <param name="offset">offset in bytes</param>
        /// <returns>if the offset value exists, return true; else return false </returns>
        internal bool TryGetStructFieldOffset(McgStructMarshalData structMarshalData, string fieldName, out uint offset)
        {
            // Try to find its field in map
            if (m_unsafeStructFieldNameMap != null)
            {
                int start = structMarshalData.FieldOffsetStartIndex;
                int count = structMarshalData.NumOfFields;

                for (int i = start; i < start + count; i++)
                {
                    if (fieldName == m_unsafeStructFieldNameMap.GetString(i))
                    {
                        offset = m_unsafeStructOffsetData[i].Offset;
                        return(true);
                    }
                }
            }

            // Couldn't find its field
            offset = 0;
            return(false);
        }
示例#3
0
        internal static bool TryGetStructMarshalData(RuntimeTypeHandle structureTypeHandle, out McgStructMarshalData structMarshalData)
        {
            for (int i = 0; i < s_moduleCount; i++)
            {
                if (s_modules[i].TryGetStructMarshalData(structureTypeHandle, out structMarshalData))
                {
                    return(true);
                }
            }

            structMarshalData = default(McgStructMarshalData);
            return(false);
        }