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(TypeReference aTypeRef, object aSource, string aSourceType) { if (mLogEnabled) { LogMapPoint(aSource, aSourceType, aTypeRef); } List <TypeReference> xTypeArgs = null; TypeDefinition xTypeDef; var xArrayType = aTypeRef as ArrayType; if (xArrayType != null) { var xQueuedArrayType = new QueuedArrayType(xArrayType); EcmaCil.ArrayTypeMeta xArrayMeta; if (mArrayTypes.TryGetValue(xQueuedArrayType, out xArrayMeta)) { return(xArrayMeta); } var xElemMeta = EnqueueType(xQueuedArrayType.ArrayType.ElementType, aTypeRef, "Array element type"); xArrayMeta = new EcmaCil.ArrayTypeMeta { ElementType = xElemMeta }; mArrayTypes.Add(xQueuedArrayType, xArrayMeta); mQueue.Enqueue(xQueuedArrayType); return(xArrayMeta); } var xPointerType = aTypeRef as PointerType; if (xPointerType != null) { var xQueuedPointerType = new QueuedPointerType(xPointerType); EcmaCil.PointerTypeMeta xPointerMeta; if (mPointerTypes.TryGetValue(xQueuedPointerType, out xPointerMeta)) { return(xPointerMeta); } var xElemMeta = EnqueueType(xQueuedPointerType.PointerType.ElementType, aTypeRef, "Array element type"); xPointerMeta = new EcmaCil.PointerTypeMeta { ElementType = xElemMeta }; mPointerTypes.Add(xQueuedPointerType, xPointerMeta); mQueue.Enqueue(xQueuedPointerType); return(xPointerMeta); } var xGenSpec = aTypeRef as GenericInstanceType; if (xGenSpec != null) { xTypeDef = ResolveType(xGenSpec.ElementType); xTypeArgs = new List <TypeReference>(); foreach (TypeReference xArg in xGenSpec.GenericArguments) { xTypeArgs.Add(xArg); } } else { xTypeDef = ResolveType(aTypeRef); } var xQueuedType = new QueuedType(xTypeDef, (xTypeArgs == null ? null : xTypeArgs.ToArray())); EcmaCil.TypeMeta xTypeMeta; if (mTypes.TryGetValue(xQueuedType, out xTypeMeta)) { return(xTypeMeta); } xTypeMeta = new EcmaCil.TypeMeta(); if (xTypeDef.BaseType != null) { xTypeMeta.BaseType = EnqueueType(xTypeDef.BaseType, aTypeRef, "Base type"); } mTypes.Add(xQueuedType, xTypeMeta); mQueue.Enqueue(xQueuedType); return(xTypeMeta); }