| Index: runtime/vm/heap_histogram.cc | 
| =================================================================== | 
| --- runtime/vm/heap_histogram.cc	(revision 27342) | 
| +++ runtime/vm/heap_histogram.cc	(working copy) | 
| @@ -158,44 +158,47 @@ | 
|  | 
| intptr_t size_sum = 0; | 
| intptr_t count_sum = 0; | 
| -  stream->OpenObject(); | 
| -  stream->PrintProperty("type", "ObjectHistogram"); | 
| -  stream->OpenArray("properties"); | 
| -  stream->PrintValue("size"); | 
| -  stream->PrintValue("count"); | 
| -  stream->CloseArray(); | 
| -  stream->OpenArray("members"); | 
| -  for (intptr_t pos = 0; pos < length; pos++) { | 
| -    Element* e = array[pos]; | 
| -    if (e->count_ > 0) { | 
| -      cls = isolate_->class_table()->At(e->class_id_); | 
| -      str = cls.Name(); | 
| -      lib = cls.library(); | 
| -      stream->OpenObject(); | 
| -      stream->PrintProperty("type", "ObjectHistogramEntry"); | 
| -      // It should not be possible to overflow here because the total | 
| -      // size of the heap is bounded and we are dividing the value | 
| -      // by the number of major gcs that have occurred. | 
| -      size_sum += (e->size_ / major_gc_count_); | 
| -      count_sum += (e->count_ / major_gc_count_); | 
| -      stream->PrintProperty("size", e->size_ / major_gc_count_); | 
| -      stream->PrintProperty("count", e->count_ / major_gc_count_); | 
| -      stream->PrintProperty("name", str.ToCString()); | 
| -      if (lib.IsNull()) { | 
| -        stream->PrintProperty("category", ""); | 
| -      } else { | 
| -        str = lib.url(); | 
| -        stream->PrintProperty("category", str.ToCString()); | 
| +  JSONObject jsobj(stream); | 
| +  jsobj.AddProperty("type", "ObjectHistogram"); | 
| +  {  // TODO(johnmccutchan): Why is this empty array needed here? | 
| +    JSONArray jsarr(jsobj, "properties"); | 
| +    jsarr.AddValue("size"); | 
| +    jsarr.AddValue("count"); | 
| +  } | 
| +  { | 
| +    JSONArray jsarr(jsobj, "members"); | 
| +    for (intptr_t pos = 0; pos < length; pos++) { | 
| +      Element* e = array[pos]; | 
| +      if (e->count_ > 0) { | 
| +        cls = isolate_->class_table()->At(e->class_id_); | 
| +        str = cls.Name(); | 
| +        lib = cls.library(); | 
| +        JSONObject jsobj(jsarr); | 
| +        jsobj.AddProperty("type", "ObjectHistogramEntry"); | 
| +        // It should not be possible to overflow here because the total | 
| +        // size of the heap is bounded and we are dividing the value | 
| +        // by the number of major gcs that have occurred. | 
| +        size_sum += (e->size_ / major_gc_count_); | 
| +        count_sum += (e->count_ / major_gc_count_); | 
| +        jsobj.AddProperty("size", e->size_ / major_gc_count_); | 
| +        jsobj.AddProperty("count", e->count_ / major_gc_count_); | 
| +        jsobj.AddProperty("class", cls, true); | 
| +        jsobj.AddProperty("lib", lib, true); | 
| +        // TODO(johnmccutchan): Update the UI to use the class and lib object | 
| +        // properties above instead of name and category strings. | 
| +        jsobj.AddProperty("name", str.ToCString()); | 
| +        if (lib.IsNull()) { | 
| +          jsobj.AddProperty("category", ""); | 
| +        } else { | 
| +          str = lib.url(); | 
| +          jsobj.AddProperty("category", str.ToCString()); | 
| +        } | 
| } | 
| -      stream->CloseObject(); | 
| } | 
| } | 
| -  stream->CloseArray(); | 
| -  stream->OpenObject("sums"); | 
| -  stream->PrintProperty("size", size_sum); | 
| -  stream->PrintProperty("count", count_sum); | 
| -  stream->CloseObject(); | 
| -  stream->CloseObject(); | 
| +  JSONObject sums(jsobj, "sums"); | 
| +  sums.AddProperty("size", size_sum); | 
| +  sums.AddProperty("count", count_sum); | 
|  | 
| // Deallocate the array for sorting. | 
| free(array); | 
|  |