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); }
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); }
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); }
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. }
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); }
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); }