summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIan Rogers <irogers@google.com>2011-11-02 14:56:39 -0700
committerIan Rogers <irogers@google.com>2011-11-02 14:56:39 -0700
commitf4028cce202a328a99db4014ad096caa4b6f2432 (patch)
tree2edd02a303c37d2b06bb34362797f3d794e77837 /src
parentf3c1f780145511b234ae50de6e8dbd8c541b7bb0 (diff)
downloadart-f4028cce202a328a99db4014ad096caa4b6f2432.zip
art-f4028cce202a328a99db4014ad096caa4b6f2432.tar.gz
art-f4028cce202a328a99db4014ad096caa4b6f2432.tar.bz2
Support for unresolved fields in the verifier.
Change-Id: I7bf28786c2610647b9cef6921e9bd162c4707943
Diffstat (limited to 'src')
-rw-r--r--src/dex_verifier.cc35
1 files changed, 23 insertions, 12 deletions
diff --git a/src/dex_verifier.cc b/src/dex_verifier.cc
index 9f66250..5ab21bb 100644
--- a/src/dex_verifier.cc
+++ b/src/dex_verifier.cc
@@ -3291,9 +3291,9 @@ Field* DexVerifier::GetStaticField(int field_idx) {
Field* field = Runtime::Current()->GetClassLinker()->ResolveField(field_idx, method_, true);
if (field == NULL) {
const DexFile::FieldId& field_id = dex_file_->GetFieldId(field_idx);
- Fail(VERIFY_ERROR_NO_FIELD) << "unable to resolve static field " << field_idx << " ("
- << dex_file_->GetFieldName(field_id) << ") in "
- << dex_file_->GetFieldDeclaringClassDescriptor(field_id);
+ LOG(INFO) << "unable to resolve static field " << field_idx << " ("
+ << dex_file_->GetFieldName(field_id) << ") in "
+ << dex_file_->GetFieldDeclaringClassDescriptor(field_id);
DCHECK(Thread::Current()->IsExceptionPending());
Thread::Current()->ClearException();
return NULL;
@@ -3314,9 +3314,9 @@ Field* DexVerifier::GetInstanceField(const RegType& obj_type, int field_idx) {
Field* field = Runtime::Current()->GetClassLinker()->ResolveField(field_idx, method_, false);
if (field == NULL) {
const DexFile::FieldId& field_id = dex_file_->GetFieldId(field_idx);
- Fail(VERIFY_ERROR_NO_FIELD) << "unable to resolve instance field " << field_idx << " ("
- << dex_file_->GetFieldName(field_id) << ") in "
- << dex_file_->GetFieldDeclaringClassDescriptor(field_id);
+ LOG(INFO) << "unable to resolve instance field " << field_idx << " ("
+ << dex_file_->GetFieldName(field_id) << ") in "
+ << dex_file_->GetFieldDeclaringClassDescriptor(field_id);
DCHECK(Thread::Current()->IsExceptionPending());
Thread::Current()->ClearException();
return NULL;
@@ -3355,17 +3355,28 @@ Field* DexVerifier::GetInstanceField(const RegType& obj_type, int field_idx) {
void DexVerifier::VerifyISGet(const Instruction::DecodedInstruction& dec_insn,
const RegType& insn_type, bool is_primitive, bool is_static) {
+ uint32_t field_idx = is_static ? dec_insn.vB_ : dec_insn.vC_;
Field* field;
if (is_static) {
- field = GetStaticField(dec_insn.vB_);
+ field = GetStaticField(field_idx);
} else {
const RegType& object_type = work_line_->GetRegisterType(dec_insn.vB_);
- field = GetInstanceField(object_type, dec_insn.vC_);
+ field = GetInstanceField(object_type, field_idx);
}
- if (field != NULL) {
- const RegType& field_type =
- reg_types_.FromDescriptor(field->GetDeclaringClass()->GetClassLoader(),
- field->GetTypeDescriptor());
+ if (failure_ != VERIFY_ERROR_NONE) {
+ work_line_->SetRegisterType(dec_insn.vA_, reg_types_.Unknown());
+ } else {
+ const char* descriptor;
+ const ClassLoader* loader;
+ if (field != NULL) {
+ descriptor = field->GetTypeDescriptor();
+ loader = field->GetDeclaringClass()->GetClassLoader();
+ } else {
+ const DexFile::FieldId& field_id = dex_file_->GetFieldId(field_idx);
+ descriptor = dex_file_->GetFieldTypeDescriptor(field_id);
+ loader = method_->GetDeclaringClass()->GetClassLoader();
+ }
+ const RegType& field_type = reg_types_.FromDescriptor(loader, descriptor);
if (is_primitive) {
if (field_type.Equals(insn_type) ||
(field_type.IsFloat() && insn_type.IsIntegralTypes()) ||