Reduce meta-data object sizes, introduce meta-data helper classes.

Change-Id: Id14ad218f1c74c659701352fdf1a45bf6444daa3
diff --git a/src/hprof/hprof.cc b/src/hprof/hprof.cc
index 3c5227f..d2134e0 100644
--- a/src/hprof/hprof.cc
+++ b/src/hprof/hprof.cc
@@ -23,13 +23,16 @@
  */
 
 #include "hprof.h"
-#include "heap.h"
+
+#include "class_linker.h"
 #include "debugger.h"
+#include "heap.h"
+#include "logging.h"
 #include "object.h"
+#include "object_utils.h"
 #include "stringprintf.h"
 #include "unordered_map.h"
 #include "unordered_set.h"
-#include "logging.h"
 
 #include <cutils/open_memstream.h>
 #include <sys/uio.h>
@@ -364,6 +367,8 @@
 
       rec->AddU2(0); // empty const pool
 
+      FieldHelper fh;
+
       // Static fields
       if (sFieldCount == 0) {
         rec->AddU2((uint16_t)0);
@@ -375,10 +380,11 @@
 
         for (size_t i = 0; i < sFieldCount; ++i) {
           Field* f = thisClass->GetStaticField(i);
+          fh.ChangeField(f);
 
           size_t size;
-          HprofBasicType t = SignatureToBasicTypeAndSize(f->GetTypeDescriptor(), &size);
-          rec->AddId(LookupStringId(f->GetName()));
+          HprofBasicType t = SignatureToBasicTypeAndSize(fh.GetTypeDescriptor(), &size);
+          rec->AddId(LookupStringId(fh.GetName()));
           rec->AddU1(t);
           if (size == 1) {
             rec->AddU1(static_cast<uint8_t>(f->Get32(NULL)));
@@ -399,8 +405,9 @@
       rec->AddU2((uint16_t)iFieldCount);
       for (int i = 0; i < iFieldCount; ++i) {
         Field* f = thisClass->GetInstanceField(i);
-        HprofBasicType t = SignatureToBasicTypeAndSize(f->GetTypeDescriptor(), NULL);
-        rec->AddId(LookupStringId(f->GetName()));
+        fh.ChangeField(f);
+        HprofBasicType t = SignatureToBasicTypeAndSize(fh.GetTypeDescriptor(), NULL);
+        rec->AddId(LookupStringId(fh.GetName()));
         rec->AddU1(t);
       }
     } else if (clazz->IsArrayClass()) {
@@ -463,12 +470,14 @@
       // Write the instance data;  fields for this class, followed by super class fields,
       // and so on. Don't write the klass or monitor fields of Object.class.
       const Class* sclass = clazz;
+      FieldHelper fh;
       while (!sclass->IsObjectClass()) {
         int ifieldCount = sclass->NumInstanceFields();
         for (int i = 0; i < ifieldCount; i++) {
           Field* f = sclass->GetInstanceField(i);
+          fh.ChangeField(f);
           size_t size;
-          SignatureToBasicTypeAndSize(f->GetTypeDescriptor(), &size);
+          SignatureToBasicTypeAndSize(fh.GetTypeDescriptor(), &size);
           if (size == 1) {
             rec->AddU1(f->Get32(obj));
           } else if (size == 2) {
@@ -680,7 +689,7 @@
 }
 
 HprofStringId Hprof::LookupClassNameId(Class* clazz) {
-  return LookupStringId(PrettyDescriptor(clazz->GetDescriptor()));
+  return LookupStringId(PrettyDescriptor(clazz));
 }
 
 HprofClassObjectId Hprof::LookupClassId(Class* clazz) {