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 override IClrObjMappingModel ReadEntity(ClrObject obj, ModelMapperFactory factory) { var rawElelments = ProcessReferenceConcurrentDictionary(obj); var model = new HashtableMappingModel(rawElelments.Count, obj); foreach (var pair in rawElelments) { model.Elements.Add(factory.BuildModel(pair.Key), factory.BuildModel(pair.Value)); } return(model); }
public override IClrObjMappingModel ReadEntity(ClrObject obj, ModelMapperFactory factory) { Dictionary <ClrObject, ClrObject> clrDictionary = ReadClrObjects(obj); HashtableMappingModel model; if (clrDictionary == null) { return(new HashtableMappingModel(obj)); } model = new HashtableMappingModel(clrDictionary.Count, obj); foreach (var pair in clrDictionary) { model.Elements.Add(factory.BuildModel(pair.Key), factory.BuildModel(pair.Value)); } return(model); }
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); }
public override IClrObjMappingModel ReadEntity(ClrObject obj, ModelMapperFactory factory) { var hashtableModel = new HashtableMappingModel { Obj = obj }; ClrObject entriesField = obj.GetRefFld(entriesFldName); if (entriesField == null || entriesField.Type == null) { // Object contains this field, but value is null. // Most likely dictionary is either in the middle of construction, or destruction. // Anyway we can assume it is empty. return(hashtableModel); } ClrType type = entriesField.Type; ClrHeap heap = type.Heap; var componentType = type.ComponentType; if (componentType == null) { // TODO :Try reload type. return(null); } ClrInstanceField valueField = componentType.GetFieldByName("value"); ClrInstanceField keyField = componentType.GetFieldByName("key"); int len = type.GetArrayLength(entriesField.Address); ulong entriesFieldAddress = entriesField.Address; for (int i = 0; i < len; i++) { ulong addr = type.GetArrayElementAddress(entriesFieldAddress, i); if (addr == 0) { continue; } try { var key = keyField.GetValue(addr, true); if (!(key is ulong)) { continue; } var keyPointer = (ulong)key; if (keyPointer == 0) { continue; } var val = valueField.GetValue(addr, true); ulong valuePointer; if (val is ulong) { valuePointer = (ulong)val; } else { valuePointer = 0; } var keyObj = new ClrObject(keyPointer, heap); var valObj = new ClrObject(valuePointer, heap); hashtableModel.Elements.Add(factory.BuildModel(keyObj), factory.BuildModel(valObj)); } catch (Exception) { Trace.TraceError("Count not read {0} object", obj.HexAddress); // Do nothing for now } } return(hashtableModel); }