summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastien Hertz <shertz@google.com>2014-04-22 17:11:08 +0200
committerSebastien Hertz <shertz@google.com>2014-04-25 10:10:07 +0200
commit2ed76f95dd5a7edada82407a1853be803c9853a9 (patch)
tree1ff07ef9ef905e943480a808e69fd61a7645e667
parentec83aacf669165eeeb1c30aee402001394982fd3 (diff)
downloadart-2ed76f95dd5a7edada82407a1853be803c9853a9.zip
art-2ed76f95dd5a7edada82407a1853be803c9853a9.tar.gz
art-2ed76f95dd5a7edada82407a1853be803c9853a9.tar.bz2
Resolve method's argument reference types
Using ResolveClassAndCheckAccess allows to resolve reference types and check we have access to these types too. This also prevents from getting unresolved reference types, which has been observed during deoptimization. Bug: 13464407 Change-Id: I4c02fdff191c195f34502a4d4a20357419982eb1
-rw-r--r--runtime/verifier/method_verifier.cc7
1 files changed, 5 insertions, 2 deletions
diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc
index 535c76d..4159c08 100644
--- a/runtime/verifier/method_verifier.cc
+++ b/runtime/verifier/method_verifier.cc
@@ -1176,8 +1176,11 @@ bool MethodVerifier::SetTypesFromSignature() {
// it's effectively considered initialized the instant we reach here (in the sense that we
// can return without doing anything or call virtual methods).
{
- const RegType& reg_type = reg_types_.FromDescriptor(class_loader_->get(), descriptor,
- false);
+ const RegType& reg_type = ResolveClassAndCheckAccess(iterator.GetTypeIdx());
+ if (!reg_type.IsNonZeroReferenceTypes()) {
+ DCHECK(HasFailures());
+ return false;
+ }
reg_line->SetRegisterType(arg_start + cur_arg, reg_type);
}
break;