Support for a set of verifier failures.
(cherry picked from commit 0d60484cbb0c70acc60965b015e94c2e9cb9f1e7)
Change-Id: I70eb1121390305c436a2bed2c7835c870c0c3972
diff --git a/src/verifier/reg_type_cache.cc b/src/verifier/reg_type_cache.cc
index d06377a..53b7a76 100644
--- a/src/verifier/reg_type_cache.cc
+++ b/src/verifier/reg_type_cache.cc
@@ -32,7 +32,7 @@
case Primitive::kPrimFloat: return RegType::kRegTypeFloat;
case Primitive::kPrimDouble: return RegType::kRegTypeDoubleLo;
case Primitive::kPrimVoid:
- default: return RegType::kRegTypeUnknown;
+ default: return RegType::kRegTypeConflict;
}
}
@@ -48,12 +48,12 @@
case 'F': return RegType::kRegTypeFloat;
case 'D': return RegType::kRegTypeDoubleLo;
case 'V':
- default: return RegType::kRegTypeUnknown;
+ default: return RegType::kRegTypeConflict;
}
} else if (descriptor[0] == 'L' || descriptor[0] == '[') {
return RegType::kRegTypeReference;
} else {
- return RegType::kRegTypeUnknown;
+ return RegType::kRegTypeConflict;
}
}
@@ -115,7 +115,7 @@
} else {
// The descriptor is broken return the unknown type as there's nothing sensible that
// could be done at runtime
- return Unknown();
+ return Conflict();
}
}
}
@@ -201,15 +201,30 @@
return *entry;
}
-const RegType& RegTypeCache::UninitializedThisArgument(Class* klass) {
- for (size_t i = RegType::kRegTypeLastFixedLocation + 1; i < entries_.size(); i++) {
- RegType* cur_entry = entries_[i];
- if (cur_entry->IsUninitializedThisReference() && cur_entry->GetClass() == klass) {
- return *cur_entry;
+const RegType& RegTypeCache::UninitializedThisArgument(const RegType& type) {
+ // TODO: implement descriptor version.
+ RegType* entry;
+ if (type.IsUnresolvedTypes()) {
+ String* descriptor = type.GetDescriptor();
+ for (size_t i = RegType::kRegTypeLastFixedLocation + 1; i < entries_.size(); i++) {
+ RegType* cur_entry = entries_[i];
+ if (cur_entry->IsUnresolvedAndUninitializedThisReference() &&
+ cur_entry->GetDescriptor() == descriptor) {
+ return *cur_entry;
+ }
}
+ entry = new RegType(RegType::kRegTypeUnresolvedAndUninitializedThisReference, descriptor, 0,
+ entries_.size());
+ } else {
+ Class* klass = type.GetClass();
+ for (size_t i = RegType::kRegTypeLastFixedLocation + 1; i < entries_.size(); i++) {
+ RegType* cur_entry = entries_[i];
+ if (cur_entry->IsUninitializedThisReference() && cur_entry->GetClass() == klass) {
+ return *cur_entry;
+ }
+ }
+ entry = new RegType(RegType::kRegTypeUninitializedThisReference, klass, 0, entries_.size());
}
- RegType* entry = new RegType(RegType::kRegTypeUninitializedThisReference, klass, 0,
- entries_.size());
entries_.push_back(entry);
return *entry;
}