OSDN Git Service

Fix failing hprof DCHECK
authorMathieu Chartier <mathieuc@google.com>
Fri, 6 Mar 2015 20:45:44 +0000 (12:45 -0800)
committerMathieu Chartier <mathieuc@google.com>
Fri, 6 Mar 2015 20:52:57 +0000 (12:52 -0800)
Benign.

Bug: 19627999
Change-Id: I20f3d36ffa1efaf23b40b6290c042df81eca2fea

runtime/hprof/hprof.cc

index 7da22b1..5a7b7e1 100644 (file)
@@ -1008,17 +1008,26 @@ void Hprof::DumpHeapClass(mirror::Class* klass, EndianOutput* output) {
       HprofBasicType t = SignatureToBasicTypeAndSize(f->GetTypeDescriptor(), &size);
       __ AddStringId(LookupStringId(f->GetName()));
       __ AddU1(t);
-      switch (size) {
-        case 1:
+      switch (t) {
+        case hprof_basic_byte:
           __ AddU1(f->GetByte(klass));
           break;
-        case 2:
+        case hprof_basic_boolean:
+          __ AddU1(f->GetBoolean(klass));
+          break;
+        case hprof_basic_char:
           __ AddU2(f->GetChar(klass));
           break;
-        case 4:
+        case hprof_basic_short:
+          __ AddU2(f->GetShort(klass));
+          break;
+        case hprof_basic_float:
+        case hprof_basic_int:
+        case hprof_basic_object:
           __ AddU4(f->Get32(klass));
           break;
-        case 8:
+        case hprof_basic_double:
+        case hprof_basic_long:
           __ AddU8(f->Get64(klass));
           break;
         default:
@@ -1099,16 +1108,29 @@ void Hprof::DumpHeapInstanceObject(mirror::Object* obj, mirror::Class* klass,
     for (int i = 0; i < ifieldCount; ++i) {
       mirror::ArtField* f = klass->GetInstanceField(i);
       size_t size;
-      SignatureToBasicTypeAndSize(f->GetTypeDescriptor(), &size);
-      if (size == 1) {
+      auto t = SignatureToBasicTypeAndSize(f->GetTypeDescriptor(), &size);
+      switch (t) {
+      case hprof_basic_byte:
         __ AddU1(f->GetByte(obj));
-      } else if (size == 2) {
+        break;
+      case hprof_basic_boolean:
+        __ AddU1(f->GetBoolean(obj));
+        break;
+      case hprof_basic_char:
         __ AddU2(f->GetChar(obj));
-      } else if (size == 4) {
+        break;
+      case hprof_basic_short:
+        __ AddU2(f->GetShort(obj));
+        break;
+      case hprof_basic_float:
+      case hprof_basic_int:
+      case hprof_basic_object:
         __ AddU4(f->Get32(obj));
-      } else {
-        CHECK_EQ(size, 8U);
+        break;
+      case hprof_basic_double:
+      case hprof_basic_long:
         __ AddU8(f->Get64(obj));
+        break;
       }
     }