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_;
}
}