Index: runtime/vm/heap_profiler.cc |
diff --git a/runtime/vm/heap_profiler.cc b/runtime/vm/heap_profiler.cc |
index 7f5b01aaaded06c606c6bff3ad20440f0b73bba5..348f477e7e3a57ce858768f3230bd3eabe86c252 100644 |
--- a/runtime/vm/heap_profiler.cc |
+++ b/runtime/vm/heap_profiler.cc |
@@ -119,7 +119,24 @@ HeapProfiler::HeapProfiler(Dart_FileWriteCallback callback, void* stream) |
heap_dump_record_(NULL) { |
WriteHeader(); |
WriteStackTrace(); |
+ WriteFakeLoadClass(kJavaLangClass, "java.lang.Class"); |
+ WriteFakeLoadClass(kJavaLangClassLoader, "java.lang.ClassLoader"); |
+ WriteFakeLoadClass(kJavaLangObject, "java.lang.Object"); |
+ WriteFakeLoadClass(kJavaLangString, "java.lang.String"); |
+ WriteFakeLoadClass(kArrayObject, "Object[]"); |
+ WriteFakeLoadClass(kArrayBoolean, "bool[]"); |
+ WriteFakeLoadClass(kArrayChar, "char[]"); |
+ WriteFakeLoadClass(kArrayFloat, "float[]"); |
+ WriteFakeLoadClass(kArrayDouble, "double[]"); |
+ WriteFakeLoadClass(kArrayByte, "byte[]"); |
+ WriteFakeLoadClass(kArrayShort, "short[]"); |
+ WriteFakeLoadClass(kArrayInt, "int[]"); |
+ WriteFakeLoadClass(kArrayLong, "long[]"); |
heap_dump_record_ = new Record(kHeapDump, this); |
+ WriteFakeClassDump(kJavaLangClass, static_cast<FakeClass>(0)); |
+ WriteFakeClassDump(kJavaLangClassLoader, kJavaLangObject); |
+ WriteFakeClassDump(kJavaLangObject, static_cast<FakeClass>(0)); |
+ WriteFakeClassDump(kJavaLangString, kJavaLangObject); |
} |
@@ -414,6 +431,20 @@ void HeapProfiler::WriteLoadClass(const RawClass* raw_class) { |
} |
+void HeapProfiler::WriteFakeLoadClass(FakeClass fake_class, |
+ const char* class_name) { |
+ Record record(kLoadClass, this); |
+ // class serial number (always > 0) |
+ record.Write32(1); |
+ // class object ID |
+ record.WriteObjectId(reinterpret_cast<void*>(fake_class)); |
+ // stack trace serial number |
+ record.Write32(0); |
+ // class name string ID |
+ record.WriteObjectId(StringId(class_name)); |
+} |
+ |
+ |
// STACK TRACE - 0x05 |
// |
// u4 - stack trace serial number |
@@ -566,6 +597,36 @@ void HeapProfiler::WriteClassDump(const RawClass* raw_class) { |
} |
} |
+void HeapProfiler::WriteFakeClassDump(FakeClass fake_class, |
+ FakeClass fake_super_class) { |
+ SubRecord sub(kClassDump, this); |
+ // class object ID |
+ sub.WriteObjectId(reinterpret_cast<void*>(fake_class)); |
+ // stack trace serial number |
+ sub.Write32(0); |
+ // super class object ID |
+ sub.WriteObjectId(reinterpret_cast<void*>(fake_super_class)); |
+ // class loader object ID |
+ sub.WriteObjectId(NULL); |
+ // signers object ID |
+ sub.WriteObjectId(NULL); |
+ // protection domain object ID |
+ sub.WriteObjectId(NULL); |
+ // reserved |
+ sub.WriteObjectId(NULL); |
+ // reserved |
+ sub.WriteObjectId(NULL); |
+ // instance size (in bytes) |
+ sub.Write32(0); |
+ // size of constant pool and number of records that follow: |
+ sub.Write16(0); |
+ // Number of static fields |
+ sub.Write16(0); |
+ // Number of instance fields (not include super class's) |
+ sub.Write16(0); |
+} |
+ |
+ |
// INSTANCE DUMP - 0x21 |
// |
@@ -645,7 +706,7 @@ void HeapProfiler::WriteObjectArrayDump(const RawArray* raw_array) { |
intptr_t length = Smi::Value(raw_array->ptr()->length_); |
sub.Write32(length); |
// array class object ID |
- sub.WriteObjectId(NULL); |
+ sub.WriteObjectId(reinterpret_cast<void*>(kArrayObject)); |
// elements |
for (intptr_t i = 0; i < length; ++i) { |
sub.WriteObjectId(ObjectId(raw_array->ptr()->data()[i])); |