Merge "Include static fields when dumping class objects." into gingerbread
diff --git a/vm/oo/Object.c b/vm/oo/Object.c
index 3fa86e3..32ed679 100644
--- a/vm/oo/Object.c
+++ b/vm/oo/Object.c
@@ -694,17 +694,17 @@
     int i;
 
     if (obj == NULL || obj->clazz == NULL) {
-        LOGW("Null or malformed object not dumped\n");
+        LOGW("Null or malformed object not dumped");
         return;
     }
 
     clazz = obj->clazz;
-    LOGD("----- Object dump: %p (%s, %d bytes) -----\n",
+    LOGD("----- Object dump: %p (%s, %d bytes) -----",
         obj, clazz->descriptor, (int) clazz->objectSize);
     //printHexDump(obj, clazz->objectSize);
-    LOGD("  Fields:\n");
+    LOGD("  Fields:");
     while (clazz != NULL) {
-        LOGD("    -- %s\n", clazz->descriptor);
+        LOGD("    -- %s", clazz->descriptor);
         for (i = 0; i < clazz->ifieldCount; i++) {
             const InstField* pField = &clazz->ifields[i];
             char type = pField->field.signature[0];
@@ -717,7 +717,7 @@
                 else
                     dval = dvmGetFieldDouble(obj, pField->byteOffset);
 
-                LOGD("    %2d: '%s' '%s' af=%04x off=%d %.3f\n", i,
+                LOGD("    %2d: '%s' '%s' af=%04x off=%d %.3f", i,
                     pField->field.name, pField->field.signature,
                     pField->field.accessFlags, pField->byteOffset, dval);
             } else {
@@ -730,7 +730,7 @@
                 else
                     lval = dvmGetFieldInt(obj, pField->byteOffset);
 
-                LOGD("    %2d: '%s' '%s' af=%04x off=%d 0x%08llx\n", i,
+                LOGD("    %2d: '%s' '%s' af=%04x off=%d 0x%08llx", i,
                     pField->field.name, pField->field.signature,
                     pField->field.accessFlags, pField->byteOffset, lval);
             }
@@ -738,4 +738,39 @@
 
         clazz = clazz->super;
     }
+    if (obj->clazz == gDvm.classJavaLangClass) {
+        LOGD("  Static fields:");
+        const StaticField* sfields = &((ClassObject *)obj)->sfields[0];
+        for (i = 0; i < ((ClassObject *)obj)->sfieldCount; ++i) {
+            const StaticField* pField = &sfields[i];
+            size_t byteOffset = (size_t)pField - (size_t)sfields;
+            char type = pField->field.signature[0];
+
+            if (type == 'F' || type == 'D') {
+                double dval;
+
+                if (type == 'F')
+                    dval = pField->value.f;
+                else
+                    dval = pField->value.d;
+
+                LOGD("    %2d: '%s' '%s' af=%04x off=%zd %.3f", i,
+                     pField->field.name, pField->field.signature,
+                     pField->field.accessFlags, byteOffset, dval);
+            } else {
+                u8 lval;
+
+                if (type == 'J')
+                    lval = pField->value.j;
+                else if (type == 'Z')
+                    lval = pField->value.z;
+                else
+                    lval = pField->value.i;
+
+                LOGD("    %2d: '%s' '%s' af=%04x off=%zd 0x%08llx", i,
+                     pField->field.name, pField->field.signature,
+                     pField->field.accessFlags, byteOffset, lval);
+            }
+        }
+    }
 }