示例#1
0
        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
        }
示例#2
0
        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);
        }