summaryrefslogtreecommitdiff
path: root/runtime/art_method-inl.h
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/art_method-inl.h')
-rw-r--r--runtime/art_method-inl.h38
1 files changed, 33 insertions, 5 deletions
diff --git a/runtime/art_method-inl.h b/runtime/art_method-inl.h
index 65bacd8237..e6e35c89c9 100644
--- a/runtime/art_method-inl.h
+++ b/runtime/art_method-inl.h
@@ -377,6 +377,22 @@ inline bool ArtMethod::HasSingleImplementation() {
return (GetAccessFlags() & kAccSingleImplementation) != 0;
}
+inline bool ArtMethod::IsHiddenIntrinsic(uint32_t ordinal) {
+ switch (static_cast<Intrinsics>(ordinal)) {
+ case Intrinsics::kReferenceGetReferent:
+ case Intrinsics::kSystemArrayCopyChar:
+ case Intrinsics::kStringGetCharsNoCheck:
+ case Intrinsics::kVarHandleFullFence:
+ case Intrinsics::kVarHandleAcquireFence:
+ case Intrinsics::kVarHandleReleaseFence:
+ case Intrinsics::kVarHandleLoadLoadFence:
+ case Intrinsics::kVarHandleStoreStoreFence:
+ return true;
+ default:
+ return false;
+ }
+}
+
inline void ArtMethod::SetIntrinsic(uint32_t intrinsic) {
// Currently we only do intrinsics for static/final methods or methods of final
// classes. We don't set kHasSingleImplementation for those methods.
@@ -413,10 +429,14 @@ inline void ArtMethod::SetIntrinsic(uint32_t intrinsic) {
DCHECK_EQ(is_default_conflict, IsDefaultConflicting());
DCHECK_EQ(is_compilable, IsCompilable());
DCHECK_EQ(must_count_locks, MustCountLocks());
- // We need to special case java.lang.ref.Reference.getRefererent. The Java method
- // is hidden but we do not yet have a way of making intrinsics hidden.
- if (intrinsic != static_cast<uint32_t>(Intrinsics::kReferenceGetReferent)) {
- DCHECK_EQ(hidden_api_list, GetHiddenApiAccessFlags());
+ if (kIsDebugBuild) {
+ if (IsHiddenIntrinsic(intrinsic)) {
+ // Special case some of our intrinsics because the access flags clash
+ // with the intrinsics ordinal.
+ DCHECK_EQ(HiddenApiAccessFlags::kWhitelist, GetHiddenApiAccessFlags());
+ } else {
+ DCHECK_EQ(hidden_api_list, GetHiddenApiAccessFlags());
+ }
}
} else {
SetAccessFlags(new_value);
@@ -466,7 +486,15 @@ inline void ArtMethod::UpdateEntrypoints(const Visitor& visitor, PointerSize poi
}
inline CodeItemInstructionAccessor ArtMethod::DexInstructions() {
- return CodeItemInstructionAccessor(this);
+ return CodeItemInstructionAccessor(*GetDexFile(), GetCodeItem());
+}
+
+inline CodeItemDataAccessor ArtMethod::DexInstructionData() {
+ return CodeItemDataAccessor(*GetDexFile(), GetCodeItem());
+}
+
+inline CodeItemDebugInfoAccessor ArtMethod::DexInstructionDebugInfo() {
+ return CodeItemDebugInfoAccessor(*GetDexFile(), GetCodeItem(), GetDexMethodIndex());
}
} // namespace art