summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author David Brazdil <dbrazdil@google.com> 2016-01-18 17:13:41 +0000
committer David Brazdil <dbrazdil@google.com> 2016-01-18 18:40:10 +0000
commit38f64d325867d3e7197da6e07b1d4d9ba8497427 (patch)
tree6aa220b7f86da5a68d1a666362dfbacee199cc68
parentb8bb9f6d0b59be125066f604f134155f8998f5ae (diff)
ART: Public classes never require access checks
CompilerDriver's CanAccess(Instantiable)TypeWithoutChecks will always return false if the referrer class is unresolved. This is too conservative when the target class is resolved and known public. Change-Id: Ibf95f43f13a7295e85671e3b71e28b5d88b4ca3b
-rw-r--r--compiler/driver/compiler_driver.cc43
-rwxr-xr-xtest/127-checker-secondarydex/build (renamed from test/127-secondarydex/build)0
-rw-r--r--test/127-checker-secondarydex/expected.txt (renamed from test/127-secondarydex/expected.txt)0
-rw-r--r--test/127-checker-secondarydex/info.txt (renamed from test/127-secondarydex/info.txt)0
-rwxr-xr-xtest/127-checker-secondarydex/run (renamed from test/127-secondarydex/run)0
-rw-r--r--test/127-checker-secondarydex/src/Main.java (renamed from test/127-secondarydex/src/Main.java)0
-rw-r--r--test/127-checker-secondarydex/src/Super.java (renamed from test/127-secondarydex/src/Super.java)0
-rw-r--r--test/127-checker-secondarydex/src/Test.java (renamed from test/127-secondarydex/src/Test.java)3
8 files changed, 28 insertions, 18 deletions
diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc
index 043bd93bd7..56e5abe194 100644
--- a/compiler/driver/compiler_driver.cc
+++ b/compiler/driver/compiler_driver.cc
@@ -1197,15 +1197,18 @@ bool CompilerDriver::CanAccessTypeWithoutChecks(uint32_t referrer_idx, const Dex
if (equals_referrers_class != nullptr) {
*equals_referrers_class = (method_id.class_idx_ == type_idx);
}
- mirror::Class* referrer_class = dex_cache->GetResolvedType(method_id.class_idx_);
- if (referrer_class == nullptr) {
- stats_->TypeNeedsAccessCheck();
- return false; // Incomplete referrer knowledge needs access check.
- }
- // Perform access check, will return true if access is ok or false if we're going to have to
- // check this at runtime (for example for class loaders).
- bool result = referrer_class->CanAccess(resolved_class);
- if (result) {
+ bool is_accessible = resolved_class->IsPublic(); // Public classes are always accessible.
+ if (!is_accessible) {
+ mirror::Class* referrer_class = dex_cache->GetResolvedType(method_id.class_idx_);
+ if (referrer_class == nullptr) {
+ stats_->TypeNeedsAccessCheck();
+ return false; // Incomplete referrer knowledge needs access check.
+ }
+ // Perform access check, will return true if access is ok or false if we're going to have to
+ // check this at runtime (for example for class loaders).
+ is_accessible = referrer_class->CanAccess(resolved_class);
+ }
+ if (is_accessible) {
stats_->TypeDoesntNeedAccessCheck();
if (type_known_final != nullptr) {
*type_known_final = resolved_class->IsFinal() && !resolved_class->IsArrayClass();
@@ -1216,7 +1219,7 @@ bool CompilerDriver::CanAccessTypeWithoutChecks(uint32_t referrer_idx, const Dex
} else {
stats_->TypeNeedsAccessCheck();
}
- return result;
+ return is_accessible;
}
bool CompilerDriver::CanAccessInstantiableTypeWithoutChecks(uint32_t referrer_idx,
@@ -1236,14 +1239,18 @@ bool CompilerDriver::CanAccessInstantiableTypeWithoutChecks(uint32_t referrer_id
}
*finalizable = resolved_class->IsFinalizable();
const DexFile::MethodId& method_id = dex_file.GetMethodId(referrer_idx);
- mirror::Class* referrer_class = dex_cache->GetResolvedType(method_id.class_idx_);
- if (referrer_class == nullptr) {
- stats_->TypeNeedsAccessCheck();
- return false; // Incomplete referrer knowledge needs access check.
- }
- // Perform access and instantiable checks, will return true if access is ok or false if we're
- // going to have to check this at runtime (for example for class loaders).
- bool result = referrer_class->CanAccess(resolved_class) && resolved_class->IsInstantiable();
+ bool is_accessible = resolved_class->IsPublic(); // Public classes are always accessible.
+ if (!is_accessible) {
+ mirror::Class* referrer_class = dex_cache->GetResolvedType(method_id.class_idx_);
+ if (referrer_class == nullptr) {
+ stats_->TypeNeedsAccessCheck();
+ return false; // Incomplete referrer knowledge needs access check.
+ }
+ // Perform access and instantiable checks, will return true if access is ok or false if we're
+ // going to have to check this at runtime (for example for class loaders).
+ is_accessible = referrer_class->CanAccess(resolved_class);
+ }
+ bool result = is_accessible && resolved_class->IsInstantiable();
if (result) {
stats_->TypeDoesntNeedAccessCheck();
} else {
diff --git a/test/127-secondarydex/build b/test/127-checker-secondarydex/build
index 0d9f4d6291..0d9f4d6291 100755
--- a/test/127-secondarydex/build
+++ b/test/127-checker-secondarydex/build
diff --git a/test/127-secondarydex/expected.txt b/test/127-checker-secondarydex/expected.txt
index 1c8defb6ec..1c8defb6ec 100644
--- a/test/127-secondarydex/expected.txt
+++ b/test/127-checker-secondarydex/expected.txt
diff --git a/test/127-secondarydex/info.txt b/test/127-checker-secondarydex/info.txt
index 0479d1a784..0479d1a784 100644
--- a/test/127-secondarydex/info.txt
+++ b/test/127-checker-secondarydex/info.txt
diff --git a/test/127-secondarydex/run b/test/127-checker-secondarydex/run
index d8c3c798bf..d8c3c798bf 100755
--- a/test/127-secondarydex/run
+++ b/test/127-checker-secondarydex/run
diff --git a/test/127-secondarydex/src/Main.java b/test/127-checker-secondarydex/src/Main.java
index 0ede8ed2b2..0ede8ed2b2 100644
--- a/test/127-secondarydex/src/Main.java
+++ b/test/127-checker-secondarydex/src/Main.java
diff --git a/test/127-secondarydex/src/Super.java b/test/127-checker-secondarydex/src/Super.java
index 7608d4a7c8..7608d4a7c8 100644
--- a/test/127-secondarydex/src/Super.java
+++ b/test/127-checker-secondarydex/src/Super.java
diff --git a/test/127-secondarydex/src/Test.java b/test/127-checker-secondarydex/src/Test.java
index 8547e791c2..ae8bac9379 100644
--- a/test/127-secondarydex/src/Test.java
+++ b/test/127-checker-secondarydex/src/Test.java
@@ -23,6 +23,9 @@ public class Test extends Super {
System.out.println("Test");
}
+ /// CHECK-START: java.lang.String Test.toString() ssa_builder (after)
+ /// CHECK: LoadClass needs_access_check:false klass:java.lang.String
+
public String toString() {
return new String("Test");
}