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