| OLD | NEW | 
|---|
| 1 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2013, 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/heap_histogram.h" | 5 #include "vm/heap_histogram.h" | 
| 6 | 6 | 
| 7 #include "platform/assert.h" | 7 #include "platform/assert.h" | 
| 8 #include "vm/flags.h" | 8 #include "vm/flags.h" | 
| 9 #include "vm/object.h" | 9 #include "vm/object.h" | 
| 10 #include "vm/json_stream.h" | 10 #include "vm/json_stream.h" | 
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 151   array = GetSortedArray(&length); | 151   array = GetSortedArray(&length); | 
| 152   ASSERT(array != NULL); | 152   ASSERT(array != NULL); | 
| 153 | 153 | 
| 154   // Finally print the sorted array. | 154   // Finally print the sorted array. | 
| 155   Class& cls = Class::Handle(); | 155   Class& cls = Class::Handle(); | 
| 156   String& str = String::Handle(); | 156   String& str = String::Handle(); | 
| 157   Library& lib = Library::Handle(); | 157   Library& lib = Library::Handle(); | 
| 158 | 158 | 
| 159   intptr_t size_sum = 0; | 159   intptr_t size_sum = 0; | 
| 160   intptr_t count_sum = 0; | 160   intptr_t count_sum = 0; | 
| 161   stream->OpenObject(); | 161   JSONObject jsobj(stream); | 
| 162   stream->PrintProperty("type", "ObjectHistogram"); | 162   jsobj.AddProperty("type", "ObjectHistogram"); | 
| 163   stream->OpenArray("properties"); | 163   {  // TODO(johnmccutchan): Why is this empty array needed here? | 
| 164   stream->PrintValue("size"); | 164     JSONArray jsarr(jsobj, "properties"); | 
| 165   stream->PrintValue("count"); | 165     jsarr.AddValue("size"); | 
| 166   stream->CloseArray(); | 166     jsarr.AddValue("count"); | 
| 167   stream->OpenArray("members"); | 167   } | 
| 168   for (intptr_t pos = 0; pos < length; pos++) { | 168   { | 
| 169     Element* e = array[pos]; | 169     JSONArray jsarr(jsobj, "members"); | 
| 170     if (e->count_ > 0) { | 170     for (intptr_t pos = 0; pos < length; pos++) { | 
| 171       cls = isolate_->class_table()->At(e->class_id_); | 171       Element* e = array[pos]; | 
| 172       str = cls.Name(); | 172       if (e->count_ > 0) { | 
| 173       lib = cls.library(); | 173         cls = isolate_->class_table()->At(e->class_id_); | 
| 174       stream->OpenObject(); | 174         str = cls.Name(); | 
| 175       stream->PrintProperty("type", "ObjectHistogramEntry"); | 175         lib = cls.library(); | 
| 176       // It should not be possible to overflow here because the total | 176         JSONObject jsobj(jsarr); | 
| 177       // size of the heap is bounded and we are dividing the value | 177         jsobj.AddProperty("type", "ObjectHistogramEntry"); | 
| 178       // by the number of major gcs that have occurred. | 178         // It should not be possible to overflow here because the total | 
| 179       size_sum += (e->size_ / major_gc_count_); | 179         // size of the heap is bounded and we are dividing the value | 
| 180       count_sum += (e->count_ / major_gc_count_); | 180         // by the number of major gcs that have occurred. | 
| 181       stream->PrintProperty("size", e->size_ / major_gc_count_); | 181         size_sum += (e->size_ / major_gc_count_); | 
| 182       stream->PrintProperty("count", e->count_ / major_gc_count_); | 182         count_sum += (e->count_ / major_gc_count_); | 
| 183       stream->PrintProperty("name", str.ToCString()); | 183         jsobj.AddProperty("size", e->size_ / major_gc_count_); | 
| 184       if (lib.IsNull()) { | 184         jsobj.AddProperty("count", e->count_ / major_gc_count_); | 
| 185         stream->PrintProperty("category", ""); | 185         jsobj.AddProperty("class", cls, true); | 
| 186       } else { | 186         jsobj.AddProperty("lib", lib, true); | 
| 187         str = lib.url(); | 187         // TODO(johnmccutchan): Update the UI to use the class and lib object | 
| 188         stream->PrintProperty("category", str.ToCString()); | 188         // properties above instead of name and category strings. | 
|  | 189         jsobj.AddProperty("name", str.ToCString()); | 
|  | 190         if (lib.IsNull()) { | 
|  | 191           jsobj.AddProperty("category", ""); | 
|  | 192         } else { | 
|  | 193           str = lib.url(); | 
|  | 194           jsobj.AddProperty("category", str.ToCString()); | 
|  | 195         } | 
| 189       } | 196       } | 
| 190       stream->CloseObject(); |  | 
| 191     } | 197     } | 
| 192   } | 198   } | 
| 193   stream->CloseArray(); | 199   JSONObject sums(jsobj, "sums"); | 
| 194   stream->OpenObject("sums"); | 200   sums.AddProperty("size", size_sum); | 
| 195   stream->PrintProperty("size", size_sum); | 201   sums.AddProperty("count", count_sum); | 
| 196   stream->PrintProperty("count", count_sum); |  | 
| 197   stream->CloseObject(); |  | 
| 198   stream->CloseObject(); |  | 
| 199 | 202 | 
| 200   // Deallocate the array for sorting. | 203   // Deallocate the array for sorting. | 
| 201   free(array); | 204   free(array); | 
| 202 } | 205 } | 
| 203 | 206 | 
| 204 | 207 | 
| 205 }  // namespace dart | 208 }  // namespace dart | 
| OLD | NEW | 
|---|