Add support for Value Format VALUE_TYPE in the encoded_array_item used for initial values of static field references from a class_def_item

Bug: 7356558
Change-Id: I2bef6de9b41605f17518bbcc72907bf5a92c6c26
diff --git a/src/dex_file.cc b/src/dex_file.cc
index d918152..c433f3d 100644
--- a/src/dex_file.cc
+++ b/src/dex_file.cc
@@ -901,10 +901,11 @@
 
 EncodedStaticFieldValueIterator::EncodedStaticFieldValueIterator(const DexFile& dex_file,
                                                                  DexCache* dex_cache,
+                                                                 ClassLoader* class_loader,
                                                                  ClassLinker* linker,
                                                                  const DexFile::ClassDef& class_def)
-    : dex_file_(dex_file), dex_cache_(dex_cache), linker_(linker), array_size_(), pos_(-1),
-      type_(0) {
+    : dex_file_(dex_file), dex_cache_(dex_cache), class_loader_(class_loader), linker_(linker),
+      array_size_(), pos_(-1), type_(kByte) {
   ptr_ = dex_file.GetEncodedStaticFieldValuesArray(class_def);
   if (ptr_ == NULL) {
     array_size_ = 0;
@@ -924,7 +925,7 @@
   byte value_type = *ptr_++;
   byte value_arg = value_type >> kEncodedValueArgShift;
   size_t width = value_arg + 1;  // assume and correct later
-  type_ = value_type & kEncodedValueTypeMask;
+  type_ = static_cast<ValueType>(value_type & kEncodedValueTypeMask);
   switch (type_) {
   case kBoolean:
     jval_.i = (value_arg != 0) ? 1 : 0;
@@ -956,11 +957,11 @@
     break;
   case kString:
   case kType:
-  case kMethod:
-  case kEnum:
     jval_.i = ReadUnsignedInt(ptr_, value_arg, false);
     break;
   case kField:
+  case kMethod:
+  case kEnum:
   case kArray:
   case kAnnotation:
     UNIMPLEMENTED(FATAL) << ": type " << type_;
@@ -991,6 +992,11 @@
       field->SetObject(NULL, resolved);
       break;
     }
+    case kType: {
+      Class* resolved = linker_->ResolveType(dex_file_, jval_.i, dex_cache_, class_loader_);
+      field->SetObject(NULL, resolved);
+      break;
+    }
     default: UNIMPLEMENTED(FATAL) << ": type " << type_;
   }
 }