/// <summary> /// Resolves the type. /// </summary> /// <param name="type">The type.</param> private void ResolveType(MosaType type) { if (type.IsModule) { return; } if (type.BaseType == null && !type.IsInterface && type.FullName != "System.Object") // ghost types like generic params, function ptr, etc. { return; } if (type.Modifier != null) // For types having modifiers, resolve the element type instead. { ResolveType(type.ElementType); return; } if (resolvedTypes.Contains(type)) { return; } resolvedTypes.Add(type); if (type.BaseType != null) { ResolveType(type.BaseType); Addchildren(type.BaseType, type); } if (type.IsInterface) { ResolveInterfaceType(type); CreateMethodTable(type); return; } foreach (var interfaceType in type.Interfaces) { ResolveInterfaceType(interfaceType); } if (type.GetPrimitiveSize(NativePointerSize) != null) { typeSizes[type] = type.GetPrimitiveSize(NativePointerSize).Value; } else if (type.IsExplicitLayout) { ComputeExplicitLayout(type); } else { ComputeSequentialLayout(type); } CreateMethodTable(type); }
/// <summary> /// Determines whether [is compound type] [the specified type]. /// </summary> /// <param name="type">The type.</param> /// <returns> /// <c>true</c> if [is compound type] [the specified type]; otherwise, <c>false</c>. /// </returns> public bool IsCompoundType(MosaType type) { // i.e. whether copying of the type requires multiple move int?primitiveSize = type.GetPrimitiveSize(NativePointerSize); if (primitiveSize != null && primitiveSize > 8) { return(true); } if (!type.IsUserValueType) { return(false); } int typeSize = GetTypeSize(type); return(typeSize > NativePointerSize); }
public bool IsCompoundType(MosaType type) { // i.e. whether copying of the type requires multiple move int? primitiveSize = type.GetPrimitiveSize(nativePointerSize); if (primitiveSize != null && primitiveSize > 8) return true; if (!type.IsUserValueType) return false; int typeSize = GetTypeSize(type); if (typeSize > nativePointerSize) return true; return false; }
private void ResolveType(MosaType type) { if (type.IsModule) return; if (type.HasOpenGenericParams) return; if (type.BaseType == null && !type.IsInterface && type.FullName != "System.Object") // ghost types like generic params, function ptr, etc. return; if (typeSet.Contains(type)) return; typeSet.Add(type); if (type.BaseType != null) { ResolveType(type.BaseType); } if (type.IsInterface) { ResolveInterfaceType(type); CreateMethodTable(type); return; } foreach (MosaType interfaceType in type.Interfaces) { ResolveInterfaceType(interfaceType); } int? size = type.GetPrimitiveSize((int)nativePointerSize); if (size != null) { typeSizes[type] = size.Value; } else if (type.IsExplicitLayout) { ComputeExplicitLayout(type); } else { ComputeSequentialLayout(type); } CreateMethodTable(type); }
private void ResolveType(MosaType type) { if (type.IsModule) return; if (type.BaseType == null && !type.IsInterface && type.FullName != "System.Object") // ghost types like generic params, function ptr, etc. return; if (type.Modifier != null) // For types having modifiers, resolve the element type instead. { ResolveType(type.ElementType); return; } // FIXME: This is not threadsafe!!!!! if (typeSet.Contains(type)) return; typeSet.Add(type); if (type.BaseType != null) { ResolveType(type.BaseType); } if (type.IsInterface) { ResolveInterfaceType(type); CreateMethodTable(type); return; } foreach (var interfaceType in type.Interfaces) { ResolveInterfaceType(interfaceType); } int? size = type.GetPrimitiveSize(NativePointerSize); if (size != null) { typeSizes[type] = size.Value; } else if (type.IsExplicitLayout) { ComputeExplicitLayout(type); } else { ComputeSequentialLayout(type); } CreateMethodTable(type); }