diff options
Diffstat (limited to 'runtime/art_method.h')
-rw-r--r-- | runtime/art_method.h | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/runtime/art_method.h b/runtime/art_method.h index 3d2db690a7..7a8f479d19 100644 --- a/runtime/art_method.h +++ b/runtime/art_method.h @@ -137,7 +137,52 @@ class ArtMethod FINAL { return (GetAccessFlags() & kAccFinal) != 0; } + bool IsIntrinsic() { + return (GetAccessFlags() & kAccIntrinsic) != 0; + } + + void SetIntrinsic(uint32_t intrinsic) { + DCHECK(IsUint<8>(intrinsic)); + uint32_t new_value = (GetAccessFlags() & kAccFlagsNotUsedByIntrinsic) | + kAccIntrinsic | + (intrinsic << POPCOUNT(kAccFlagsNotUsedByIntrinsic)); + if (kIsDebugBuild) { + uint32_t java_flags = (GetAccessFlags() & kAccJavaFlagsMask); + bool is_constructor = IsConstructor(); + bool is_synchronized = IsSynchronized(); + bool skip_access_checks = SkipAccessChecks(); + bool is_fast_native = IsFastNative(); + bool is_copied = IsCopied(); + bool is_miranda = IsMiranda(); + bool is_default = IsDefault(); + bool is_default_conflict = IsDefaultConflicting(); + bool is_compilable = IsCompilable(); + bool must_count_locks = MustCountLocks(); + SetAccessFlags(new_value); + DCHECK_EQ(java_flags, (GetAccessFlags() & kAccJavaFlagsMask)); + DCHECK_EQ(is_constructor, IsConstructor()); + DCHECK_EQ(is_synchronized, IsSynchronized()); + DCHECK_EQ(skip_access_checks, SkipAccessChecks()); + DCHECK_EQ(is_fast_native, IsFastNative()); + DCHECK_EQ(is_copied, IsCopied()); + DCHECK_EQ(is_miranda, IsMiranda()); + DCHECK_EQ(is_default, IsDefault()); + DCHECK_EQ(is_default_conflict, IsDefaultConflicting()); + DCHECK_EQ(is_compilable, IsCompilable()); + DCHECK_EQ(must_count_locks, MustCountLocks()); + } else { + SetAccessFlags(new_value); + } + } + + uint32_t GetIntrinsic() { + DCHECK(IsIntrinsic()); + return (GetAccessFlags() >> POPCOUNT(kAccFlagsNotUsedByIntrinsic)) & kAccMaxIntrinsic; + } + bool IsCopied() { + static_assert((kAccCopied & kAccFlagsNotUsedByIntrinsic) == kAccCopied, + "kAccCopied conflicts with intrinsic modifier"); const bool copied = (GetAccessFlags() & kAccCopied) != 0; // (IsMiranda() || IsDefaultConflicting()) implies copied DCHECK(!(IsMiranda() || IsDefaultConflicting()) || copied) @@ -146,6 +191,8 @@ class ArtMethod FINAL { } bool IsMiranda() { + static_assert((kAccMiranda & kAccFlagsNotUsedByIntrinsic) == kAccMiranda, + "kAccMiranda conflicts with intrinsic modifier"); return (GetAccessFlags() & kAccMiranda) != 0; } @@ -156,6 +203,9 @@ class ArtMethod FINAL { } bool IsCompilable() { + if (IsIntrinsic()) { + return true; + } return (GetAccessFlags() & kAccCompileDontBother) == 0; } @@ -163,11 +213,16 @@ class ArtMethod FINAL { // multiple default methods. It cannot be invoked, throwing an IncompatibleClassChangeError if one // attempts to do so. bool IsDefaultConflicting() { + if (IsIntrinsic()) { + return false; + } return (GetAccessFlags() & kAccDefaultConflict) != 0u; } // This is set by the class linker. bool IsDefault() { + static_assert((kAccDefault & kAccFlagsNotUsedByIntrinsic) == kAccDefault, + "kAccDefault conflicts with intrinsic modifier"); return (GetAccessFlags() & kAccDefault) != 0; } @@ -204,6 +259,9 @@ class ArtMethod FINAL { // Should this method be run in the interpreter and count locks (e.g., failed structured- // locking verification)? bool MustCountLocks() { + if (IsIntrinsic()) { + return false; + } return (GetAccessFlags() & kAccMustCountLocks) != 0; } |