diff options
Diffstat (limited to 'runtime/openjdkjvmti/ti_method.cc')
| -rw-r--r-- | runtime/openjdkjvmti/ti_method.cc | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/runtime/openjdkjvmti/ti_method.cc b/runtime/openjdkjvmti/ti_method.cc index 4aae4d1d49..7b82e7c075 100644 --- a/runtime/openjdkjvmti/ti_method.cc +++ b/runtime/openjdkjvmti/ti_method.cc @@ -34,6 +34,7 @@ #include "art_jvmti.h" #include "art_method-inl.h" #include "base/enums.h" +#include "modifiers.h" #include "scoped_thread_state_change-inl.h" namespace openjdkjvmti { @@ -114,4 +115,30 @@ jvmtiError MethodUtil::GetMethodDeclaringClass(jvmtiEnv* env ATTRIBUTE_UNUSED, return ERR(NONE); } +jvmtiError MethodUtil::GetMethodModifiers(jvmtiEnv* env ATTRIBUTE_UNUSED, + jmethodID method, + jint* modifiers_ptr) { + if (modifiers_ptr == nullptr) { + return ERR(NULL_POINTER); + } + + art::ScopedObjectAccess soa(art::Thread::Current()); + art::ArtMethod* art_method = soa.DecodeMethod(method); + + uint32_t modifiers = art_method->GetAccessFlags(); + + // Note: Keep this code in sync with Executable.fixMethodFlags. + if ((modifiers & art::kAccAbstract) != 0) { + modifiers &= ~art::kAccNative; + } + modifiers &= ~art::kAccSynchronized; + if ((modifiers & art::kAccDeclaredSynchronized) != 0) { + modifiers |= art::kAccSynchronized; + } + modifiers &= art::kAccJavaFlagsMask; + + *modifiers_ptr = modifiers; + return ERR(NONE); +} + } // namespace openjdkjvmti |