private void ScanArrayType(QueuedArrayType aArrayType, EcmaCil.ArrayTypeMeta aArrayMeta) { aArrayMeta.Dimensions = aArrayType.ArrayType.GetArrayRank(); // todo: fix? // foreach (ArrayDimension xDimension in aType.ArrayType.Dimensions) //{ // if (xDimension.LowerBound != 0 || xDimension.UpperBound != 0) // { // throw new Exception("Arrays with limited dimensions not supported"); // } //} if (aArrayType.ArrayType.GetArrayRank() != 1) { throw new Exception("Multidimensional arrays not yet supported!"); } #if DEBUG var xSB = new StringBuilder(); xSB.Append(aArrayMeta.ElementType.ToString()); xSB.Append("["); xSB.Append(new String(',', aArrayMeta.Dimensions - 1)); xSB.Append("]"); aArrayMeta.Data[EcmaCil.DataIds.DebugMetaId] = xSB.ToString(); #endif }
private EcmaCil.TypeMeta EnqueueType(Type aTypeRef, object aSource, string aSourceType) { if (mLogEnabled) { LogMapPoint(aSource, aSourceType, aTypeRef); } List <Type> xTypeArgs = null; if (aTypeRef.IsArray) { var xQueuedArrayType = new QueuedArrayType(aTypeRef); EcmaCil.ArrayTypeMeta xArrayMeta; if (mArrayTypes.TryGetValue(xQueuedArrayType, out xArrayMeta)) { return(xArrayMeta); } var xElemMeta = EnqueueType(aTypeRef.GetElementType(), aTypeRef, "Array element type"); xArrayMeta = new EcmaCil.ArrayTypeMeta { ElementType = xElemMeta }; mArrayTypes.Add(xQueuedArrayType, xArrayMeta); mQueue.Enqueue(xQueuedArrayType); return(xArrayMeta); } if (aTypeRef.IsPointer) { var xQueuedPointerType = new QueuedPointerType(aTypeRef); EcmaCil.PointerTypeMeta xPointerMeta; if (mPointerTypes.TryGetValue(xQueuedPointerType, out xPointerMeta)) { return(xPointerMeta); } var xElemMeta = EnqueueType(aTypeRef.GetElementType(), aTypeRef, "Array element type"); xPointerMeta = new EcmaCil.PointerTypeMeta { ElementType = xElemMeta }; mPointerTypes.Add(xQueuedPointerType, xPointerMeta); mQueue.Enqueue(xQueuedPointerType); return(xPointerMeta); } if (aTypeRef.IsGenericType) { xTypeArgs = new List <Type>(aTypeRef.GetGenericArguments()); } var xQueuedType = new QueuedType(aTypeRef, (xTypeArgs == null ? null : xTypeArgs.ToArray())); EcmaCil.TypeMeta xTypeMeta; if (mTypes.TryGetValue(xQueuedType, out xTypeMeta)) { return(xTypeMeta); } xTypeMeta = new EcmaCil.TypeMeta(); mTypeMetaToType.Add(xTypeMeta, aTypeRef); if (aTypeRef.BaseType != null) { xTypeMeta.BaseType = EnqueueType(aTypeRef.BaseType, aTypeRef, "Base type"); } mTypes.Add(xQueuedType, xTypeMeta); mQueue.Enqueue(xQueuedType); return(xTypeMeta); }