Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/object_graph.h" | 5 #include "vm/object_graph.h" |
| 6 | 6 |
| 7 #include "vm/dart.h" | 7 #include "vm/dart.h" |
| 8 #include "vm/growable_array.h" | 8 #include "vm/growable_array.h" |
| 9 #include "vm/isolate.h" | 9 #include "vm/isolate.h" |
| 10 #include "vm/object.h" | 10 #include "vm/object.h" |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 200 intptr_t ObjectGraph::SizeRetainedByClass(intptr_t class_id) { | 200 intptr_t ObjectGraph::SizeRetainedByClass(intptr_t class_id) { |
| 201 SizeVisitor total; | 201 SizeVisitor total; |
| 202 IterateObjects(&total); | 202 IterateObjects(&total); |
| 203 intptr_t size_total = total.size(); | 203 intptr_t size_total = total.size(); |
| 204 SizeExcludingClassVisitor excluding_class(class_id); | 204 SizeExcludingClassVisitor excluding_class(class_id); |
| 205 IterateObjects(&excluding_class); | 205 IterateObjects(&excluding_class); |
| 206 intptr_t size_excluding_class = excluding_class.size(); | 206 intptr_t size_excluding_class = excluding_class.size(); |
| 207 return size_total - size_excluding_class; | 207 return size_total - size_excluding_class; |
| 208 } | 208 } |
| 209 | 209 |
| 210 | |
| 211 class RetainingPathVisitor : public ObjectGraph::Visitor { | |
| 212 public: | |
| 213 RetainingPathVisitor(RawObject* obj, const Array& path) | |
| 214 : obj_(obj), path_(path), length_(0) { | |
| 215 ASSERT(Isolate::Current()->no_gc_scope_depth() != 0); | |
|
turnidge
2014/05/20 18:00:38
We could consider clearing path_ here.
Are we una
koda
2014/05/20 20:37:49
Yes, we need to avoid GC during the search.
| |
| 216 } | |
| 217 intptr_t length() const { return length_; } | |
|
turnidge
2014/05/20 18:00:38
blank line here would help me.
koda
2014/05/20 20:37:49
Done.
| |
| 218 virtual Direction VisitObject(ObjectGraph::StackIterator* it) { | |
| 219 if (it->Get() != obj_) { | |
| 220 return kProceed; | |
| 221 } | |
| 222 Object& parent = Object::Handle(); | |
| 223 for (length_ = 0; it->MoveToParent(); ++length_) { | |
| 224 if (length_ < path_.Length()) { | |
|
Cutch
2014/05/20 17:39:12
Could we allow path to be Array::null() and call l
koda
2014/05/20 20:37:49
Done. Although I expect the common use will be to
| |
| 225 parent = it->Get(); | |
| 226 path_.SetAt(length_, parent); | |
| 227 } | |
| 228 } | |
| 229 return kAbort; | |
| 230 } | |
| 231 private: | |
| 232 RawObject* obj_; | |
| 233 const Array& path_; | |
| 234 intptr_t length_; | |
| 235 }; | |
| 236 | |
| 237 | |
| 238 intptr_t ObjectGraph::RetainingPath(Object* obj, const Array& path) { | |
| 239 NoGCScope no_gc_scope_; | |
|
turnidge
2014/05/20 18:00:38
Maybe comment on what you are doing here with obj
koda
2014/05/20 20:37:49
Done.
| |
| 240 RawObject* raw = obj->raw(); | |
| 241 *obj = Object::null(); | |
| 242 RetainingPathVisitor visitor(raw, path); | |
| 243 IterateObjects(&visitor); | |
| 244 *obj = raw; | |
| 245 return visitor.length(); | |
| 246 } | |
| 247 | |
| 210 } // namespace dart | 248 } // namespace dart |
| OLD | NEW |