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