Home | History | Annotate | Download | only in openjdkjvmti
      1 /* Copyright (C) 2016 The Android Open Source Project
      2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      3  *
      4  * This file implements interfaces from the file jvmti.h. This implementation
      5  * is licensed under the same terms as the file jvmti.h.  The
      6  * copyright and license information for the file jvmti.h follows.
      7  *
      8  * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
      9  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     10  *
     11  * This code is free software; you can redistribute it and/or modify it
     12  * under the terms of the GNU General Public License version 2 only, as
     13  * published by the Free Software Foundation.  Oracle designates this
     14  * particular file as subject to the "Classpath" exception as provided
     15  * by Oracle in the LICENSE file that accompanied this code.
     16  *
     17  * This code is distributed in the hope that it will be useful, but WITHOUT
     18  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     19  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     20  * version 2 for more details (a copy is included in the LICENSE file that
     21  * accompanied this code).
     22  *
     23  * You should have received a copy of the GNU General Public License version
     24  * 2 along with this work; if not, write to the Free Software Foundation,
     25  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
     26  *
     27  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
     28  * or visit www.oracle.com if you need additional information or have any
     29  * questions.
     30  */
     31 
     32 #include <string>
     33 #include <type_traits>
     34 #include <vector>
     35 
     36 #include <android-base/logging.h>
     37 
     38 #include <jni.h>
     39 
     40 #include "jvmti.h"
     41 
     42 #include "art_jvmti.h"
     43 #include "base/logging.h"  // For gLogVerbosity.
     44 #include "base/mutex.h"
     45 #include "events-inl.h"
     46 #include "jni_env_ext-inl.h"
     47 #include "obj_ptr-inl.h"
     48 #include "object_tagging.h"
     49 #include "runtime.h"
     50 #include "scoped_thread_state_change-inl.h"
     51 #include "thread-current-inl.h"
     52 #include "thread_list.h"
     53 #include "ti_allocator.h"
     54 #include "ti_breakpoint.h"
     55 #include "ti_class.h"
     56 #include "ti_dump.h"
     57 #include "ti_extension.h"
     58 #include "ti_field.h"
     59 #include "ti_heap.h"
     60 #include "ti_jni.h"
     61 #include "ti_method.h"
     62 #include "ti_monitor.h"
     63 #include "ti_object.h"
     64 #include "ti_phase.h"
     65 #include "ti_properties.h"
     66 #include "ti_redefine.h"
     67 #include "ti_search.h"
     68 #include "ti_stack.h"
     69 #include "ti_thread.h"
     70 #include "ti_threadgroup.h"
     71 #include "ti_timers.h"
     72 #include "transform.h"
     73 
     74 namespace openjdkjvmti {
     75 
     76 // NB These are heap allocated to avoid the static destructors being run if an agent calls exit(3).
     77 // These should never be null.
     78 EventHandler* gEventHandler;
     79 DeoptManager* gDeoptManager;
     80 
     81 #define ENSURE_NON_NULL(n)      \
     82   do {                          \
     83     if ((n) == nullptr) {       \
     84       return ERR(NULL_POINTER); \
     85     }                           \
     86   } while (false)
     87 
     88 // Returns whether we are able to use all jvmti features.
     89 static bool IsFullJvmtiAvailable() {
     90   art::Runtime* runtime = art::Runtime::Current();
     91   return runtime->GetInstrumentation()->IsForcedInterpretOnly() || runtime->IsJavaDebuggable();
     92 }
     93 
     94 class JvmtiFunctions {
     95  private:
     96   static jvmtiError getEnvironmentError(jvmtiEnv* env) {
     97     if (env == nullptr) {
     98       return ERR(INVALID_ENVIRONMENT);
     99     } else if (art::Thread::Current() == nullptr) {
    100       return ERR(UNATTACHED_THREAD);
    101     } else {
    102       return OK;
    103     }
    104   }
    105 
    106 #define ENSURE_VALID_ENV(env)                                            \
    107   do {                                                                   \
    108     jvmtiError ensure_valid_env_ ## __LINE__ = getEnvironmentError(env); \
    109     if (ensure_valid_env_ ## __LINE__ != OK) {                           \
    110       return ensure_valid_env_ ## __LINE__ ;                             \
    111     }                                                                    \
    112   } while (false)
    113 
    114 #define ENSURE_HAS_CAP(env, cap) \
    115   do { \
    116     if (ArtJvmTiEnv::AsArtJvmTiEnv(env)->capabilities.cap != 1) { \
    117       return ERR(MUST_POSSESS_CAPABILITY); \
    118     } \
    119   } while (false)
    120 
    121  public:
    122   static jvmtiError Allocate(jvmtiEnv* env, jlong size, unsigned char** mem_ptr) {
    123     ENSURE_VALID_ENV(env);
    124     ENSURE_NON_NULL(mem_ptr);
    125     return AllocUtil::Allocate(env, size, mem_ptr);
    126   }
    127 
    128   static jvmtiError Deallocate(jvmtiEnv* env, unsigned char* mem) {
    129     ENSURE_VALID_ENV(env);
    130     return AllocUtil::Deallocate(env, mem);
    131   }
    132 
    133   static jvmtiError GetThreadState(jvmtiEnv* env, jthread thread, jint* thread_state_ptr) {
    134     ENSURE_VALID_ENV(env);
    135     return ThreadUtil::GetThreadState(env, thread, thread_state_ptr);
    136   }
    137 
    138   static jvmtiError GetCurrentThread(jvmtiEnv* env, jthread* thread_ptr) {
    139     ENSURE_VALID_ENV(env);
    140     return ThreadUtil::GetCurrentThread(env, thread_ptr);
    141   }
    142 
    143   static jvmtiError GetAllThreads(jvmtiEnv* env, jint* threads_count_ptr, jthread** threads_ptr) {
    144     ENSURE_VALID_ENV(env);
    145     return ThreadUtil::GetAllThreads(env, threads_count_ptr, threads_ptr);
    146   }
    147 
    148   static jvmtiError SuspendThread(jvmtiEnv* env, jthread thread) {
    149     ENSURE_VALID_ENV(env);
    150     ENSURE_HAS_CAP(env, can_suspend);
    151     return ThreadUtil::SuspendThread(env, thread);
    152   }
    153 
    154   static jvmtiError SuspendThreadList(jvmtiEnv* env,
    155                                       jint request_count,
    156                                       const jthread* request_list,
    157                                       jvmtiError* results) {
    158     ENSURE_VALID_ENV(env);
    159     ENSURE_HAS_CAP(env, can_suspend);
    160     return ThreadUtil::SuspendThreadList(env, request_count, request_list, results);
    161   }
    162 
    163   static jvmtiError ResumeThread(jvmtiEnv* env, jthread thread) {
    164     ENSURE_VALID_ENV(env);
    165     ENSURE_HAS_CAP(env, can_suspend);
    166     return ThreadUtil::ResumeThread(env, thread);
    167   }
    168 
    169   static jvmtiError ResumeThreadList(jvmtiEnv* env,
    170                                      jint request_count,
    171                                      const jthread* request_list,
    172                                      jvmtiError* results) {
    173     ENSURE_VALID_ENV(env);
    174     ENSURE_HAS_CAP(env, can_suspend);
    175     return ThreadUtil::ResumeThreadList(env, request_count, request_list, results);
    176   }
    177 
    178   static jvmtiError StopThread(jvmtiEnv* env, jthread thread, jobject exception) {
    179     ENSURE_VALID_ENV(env);
    180     ENSURE_HAS_CAP(env, can_signal_thread);
    181     return ThreadUtil::StopThread(env, thread, exception);
    182   }
    183 
    184   static jvmtiError InterruptThread(jvmtiEnv* env, jthread thread) {
    185     ENSURE_VALID_ENV(env);
    186     ENSURE_HAS_CAP(env, can_signal_thread);
    187     return ThreadUtil::InterruptThread(env, thread);
    188   }
    189 
    190   static jvmtiError GetThreadInfo(jvmtiEnv* env, jthread thread, jvmtiThreadInfo* info_ptr) {
    191     ENSURE_VALID_ENV(env);
    192     return ThreadUtil::GetThreadInfo(env, thread, info_ptr);
    193   }
    194 
    195   static jvmtiError GetOwnedMonitorInfo(jvmtiEnv* env,
    196                                         jthread thread,
    197                                         jint* owned_monitor_count_ptr,
    198                                         jobject** owned_monitors_ptr) {
    199     ENSURE_VALID_ENV(env);
    200     ENSURE_HAS_CAP(env, can_get_owned_monitor_info);
    201     return StackUtil::GetOwnedMonitorInfo(env,
    202                                           thread,
    203                                           owned_monitor_count_ptr,
    204                                           owned_monitors_ptr);
    205   }
    206 
    207   static jvmtiError GetOwnedMonitorStackDepthInfo(jvmtiEnv* env,
    208                                                   jthread thread,
    209                                                   jint* monitor_info_count_ptr,
    210                                                   jvmtiMonitorStackDepthInfo** monitor_info_ptr) {
    211     ENSURE_VALID_ENV(env);
    212     ENSURE_HAS_CAP(env, can_get_owned_monitor_stack_depth_info);
    213     return StackUtil::GetOwnedMonitorStackDepthInfo(env,
    214                                                     thread,
    215                                                     monitor_info_count_ptr,
    216                                                     monitor_info_ptr);
    217   }
    218 
    219   static jvmtiError GetCurrentContendedMonitor(jvmtiEnv* env,
    220                                                jthread thread,
    221                                                jobject* monitor_ptr) {
    222     ENSURE_VALID_ENV(env);
    223     ENSURE_HAS_CAP(env, can_get_current_contended_monitor);
    224     return MonitorUtil::GetCurrentContendedMonitor(env, thread, monitor_ptr);
    225   }
    226 
    227   static jvmtiError RunAgentThread(jvmtiEnv* env,
    228                                    jthread thread,
    229                                    jvmtiStartFunction proc,
    230                                    const void* arg,
    231                                    jint priority) {
    232     ENSURE_VALID_ENV(env);
    233     return ThreadUtil::RunAgentThread(env, thread, proc, arg, priority);
    234   }
    235 
    236   static jvmtiError SetThreadLocalStorage(jvmtiEnv* env, jthread thread, const void* data) {
    237     ENSURE_VALID_ENV(env);
    238     return ThreadUtil::SetThreadLocalStorage(env, thread, data);
    239   }
    240 
    241   static jvmtiError GetThreadLocalStorage(jvmtiEnv* env, jthread thread, void** data_ptr) {
    242     ENSURE_VALID_ENV(env);
    243     return ThreadUtil::GetThreadLocalStorage(env, thread, data_ptr);
    244   }
    245 
    246   static jvmtiError GetTopThreadGroups(jvmtiEnv* env,
    247                                        jint* group_count_ptr,
    248                                        jthreadGroup** groups_ptr) {
    249     ENSURE_VALID_ENV(env);
    250     return ThreadGroupUtil::GetTopThreadGroups(env, group_count_ptr, groups_ptr);
    251   }
    252 
    253   static jvmtiError GetThreadGroupInfo(jvmtiEnv* env,
    254                                        jthreadGroup group,
    255                                        jvmtiThreadGroupInfo* info_ptr) {
    256     ENSURE_VALID_ENV(env);
    257     return ThreadGroupUtil::GetThreadGroupInfo(env, group, info_ptr);
    258   }
    259 
    260   static jvmtiError GetThreadGroupChildren(jvmtiEnv* env,
    261                                            jthreadGroup group,
    262                                            jint* thread_count_ptr,
    263                                            jthread** threads_ptr,
    264                                            jint* group_count_ptr,
    265                                            jthreadGroup** groups_ptr) {
    266     ENSURE_VALID_ENV(env);
    267     return ThreadGroupUtil::GetThreadGroupChildren(env,
    268                                                    group,
    269                                                    thread_count_ptr,
    270                                                    threads_ptr,
    271                                                    group_count_ptr,
    272                                                    groups_ptr);
    273   }
    274 
    275   static jvmtiError GetStackTrace(jvmtiEnv* env,
    276                                   jthread thread,
    277                                   jint start_depth,
    278                                   jint max_frame_count,
    279                                   jvmtiFrameInfo* frame_buffer,
    280                                   jint* count_ptr) {
    281     ENSURE_VALID_ENV(env);
    282     return StackUtil::GetStackTrace(env,
    283                                     thread,
    284                                     start_depth,
    285                                     max_frame_count,
    286                                     frame_buffer,
    287                                     count_ptr);
    288   }
    289 
    290   static jvmtiError GetAllStackTraces(jvmtiEnv* env,
    291                                       jint max_frame_count,
    292                                       jvmtiStackInfo** stack_info_ptr,
    293                                       jint* thread_count_ptr) {
    294     ENSURE_VALID_ENV(env);
    295     return StackUtil::GetAllStackTraces(env, max_frame_count, stack_info_ptr, thread_count_ptr);
    296   }
    297 
    298   static jvmtiError GetThreadListStackTraces(jvmtiEnv* env,
    299                                              jint thread_count,
    300                                              const jthread* thread_list,
    301                                              jint max_frame_count,
    302                                              jvmtiStackInfo** stack_info_ptr) {
    303     ENSURE_VALID_ENV(env);
    304     return StackUtil::GetThreadListStackTraces(env,
    305                                                thread_count,
    306                                                thread_list,
    307                                                max_frame_count,
    308                                                stack_info_ptr);
    309   }
    310 
    311   static jvmtiError GetFrameCount(jvmtiEnv* env, jthread thread, jint* count_ptr) {
    312     ENSURE_VALID_ENV(env);
    313     return StackUtil::GetFrameCount(env, thread, count_ptr);
    314   }
    315 
    316   static jvmtiError PopFrame(jvmtiEnv* env, jthread thread ATTRIBUTE_UNUSED) {
    317     ENSURE_VALID_ENV(env);
    318     ENSURE_HAS_CAP(env, can_pop_frame);
    319     return ERR(NOT_IMPLEMENTED);
    320   }
    321 
    322   static jvmtiError GetFrameLocation(jvmtiEnv* env,
    323                                      jthread thread,
    324                                      jint depth,
    325                                      jmethodID* method_ptr,
    326                                      jlocation* location_ptr) {
    327     ENSURE_VALID_ENV(env);
    328     return StackUtil::GetFrameLocation(env, thread, depth, method_ptr, location_ptr);
    329   }
    330 
    331   static jvmtiError NotifyFramePop(jvmtiEnv* env, jthread thread, jint depth) {
    332     ENSURE_VALID_ENV(env);
    333     ENSURE_HAS_CAP(env, can_generate_frame_pop_events);
    334     return StackUtil::NotifyFramePop(env, thread, depth);
    335   }
    336 
    337   static jvmtiError ForceEarlyReturnObject(jvmtiEnv* env,
    338                                            jthread thread ATTRIBUTE_UNUSED,
    339                                            jobject value ATTRIBUTE_UNUSED) {
    340     ENSURE_VALID_ENV(env);
    341     ENSURE_HAS_CAP(env, can_force_early_return);
    342     return ERR(NOT_IMPLEMENTED);
    343   }
    344 
    345   static jvmtiError ForceEarlyReturnInt(jvmtiEnv* env,
    346                                         jthread thread ATTRIBUTE_UNUSED,
    347                                         jint value ATTRIBUTE_UNUSED) {
    348     ENSURE_VALID_ENV(env);
    349     ENSURE_HAS_CAP(env, can_force_early_return);
    350     return ERR(NOT_IMPLEMENTED);
    351   }
    352 
    353   static jvmtiError ForceEarlyReturnLong(jvmtiEnv* env,
    354                                          jthread thread ATTRIBUTE_UNUSED,
    355                                          jlong value ATTRIBUTE_UNUSED) {
    356     ENSURE_VALID_ENV(env);
    357     ENSURE_HAS_CAP(env, can_force_early_return);
    358     return ERR(NOT_IMPLEMENTED);
    359   }
    360 
    361   static jvmtiError ForceEarlyReturnFloat(jvmtiEnv* env,
    362                                           jthread thread ATTRIBUTE_UNUSED,
    363                                           jfloat value ATTRIBUTE_UNUSED) {
    364     ENSURE_VALID_ENV(env);
    365     ENSURE_HAS_CAP(env, can_force_early_return);
    366     return ERR(NOT_IMPLEMENTED);
    367   }
    368 
    369   static jvmtiError ForceEarlyReturnDouble(jvmtiEnv* env,
    370                                            jthread thread ATTRIBUTE_UNUSED,
    371                                            jdouble value ATTRIBUTE_UNUSED) {
    372     ENSURE_VALID_ENV(env);
    373     ENSURE_HAS_CAP(env, can_force_early_return);
    374     return ERR(NOT_IMPLEMENTED);
    375   }
    376 
    377   static jvmtiError ForceEarlyReturnVoid(jvmtiEnv* env, jthread thread ATTRIBUTE_UNUSED) {
    378     ENSURE_VALID_ENV(env);
    379     ENSURE_HAS_CAP(env, can_force_early_return);
    380     return ERR(NOT_IMPLEMENTED);
    381   }
    382 
    383   static jvmtiError FollowReferences(jvmtiEnv* env,
    384                                      jint heap_filter,
    385                                      jclass klass,
    386                                      jobject initial_object,
    387                                      const jvmtiHeapCallbacks* callbacks,
    388                                      const void* user_data) {
    389     ENSURE_VALID_ENV(env);
    390     ENSURE_HAS_CAP(env, can_tag_objects);
    391     HeapUtil heap_util(ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table.get());
    392     return heap_util.FollowReferences(env,
    393                                       heap_filter,
    394                                       klass,
    395                                       initial_object,
    396                                       callbacks,
    397                                       user_data);
    398   }
    399 
    400   static jvmtiError IterateThroughHeap(jvmtiEnv* env,
    401                                        jint heap_filter,
    402                                        jclass klass,
    403                                        const jvmtiHeapCallbacks* callbacks,
    404                                        const void* user_data) {
    405     ENSURE_VALID_ENV(env);
    406     ENSURE_HAS_CAP(env, can_tag_objects);
    407     HeapUtil heap_util(ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table.get());
    408     return heap_util.IterateThroughHeap(env, heap_filter, klass, callbacks, user_data);
    409   }
    410 
    411   static jvmtiError GetTag(jvmtiEnv* env, jobject object, jlong* tag_ptr) {
    412     ENSURE_VALID_ENV(env);
    413     ENSURE_HAS_CAP(env, can_tag_objects);
    414 
    415     JNIEnv* jni_env = GetJniEnv(env);
    416     if (jni_env == nullptr) {
    417       return ERR(INTERNAL);
    418     }
    419 
    420     art::ScopedObjectAccess soa(jni_env);
    421     art::ObjPtr<art::mirror::Object> obj = soa.Decode<art::mirror::Object>(object);
    422     if (!ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table->GetTag(obj.Ptr(), tag_ptr)) {
    423       *tag_ptr = 0;
    424     }
    425 
    426     return ERR(NONE);
    427   }
    428 
    429   static jvmtiError SetTag(jvmtiEnv* env, jobject object, jlong tag) {
    430     ENSURE_VALID_ENV(env);
    431     ENSURE_HAS_CAP(env, can_tag_objects);
    432 
    433     if (object == nullptr) {
    434       return ERR(NULL_POINTER);
    435     }
    436 
    437     JNIEnv* jni_env = GetJniEnv(env);
    438     if (jni_env == nullptr) {
    439       return ERR(INTERNAL);
    440     }
    441 
    442     art::ScopedObjectAccess soa(jni_env);
    443     art::ObjPtr<art::mirror::Object> obj = soa.Decode<art::mirror::Object>(object);
    444     ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table->Set(obj.Ptr(), tag);
    445 
    446     return ERR(NONE);
    447   }
    448 
    449   static jvmtiError GetObjectsWithTags(jvmtiEnv* env,
    450                                        jint tag_count,
    451                                        const jlong* tags,
    452                                        jint* count_ptr,
    453                                        jobject** object_result_ptr,
    454                                        jlong** tag_result_ptr) {
    455     ENSURE_VALID_ENV(env);
    456     ENSURE_HAS_CAP(env, can_tag_objects);
    457 
    458     JNIEnv* jni_env = GetJniEnv(env);
    459     if (jni_env == nullptr) {
    460       return ERR(INTERNAL);
    461     }
    462 
    463     art::ScopedObjectAccess soa(jni_env);
    464     return ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table->GetTaggedObjects(env,
    465                                                                                tag_count,
    466                                                                                tags,
    467                                                                                count_ptr,
    468                                                                                object_result_ptr,
    469                                                                                tag_result_ptr);
    470   }
    471 
    472   static jvmtiError ForceGarbageCollection(jvmtiEnv* env) {
    473     ENSURE_VALID_ENV(env);
    474     return HeapUtil::ForceGarbageCollection(env);
    475   }
    476 
    477   static jvmtiError IterateOverObjectsReachableFromObject(
    478       jvmtiEnv* env,
    479       jobject object ATTRIBUTE_UNUSED,
    480       jvmtiObjectReferenceCallback object_reference_callback ATTRIBUTE_UNUSED,
    481       const void* user_data ATTRIBUTE_UNUSED) {
    482     ENSURE_VALID_ENV(env);
    483     ENSURE_HAS_CAP(env, can_tag_objects);
    484     return ERR(NOT_IMPLEMENTED);
    485   }
    486 
    487   static jvmtiError IterateOverReachableObjects(
    488       jvmtiEnv* env,
    489       jvmtiHeapRootCallback heap_root_callback ATTRIBUTE_UNUSED,
    490       jvmtiStackReferenceCallback stack_ref_callback ATTRIBUTE_UNUSED,
    491       jvmtiObjectReferenceCallback object_ref_callback ATTRIBUTE_UNUSED,
    492       const void* user_data ATTRIBUTE_UNUSED) {
    493     ENSURE_VALID_ENV(env);
    494     ENSURE_HAS_CAP(env, can_tag_objects);
    495     return ERR(NOT_IMPLEMENTED);
    496   }
    497 
    498   static jvmtiError IterateOverHeap(jvmtiEnv* env,
    499                                     jvmtiHeapObjectFilter object_filter ATTRIBUTE_UNUSED,
    500                                     jvmtiHeapObjectCallback heap_object_callback ATTRIBUTE_UNUSED,
    501                                     const void* user_data ATTRIBUTE_UNUSED) {
    502     ENSURE_VALID_ENV(env);
    503     ENSURE_HAS_CAP(env, can_tag_objects);
    504     return ERR(NOT_IMPLEMENTED);
    505   }
    506 
    507   static jvmtiError IterateOverInstancesOfClass(
    508       jvmtiEnv* env,
    509       jclass klass ATTRIBUTE_UNUSED,
    510       jvmtiHeapObjectFilter object_filter ATTRIBUTE_UNUSED,
    511       jvmtiHeapObjectCallback heap_object_callback ATTRIBUTE_UNUSED,
    512       const void* user_data ATTRIBUTE_UNUSED) {
    513     ENSURE_VALID_ENV(env);
    514     ENSURE_HAS_CAP(env, can_tag_objects);
    515     return ERR(NOT_IMPLEMENTED);
    516   }
    517 
    518   static jvmtiError GetLocalObject(jvmtiEnv* env,
    519                                    jthread thread,
    520                                    jint depth,
    521                                    jint slot,
    522                                    jobject* value_ptr) {
    523     ENSURE_VALID_ENV(env);
    524     ENSURE_HAS_CAP(env, can_access_local_variables);
    525     return MethodUtil::GetLocalVariable(env, thread, depth, slot, value_ptr);
    526   }
    527 
    528   static jvmtiError GetLocalInstance(jvmtiEnv* env,
    529                                      jthread thread,
    530                                      jint depth,
    531                                      jobject* value_ptr) {
    532     ENSURE_VALID_ENV(env);
    533     ENSURE_HAS_CAP(env, can_access_local_variables);
    534     return MethodUtil::GetLocalInstance(env, thread, depth, value_ptr);
    535   }
    536 
    537   static jvmtiError GetLocalInt(jvmtiEnv* env,
    538                                 jthread thread,
    539                                 jint depth,
    540                                 jint slot,
    541                                 jint* value_ptr) {
    542     ENSURE_VALID_ENV(env);
    543     ENSURE_HAS_CAP(env, can_access_local_variables);
    544     return MethodUtil::GetLocalVariable(env, thread, depth, slot, value_ptr);
    545   }
    546 
    547   static jvmtiError GetLocalLong(jvmtiEnv* env,
    548                                  jthread thread,
    549                                  jint depth,
    550                                  jint slot,
    551                                  jlong* value_ptr) {
    552     ENSURE_VALID_ENV(env);
    553     ENSURE_HAS_CAP(env, can_access_local_variables);
    554     return MethodUtil::GetLocalVariable(env, thread, depth, slot, value_ptr);
    555   }
    556 
    557   static jvmtiError GetLocalFloat(jvmtiEnv* env,
    558                                   jthread thread,
    559                                   jint depth,
    560                                   jint slot,
    561                                   jfloat* value_ptr) {
    562     ENSURE_VALID_ENV(env);
    563     ENSURE_HAS_CAP(env, can_access_local_variables);
    564     return MethodUtil::GetLocalVariable(env, thread, depth, slot, value_ptr);
    565   }
    566 
    567   static jvmtiError GetLocalDouble(jvmtiEnv* env,
    568                                    jthread thread,
    569                                    jint depth,
    570                                    jint slot,
    571                                    jdouble* value_ptr) {
    572     ENSURE_VALID_ENV(env);
    573     ENSURE_HAS_CAP(env, can_access_local_variables);
    574     return MethodUtil::GetLocalVariable(env, thread, depth, slot, value_ptr);
    575   }
    576 
    577   static jvmtiError SetLocalObject(jvmtiEnv* env,
    578                                    jthread thread,
    579                                    jint depth,
    580                                    jint slot,
    581                                    jobject value) {
    582     ENSURE_VALID_ENV(env);
    583     ENSURE_HAS_CAP(env, can_access_local_variables);
    584     return MethodUtil::SetLocalVariable(env, thread, depth, slot, value);
    585   }
    586 
    587   static jvmtiError SetLocalInt(jvmtiEnv* env,
    588                                 jthread thread,
    589                                 jint depth,
    590                                 jint slot,
    591                                 jint value) {
    592     ENSURE_VALID_ENV(env);
    593     ENSURE_HAS_CAP(env, can_access_local_variables);
    594     return MethodUtil::SetLocalVariable(env, thread, depth, slot, value);
    595   }
    596 
    597   static jvmtiError SetLocalLong(jvmtiEnv* env,
    598                                  jthread thread,
    599                                  jint depth,
    600                                  jint slot,
    601                                  jlong value) {
    602     ENSURE_VALID_ENV(env);
    603     ENSURE_HAS_CAP(env, can_access_local_variables);
    604     return MethodUtil::SetLocalVariable(env, thread, depth, slot, value);
    605   }
    606 
    607   static jvmtiError SetLocalFloat(jvmtiEnv* env,
    608                                   jthread thread,
    609                                   jint depth,
    610                                   jint slot,
    611                                   jfloat value) {
    612     ENSURE_VALID_ENV(env);
    613     ENSURE_HAS_CAP(env, can_access_local_variables);
    614     return MethodUtil::SetLocalVariable(env, thread, depth, slot, value);
    615   }
    616 
    617   static jvmtiError SetLocalDouble(jvmtiEnv* env,
    618                                    jthread thread,
    619                                    jint depth,
    620                                    jint slot,
    621                                    jdouble value) {
    622     ENSURE_VALID_ENV(env);
    623     ENSURE_HAS_CAP(env, can_access_local_variables);
    624     return MethodUtil::SetLocalVariable(env, thread, depth, slot, value);
    625   }
    626 
    627 
    628   static jvmtiError SetBreakpoint(jvmtiEnv* env, jmethodID method, jlocation location) {
    629     ENSURE_VALID_ENV(env);
    630     ENSURE_HAS_CAP(env, can_generate_breakpoint_events);
    631     return BreakpointUtil::SetBreakpoint(env, method, location);
    632   }
    633 
    634   static jvmtiError ClearBreakpoint(jvmtiEnv* env, jmethodID method, jlocation location) {
    635     ENSURE_VALID_ENV(env);
    636     ENSURE_HAS_CAP(env, can_generate_breakpoint_events);
    637     return BreakpointUtil::ClearBreakpoint(env, method, location);
    638   }
    639 
    640   static jvmtiError SetFieldAccessWatch(jvmtiEnv* env, jclass klass, jfieldID field) {
    641     ENSURE_VALID_ENV(env);
    642     ENSURE_HAS_CAP(env, can_generate_field_access_events);
    643     return FieldUtil::SetFieldAccessWatch(env, klass, field);
    644   }
    645 
    646   static jvmtiError ClearFieldAccessWatch(jvmtiEnv* env, jclass klass, jfieldID field) {
    647     ENSURE_VALID_ENV(env);
    648     ENSURE_HAS_CAP(env, can_generate_field_access_events);
    649     return FieldUtil::ClearFieldAccessWatch(env, klass, field);
    650   }
    651 
    652   static jvmtiError SetFieldModificationWatch(jvmtiEnv* env, jclass klass, jfieldID field) {
    653     ENSURE_VALID_ENV(env);
    654     ENSURE_HAS_CAP(env, can_generate_field_modification_events);
    655     return FieldUtil::SetFieldModificationWatch(env, klass, field);
    656   }
    657 
    658   static jvmtiError ClearFieldModificationWatch(jvmtiEnv* env, jclass klass, jfieldID field) {
    659     ENSURE_VALID_ENV(env);
    660     ENSURE_HAS_CAP(env, can_generate_field_modification_events);
    661     return FieldUtil::ClearFieldModificationWatch(env, klass, field);
    662   }
    663 
    664   static jvmtiError GetLoadedClasses(jvmtiEnv* env, jint* class_count_ptr, jclass** classes_ptr) {
    665     ENSURE_VALID_ENV(env);
    666     HeapUtil heap_util(ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table.get());
    667     return heap_util.GetLoadedClasses(env, class_count_ptr, classes_ptr);
    668   }
    669 
    670   static jvmtiError GetClassLoaderClasses(jvmtiEnv* env,
    671                                           jobject initiating_loader,
    672                                           jint* class_count_ptr,
    673                                           jclass** classes_ptr) {
    674     ENSURE_VALID_ENV(env);
    675     return ClassUtil::GetClassLoaderClasses(env, initiating_loader, class_count_ptr, classes_ptr);
    676   }
    677 
    678   static jvmtiError GetClassSignature(jvmtiEnv* env,
    679                                       jclass klass,
    680                                       char** signature_ptr,
    681                                       char** generic_ptr) {
    682     ENSURE_VALID_ENV(env);
    683     return ClassUtil::GetClassSignature(env, klass, signature_ptr, generic_ptr);
    684   }
    685 
    686   static jvmtiError GetClassStatus(jvmtiEnv* env, jclass klass, jint* status_ptr) {
    687     ENSURE_VALID_ENV(env);
    688     return ClassUtil::GetClassStatus(env, klass, status_ptr);
    689   }
    690 
    691   static jvmtiError GetSourceFileName(jvmtiEnv* env, jclass klass, char** source_name_ptr) {
    692     ENSURE_VALID_ENV(env);
    693     ENSURE_HAS_CAP(env, can_get_source_file_name);
    694     return ClassUtil::GetSourceFileName(env, klass, source_name_ptr);
    695   }
    696 
    697   static jvmtiError GetClassModifiers(jvmtiEnv* env, jclass klass, jint* modifiers_ptr) {
    698     ENSURE_VALID_ENV(env);
    699     return ClassUtil::GetClassModifiers(env, klass, modifiers_ptr);
    700   }
    701 
    702   static jvmtiError GetClassMethods(jvmtiEnv* env,
    703                                     jclass klass,
    704                                     jint* method_count_ptr,
    705                                     jmethodID** methods_ptr) {
    706     ENSURE_VALID_ENV(env);
    707     return ClassUtil::GetClassMethods(env, klass, method_count_ptr, methods_ptr);
    708   }
    709 
    710   static jvmtiError GetClassFields(jvmtiEnv* env,
    711                                    jclass klass,
    712                                    jint* field_count_ptr,
    713                                    jfieldID** fields_ptr) {
    714     ENSURE_VALID_ENV(env);
    715     return ClassUtil::GetClassFields(env, klass, field_count_ptr, fields_ptr);
    716   }
    717 
    718   static jvmtiError GetImplementedInterfaces(jvmtiEnv* env,
    719                                              jclass klass,
    720                                              jint* interface_count_ptr,
    721                                              jclass** interfaces_ptr) {
    722     ENSURE_VALID_ENV(env);
    723     return ClassUtil::GetImplementedInterfaces(env, klass, interface_count_ptr, interfaces_ptr);
    724   }
    725 
    726   static jvmtiError GetClassVersionNumbers(jvmtiEnv* env,
    727                                            jclass klass,
    728                                            jint* minor_version_ptr,
    729                                            jint* major_version_ptr) {
    730     ENSURE_VALID_ENV(env);
    731     return ClassUtil::GetClassVersionNumbers(env, klass, minor_version_ptr, major_version_ptr);
    732   }
    733 
    734   static jvmtiError GetConstantPool(jvmtiEnv* env,
    735                                     jclass klass ATTRIBUTE_UNUSED,
    736                                     jint* constant_pool_count_ptr ATTRIBUTE_UNUSED,
    737                                     jint* constant_pool_byte_count_ptr ATTRIBUTE_UNUSED,
    738                                     unsigned char** constant_pool_bytes_ptr ATTRIBUTE_UNUSED) {
    739     ENSURE_VALID_ENV(env);
    740     ENSURE_HAS_CAP(env, can_get_constant_pool);
    741     return ERR(NOT_IMPLEMENTED);
    742   }
    743 
    744   static jvmtiError IsInterface(jvmtiEnv* env, jclass klass, jboolean* is_interface_ptr) {
    745     ENSURE_VALID_ENV(env);
    746     return ClassUtil::IsInterface(env, klass, is_interface_ptr);
    747   }
    748 
    749   static jvmtiError IsArrayClass(jvmtiEnv* env,
    750                                  jclass klass,
    751                                  jboolean* is_array_class_ptr) {
    752     ENSURE_VALID_ENV(env);
    753     return ClassUtil::IsArrayClass(env, klass, is_array_class_ptr);
    754   }
    755 
    756   static jvmtiError IsModifiableClass(jvmtiEnv* env,
    757                                       jclass klass,
    758                                       jboolean* is_modifiable_class_ptr) {
    759     ENSURE_VALID_ENV(env);
    760     return Redefiner::IsModifiableClass(env, klass, is_modifiable_class_ptr);
    761   }
    762 
    763   static jvmtiError GetClassLoader(jvmtiEnv* env, jclass klass, jobject* classloader_ptr) {
    764     ENSURE_VALID_ENV(env);
    765     return ClassUtil::GetClassLoader(env, klass, classloader_ptr);
    766   }
    767 
    768   static jvmtiError GetSourceDebugExtension(jvmtiEnv* env,
    769                                             jclass klass,
    770                                             char** source_debug_extension_ptr) {
    771     ENSURE_VALID_ENV(env);
    772     ENSURE_HAS_CAP(env, can_get_source_debug_extension);
    773     return ClassUtil::GetSourceDebugExtension(env, klass, source_debug_extension_ptr);
    774   }
    775 
    776   static jvmtiError RetransformClasses(jvmtiEnv* env, jint class_count, const jclass* classes) {
    777     ENSURE_VALID_ENV(env);
    778     ENSURE_HAS_CAP(env, can_retransform_classes);
    779     std::string error_msg;
    780     jvmtiError res = Transformer::RetransformClasses(ArtJvmTiEnv::AsArtJvmTiEnv(env),
    781                                                      gEventHandler,
    782                                                      art::Runtime::Current(),
    783                                                      art::Thread::Current(),
    784                                                      class_count,
    785                                                      classes,
    786                                                      &error_msg);
    787     if (res != OK) {
    788       LOG(WARNING) << "FAILURE TO RETRANFORM " << error_msg;
    789     }
    790     return res;
    791   }
    792 
    793   static jvmtiError RedefineClasses(jvmtiEnv* env,
    794                                     jint class_count,
    795                                     const jvmtiClassDefinition* class_definitions) {
    796     ENSURE_VALID_ENV(env);
    797     ENSURE_HAS_CAP(env, can_redefine_classes);
    798     std::string error_msg;
    799     jvmtiError res = Redefiner::RedefineClasses(ArtJvmTiEnv::AsArtJvmTiEnv(env),
    800                                                 gEventHandler,
    801                                                 art::Runtime::Current(),
    802                                                 art::Thread::Current(),
    803                                                 class_count,
    804                                                 class_definitions,
    805                                                 &error_msg);
    806     if (res != OK) {
    807       LOG(WARNING) << "FAILURE TO REDEFINE " << error_msg;
    808     }
    809     return res;
    810   }
    811 
    812   static jvmtiError GetObjectSize(jvmtiEnv* env, jobject object, jlong* size_ptr) {
    813     ENSURE_VALID_ENV(env);
    814     return ObjectUtil::GetObjectSize(env, object, size_ptr);
    815   }
    816 
    817   static jvmtiError GetObjectHashCode(jvmtiEnv* env, jobject object, jint* hash_code_ptr) {
    818     ENSURE_VALID_ENV(env);
    819     return ObjectUtil::GetObjectHashCode(env, object, hash_code_ptr);
    820   }
    821 
    822   static jvmtiError GetObjectMonitorUsage(jvmtiEnv* env,
    823                                           jobject object,
    824                                           jvmtiMonitorUsage* info_ptr) {
    825     ENSURE_VALID_ENV(env);
    826     ENSURE_HAS_CAP(env, can_get_monitor_info);
    827     return ObjectUtil::GetObjectMonitorUsage(env, object, info_ptr);
    828   }
    829 
    830   static jvmtiError GetFieldName(jvmtiEnv* env,
    831                                  jclass klass,
    832                                  jfieldID field,
    833                                  char** name_ptr,
    834                                  char** signature_ptr,
    835                                  char** generic_ptr) {
    836     ENSURE_VALID_ENV(env);
    837     return FieldUtil::GetFieldName(env, klass, field, name_ptr, signature_ptr, generic_ptr);
    838   }
    839 
    840   static jvmtiError GetFieldDeclaringClass(jvmtiEnv* env,
    841                                            jclass klass,
    842                                            jfieldID field,
    843                                            jclass* declaring_class_ptr) {
    844     ENSURE_VALID_ENV(env);
    845     return FieldUtil::GetFieldDeclaringClass(env, klass, field, declaring_class_ptr);
    846   }
    847 
    848   static jvmtiError GetFieldModifiers(jvmtiEnv* env,
    849                                       jclass klass,
    850                                       jfieldID field,
    851                                       jint* modifiers_ptr) {
    852     ENSURE_VALID_ENV(env);
    853     return FieldUtil::GetFieldModifiers(env, klass, field, modifiers_ptr);
    854   }
    855 
    856   static jvmtiError IsFieldSynthetic(jvmtiEnv* env,
    857                                      jclass klass,
    858                                      jfieldID field,
    859                                      jboolean* is_synthetic_ptr) {
    860     ENSURE_VALID_ENV(env);
    861     ENSURE_HAS_CAP(env, can_get_synthetic_attribute);
    862     return FieldUtil::IsFieldSynthetic(env, klass, field, is_synthetic_ptr);
    863   }
    864 
    865   static jvmtiError GetMethodName(jvmtiEnv* env,
    866                                   jmethodID method,
    867                                   char** name_ptr,
    868                                   char** signature_ptr,
    869                                   char** generic_ptr) {
    870     ENSURE_VALID_ENV(env);
    871     return MethodUtil::GetMethodName(env, method, name_ptr, signature_ptr, generic_ptr);
    872   }
    873 
    874   static jvmtiError GetMethodDeclaringClass(jvmtiEnv* env,
    875                                             jmethodID method,
    876                                             jclass* declaring_class_ptr) {
    877     ENSURE_VALID_ENV(env);
    878     return MethodUtil::GetMethodDeclaringClass(env, method, declaring_class_ptr);
    879   }
    880 
    881   static jvmtiError GetMethodModifiers(jvmtiEnv* env,
    882                                        jmethodID method,
    883                                        jint* modifiers_ptr) {
    884     ENSURE_VALID_ENV(env);
    885     return MethodUtil::GetMethodModifiers(env, method, modifiers_ptr);
    886   }
    887 
    888   static jvmtiError GetMaxLocals(jvmtiEnv* env,
    889                                  jmethodID method,
    890                                  jint* max_ptr) {
    891     ENSURE_VALID_ENV(env);
    892     return MethodUtil::GetMaxLocals(env, method, max_ptr);
    893   }
    894 
    895   static jvmtiError GetArgumentsSize(jvmtiEnv* env,
    896                                      jmethodID method,
    897                                      jint* size_ptr) {
    898     ENSURE_VALID_ENV(env);
    899     return MethodUtil::GetArgumentsSize(env, method, size_ptr);
    900   }
    901 
    902   static jvmtiError GetLineNumberTable(jvmtiEnv* env,
    903                                        jmethodID method,
    904                                        jint* entry_count_ptr,
    905                                        jvmtiLineNumberEntry** table_ptr) {
    906     ENSURE_VALID_ENV(env);
    907     ENSURE_HAS_CAP(env, can_get_line_numbers);
    908     return MethodUtil::GetLineNumberTable(env, method, entry_count_ptr, table_ptr);
    909   }
    910 
    911   static jvmtiError GetMethodLocation(jvmtiEnv* env,
    912                                       jmethodID method,
    913                                       jlocation* start_location_ptr,
    914                                       jlocation* end_location_ptr) {
    915     ENSURE_VALID_ENV(env);
    916     return MethodUtil::GetMethodLocation(env, method, start_location_ptr, end_location_ptr);
    917   }
    918 
    919   static jvmtiError GetLocalVariableTable(jvmtiEnv* env,
    920                                           jmethodID method,
    921                                           jint* entry_count_ptr,
    922                                           jvmtiLocalVariableEntry** table_ptr) {
    923     ENSURE_VALID_ENV(env);
    924     ENSURE_HAS_CAP(env, can_access_local_variables);
    925     return MethodUtil::GetLocalVariableTable(env, method, entry_count_ptr, table_ptr);
    926   }
    927 
    928   static jvmtiError GetBytecodes(jvmtiEnv* env,
    929                                  jmethodID method,
    930                                  jint* bytecode_count_ptr,
    931                                  unsigned char** bytecodes_ptr) {
    932     ENSURE_VALID_ENV(env);
    933     ENSURE_HAS_CAP(env, can_get_bytecodes);
    934     return MethodUtil::GetBytecodes(env, method, bytecode_count_ptr, bytecodes_ptr);
    935   }
    936 
    937   static jvmtiError IsMethodNative(jvmtiEnv* env, jmethodID method, jboolean* is_native_ptr) {
    938     ENSURE_VALID_ENV(env);
    939     return MethodUtil::IsMethodNative(env, method, is_native_ptr);
    940   }
    941 
    942   static jvmtiError IsMethodSynthetic(jvmtiEnv* env, jmethodID method, jboolean* is_synthetic_ptr) {
    943     ENSURE_VALID_ENV(env);
    944     ENSURE_HAS_CAP(env, can_get_synthetic_attribute);
    945     return MethodUtil::IsMethodSynthetic(env, method, is_synthetic_ptr);
    946   }
    947 
    948   static jvmtiError IsMethodObsolete(jvmtiEnv* env, jmethodID method, jboolean* is_obsolete_ptr) {
    949     ENSURE_VALID_ENV(env);
    950     return MethodUtil::IsMethodObsolete(env, method, is_obsolete_ptr);
    951   }
    952 
    953   static jvmtiError SetNativeMethodPrefix(jvmtiEnv* env, const char* prefix ATTRIBUTE_UNUSED) {
    954     ENSURE_VALID_ENV(env);
    955     ENSURE_HAS_CAP(env, can_set_native_method_prefix);
    956     return ERR(NOT_IMPLEMENTED);
    957   }
    958 
    959   static jvmtiError SetNativeMethodPrefixes(jvmtiEnv* env,
    960                                             jint prefix_count ATTRIBUTE_UNUSED,
    961                                             char** prefixes ATTRIBUTE_UNUSED) {
    962     ENSURE_VALID_ENV(env);
    963     ENSURE_HAS_CAP(env, can_set_native_method_prefix);
    964     return ERR(NOT_IMPLEMENTED);
    965   }
    966 
    967   static jvmtiError CreateRawMonitor(jvmtiEnv* env, const char* name, jrawMonitorID* monitor_ptr) {
    968     ENSURE_VALID_ENV(env);
    969     return MonitorUtil::CreateRawMonitor(env, name, monitor_ptr);
    970   }
    971 
    972   static jvmtiError DestroyRawMonitor(jvmtiEnv* env, jrawMonitorID monitor) {
    973     ENSURE_VALID_ENV(env);
    974     return MonitorUtil::DestroyRawMonitor(env, monitor);
    975   }
    976 
    977   static jvmtiError RawMonitorEnter(jvmtiEnv* env, jrawMonitorID monitor) {
    978     ENSURE_VALID_ENV(env);
    979     return MonitorUtil::RawMonitorEnter(env, monitor);
    980   }
    981 
    982   static jvmtiError RawMonitorExit(jvmtiEnv* env, jrawMonitorID monitor) {
    983     ENSURE_VALID_ENV(env);
    984     return MonitorUtil::RawMonitorExit(env, monitor);
    985   }
    986 
    987   static jvmtiError RawMonitorWait(jvmtiEnv* env, jrawMonitorID monitor, jlong millis) {
    988     ENSURE_VALID_ENV(env);
    989     return MonitorUtil::RawMonitorWait(env, monitor, millis);
    990   }
    991 
    992   static jvmtiError RawMonitorNotify(jvmtiEnv* env, jrawMonitorID monitor) {
    993     ENSURE_VALID_ENV(env);
    994     return MonitorUtil::RawMonitorNotify(env, monitor);
    995   }
    996 
    997   static jvmtiError RawMonitorNotifyAll(jvmtiEnv* env, jrawMonitorID monitor) {
    998     ENSURE_VALID_ENV(env);
    999     return MonitorUtil::RawMonitorNotifyAll(env, monitor);
   1000   }
   1001 
   1002   static jvmtiError SetJNIFunctionTable(jvmtiEnv* env, const jniNativeInterface* function_table) {
   1003     ENSURE_VALID_ENV(env);
   1004     return JNIUtil::SetJNIFunctionTable(env, function_table);
   1005   }
   1006 
   1007   static jvmtiError GetJNIFunctionTable(jvmtiEnv* env, jniNativeInterface** function_table) {
   1008     ENSURE_VALID_ENV(env);
   1009     return JNIUtil::GetJNIFunctionTable(env, function_table);
   1010   }
   1011 
   1012   // TODO: This will require locking, so that an agent can't remove callbacks when we're dispatching
   1013   //       an event.
   1014   static jvmtiError SetEventCallbacks(jvmtiEnv* env,
   1015                                       const jvmtiEventCallbacks* callbacks,
   1016                                       jint size_of_callbacks) {
   1017     ENSURE_VALID_ENV(env);
   1018     if (size_of_callbacks < 0) {
   1019       return ERR(ILLEGAL_ARGUMENT);
   1020     }
   1021 
   1022     if (callbacks == nullptr) {
   1023       ArtJvmTiEnv::AsArtJvmTiEnv(env)->event_callbacks.reset();
   1024       return ERR(NONE);
   1025     }
   1026 
   1027     // Lock the event_info_mutex_ while we replace the callbacks.
   1028     ArtJvmTiEnv* art_env = ArtJvmTiEnv::AsArtJvmTiEnv(env);
   1029     art::WriterMutexLock lk(art::Thread::Current(), art_env->event_info_mutex_);
   1030     std::unique_ptr<ArtJvmtiEventCallbacks> tmp(new ArtJvmtiEventCallbacks());
   1031     // Copy over the extension events.
   1032     tmp->CopyExtensionsFrom(art_env->event_callbacks.get());
   1033     // Never overwrite the extension events.
   1034     size_t copy_size = std::min(sizeof(jvmtiEventCallbacks),
   1035                                 static_cast<size_t>(size_of_callbacks));
   1036     copy_size = art::RoundDown(copy_size, sizeof(void*));
   1037     // Copy non-extension events.
   1038     memcpy(tmp.get(), callbacks, copy_size);
   1039 
   1040     // replace the event table.
   1041     art_env->event_callbacks = std::move(tmp);
   1042 
   1043     return ERR(NONE);
   1044   }
   1045 
   1046   static jvmtiError SetEventNotificationMode(jvmtiEnv* env,
   1047                                              jvmtiEventMode mode,
   1048                                              jvmtiEvent event_type,
   1049                                              jthread event_thread,
   1050                                              ...) {
   1051     ENSURE_VALID_ENV(env);
   1052     art::Thread* art_thread = nullptr;
   1053     if (event_thread != nullptr) {
   1054       // TODO The locking around this call is less then what we really want.
   1055       art::ScopedObjectAccess soa(art::Thread::Current());
   1056       art::MutexLock mu(soa.Self(), *art::Locks::thread_list_lock_);
   1057       jvmtiError err = ERR(INTERNAL);
   1058       if (!ThreadUtil::GetAliveNativeThread(event_thread, soa, &art_thread, &err)) {
   1059         return err;
   1060       } else if (art_thread->IsStillStarting()) {
   1061         return ERR(THREAD_NOT_ALIVE);
   1062       }
   1063     }
   1064 
   1065     ArtJvmTiEnv* art_env = ArtJvmTiEnv::AsArtJvmTiEnv(env);
   1066     return gEventHandler->SetEvent(art_env,
   1067                                    art_thread,
   1068                                    GetArtJvmtiEvent(art_env, event_type),
   1069                                    mode);
   1070   }
   1071 
   1072   static jvmtiError GenerateEvents(jvmtiEnv* env,
   1073                                    jvmtiEvent event_type ATTRIBUTE_UNUSED) {
   1074     ENSURE_VALID_ENV(env);
   1075     return OK;
   1076   }
   1077 
   1078   static jvmtiError GetExtensionFunctions(jvmtiEnv* env,
   1079                                           jint* extension_count_ptr,
   1080                                           jvmtiExtensionFunctionInfo** extensions) {
   1081     ENSURE_VALID_ENV(env);
   1082     ENSURE_NON_NULL(extension_count_ptr);
   1083     ENSURE_NON_NULL(extensions);
   1084     return ExtensionUtil::GetExtensionFunctions(env, extension_count_ptr, extensions);
   1085   }
   1086 
   1087   static jvmtiError GetExtensionEvents(jvmtiEnv* env,
   1088                                        jint* extension_count_ptr,
   1089                                        jvmtiExtensionEventInfo** extensions) {
   1090     ENSURE_VALID_ENV(env);
   1091     ENSURE_NON_NULL(extension_count_ptr);
   1092     ENSURE_NON_NULL(extensions);
   1093     return ExtensionUtil::GetExtensionEvents(env, extension_count_ptr, extensions);
   1094   }
   1095 
   1096   static jvmtiError SetExtensionEventCallback(jvmtiEnv* env,
   1097                                               jint extension_event_index,
   1098                                               jvmtiExtensionEvent callback) {
   1099     ENSURE_VALID_ENV(env);
   1100     return ExtensionUtil::SetExtensionEventCallback(env,
   1101                                                     extension_event_index,
   1102                                                     callback,
   1103                                                     gEventHandler);
   1104   }
   1105 
   1106 #define FOR_ALL_CAPABILITIES(FUN)                        \
   1107     FUN(can_tag_objects)                                 \
   1108     FUN(can_generate_field_modification_events)          \
   1109     FUN(can_generate_field_access_events)                \
   1110     FUN(can_get_bytecodes)                               \
   1111     FUN(can_get_synthetic_attribute)                     \
   1112     FUN(can_get_owned_monitor_info)                      \
   1113     FUN(can_get_current_contended_monitor)               \
   1114     FUN(can_get_monitor_info)                            \
   1115     FUN(can_pop_frame)                                   \
   1116     FUN(can_redefine_classes)                            \
   1117     FUN(can_signal_thread)                               \
   1118     FUN(can_get_source_file_name)                        \
   1119     FUN(can_get_line_numbers)                            \
   1120     FUN(can_get_source_debug_extension)                  \
   1121     FUN(can_access_local_variables)                      \
   1122     FUN(can_maintain_original_method_order)              \
   1123     FUN(can_generate_single_step_events)                 \
   1124     FUN(can_generate_exception_events)                   \
   1125     FUN(can_generate_frame_pop_events)                   \
   1126     FUN(can_generate_breakpoint_events)                  \
   1127     FUN(can_suspend)                                     \
   1128     FUN(can_redefine_any_class)                          \
   1129     FUN(can_get_current_thread_cpu_time)                 \
   1130     FUN(can_get_thread_cpu_time)                         \
   1131     FUN(can_generate_method_entry_events)                \
   1132     FUN(can_generate_method_exit_events)                 \
   1133     FUN(can_generate_all_class_hook_events)              \
   1134     FUN(can_generate_compiled_method_load_events)        \
   1135     FUN(can_generate_monitor_events)                     \
   1136     FUN(can_generate_vm_object_alloc_events)             \
   1137     FUN(can_generate_native_method_bind_events)          \
   1138     FUN(can_generate_garbage_collection_events)          \
   1139     FUN(can_generate_object_free_events)                 \
   1140     FUN(can_force_early_return)                          \
   1141     FUN(can_get_owned_monitor_stack_depth_info)          \
   1142     FUN(can_get_constant_pool)                           \
   1143     FUN(can_set_native_method_prefix)                    \
   1144     FUN(can_retransform_classes)                         \
   1145     FUN(can_retransform_any_class)                       \
   1146     FUN(can_generate_resource_exhaustion_heap_events)    \
   1147     FUN(can_generate_resource_exhaustion_threads_events)
   1148 
   1149   static jvmtiError GetPotentialCapabilities(jvmtiEnv* env, jvmtiCapabilities* capabilities_ptr) {
   1150     ENSURE_VALID_ENV(env);
   1151     ENSURE_NON_NULL(capabilities_ptr);
   1152     *capabilities_ptr = kPotentialCapabilities;
   1153     if (UNLIKELY(!IsFullJvmtiAvailable())) {
   1154 #define REMOVE_NONDEBUGGABLE_UNSUPPORTED(e)                 \
   1155       do {                                                  \
   1156         if (kNonDebuggableUnsupportedCapabilities.e == 1) { \
   1157           capabilities_ptr->e = 0;                          \
   1158         }                                                   \
   1159       } while (false);
   1160 
   1161       FOR_ALL_CAPABILITIES(REMOVE_NONDEBUGGABLE_UNSUPPORTED);
   1162 #undef REMOVE_NONDEBUGGABLE_UNSUPPORTED
   1163     }
   1164     return OK;
   1165   }
   1166 
   1167   static jvmtiError AddCapabilities(jvmtiEnv* env, const jvmtiCapabilities* capabilities_ptr) {
   1168     ENSURE_VALID_ENV(env);
   1169     ENSURE_NON_NULL(capabilities_ptr);
   1170     ArtJvmTiEnv* art_env = static_cast<ArtJvmTiEnv*>(env);
   1171     jvmtiError ret = OK;
   1172     jvmtiCapabilities changed = {};
   1173     jvmtiCapabilities potential_capabilities = {};
   1174     ret = env->GetPotentialCapabilities(&potential_capabilities);
   1175     if (ret != OK) {
   1176       return ret;
   1177     }
   1178 #define ADD_CAPABILITY(e) \
   1179     do { \
   1180       if (capabilities_ptr->e == 1) { \
   1181         if (potential_capabilities.e == 1) { \
   1182           if (art_env->capabilities.e != 1) { \
   1183             art_env->capabilities.e = 1; \
   1184             changed.e = 1; \
   1185           }\
   1186         } else { \
   1187           ret = ERR(NOT_AVAILABLE); \
   1188         } \
   1189       } \
   1190     } while (false);
   1191 
   1192     FOR_ALL_CAPABILITIES(ADD_CAPABILITY);
   1193 #undef ADD_CAPABILITY
   1194     gEventHandler->HandleChangedCapabilities(ArtJvmTiEnv::AsArtJvmTiEnv(env),
   1195                                              changed,
   1196                                              /*added*/true);
   1197     return ret;
   1198   }
   1199 
   1200   static jvmtiError RelinquishCapabilities(jvmtiEnv* env,
   1201                                            const jvmtiCapabilities* capabilities_ptr) {
   1202     ENSURE_VALID_ENV(env);
   1203     ENSURE_NON_NULL(capabilities_ptr);
   1204     ArtJvmTiEnv* art_env = reinterpret_cast<ArtJvmTiEnv*>(env);
   1205     jvmtiCapabilities changed = {};
   1206 #define DEL_CAPABILITY(e) \
   1207     do { \
   1208       if (capabilities_ptr->e == 1) { \
   1209         if (art_env->capabilities.e == 1) { \
   1210           art_env->capabilities.e = 0;\
   1211           changed.e = 1; \
   1212         } \
   1213       } \
   1214     } while (false);
   1215 
   1216     FOR_ALL_CAPABILITIES(DEL_CAPABILITY);
   1217 #undef DEL_CAPABILITY
   1218     gEventHandler->HandleChangedCapabilities(ArtJvmTiEnv::AsArtJvmTiEnv(env),
   1219                                              changed,
   1220                                              /*added*/false);
   1221     return OK;
   1222   }
   1223 
   1224 #undef FOR_ALL_CAPABILITIES
   1225 
   1226   static jvmtiError GetCapabilities(jvmtiEnv* env, jvmtiCapabilities* capabilities_ptr) {
   1227     ENSURE_VALID_ENV(env);
   1228     ENSURE_NON_NULL(capabilities_ptr);
   1229     ArtJvmTiEnv* artenv = reinterpret_cast<ArtJvmTiEnv*>(env);
   1230     *capabilities_ptr = artenv->capabilities;
   1231     return OK;
   1232   }
   1233 
   1234   static jvmtiError GetCurrentThreadCpuTimerInfo(jvmtiEnv* env,
   1235                                                  jvmtiTimerInfo* info_ptr ATTRIBUTE_UNUSED) {
   1236     ENSURE_VALID_ENV(env);
   1237     ENSURE_HAS_CAP(env, can_get_current_thread_cpu_time);
   1238     return ERR(NOT_IMPLEMENTED);
   1239   }
   1240 
   1241   static jvmtiError GetCurrentThreadCpuTime(jvmtiEnv* env, jlong* nanos_ptr ATTRIBUTE_UNUSED) {
   1242     ENSURE_VALID_ENV(env);
   1243     ENSURE_HAS_CAP(env, can_get_current_thread_cpu_time);
   1244     return ERR(NOT_IMPLEMENTED);
   1245   }
   1246 
   1247   static jvmtiError GetThreadCpuTimerInfo(jvmtiEnv* env,
   1248                                           jvmtiTimerInfo* info_ptr ATTRIBUTE_UNUSED) {
   1249     ENSURE_VALID_ENV(env);
   1250     ENSURE_HAS_CAP(env, can_get_thread_cpu_time);
   1251     return ERR(NOT_IMPLEMENTED);
   1252   }
   1253 
   1254   static jvmtiError GetThreadCpuTime(jvmtiEnv* env,
   1255                                      jthread thread ATTRIBUTE_UNUSED,
   1256                                      jlong* nanos_ptr ATTRIBUTE_UNUSED) {
   1257     ENSURE_VALID_ENV(env);
   1258     ENSURE_HAS_CAP(env, can_get_thread_cpu_time);
   1259     return ERR(NOT_IMPLEMENTED);
   1260   }
   1261 
   1262   static jvmtiError GetTimerInfo(jvmtiEnv* env, jvmtiTimerInfo* info_ptr) {
   1263     ENSURE_VALID_ENV(env);
   1264     return TimerUtil::GetTimerInfo(env, info_ptr);
   1265   }
   1266 
   1267   static jvmtiError GetTime(jvmtiEnv* env, jlong* nanos_ptr) {
   1268     ENSURE_VALID_ENV(env);
   1269     return TimerUtil::GetTime(env, nanos_ptr);
   1270   }
   1271 
   1272   static jvmtiError GetAvailableProcessors(jvmtiEnv* env, jint* processor_count_ptr) {
   1273     ENSURE_VALID_ENV(env);
   1274     return TimerUtil::GetAvailableProcessors(env, processor_count_ptr);
   1275   }
   1276 
   1277   static jvmtiError AddToBootstrapClassLoaderSearch(jvmtiEnv* env, const char* segment) {
   1278     ENSURE_VALID_ENV(env);
   1279     return SearchUtil::AddToBootstrapClassLoaderSearch(env, segment);
   1280   }
   1281 
   1282   static jvmtiError AddToSystemClassLoaderSearch(jvmtiEnv* env, const char* segment) {
   1283     ENSURE_VALID_ENV(env);
   1284     return SearchUtil::AddToSystemClassLoaderSearch(env, segment);
   1285   }
   1286 
   1287   static jvmtiError GetSystemProperties(jvmtiEnv* env, jint* count_ptr, char*** property_ptr) {
   1288     ENSURE_VALID_ENV(env);
   1289     return PropertiesUtil::GetSystemProperties(env, count_ptr, property_ptr);
   1290   }
   1291 
   1292   static jvmtiError GetSystemProperty(jvmtiEnv* env, const char* property, char** value_ptr) {
   1293     ENSURE_VALID_ENV(env);
   1294     return PropertiesUtil::GetSystemProperty(env, property, value_ptr);
   1295   }
   1296 
   1297   static jvmtiError SetSystemProperty(jvmtiEnv* env, const char* property, const char* value) {
   1298     ENSURE_VALID_ENV(env);
   1299     return PropertiesUtil::SetSystemProperty(env, property, value);
   1300   }
   1301 
   1302   static jvmtiError GetPhase(jvmtiEnv* env, jvmtiPhase* phase_ptr) {
   1303     ENSURE_VALID_ENV(env);
   1304     return PhaseUtil::GetPhase(env, phase_ptr);
   1305   }
   1306 
   1307   static jvmtiError DisposeEnvironment(jvmtiEnv* env) {
   1308     ENSURE_VALID_ENV(env);
   1309     ArtJvmTiEnv* tienv = ArtJvmTiEnv::AsArtJvmTiEnv(env);
   1310     gEventHandler->RemoveArtJvmTiEnv(tienv);
   1311     art::Runtime::Current()->RemoveSystemWeakHolder(tienv->object_tag_table.get());
   1312     ThreadUtil::RemoveEnvironment(tienv);
   1313     delete tienv;
   1314     return OK;
   1315   }
   1316 
   1317   static jvmtiError SetEnvironmentLocalStorage(jvmtiEnv* env, const void* data) {
   1318     ENSURE_VALID_ENV(env);
   1319     reinterpret_cast<ArtJvmTiEnv*>(env)->local_data = const_cast<void*>(data);
   1320     return OK;
   1321   }
   1322 
   1323   static jvmtiError GetEnvironmentLocalStorage(jvmtiEnv* env, void** data_ptr) {
   1324     ENSURE_VALID_ENV(env);
   1325     *data_ptr = reinterpret_cast<ArtJvmTiEnv*>(env)->local_data;
   1326     return OK;
   1327   }
   1328 
   1329   static jvmtiError GetVersionNumber(jvmtiEnv* env, jint* version_ptr) {
   1330     ENSURE_VALID_ENV(env);
   1331     *version_ptr = ArtJvmTiEnv::AsArtJvmTiEnv(env)->ti_version;
   1332     return OK;
   1333   }
   1334 
   1335   static jvmtiError GetErrorName(jvmtiEnv* env, jvmtiError error,  char** name_ptr) {
   1336     ENSURE_NON_NULL(name_ptr);
   1337     auto copy_fn = [&](const char* name_cstr) {
   1338       jvmtiError res;
   1339       JvmtiUniquePtr<char[]> copy = CopyString(env, name_cstr, &res);
   1340       if (copy == nullptr) {
   1341         *name_ptr = nullptr;
   1342         return res;
   1343       } else {
   1344         *name_ptr = copy.release();
   1345         return OK;
   1346       }
   1347     };
   1348     switch (error) {
   1349 #define ERROR_CASE(e) case (JVMTI_ERROR_ ## e) : \
   1350         return copy_fn("JVMTI_ERROR_"#e);
   1351       ERROR_CASE(NONE);
   1352       ERROR_CASE(INVALID_THREAD);
   1353       ERROR_CASE(INVALID_THREAD_GROUP);
   1354       ERROR_CASE(INVALID_PRIORITY);
   1355       ERROR_CASE(THREAD_NOT_SUSPENDED);
   1356       ERROR_CASE(THREAD_SUSPENDED);
   1357       ERROR_CASE(THREAD_NOT_ALIVE);
   1358       ERROR_CASE(INVALID_OBJECT);
   1359       ERROR_CASE(INVALID_CLASS);
   1360       ERROR_CASE(CLASS_NOT_PREPARED);
   1361       ERROR_CASE(INVALID_METHODID);
   1362       ERROR_CASE(INVALID_LOCATION);
   1363       ERROR_CASE(INVALID_FIELDID);
   1364       ERROR_CASE(NO_MORE_FRAMES);
   1365       ERROR_CASE(OPAQUE_FRAME);
   1366       ERROR_CASE(TYPE_MISMATCH);
   1367       ERROR_CASE(INVALID_SLOT);
   1368       ERROR_CASE(DUPLICATE);
   1369       ERROR_CASE(NOT_FOUND);
   1370       ERROR_CASE(INVALID_MONITOR);
   1371       ERROR_CASE(NOT_MONITOR_OWNER);
   1372       ERROR_CASE(INTERRUPT);
   1373       ERROR_CASE(INVALID_CLASS_FORMAT);
   1374       ERROR_CASE(CIRCULAR_CLASS_DEFINITION);
   1375       ERROR_CASE(FAILS_VERIFICATION);
   1376       ERROR_CASE(UNSUPPORTED_REDEFINITION_METHOD_ADDED);
   1377       ERROR_CASE(UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED);
   1378       ERROR_CASE(INVALID_TYPESTATE);
   1379       ERROR_CASE(UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED);
   1380       ERROR_CASE(UNSUPPORTED_REDEFINITION_METHOD_DELETED);
   1381       ERROR_CASE(UNSUPPORTED_VERSION);
   1382       ERROR_CASE(NAMES_DONT_MATCH);
   1383       ERROR_CASE(UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED);
   1384       ERROR_CASE(UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED);
   1385       ERROR_CASE(UNMODIFIABLE_CLASS);
   1386       ERROR_CASE(NOT_AVAILABLE);
   1387       ERROR_CASE(MUST_POSSESS_CAPABILITY);
   1388       ERROR_CASE(NULL_POINTER);
   1389       ERROR_CASE(ABSENT_INFORMATION);
   1390       ERROR_CASE(INVALID_EVENT_TYPE);
   1391       ERROR_CASE(ILLEGAL_ARGUMENT);
   1392       ERROR_CASE(NATIVE_METHOD);
   1393       ERROR_CASE(CLASS_LOADER_UNSUPPORTED);
   1394       ERROR_CASE(OUT_OF_MEMORY);
   1395       ERROR_CASE(ACCESS_DENIED);
   1396       ERROR_CASE(WRONG_PHASE);
   1397       ERROR_CASE(INTERNAL);
   1398       ERROR_CASE(UNATTACHED_THREAD);
   1399       ERROR_CASE(INVALID_ENVIRONMENT);
   1400 #undef ERROR_CASE
   1401     }
   1402 
   1403     return ERR(ILLEGAL_ARGUMENT);
   1404   }
   1405 
   1406   static jvmtiError SetVerboseFlag(jvmtiEnv* env,
   1407                                    jvmtiVerboseFlag flag,
   1408                                    jboolean value) {
   1409     ENSURE_VALID_ENV(env);
   1410     if (flag == jvmtiVerboseFlag::JVMTI_VERBOSE_OTHER) {
   1411       // OTHER is special, as it's 0, so can't do a bit check.
   1412       bool val = (value == JNI_TRUE) ? true : false;
   1413 
   1414       art::gLogVerbosity.collector = val;
   1415       art::gLogVerbosity.compiler = val;
   1416       art::gLogVerbosity.deopt = val;
   1417       art::gLogVerbosity.heap = val;
   1418       art::gLogVerbosity.jdwp = val;
   1419       art::gLogVerbosity.jit = val;
   1420       art::gLogVerbosity.monitor = val;
   1421       art::gLogVerbosity.oat = val;
   1422       art::gLogVerbosity.profiler = val;
   1423       art::gLogVerbosity.signals = val;
   1424       art::gLogVerbosity.simulator = val;
   1425       art::gLogVerbosity.startup = val;
   1426       art::gLogVerbosity.third_party_jni = val;
   1427       art::gLogVerbosity.threads = val;
   1428       art::gLogVerbosity.verifier = val;
   1429       // Do not set verifier-debug.
   1430       art::gLogVerbosity.image = val;
   1431 
   1432       // Note: can't switch systrace_lock_logging. That requires changing entrypoints.
   1433 
   1434       art::gLogVerbosity.agents = val;
   1435     } else {
   1436       // Spec isn't clear whether "flag" is a mask or supposed to be single. We implement the mask
   1437       // semantics.
   1438       constexpr std::underlying_type<jvmtiVerboseFlag>::type kMask =
   1439           jvmtiVerboseFlag::JVMTI_VERBOSE_GC |
   1440           jvmtiVerboseFlag::JVMTI_VERBOSE_CLASS |
   1441           jvmtiVerboseFlag::JVMTI_VERBOSE_JNI;
   1442       if ((flag & ~kMask) != 0) {
   1443         return ERR(ILLEGAL_ARGUMENT);
   1444       }
   1445 
   1446       bool val = (value == JNI_TRUE) ? true : false;
   1447 
   1448       if ((flag & jvmtiVerboseFlag::JVMTI_VERBOSE_GC) != 0) {
   1449         art::gLogVerbosity.gc = val;
   1450       }
   1451 
   1452       if ((flag & jvmtiVerboseFlag::JVMTI_VERBOSE_CLASS) != 0) {
   1453         art::gLogVerbosity.class_linker = val;
   1454       }
   1455 
   1456       if ((flag & jvmtiVerboseFlag::JVMTI_VERBOSE_JNI) != 0) {
   1457         art::gLogVerbosity.jni = val;
   1458       }
   1459     }
   1460 
   1461     return ERR(NONE);
   1462   }
   1463 
   1464   static jvmtiError GetJLocationFormat(jvmtiEnv* env, jvmtiJlocationFormat* format_ptr) {
   1465     ENSURE_VALID_ENV(env);
   1466     // Report BCI as jlocation format. We report dex bytecode indices.
   1467     if (format_ptr == nullptr) {
   1468       return ERR(NULL_POINTER);
   1469     }
   1470     *format_ptr = jvmtiJlocationFormat::JVMTI_JLOCATION_JVMBCI;
   1471     return ERR(NONE);
   1472   }
   1473 };
   1474 
   1475 static bool IsJvmtiVersion(jint version) {
   1476   return version ==  JVMTI_VERSION_1 ||
   1477          version == JVMTI_VERSION_1_0 ||
   1478          version == JVMTI_VERSION_1_1 ||
   1479          version == JVMTI_VERSION_1_2 ||
   1480          version == JVMTI_VERSION;
   1481 }
   1482 
   1483 extern const jvmtiInterface_1 gJvmtiInterface;
   1484 
   1485 ArtJvmTiEnv::ArtJvmTiEnv(art::JavaVMExt* runtime, EventHandler* event_handler, jint version)
   1486     : art_vm(runtime),
   1487       local_data(nullptr),
   1488       ti_version(version),
   1489       capabilities(),
   1490       event_info_mutex_("jvmtiEnv_EventInfoMutex") {
   1491   object_tag_table = std::unique_ptr<ObjectTagTable>(new ObjectTagTable(event_handler, this));
   1492   functions = &gJvmtiInterface;
   1493 }
   1494 
   1495 // Creates a jvmtiEnv and returns it with the art::ti::Env that is associated with it. new_art_ti
   1496 // is a pointer to the uninitialized memory for an art::ti::Env.
   1497 static void CreateArtJvmTiEnv(art::JavaVMExt* vm, jint version, /*out*/void** new_jvmtiEnv) {
   1498   struct ArtJvmTiEnv* env = new ArtJvmTiEnv(vm, gEventHandler, version);
   1499   *new_jvmtiEnv = env;
   1500 
   1501   gEventHandler->RegisterArtJvmTiEnv(env);
   1502 
   1503   art::Runtime::Current()->AddSystemWeakHolder(
   1504       ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table.get());
   1505 }
   1506 
   1507 // A hook that the runtime uses to allow plugins to handle GetEnv calls. It returns true and
   1508 // places the return value in 'env' if this library can handle the GetEnv request. Otherwise
   1509 // returns false and does not modify the 'env' pointer.
   1510 static jint GetEnvHandler(art::JavaVMExt* vm, /*out*/void** env, jint version) {
   1511   // JavaDebuggable will either be set by the runtime as it is starting up or the plugin if it's
   1512   // loaded early enough. If this is false we cannot guarantee conformance to all JVMTI behaviors
   1513   // due to optimizations. We will only allow agents to get ArtTiEnvs using the kArtTiVersion.
   1514   if (IsFullJvmtiAvailable() && IsJvmtiVersion(version)) {
   1515     CreateArtJvmTiEnv(vm, JVMTI_VERSION, env);
   1516     return JNI_OK;
   1517   } else if (version == kArtTiVersion) {
   1518     CreateArtJvmTiEnv(vm, kArtTiVersion, env);
   1519     return JNI_OK;
   1520   } else {
   1521     printf("version 0x%x is not valid!", version);
   1522     return JNI_EVERSION;
   1523   }
   1524 }
   1525 
   1526 // The plugin initialization function. This adds the jvmti environment.
   1527 extern "C" bool ArtPlugin_Initialize() {
   1528   art::Runtime* runtime = art::Runtime::Current();
   1529 
   1530   gDeoptManager = new DeoptManager;
   1531   gEventHandler = new EventHandler;
   1532 
   1533   gDeoptManager->Setup();
   1534   if (runtime->IsStarted()) {
   1535     PhaseUtil::SetToLive();
   1536   } else {
   1537     PhaseUtil::SetToOnLoad();
   1538   }
   1539   PhaseUtil::Register(gEventHandler);
   1540   ThreadUtil::Register(gEventHandler);
   1541   ClassUtil::Register(gEventHandler);
   1542   DumpUtil::Register(gEventHandler);
   1543   MethodUtil::Register(gEventHandler);
   1544   SearchUtil::Register();
   1545   HeapUtil::Register();
   1546   Transformer::Setup();
   1547 
   1548   {
   1549     // Make sure we can deopt anything we need to.
   1550     art::ScopedObjectAccess soa(art::Thread::Current());
   1551     gDeoptManager->FinishSetup();
   1552   }
   1553 
   1554   runtime->GetJavaVM()->AddEnvironmentHook(GetEnvHandler);
   1555 
   1556   return true;
   1557 }
   1558 
   1559 extern "C" bool ArtPlugin_Deinitialize() {
   1560   gEventHandler->Shutdown();
   1561   gDeoptManager->Shutdown();
   1562   PhaseUtil::Unregister();
   1563   ThreadUtil::Unregister();
   1564   ClassUtil::Unregister();
   1565   DumpUtil::Unregister();
   1566   MethodUtil::Unregister();
   1567   SearchUtil::Unregister();
   1568   HeapUtil::Unregister();
   1569 
   1570   // TODO It would be good to delete the gEventHandler and gDeoptManager here but we cannot since
   1571   // daemon threads might be suspended and we want to make sure that even if they wake up briefly
   1572   // they won't hit deallocated memory. By this point none of the functions will do anything since
   1573   // they have already shutdown.
   1574 
   1575   return true;
   1576 }
   1577 
   1578 // The actual struct holding all of the entrypoints into the jvmti interface.
   1579 const jvmtiInterface_1 gJvmtiInterface = {
   1580   nullptr,  // reserved1
   1581   JvmtiFunctions::SetEventNotificationMode,
   1582   nullptr,  // reserved3
   1583   JvmtiFunctions::GetAllThreads,
   1584   JvmtiFunctions::SuspendThread,
   1585   JvmtiFunctions::ResumeThread,
   1586   JvmtiFunctions::StopThread,
   1587   JvmtiFunctions::InterruptThread,
   1588   JvmtiFunctions::GetThreadInfo,
   1589   JvmtiFunctions::GetOwnedMonitorInfo,  // 10
   1590   JvmtiFunctions::GetCurrentContendedMonitor,
   1591   JvmtiFunctions::RunAgentThread,
   1592   JvmtiFunctions::GetTopThreadGroups,
   1593   JvmtiFunctions::GetThreadGroupInfo,
   1594   JvmtiFunctions::GetThreadGroupChildren,
   1595   JvmtiFunctions::GetFrameCount,
   1596   JvmtiFunctions::GetThreadState,
   1597   JvmtiFunctions::GetCurrentThread,
   1598   JvmtiFunctions::GetFrameLocation,
   1599   JvmtiFunctions::NotifyFramePop,  // 20
   1600   JvmtiFunctions::GetLocalObject,
   1601   JvmtiFunctions::GetLocalInt,
   1602   JvmtiFunctions::GetLocalLong,
   1603   JvmtiFunctions::GetLocalFloat,
   1604   JvmtiFunctions::GetLocalDouble,
   1605   JvmtiFunctions::SetLocalObject,
   1606   JvmtiFunctions::SetLocalInt,
   1607   JvmtiFunctions::SetLocalLong,
   1608   JvmtiFunctions::SetLocalFloat,
   1609   JvmtiFunctions::SetLocalDouble,  // 30
   1610   JvmtiFunctions::CreateRawMonitor,
   1611   JvmtiFunctions::DestroyRawMonitor,
   1612   JvmtiFunctions::RawMonitorEnter,
   1613   JvmtiFunctions::RawMonitorExit,
   1614   JvmtiFunctions::RawMonitorWait,
   1615   JvmtiFunctions::RawMonitorNotify,
   1616   JvmtiFunctions::RawMonitorNotifyAll,
   1617   JvmtiFunctions::SetBreakpoint,
   1618   JvmtiFunctions::ClearBreakpoint,
   1619   nullptr,  // reserved40
   1620   JvmtiFunctions::SetFieldAccessWatch,
   1621   JvmtiFunctions::ClearFieldAccessWatch,
   1622   JvmtiFunctions::SetFieldModificationWatch,
   1623   JvmtiFunctions::ClearFieldModificationWatch,
   1624   JvmtiFunctions::IsModifiableClass,
   1625   JvmtiFunctions::Allocate,
   1626   JvmtiFunctions::Deallocate,
   1627   JvmtiFunctions::GetClassSignature,
   1628   JvmtiFunctions::GetClassStatus,
   1629   JvmtiFunctions::GetSourceFileName,  // 50
   1630   JvmtiFunctions::GetClassModifiers,
   1631   JvmtiFunctions::GetClassMethods,
   1632   JvmtiFunctions::GetClassFields,
   1633   JvmtiFunctions::GetImplementedInterfaces,
   1634   JvmtiFunctions::IsInterface,
   1635   JvmtiFunctions::IsArrayClass,
   1636   JvmtiFunctions::GetClassLoader,
   1637   JvmtiFunctions::GetObjectHashCode,
   1638   JvmtiFunctions::GetObjectMonitorUsage,
   1639   JvmtiFunctions::GetFieldName,  // 60
   1640   JvmtiFunctions::GetFieldDeclaringClass,
   1641   JvmtiFunctions::GetFieldModifiers,
   1642   JvmtiFunctions::IsFieldSynthetic,
   1643   JvmtiFunctions::GetMethodName,
   1644   JvmtiFunctions::GetMethodDeclaringClass,
   1645   JvmtiFunctions::GetMethodModifiers,
   1646   nullptr,  // reserved67
   1647   JvmtiFunctions::GetMaxLocals,
   1648   JvmtiFunctions::GetArgumentsSize,
   1649   JvmtiFunctions::GetLineNumberTable,  // 70
   1650   JvmtiFunctions::GetMethodLocation,
   1651   JvmtiFunctions::GetLocalVariableTable,
   1652   JvmtiFunctions::SetNativeMethodPrefix,
   1653   JvmtiFunctions::SetNativeMethodPrefixes,
   1654   JvmtiFunctions::GetBytecodes,
   1655   JvmtiFunctions::IsMethodNative,
   1656   JvmtiFunctions::IsMethodSynthetic,
   1657   JvmtiFunctions::GetLoadedClasses,
   1658   JvmtiFunctions::GetClassLoaderClasses,
   1659   JvmtiFunctions::PopFrame,  // 80
   1660   JvmtiFunctions::ForceEarlyReturnObject,
   1661   JvmtiFunctions::ForceEarlyReturnInt,
   1662   JvmtiFunctions::ForceEarlyReturnLong,
   1663   JvmtiFunctions::ForceEarlyReturnFloat,
   1664   JvmtiFunctions::ForceEarlyReturnDouble,
   1665   JvmtiFunctions::ForceEarlyReturnVoid,
   1666   JvmtiFunctions::RedefineClasses,
   1667   JvmtiFunctions::GetVersionNumber,
   1668   JvmtiFunctions::GetCapabilities,
   1669   JvmtiFunctions::GetSourceDebugExtension,  // 90
   1670   JvmtiFunctions::IsMethodObsolete,
   1671   JvmtiFunctions::SuspendThreadList,
   1672   JvmtiFunctions::ResumeThreadList,
   1673   nullptr,  // reserved94
   1674   nullptr,  // reserved95
   1675   nullptr,  // reserved96
   1676   nullptr,  // reserved97
   1677   nullptr,  // reserved98
   1678   nullptr,  // reserved99
   1679   JvmtiFunctions::GetAllStackTraces,  // 100
   1680   JvmtiFunctions::GetThreadListStackTraces,
   1681   JvmtiFunctions::GetThreadLocalStorage,
   1682   JvmtiFunctions::SetThreadLocalStorage,
   1683   JvmtiFunctions::GetStackTrace,
   1684   nullptr,  // reserved105
   1685   JvmtiFunctions::GetTag,
   1686   JvmtiFunctions::SetTag,
   1687   JvmtiFunctions::ForceGarbageCollection,
   1688   JvmtiFunctions::IterateOverObjectsReachableFromObject,
   1689   JvmtiFunctions::IterateOverReachableObjects,  // 110
   1690   JvmtiFunctions::IterateOverHeap,
   1691   JvmtiFunctions::IterateOverInstancesOfClass,
   1692   nullptr,  // reserved113
   1693   JvmtiFunctions::GetObjectsWithTags,
   1694   JvmtiFunctions::FollowReferences,
   1695   JvmtiFunctions::IterateThroughHeap,
   1696   nullptr,  // reserved117
   1697   nullptr,  // reserved118
   1698   nullptr,  // reserved119
   1699   JvmtiFunctions::SetJNIFunctionTable,  // 120
   1700   JvmtiFunctions::GetJNIFunctionTable,
   1701   JvmtiFunctions::SetEventCallbacks,
   1702   JvmtiFunctions::GenerateEvents,
   1703   JvmtiFunctions::GetExtensionFunctions,
   1704   JvmtiFunctions::GetExtensionEvents,
   1705   JvmtiFunctions::SetExtensionEventCallback,
   1706   JvmtiFunctions::DisposeEnvironment,
   1707   JvmtiFunctions::GetErrorName,
   1708   JvmtiFunctions::GetJLocationFormat,
   1709   JvmtiFunctions::GetSystemProperties,  // 130
   1710   JvmtiFunctions::GetSystemProperty,
   1711   JvmtiFunctions::SetSystemProperty,
   1712   JvmtiFunctions::GetPhase,
   1713   JvmtiFunctions::GetCurrentThreadCpuTimerInfo,
   1714   JvmtiFunctions::GetCurrentThreadCpuTime,
   1715   JvmtiFunctions::GetThreadCpuTimerInfo,
   1716   JvmtiFunctions::GetThreadCpuTime,
   1717   JvmtiFunctions::GetTimerInfo,
   1718   JvmtiFunctions::GetTime,
   1719   JvmtiFunctions::GetPotentialCapabilities,  // 140
   1720   nullptr,  // reserved141
   1721   JvmtiFunctions::AddCapabilities,
   1722   JvmtiFunctions::RelinquishCapabilities,
   1723   JvmtiFunctions::GetAvailableProcessors,
   1724   JvmtiFunctions::GetClassVersionNumbers,
   1725   JvmtiFunctions::GetConstantPool,
   1726   JvmtiFunctions::GetEnvironmentLocalStorage,
   1727   JvmtiFunctions::SetEnvironmentLocalStorage,
   1728   JvmtiFunctions::AddToBootstrapClassLoaderSearch,
   1729   JvmtiFunctions::SetVerboseFlag,  // 150
   1730   JvmtiFunctions::AddToSystemClassLoaderSearch,
   1731   JvmtiFunctions::RetransformClasses,
   1732   JvmtiFunctions::GetOwnedMonitorStackDepthInfo,
   1733   JvmtiFunctions::GetObjectSize,
   1734   JvmtiFunctions::GetLocalInstance,
   1735 };
   1736 
   1737 };  // namespace openjdkjvmti
   1738