private void ScanType(QueuedType aType, EcmaCil.TypeMeta aTypeMeta) { #if DEBUG var xSB = new StringBuilder(); xSB.Append(aType.Type.ToString()); if (aType.Args.Length > 0) { xSB.Append("<"); for (int i = 0; i < aType.Args.Length; i++) { xSB.Append(aType.Args[i].ToString()); if (i < (aType.Args.Length - 1)) { xSB.Append(", "); } } xSB.Append(">"); } aTypeMeta.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); }