Beispiel #1
0
        public static Dictionary <ClrObject, ClrObject> ReadClrObjects(ClrObject obj)
        {
            if (obj.Type == null)
            {
                return(new Dictionary <ClrObject, ClrObject>());
            }

            ClrObject buckets = obj.GetRefFld("buckets", false);

            if (buckets.Type == null)
            {
                return(new Dictionary <ClrObject, ClrObject>());
            }

            List <Tuple <ClrObject, ClrObject> > enumerated = ClrCollectionHelper.EnumerateHashtable(obj);

            var dict = new Dictionary <ClrObject, ClrObject>(enumerated.Count);

            foreach (var tuple in enumerated)
            {
                dict.Add(tuple.Item1, tuple.Item2);
            }

            return(dict);
        }
        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);
        }
Beispiel #3
0
        public override IClrObjMappingModel ReadEntity(ClrObject obj, ModelMapperFactory factory)
        {
            ClrObject fld = obj.GetRefFld(entriesTableFldName);
            List <Tuple <ClrObject, ClrObject> > values = ClrCollectionHelper.EnumerateHashtable(fld);

            var hashtable = new Hashtable(values.Count);

            foreach (var keyValuePair in values)
            {
                ClrObject val = keyValuePair.Item2;
                if (val.IsNullObj)
                {
                    continue;
                }


                var       key   = val.GetStringFld("Key");
                ClrObject value = val.GetRefFld("Value");

                if (key == null || value.IsNullObj)
                {
                    continue;
                }

                IClrObjMappingModel valModel = factory.BuildModel(value);
                hashtable.Add(key, valModel);
            }

            var hashTableMapping = new HashtableMappingModel(hashtable, obj);

            return(hashTableMapping);
        }
Beispiel #4
0
        public static IDList Read(ClrObject obj)
        {
            if (obj.IsNullObj)
            {
                return(null);
            }

            ClrObject idsRef = obj.GetRefFld("m_ids");

            if (idsRef.IsNullObj)
            {
                return(null);
            }

            List <ClrObject> ids = idsRef.Type?.Name?.Contains("ArrayList") == true?ClrCollectionHelper.EnumerateArrayList(idsRef) :
                                       ClrCollectionHelper.EnumerateListOfRefTypes(idsRef);

            var res = new IDList();

            foreach (ClrObject id in ids)
            {
                res.Add(IDReader.Read(id));
            }

            return(res);
        }
Beispiel #5
0
 protected virtual ClrObject[] EnumerateArrayOfClassInstances(ClrObject clrObject)
 {
     try
     {
         return(ClrCollectionHelper.EnumerateArrayOfRefTypes(clrObject).ToArray());
     }
     catch (Exception)
     {
         return(ExecuteFallbackLogic(clrObject));
     }
 }
        public override void Compute()
        {
            ClrAssert.ObjectNotNullTypeNotEmpty(this.Obj);

            this.Value = Obj.GetStringFld(fieldName: "_stringValue") ?? string.Empty;

            ClrObject multi = Obj.GetRefFld("_multiValue");

            if (multi.IsNullObj)
            {
                return;
            }

            ClrObject arrayList = multi.GetRefFld("_entriesArray");

            if (arrayList.IsNullObj)
            {
                return;
            }

            List <ClrObject> buckets = ClrCollectionHelper.EnumerateArrayList(arrayList);

            foreach (ClrObject bucket in buckets)
            {
                bucket.ReEvaluateType();
                ClrObject val = bucket.GetRefFld("Value");
                val.ReEvaluateType();
                if (val.IsNullObj)
                {
                    continue;
                }

                List <ClrObject> nestedValues = ClrCollectionHelper.EnumerateArrayList(val);
                foreach (ClrObject nestedValue in nestedValues)
                {
                    nestedValue.ReEvaluateType();
                    if (nestedValue.IsNullObj || (nestedValue.Type == null))
                    {
                        continue;
                    }

                    object tmpvalue = nestedValue.Type.GetValue(nestedValue.Address);
                    if (tmpvalue is string)
                    {
                        this.Value += tmpvalue;
                    }
                }
            }

            // var buckets = ClrCollectionHelper.EnumerateArrayOfRefTypes(arrayList);
            // buckets.
        }
Beispiel #7
0
        private StringBuilder ComputeOwnContent()
        {
            var m_ChunkCharsPointer = Obj.GetRefFld("m_ChunkChars");

            if (m_ChunkCharsPointer.IsNullObj || (m_ChunkCharsPointer.Type == null) || (!m_ChunkCharsPointer.Type.IsArray))
            {
                return(new StringBuilder());
            }

            m_ChunkLength = Obj.GetInt32Fld(nameof(m_ChunkLength));

            var ar = ClrCollectionHelper.EnumerateArrayOfSimpleTypes <char>(m_ChunkCharsPointer, m_ChunkLength);

            var sb = new StringBuilder(ar.Count);

            for (var i = 0; (i < m_ChunkLength) && (i < ar.Count); i++)
            {
                var letter = ar[i];
                sb.Append(letter);
            }

            return(sb);
        }
Beispiel #8
0
        public override IClrObjMappingModel ReadEntity(ClrObject obj, ModelMapperFactory factory)
        {
            ClrObject tablesFld = obj.GetRefFld("m_tables");

            ClrObject bucketsFld = tablesFld.GetRefFld("m_buckets");
            ClrType   type       = bucketsFld.Type;
            ClrHeap   heap       = type.Heap;

            IEnumerable <ClrObject> values = ClrCollectionHelper.EnumerateArrayOfRefTypes(bucketsFld).Where(t => !t.IsNullObj);


            ClrInstanceField valueField = type.ComponentType.GetFieldByName("m_value");

            ClrInstanceField keyField = type.ComponentType.GetFieldByName("m_key");
            var hashtableModel        = new HashtableMappingModel
            {
                Obj = obj
            };

            foreach (ClrObject val in values)
            {
                ClrObject keyObj = val.GetRefFld("m_key");
                if (keyObj.IsNullObj)
                {
                    continue;
                }

                ClrObject valObj = val.GetRefFld("m_value");

                hashtableModel.Elements.Add(
                    key: factory.BuildModel(keyObj),
                    value: factory.BuildModel(valObj));
            }

            return(hashtableModel);
        }