Chromium Code Reviews| Index: runtime/vm/service.cc |
| diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc |
| index c57890a6b0404b44a1e447cfeb2be8747eee10b6..ed91060af9c1b868bd280329bf3875d990bfeb71 100644 |
| --- a/runtime/vm/service.cc |
| +++ b/runtime/vm/service.cc |
| @@ -2006,21 +2006,37 @@ static bool PrintRetainingPath(Thread* thread, |
| Smi& slot_offset = Smi::Handle(); |
| Class& element_class = Class::Handle(); |
| Array& element_field_map = Array::Handle(); |
| + LinkedHashMap& map = LinkedHashMap::Handle(); |
| + Array& map_data = Array::Handle(); |
| Field& field = Field::Handle(); |
| limit = Utils::Minimum(limit, length); |
| for (intptr_t i = 0; i < limit; ++i) { |
| JSONObject jselement(&elements); |
| element = path.At(i * 2); |
| - jselement.AddProperty("index", i); |
| jselement.AddProperty("value", element); |
| // Interpret the word offset from parent as list index or instance field. |
| // TODO(koda): User-friendly interpretation for map entries. |
|
rmacnak
2016/08/12 20:22:24
Remove TODO.
cbernaschina
2016/08/12 20:34:17
Done.
|
| if (i > 0) { |
| slot_offset ^= path.At((i * 2) - 1); |
| - if (element.IsArray()) { |
| + jselement.AddProperty("offset", slot_offset.Value()); |
| + if (element.IsArray() || element.IsGrowableObjectArray()) { |
| intptr_t element_index = slot_offset.Value() - |
| (Array::element_offset(0) >> kWordSizeLog2); |
| jselement.AddProperty("parentListIndex", element_index); |
| + } else if (element.IsLinkedHashMap()) { |
| + map = static_cast<RawLinkedHashMap*>(path.At(i * 2)); |
| + map_data = map.data(); |
| + intptr_t element_index = slot_offset.Value() - |
| + (Array::element_offset(0) >> kWordSizeLog2); |
| + LinkedHashMap::Iterator iterator(map); |
| + while (iterator.MoveNext()) { |
| + if (iterator.CurrentKey() == map_data.At(element_index) || |
| + iterator.CurrentValue() == map_data.At(element_index)) { |
| + element = iterator.CurrentKey(); |
| + jselement.AddProperty("parentMapKey", element); |
| + break; |
| + } |
| + } |
| } else if (element.IsInstance()) { |
| element_class ^= element.clazz(); |
| element_field_map = element_class.OffsetToFieldMap(); |