Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(263)

Side by Side Diff: runtime/vm/heap_profiler.cc

Issue 11879008: Emit fake classes to please the third party HPROF tool infrastructure. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: address review comments Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/heap_profiler.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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_profiler.h" 5 #include "vm/heap_profiler.h"
6 6
7 #include "vm/dart_api_state.h" 7 #include "vm/dart_api_state.h"
8 #include "vm/object.h" 8 #include "vm/object.h"
9 #include "vm/raw_object.h" 9 #include "vm/raw_object.h"
10 #include "vm/stack_frame.h" 10 #include "vm/stack_frame.h"
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 record_->WriteObjectId(value); 112 record_->WriteObjectId(value);
113 } 113 }
114 114
115 115
116 HeapProfiler::HeapProfiler(Dart_FileWriteCallback callback, void* stream) 116 HeapProfiler::HeapProfiler(Dart_FileWriteCallback callback, void* stream)
117 : write_callback_(callback), 117 : write_callback_(callback),
118 output_stream_(stream), 118 output_stream_(stream),
119 heap_dump_record_(NULL) { 119 heap_dump_record_(NULL) {
120 WriteHeader(); 120 WriteHeader();
121 WriteStackTrace(); 121 WriteStackTrace();
122 WriteFakeLoadClass(kJavaLangClass, "java.lang.Class");
123 WriteFakeLoadClass(kJavaLangClassLoader, "java.lang.ClassLoader");
124 WriteFakeLoadClass(kJavaLangObject, "java.lang.Object");
125 WriteFakeLoadClass(kJavaLangString, "java.lang.String");
126 WriteFakeLoadClass(kArrayObject, "Object[]");
127 WriteFakeLoadClass(kArrayBoolean, "bool[]");
128 WriteFakeLoadClass(kArrayChar, "char[]");
129 WriteFakeLoadClass(kArrayFloat, "float[]");
130 WriteFakeLoadClass(kArrayDouble, "double[]");
131 WriteFakeLoadClass(kArrayByte, "byte[]");
132 WriteFakeLoadClass(kArrayShort, "short[]");
133 WriteFakeLoadClass(kArrayInt, "int[]");
134 WriteFakeLoadClass(kArrayLong, "long[]");
122 heap_dump_record_ = new Record(kHeapDump, this); 135 heap_dump_record_ = new Record(kHeapDump, this);
136 WriteFakeClassDump(kJavaLangClass, static_cast<FakeClass>(0));
137 WriteFakeClassDump(kJavaLangClassLoader, kJavaLangObject);
138 WriteFakeClassDump(kJavaLangObject, static_cast<FakeClass>(0));
139 WriteFakeClassDump(kJavaLangString, kJavaLangObject);
123 } 140 }
124 141
125 142
126 HeapProfiler::~HeapProfiler() { 143 HeapProfiler::~HeapProfiler() {
127 delete heap_dump_record_; 144 delete heap_dump_record_;
128 } 145 }
129 146
130 147
131 const RawObject* HeapProfiler::ObjectId(const RawObject* raw_obj) { 148 const RawObject* HeapProfiler::ObjectId(const RawObject* raw_obj) {
132 if (!raw_obj->IsHeapObject()) { 149 if (!raw_obj->IsHeapObject()) {
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 const char* format = "<an unnamed class with id %d>"; 424 const char* format = "<an unnamed class with id %d>";
408 intptr_t len = OS::SNPrint(NULL, 0, format, raw_class->ptr()->id_); 425 intptr_t len = OS::SNPrint(NULL, 0, format, raw_class->ptr()->id_);
409 char* str = new char[len + 1]; 426 char* str = new char[len + 1];
410 OS::SNPrint(str, len + 1, format, raw_class->ptr()->id_); 427 OS::SNPrint(str, len + 1, format, raw_class->ptr()->id_);
411 record.WriteObjectId(StringId(str)); 428 record.WriteObjectId(StringId(str));
412 delete[] str; 429 delete[] str;
413 } 430 }
414 } 431 }
415 432
416 433
434 void HeapProfiler::WriteFakeLoadClass(FakeClass fake_class,
435 const char* class_name) {
436 Record record(kLoadClass, this);
437 // class serial number (always > 0)
438 record.Write32(1);
439 // class object ID
440 record.WriteObjectId(reinterpret_cast<void*>(fake_class));
441 // stack trace serial number
442 record.Write32(0);
443 // class name string ID
444 record.WriteObjectId(StringId(class_name));
445 }
446
447
417 // STACK TRACE - 0x05 448 // STACK TRACE - 0x05
418 // 449 //
419 // u4 - stack trace serial number 450 // u4 - stack trace serial number
420 // u4 - thread serial number 451 // u4 - thread serial number
421 // u4 - number of frames 452 // u4 - number of frames
422 // [ID]* - series of stack frame ID's 453 // [ID]* - series of stack frame ID's
423 void HeapProfiler::WriteStackTrace() { 454 void HeapProfiler::WriteStackTrace() {
424 Record record(kStackTrace, this); 455 Record record(kStackTrace, this);
425 // stack trace serial number 456 // stack trace serial number
426 record.Write32(0); 457 record.Write32(0);
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
559 ASSERT(raw_field->ptr()->name_ != String::null()); 590 ASSERT(raw_field->ptr()->name_ != String::null());
560 // field name string ID 591 // field name string ID
561 sub.WriteObjectId(StringId(raw_field->ptr()->name_)); 592 sub.WriteObjectId(StringId(raw_field->ptr()->name_));
562 // type of field 593 // type of field
563 sub.Write8(kObject); 594 sub.Write8(kObject);
564 } 595 }
565 } 596 }
566 } 597 }
567 } 598 }
568 599
600 void HeapProfiler::WriteFakeClassDump(FakeClass fake_class,
601 FakeClass fake_super_class) {
602 SubRecord sub(kClassDump, this);
603 // class object ID
604 sub.WriteObjectId(reinterpret_cast<void*>(fake_class));
605 // stack trace serial number
606 sub.Write32(0);
607 // super class object ID
608 sub.WriteObjectId(reinterpret_cast<void*>(fake_super_class));
609 // class loader object ID
610 sub.WriteObjectId(NULL);
611 // signers object ID
612 sub.WriteObjectId(NULL);
613 // protection domain object ID
614 sub.WriteObjectId(NULL);
615 // reserved
616 sub.WriteObjectId(NULL);
617 // reserved
618 sub.WriteObjectId(NULL);
619 // instance size (in bytes)
620 sub.Write32(0);
621 // size of constant pool and number of records that follow:
622 sub.Write16(0);
623 // Number of static fields
624 sub.Write16(0);
625 // Number of instance fields (not include super class's)
626 sub.Write16(0);
627 }
628
629
569 630
570 // INSTANCE DUMP - 0x21 631 // INSTANCE DUMP - 0x21
571 // 632 //
572 // Format: 633 // Format:
573 // ID - object ID 634 // ID - object ID
574 // u4 - stack trace serial number 635 // u4 - stack trace serial number
575 // ID - class object ID 636 // ID - class object ID
576 // u4 - number of bytes that follow 637 // u4 - number of bytes that follow
577 // [value]* - instance field values (this class, followed by super class, etc) 638 // [value]* - instance field values (this class, followed by super class, etc)
578 void HeapProfiler::WriteInstanceDump(const RawObject* raw_obj) { 639 void HeapProfiler::WriteInstanceDump(const RawObject* raw_obj) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 void HeapProfiler::WriteObjectArrayDump(const RawArray* raw_array) { 699 void HeapProfiler::WriteObjectArrayDump(const RawArray* raw_array) {
639 SubRecord sub(kObjectArrayDump, this); 700 SubRecord sub(kObjectArrayDump, this);
640 // array object ID 701 // array object ID
641 sub.WriteObjectId(raw_array); 702 sub.WriteObjectId(raw_array);
642 // stack trace serial number 703 // stack trace serial number
643 sub.Write32(0); 704 sub.Write32(0);
644 // number of elements 705 // number of elements
645 intptr_t length = Smi::Value(raw_array->ptr()->length_); 706 intptr_t length = Smi::Value(raw_array->ptr()->length_);
646 sub.Write32(length); 707 sub.Write32(length);
647 // array class object ID 708 // array class object ID
648 sub.WriteObjectId(NULL); 709 sub.WriteObjectId(reinterpret_cast<void*>(kArrayObject));
649 // elements 710 // elements
650 for (intptr_t i = 0; i < length; ++i) { 711 for (intptr_t i = 0; i < length; ++i) {
651 sub.WriteObjectId(ObjectId(raw_array->ptr()->data()[i])); 712 sub.WriteObjectId(ObjectId(raw_array->ptr()->data()[i]));
652 } 713 }
653 } 714 }
654 715
655 716
656 // PRIMITIVE ARRAY DUMP - 0x23 717 // PRIMITIVE ARRAY DUMP - 0x23
657 // 718 //
658 // Format: 719 // Format:
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
719 RawObject* raw_obj = handle->raw(); 780 RawObject* raw_obj = handle->raw();
720 visitor_->VisitPointer(&raw_obj); 781 visitor_->VisitPointer(&raw_obj);
721 } 782 }
722 783
723 784
724 void HeapProfilerObjectVisitor::VisitObject(RawObject* raw_obj) { 785 void HeapProfilerObjectVisitor::VisitObject(RawObject* raw_obj) {
725 profiler_->WriteObject(raw_obj); 786 profiler_->WriteObject(raw_obj);
726 } 787 }
727 788
728 } // namespace dart 789 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/heap_profiler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698