summaryrefslogtreecommitdiff
path: root/runtime/native/java_lang_Class.cc
diff options
context:
space:
mode:
author Mathieu Chartier <mathieuc@google.com> 2018-04-06 20:11:28 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2018-04-06 20:11:28 +0000
commitfaa7b29f1e0c311e42ab5a265cb1b17036ca5a10 (patch)
tree2d47cb8b1c10df002a602009724a026b136b3c9d /runtime/native/java_lang_Class.cc
parentd7d9f00b9e87e491f2fc0631ed64ad1acde9c744 (diff)
parentf5f1f80aa6c1c10c61b6723bbc52d5aec2eba2b9 (diff)
Merge changes from topic "hidden_api_cp"
* changes: Revert^2 "hidden_api: Call back into libcore on hidden api detection"" Revert "hidden_api: Call back into libcore on hidden api detection" hidden_api: Call back into libcore on hidden api detection
Diffstat (limited to 'runtime/native/java_lang_Class.cc')
-rw-r--r--runtime/native/java_lang_Class.cc35
1 files changed, 23 insertions, 12 deletions
diff --git a/runtime/native/java_lang_Class.cc b/runtime/native/java_lang_Class.cc
index ad05856eaf..a8b203bff2 100644
--- a/runtime/native/java_lang_Class.cc
+++ b/runtime/native/java_lang_Class.cc
@@ -98,8 +98,13 @@ ALWAYS_INLINE static bool ShouldEnforceHiddenApi(Thread* self)
template<typename T>
ALWAYS_INLINE static bool ShouldBlockAccessToMember(T* member, Thread* self)
REQUIRES_SHARED(Locks::mutator_lock_) {
- return hiddenapi::ShouldBlockAccessToMember(
+ hiddenapi::Action action = hiddenapi::GetMemberAction(
member, self, IsCallerInPlatformDex, hiddenapi::kReflection);
+ if (action != hiddenapi::kAllow) {
+ hiddenapi::NotifyHiddenApiListener(member);
+ }
+
+ return action == hiddenapi::kDeny;
}
// Returns true if a class member should be discoverable with reflection given
@@ -113,7 +118,8 @@ ALWAYS_INLINE static bool IsDiscoverable(bool public_only,
return false;
}
- if (enforce_hidden_api && hiddenapi::GetMemberAction(access_flags) == hiddenapi::kDeny) {
+ if (enforce_hidden_api &&
+ hiddenapi::GetActionFromAccessFlags(access_flags) == hiddenapi::kDeny) {
return false;
}
@@ -433,12 +439,14 @@ static jobject Class_getPublicFieldRecursive(JNIEnv* env, jobject javaThis, jstr
return nullptr;
}
- mirror::Field* field = GetPublicFieldRecursive(
- soa.Self(), DecodeClass(soa, javaThis), name_string);
- if (field == nullptr || ShouldBlockAccessToMember(field->GetArtField(), soa.Self())) {
+ StackHandleScope<1> hs(soa.Self());
+ Handle<mirror::Field> field = hs.NewHandle(GetPublicFieldRecursive(
+ soa.Self(), DecodeClass(soa, javaThis), name_string));
+ if (field.Get() == nullptr ||
+ ShouldBlockAccessToMember(field->GetArtField(), soa.Self())) {
return nullptr;
}
- return soa.AddLocalReference<jobject>(field);
+ return soa.AddLocalReference<jobject>(field.Get());
}
static jobject Class_getDeclaredField(JNIEnv* env, jobject javaThis, jstring name) {
@@ -477,15 +485,17 @@ static jobject Class_getDeclaredConstructorInternal(
ScopedFastNativeObjectAccess soa(env);
DCHECK_EQ(Runtime::Current()->GetClassLinker()->GetImagePointerSize(), kRuntimePointerSize);
DCHECK(!Runtime::Current()->IsActiveTransaction());
- ObjPtr<mirror::Constructor> result =
+
+ StackHandleScope<1> hs(soa.Self());
+ Handle<mirror::Constructor> result = hs.NewHandle(
mirror::Class::GetDeclaredConstructorInternal<kRuntimePointerSize, false>(
soa.Self(),
DecodeClass(soa, javaThis),
- soa.Decode<mirror::ObjectArray<mirror::Class>>(args));
+ soa.Decode<mirror::ObjectArray<mirror::Class>>(args)));
if (result == nullptr || ShouldBlockAccessToMember(result->GetArtMethod(), soa.Self())) {
return nullptr;
}
- return soa.AddLocalReference<jobject>(result);
+ return soa.AddLocalReference<jobject>(result.Get());
}
static ALWAYS_INLINE inline bool MethodMatchesConstructor(
@@ -535,18 +545,19 @@ static jobjectArray Class_getDeclaredConstructorsInternal(
static jobject Class_getDeclaredMethodInternal(JNIEnv* env, jobject javaThis,
jstring name, jobjectArray args) {
ScopedFastNativeObjectAccess soa(env);
+ StackHandleScope<1> hs(soa.Self());
DCHECK_EQ(Runtime::Current()->GetClassLinker()->GetImagePointerSize(), kRuntimePointerSize);
DCHECK(!Runtime::Current()->IsActiveTransaction());
- ObjPtr<mirror::Method> result =
+ Handle<mirror::Method> result = hs.NewHandle(
mirror::Class::GetDeclaredMethodInternal<kRuntimePointerSize, false>(
soa.Self(),
DecodeClass(soa, javaThis),
soa.Decode<mirror::String>(name),
- soa.Decode<mirror::ObjectArray<mirror::Class>>(args));
+ soa.Decode<mirror::ObjectArray<mirror::Class>>(args)));
if (result == nullptr || ShouldBlockAccessToMember(result->GetArtMethod(), soa.Self())) {
return nullptr;
}
- return soa.AddLocalReference<jobject>(result);
+ return soa.AddLocalReference<jobject>(result.Get());
}
static jobjectArray Class_getDeclaredMethodsUnchecked(JNIEnv* env, jobject javaThis,