public static IClrObjMappingModel EnumerateList(ClrObject clrObject, ModelMapperFactory factory)
        {
            var result = new ArrayMappingModel
            {
                Obj = clrObject
            };
            ClrObject fld = clrObject.GetRefFld("_items");

            if (fld.Type == null)
            {
                return(result);
            }
            ClrType tp = fld.Type.ComponentType;

            if ((!tp.IsValueClass) && (!tp.IsString))
            {
                // TODO: add support of reading strings.
                List <ClrObject> enumeration = ClrCollectionHelper.EnumerateListOfRefTypes(clrObject);
                foreach (ClrObject o in enumeration)
                {
                    IClrObjMappingModel model = factory.BuildModel(o);
                    result.Elements.Add(model);
                }
            }

            return(result);
        }
예제 #2
0
        public override IClrObjMappingModel ReadEntity(ClrObject obj, ModelMapperFactory factory)
        {
            var field = obj.GetRefFld("_data");
            IClrObjMappingModel safeDictionary;

            if (!factory.CollectionEnumerator.TryProcessSpecialCollection(field, out safeDictionary))
            {
                return(null);
            }

            var casted = safeDictionary as HashtableMappingModel;

            if (casted == null)
            {
                return(null);
            }

            var model = new ArrayMappingModel();

            foreach (IClrObjMappingModel key in casted.Elements.Keys)
            {
                model.AddElement(key);
            }

            return(model);
        }
예제 #3
0
        protected ArrayMappingModel ReadArray([ClrObjAndTypeNotEmpty] ClrObject clrObject,
                                              [NotNull] ModelMapperFactory factory)
        {
            var result = new ArrayMappingModel
            {
                Obj = clrObject
            };

            ClrObject[] arrayContent = this.EnumerationHelper.DoEnumerateArrayType(clrObject);
            if (arrayContent != null)
            {
                foreach (ClrObject o in arrayContent)
                {
                    o.ReEvaluateType();
                    IClrObjMappingModel nested = factory.BuildModel(o);
                    result.Elements.Add(nested);
                }
            }

            return(result);
        }
예제 #4
0
        public override IClrObjMappingModel ReadEntity(ClrObject set, ModelMapperFactory factory)
        {
            var       heap      = set.Type.Heap;
            ClrObject container = set.GetRefFld("container");

            var m_bucketsArray = container.GetRefFld("m_tables").GetRefFld("m_buckets");

            var totalElements = m_bucketsArray.Type.GetArrayLength(m_bucketsArray.Address);

            var result = new ArrayMappingModel
            {
                Obj = set
            };

            for (int i = 0; i < totalElements; i++)
            {
                var nodeAddress = (ulong)m_bucketsArray.Type.GetArrayElementValue(m_bucketsArray.Address, i);

                if (nodeAddress == 0)
                {
                    continue;
                }

                var type = heap.GetObjectType(nodeAddress);

                if (type == null)
                {
                    continue;
                }
                var node = new ClrObject(nodeAddress, type);

                var key = node.GetRefFld("m_key");
                if (!key.IsNullObj)
                {
                    result.AddElement(factory.BuildModel(key));
                }
            }

            return(result);
        }