blob: 1e7636861872e63cd8140b678b904b444e5b8f8c [file] [log] [blame]
Alex Light49948e92016-08-11 15:35:28 -07001/* 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
Yi Kongc57c6802018-10-29 14:28:56 -070032#include <memory>
Alex Light9c20a142016-08-23 15:05:12 -070033#include <string>
Andreas Gampef37e3022017-01-13 17:54:46 -080034#include <type_traits>
Alex Light9c20a142016-08-23 15:05:12 -070035#include <vector>
36
Andreas Gampe57943812017-12-06 21:39:13 -080037#include <android-base/logging.h>
38
Alex Light49948e92016-08-11 15:35:28 -070039#include <jni.h>
Alex Light9c20a142016-08-23 15:05:12 -070040
Andreas Gampe5e03a302017-03-13 13:10:00 -070041#include "jvmti.h"
Alex Light49948e92016-08-11 15:35:28 -070042
Alex Light986914b2019-11-19 01:12:25 +000043#include "alloc_manager.h"
Andreas Gampedb6dcb62016-09-13 09:05:59 -070044#include "art_jvmti.h"
Andreas Gampe170331f2017-12-07 18:41:03 -080045#include "base/logging.h" // For gLogVerbosity.
Andreas Gampe77708d92016-10-07 11:48:21 -070046#include "base/mutex.h"
47#include "events-inl.h"
Vladimir Markoa3ad0cd2018-05-04 10:06:38 +010048#include "jni/jni_env_ext-inl.h"
Andreas Gampe6dee92e2016-09-12 19:58:13 -070049#include "obj_ptr-inl.h"
Alex Lighta01de592016-11-15 10:43:06 -080050#include "object_tagging.h"
Alex Light9c20a142016-08-23 15:05:12 -070051#include "runtime.h"
Andreas Gampe6dee92e2016-09-12 19:58:13 -070052#include "scoped_thread_state_change-inl.h"
Andreas Gampeb486a982017-06-01 13:45:54 -070053#include "thread-current-inl.h"
Alex Lighta01de592016-11-15 10:43:06 -080054#include "thread_list.h"
Alex Lightbf64a572017-07-05 10:34:49 -070055#include "ti_allocator.h"
Alex Lighta26e3492017-06-27 17:55:37 -070056#include "ti_breakpoint.h"
Andreas Gampee492ae32016-10-28 19:34:57 -070057#include "ti_class.h"
Andreas Gampeeb0cea12017-01-23 08:50:04 -080058#include "ti_dump.h"
Alex Light3f33c0a2017-11-08 10:17:37 -080059#include "ti_extension.h"
Andreas Gampeab2f0d02017-01-05 17:23:45 -080060#include "ti_field.h"
Andreas Gampeba8df692016-11-01 10:30:44 -070061#include "ti_heap.h"
Andreas Gampe6f8e4f02017-01-16 18:18:14 -080062#include "ti_jni.h"
Alex Lightae45cbb2018-10-18 15:49:56 -070063#include "ti_logging.h"
Andreas Gampe3c252f02016-10-27 18:25:17 -070064#include "ti_method.h"
Andreas Gampe319dbe82017-01-09 16:42:21 -080065#include "ti_monitor.h"
Andreas Gampe50a4e492017-01-06 18:00:20 -080066#include "ti_object.h"
Andreas Gampe96eca782017-01-19 19:45:30 -080067#include "ti_phase.h"
Andreas Gampe1bdaf732017-01-09 19:21:06 -080068#include "ti_properties.h"
Alex Lighta01de592016-11-15 10:43:06 -080069#include "ti_redefine.h"
Andreas Gampece7732b2017-01-17 15:50:26 -080070#include "ti_search.h"
Andreas Gampeb5eb94a2016-10-27 19:23:09 -070071#include "ti_stack.h"
Andreas Gampeaf13ab92017-01-11 20:57:40 -080072#include "ti_thread.h"
Andreas Gamped18d9e22017-01-16 16:08:45 +000073#include "ti_threadgroup.h"
Andreas Gampe35bcf812017-01-13 16:24:17 -080074#include "ti_timers.h"
Alex Light9c20a142016-08-23 15:05:12 -070075#include "transform.h"
Alex Light49948e92016-08-11 15:35:28 -070076
Alex Light49948e92016-08-11 15:35:28 -070077namespace openjdkjvmti {
78
Alex Light0e841182018-02-12 17:42:50 +000079// NB These are heap allocated to avoid the static destructors being run if an agent calls exit(3).
80// These should never be null.
81EventHandler* gEventHandler;
82DeoptManager* gDeoptManager;
Alex Light986914b2019-11-19 01:12:25 +000083AllocationManager* gAllocManager;
Andreas Gampe6dee92e2016-09-12 19:58:13 -070084
Alex Lighte6574242016-08-17 09:56:24 -070085#define ENSURE_NON_NULL(n) \
86 do { \
87 if ((n) == nullptr) { \
88 return ERR(NULL_POINTER); \
89 } \
90 } while (false)
91
Alex Light49948e92016-08-11 15:35:28 -070092class JvmtiFunctions {
93 private:
Alex Light1edc8cf2017-03-24 14:22:56 -070094 static jvmtiError getEnvironmentError(jvmtiEnv* env) {
95 if (env == nullptr) {
96 return ERR(INVALID_ENVIRONMENT);
97 } else if (art::Thread::Current() == nullptr) {
98 return ERR(UNATTACHED_THREAD);
99 } else {
100 return OK;
101 }
Alex Light49948e92016-08-11 15:35:28 -0700102 }
103
Alex Light1edc8cf2017-03-24 14:22:56 -0700104#define ENSURE_VALID_ENV(env) \
105 do { \
106 jvmtiError ensure_valid_env_ ## __LINE__ = getEnvironmentError(env); \
107 if (ensure_valid_env_ ## __LINE__ != OK) { \
108 return ensure_valid_env_ ## __LINE__ ; \
109 } \
Alex Lighte6574242016-08-17 09:56:24 -0700110 } while (false)
111
112#define ENSURE_HAS_CAP(env, cap) \
113 do { \
Alex Lighte6574242016-08-17 09:56:24 -0700114 if (ArtJvmTiEnv::AsArtJvmTiEnv(env)->capabilities.cap != 1) { \
115 return ERR(MUST_POSSESS_CAPABILITY); \
116 } \
117 } while (false)
118
Alex Light49948e92016-08-11 15:35:28 -0700119 public:
120 static jvmtiError Allocate(jvmtiEnv* env, jlong size, unsigned char** mem_ptr) {
Alex Light6a399f32018-01-10 16:31:55 -0800121 jvmtiError err = getEnvironmentError(env);
122 // Allow UNATTACHED_THREAD since we don't really care about that for this function.
123 if (err != OK && err != ERR(UNATTACHED_THREAD)) {
124 return err;
125 }
Alex Lighte6574242016-08-17 09:56:24 -0700126 ENSURE_NON_NULL(mem_ptr);
Alex Lightbf64a572017-07-05 10:34:49 -0700127 return AllocUtil::Allocate(env, size, mem_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700128 }
129
130 static jvmtiError Deallocate(jvmtiEnv* env, unsigned char* mem) {
Alex Light6a399f32018-01-10 16:31:55 -0800131 jvmtiError err = getEnvironmentError(env);
132 // Allow UNATTACHED_THREAD since we don't really care about that for this function.
133 if (err != OK && err != ERR(UNATTACHED_THREAD)) {
134 return err;
135 }
Alex Lightbf64a572017-07-05 10:34:49 -0700136 return AllocUtil::Deallocate(env, mem);
Alex Light49948e92016-08-11 15:35:28 -0700137 }
138
139 static jvmtiError GetThreadState(jvmtiEnv* env, jthread thread, jint* thread_state_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700140 ENSURE_VALID_ENV(env);
Andreas Gampe72c19832017-01-12 13:22:16 -0800141 return ThreadUtil::GetThreadState(env, thread, thread_state_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700142 }
143
144 static jvmtiError GetCurrentThread(jvmtiEnv* env, jthread* thread_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700145 ENSURE_VALID_ENV(env);
Andreas Gampeaf13ab92017-01-11 20:57:40 -0800146 return ThreadUtil::GetCurrentThread(env, thread_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700147 }
148
149 static jvmtiError GetAllThreads(jvmtiEnv* env, jint* threads_count_ptr, jthread** threads_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700150 ENSURE_VALID_ENV(env);
Andreas Gampe85807442017-01-13 14:40:58 -0800151 return ThreadUtil::GetAllThreads(env, threads_count_ptr, threads_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700152 }
153
Alex Light88fd7202017-06-30 08:31:59 -0700154 static jvmtiError SuspendThread(jvmtiEnv* env, jthread thread) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700155 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800156 ENSURE_HAS_CAP(env, can_suspend);
Alex Light88fd7202017-06-30 08:31:59 -0700157 return ThreadUtil::SuspendThread(env, thread);
Alex Light49948e92016-08-11 15:35:28 -0700158 }
159
160 static jvmtiError SuspendThreadList(jvmtiEnv* env,
Alex Light88fd7202017-06-30 08:31:59 -0700161 jint request_count,
162 const jthread* request_list,
163 jvmtiError* results) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700164 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800165 ENSURE_HAS_CAP(env, can_suspend);
Alex Light88fd7202017-06-30 08:31:59 -0700166 return ThreadUtil::SuspendThreadList(env, request_count, request_list, results);
Alex Light49948e92016-08-11 15:35:28 -0700167 }
168
Alex Light88fd7202017-06-30 08:31:59 -0700169 static jvmtiError ResumeThread(jvmtiEnv* env, jthread thread) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700170 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800171 ENSURE_HAS_CAP(env, can_suspend);
Alex Light88fd7202017-06-30 08:31:59 -0700172 return ThreadUtil::ResumeThread(env, thread);
Alex Light49948e92016-08-11 15:35:28 -0700173 }
174
175 static jvmtiError ResumeThreadList(jvmtiEnv* env,
Alex Light88fd7202017-06-30 08:31:59 -0700176 jint request_count,
177 const jthread* request_list,
178 jvmtiError* results) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700179 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800180 ENSURE_HAS_CAP(env, can_suspend);
Alex Light88fd7202017-06-30 08:31:59 -0700181 return ThreadUtil::ResumeThreadList(env, request_count, request_list, results);
Alex Light49948e92016-08-11 15:35:28 -0700182 }
183
Alex Light54d39dc2017-09-25 17:00:16 -0700184 static jvmtiError StopThread(jvmtiEnv* env, jthread thread, jobject exception) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700185 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800186 ENSURE_HAS_CAP(env, can_signal_thread);
Alex Light54d39dc2017-09-25 17:00:16 -0700187 return ThreadUtil::StopThread(env, thread, exception);
Alex Light49948e92016-08-11 15:35:28 -0700188 }
189
Alex Light54d39dc2017-09-25 17:00:16 -0700190 static jvmtiError InterruptThread(jvmtiEnv* env, jthread thread) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700191 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800192 ENSURE_HAS_CAP(env, can_signal_thread);
Alex Light54d39dc2017-09-25 17:00:16 -0700193 return ThreadUtil::InterruptThread(env, thread);
Alex Light49948e92016-08-11 15:35:28 -0700194 }
195
196 static jvmtiError GetThreadInfo(jvmtiEnv* env, jthread thread, jvmtiThreadInfo* info_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700197 ENSURE_VALID_ENV(env);
Andreas Gampeaf13ab92017-01-11 20:57:40 -0800198 return ThreadUtil::GetThreadInfo(env, thread, info_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700199 }
200
201 static jvmtiError GetOwnedMonitorInfo(jvmtiEnv* env,
Alex Light88e1ddd2017-08-21 13:09:55 -0700202 jthread thread,
203 jint* owned_monitor_count_ptr,
204 jobject** owned_monitors_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700205 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800206 ENSURE_HAS_CAP(env, can_get_owned_monitor_info);
Alex Light88e1ddd2017-08-21 13:09:55 -0700207 return StackUtil::GetOwnedMonitorInfo(env,
208 thread,
209 owned_monitor_count_ptr,
210 owned_monitors_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700211 }
212
Alex Light88e1ddd2017-08-21 13:09:55 -0700213 static jvmtiError GetOwnedMonitorStackDepthInfo(jvmtiEnv* env,
214 jthread thread,
215 jint* monitor_info_count_ptr,
216 jvmtiMonitorStackDepthInfo** monitor_info_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700217 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800218 ENSURE_HAS_CAP(env, can_get_owned_monitor_stack_depth_info);
Alex Light88e1ddd2017-08-21 13:09:55 -0700219 return StackUtil::GetOwnedMonitorStackDepthInfo(env,
220 thread,
221 monitor_info_count_ptr,
222 monitor_info_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700223 }
224
225 static jvmtiError GetCurrentContendedMonitor(jvmtiEnv* env,
Alex Light41006c62017-09-14 09:51:14 -0700226 jthread thread,
227 jobject* monitor_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700228 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800229 ENSURE_HAS_CAP(env, can_get_current_contended_monitor);
Alex Light41006c62017-09-14 09:51:14 -0700230 return MonitorUtil::GetCurrentContendedMonitor(env, thread, monitor_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700231 }
232
233 static jvmtiError RunAgentThread(jvmtiEnv* env,
234 jthread thread,
235 jvmtiStartFunction proc,
236 const void* arg,
237 jint priority) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700238 ENSURE_VALID_ENV(env);
Andreas Gampe732b0ac2017-01-18 15:23:39 -0800239 return ThreadUtil::RunAgentThread(env, thread, proc, arg, priority);
Alex Light49948e92016-08-11 15:35:28 -0700240 }
241
242 static jvmtiError SetThreadLocalStorage(jvmtiEnv* env, jthread thread, const void* data) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700243 ENSURE_VALID_ENV(env);
Andreas Gampe7b3b3262017-01-19 20:40:42 -0800244 return ThreadUtil::SetThreadLocalStorage(env, thread, data);
Alex Light49948e92016-08-11 15:35:28 -0700245 }
246
247 static jvmtiError GetThreadLocalStorage(jvmtiEnv* env, jthread thread, void** data_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700248 ENSURE_VALID_ENV(env);
Andreas Gampe7b3b3262017-01-19 20:40:42 -0800249 return ThreadUtil::GetThreadLocalStorage(env, thread, data_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700250 }
251
252 static jvmtiError GetTopThreadGroups(jvmtiEnv* env,
253 jint* group_count_ptr,
254 jthreadGroup** groups_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700255 ENSURE_VALID_ENV(env);
Andreas Gamped18d9e22017-01-16 16:08:45 +0000256 return ThreadGroupUtil::GetTopThreadGroups(env, group_count_ptr, groups_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700257 }
258
259 static jvmtiError GetThreadGroupInfo(jvmtiEnv* env,
260 jthreadGroup group,
261 jvmtiThreadGroupInfo* info_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700262 ENSURE_VALID_ENV(env);
Andreas Gamped18d9e22017-01-16 16:08:45 +0000263 return ThreadGroupUtil::GetThreadGroupInfo(env, group, info_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700264 }
265
266 static jvmtiError GetThreadGroupChildren(jvmtiEnv* env,
267 jthreadGroup group,
268 jint* thread_count_ptr,
269 jthread** threads_ptr,
270 jint* group_count_ptr,
271 jthreadGroup** groups_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700272 ENSURE_VALID_ENV(env);
Andreas Gamped18d9e22017-01-16 16:08:45 +0000273 return ThreadGroupUtil::GetThreadGroupChildren(env,
274 group,
275 thread_count_ptr,
276 threads_ptr,
277 group_count_ptr,
278 groups_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700279 }
280
281 static jvmtiError GetStackTrace(jvmtiEnv* env,
282 jthread thread,
283 jint start_depth,
284 jint max_frame_count,
285 jvmtiFrameInfo* frame_buffer,
286 jint* count_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700287 ENSURE_VALID_ENV(env);
Andreas Gampeb5eb94a2016-10-27 19:23:09 -0700288 return StackUtil::GetStackTrace(env,
289 thread,
290 start_depth,
291 max_frame_count,
292 frame_buffer,
293 count_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700294 }
295
296 static jvmtiError GetAllStackTraces(jvmtiEnv* env,
297 jint max_frame_count,
298 jvmtiStackInfo** stack_info_ptr,
299 jint* thread_count_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700300 ENSURE_VALID_ENV(env);
Andreas Gampea1a27c62017-01-11 16:37:16 -0800301 return StackUtil::GetAllStackTraces(env, max_frame_count, stack_info_ptr, thread_count_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700302 }
303
304 static jvmtiError GetThreadListStackTraces(jvmtiEnv* env,
305 jint thread_count,
306 const jthread* thread_list,
307 jint max_frame_count,
308 jvmtiStackInfo** stack_info_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700309 ENSURE_VALID_ENV(env);
Andreas Gampeeba32fb2017-01-12 17:40:05 -0800310 return StackUtil::GetThreadListStackTraces(env,
311 thread_count,
312 thread_list,
313 max_frame_count,
314 stack_info_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700315 }
316
317 static jvmtiError GetFrameCount(jvmtiEnv* env, jthread thread, jint* count_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700318 ENSURE_VALID_ENV(env);
Andreas Gampef6f3b5f2017-01-13 09:21:42 -0800319 return StackUtil::GetFrameCount(env, thread, count_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700320 }
321
Alex Light0aa7a5a2018-10-10 15:58:14 +0000322 static jvmtiError PopFrame(jvmtiEnv* env, jthread thread) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700323 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800324 ENSURE_HAS_CAP(env, can_pop_frame);
Alex Light0aa7a5a2018-10-10 15:58:14 +0000325 return StackUtil::PopFrame(env, thread);
Alex Light49948e92016-08-11 15:35:28 -0700326 }
327
328 static jvmtiError GetFrameLocation(jvmtiEnv* env,
329 jthread thread,
330 jint depth,
331 jmethodID* method_ptr,
332 jlocation* location_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700333 ENSURE_VALID_ENV(env);
Andreas Gampef6f3b5f2017-01-13 09:21:42 -0800334 return StackUtil::GetFrameLocation(env, thread, depth, method_ptr, location_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700335 }
336
Alex Lighte814f9d2017-07-31 16:14:39 -0700337 static jvmtiError NotifyFramePop(jvmtiEnv* env, jthread thread, jint depth) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700338 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800339 ENSURE_HAS_CAP(env, can_generate_frame_pop_events);
Alex Lighte814f9d2017-07-31 16:14:39 -0700340 return StackUtil::NotifyFramePop(env, thread, depth);
Alex Light49948e92016-08-11 15:35:28 -0700341 }
342
Alex Lightb7c640d2019-03-20 15:52:13 -0700343 static jvmtiError ForceEarlyReturnObject(jvmtiEnv* env, jthread thread, jobject value) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700344 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800345 ENSURE_HAS_CAP(env, can_force_early_return);
Alex Lightb7c640d2019-03-20 15:52:13 -0700346 return StackUtil::ForceEarlyReturn(env, gEventHandler, thread, value);
Alex Light49948e92016-08-11 15:35:28 -0700347 }
348
Alex Lightb7c640d2019-03-20 15:52:13 -0700349 static jvmtiError ForceEarlyReturnInt(jvmtiEnv* env, jthread thread, jint value) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700350 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800351 ENSURE_HAS_CAP(env, can_force_early_return);
Alex Lightb7c640d2019-03-20 15:52:13 -0700352 return StackUtil::ForceEarlyReturn(env, gEventHandler, thread, value);
Alex Light49948e92016-08-11 15:35:28 -0700353 }
354
Alex Lightb7c640d2019-03-20 15:52:13 -0700355 static jvmtiError ForceEarlyReturnLong(jvmtiEnv* env, jthread thread, jlong value) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700356 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800357 ENSURE_HAS_CAP(env, can_force_early_return);
Alex Lightb7c640d2019-03-20 15:52:13 -0700358 return StackUtil::ForceEarlyReturn(env, gEventHandler, thread, value);
Alex Light49948e92016-08-11 15:35:28 -0700359 }
360
Alex Lightb7c640d2019-03-20 15:52:13 -0700361 static jvmtiError ForceEarlyReturnFloat(jvmtiEnv* env, jthread thread, jfloat value) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700362 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800363 ENSURE_HAS_CAP(env, can_force_early_return);
Alex Lightb7c640d2019-03-20 15:52:13 -0700364 return StackUtil::ForceEarlyReturn(env, gEventHandler, thread, value);
Alex Light49948e92016-08-11 15:35:28 -0700365 }
366
Alex Lightb7c640d2019-03-20 15:52:13 -0700367 static jvmtiError ForceEarlyReturnDouble(jvmtiEnv* env, jthread thread, jdouble value) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700368 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800369 ENSURE_HAS_CAP(env, can_force_early_return);
Alex Lightb7c640d2019-03-20 15:52:13 -0700370 return StackUtil::ForceEarlyReturn(env, gEventHandler, thread, value);
Alex Light49948e92016-08-11 15:35:28 -0700371 }
372
Alex Lightb7c640d2019-03-20 15:52:13 -0700373 static jvmtiError ForceEarlyReturnVoid(jvmtiEnv* env, jthread thread) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700374 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800375 ENSURE_HAS_CAP(env, can_force_early_return);
Alex Lightb7c640d2019-03-20 15:52:13 -0700376 return StackUtil::ForceEarlyReturn<nullptr_t>(env, gEventHandler, thread, nullptr);
Alex Light49948e92016-08-11 15:35:28 -0700377 }
378
379 static jvmtiError FollowReferences(jvmtiEnv* env,
380 jint heap_filter,
381 jclass klass,
382 jobject initial_object,
383 const jvmtiHeapCallbacks* callbacks,
384 const void* user_data) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700385 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800386 ENSURE_HAS_CAP(env, can_tag_objects);
Andreas Gampede19eb92017-02-24 16:21:18 -0800387 HeapUtil heap_util(ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table.get());
Andreas Gampe70bfc8a2016-11-03 11:04:15 -0700388 return heap_util.FollowReferences(env,
389 heap_filter,
390 klass,
391 initial_object,
392 callbacks,
393 user_data);
Alex Light49948e92016-08-11 15:35:28 -0700394 }
395
396 static jvmtiError IterateThroughHeap(jvmtiEnv* env,
397 jint heap_filter,
398 jclass klass,
399 const jvmtiHeapCallbacks* callbacks,
400 const void* user_data) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700401 ENSURE_VALID_ENV(env);
Alex Lighte6574242016-08-17 09:56:24 -0700402 ENSURE_HAS_CAP(env, can_tag_objects);
Andreas Gampede19eb92017-02-24 16:21:18 -0800403 HeapUtil heap_util(ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table.get());
Andreas Gampee54d9922016-10-11 19:55:37 -0700404 return heap_util.IterateThroughHeap(env, heap_filter, klass, callbacks, user_data);
Alex Light49948e92016-08-11 15:35:28 -0700405 }
406
407 static jvmtiError GetTag(jvmtiEnv* env, jobject object, jlong* tag_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700408 ENSURE_VALID_ENV(env);
Alex Lighte6574242016-08-17 09:56:24 -0700409 ENSURE_HAS_CAP(env, can_tag_objects);
Andreas Gampe6dee92e2016-09-12 19:58:13 -0700410
411 JNIEnv* jni_env = GetJniEnv(env);
412 if (jni_env == nullptr) {
413 return ERR(INTERNAL);
414 }
415
416 art::ScopedObjectAccess soa(jni_env);
417 art::ObjPtr<art::mirror::Object> obj = soa.Decode<art::mirror::Object>(object);
Andreas Gampede19eb92017-02-24 16:21:18 -0800418 if (!ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table->GetTag(obj.Ptr(), tag_ptr)) {
Andreas Gampe6dee92e2016-09-12 19:58:13 -0700419 *tag_ptr = 0;
420 }
421
422 return ERR(NONE);
Alex Light49948e92016-08-11 15:35:28 -0700423 }
424
425 static jvmtiError SetTag(jvmtiEnv* env, jobject object, jlong tag) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700426 ENSURE_VALID_ENV(env);
Alex Lighte6574242016-08-17 09:56:24 -0700427 ENSURE_HAS_CAP(env, can_tag_objects);
428
Andreas Gampe6dee92e2016-09-12 19:58:13 -0700429 if (object == nullptr) {
430 return ERR(NULL_POINTER);
431 }
432
433 JNIEnv* jni_env = GetJniEnv(env);
434 if (jni_env == nullptr) {
435 return ERR(INTERNAL);
436 }
437
438 art::ScopedObjectAccess soa(jni_env);
439 art::ObjPtr<art::mirror::Object> obj = soa.Decode<art::mirror::Object>(object);
Andreas Gampede19eb92017-02-24 16:21:18 -0800440 ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table->Set(obj.Ptr(), tag);
Andreas Gampe6dee92e2016-09-12 19:58:13 -0700441
442 return ERR(NONE);
Alex Light49948e92016-08-11 15:35:28 -0700443 }
444
445 static jvmtiError GetObjectsWithTags(jvmtiEnv* env,
446 jint tag_count,
447 const jlong* tags,
448 jint* count_ptr,
449 jobject** object_result_ptr,
450 jlong** tag_result_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700451 ENSURE_VALID_ENV(env);
Alex Lighte6574242016-08-17 09:56:24 -0700452 ENSURE_HAS_CAP(env, can_tag_objects);
453
Andreas Gampe5e6046b2016-10-25 12:05:53 -0700454 JNIEnv* jni_env = GetJniEnv(env);
455 if (jni_env == nullptr) {
456 return ERR(INTERNAL);
457 }
458
459 art::ScopedObjectAccess soa(jni_env);
Andreas Gampede19eb92017-02-24 16:21:18 -0800460 return ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table->GetTaggedObjects(env,
461 tag_count,
462 tags,
463 count_ptr,
464 object_result_ptr,
465 tag_result_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700466 }
467
468 static jvmtiError ForceGarbageCollection(jvmtiEnv* env) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700469 ENSURE_VALID_ENV(env);
Andreas Gampe8da6d032016-10-31 19:31:03 -0700470 return HeapUtil::ForceGarbageCollection(env);
Alex Light49948e92016-08-11 15:35:28 -0700471 }
472
473 static jvmtiError IterateOverObjectsReachableFromObject(
474 jvmtiEnv* env,
Stefano Cianciulli78f3c722023-05-16 10:32:54 +0000475 [[maybe_unused]] jobject object,
476 [[maybe_unused]] jvmtiObjectReferenceCallback object_reference_callback,
477 [[maybe_unused]] const void* user_data) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700478 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800479 ENSURE_HAS_CAP(env, can_tag_objects);
Alex Light49948e92016-08-11 15:35:28 -0700480 return ERR(NOT_IMPLEMENTED);
481 }
482
Alex Light6a3fd512017-02-27 14:34:32 -0800483 static jvmtiError IterateOverReachableObjects(
484 jvmtiEnv* env,
Stefano Cianciulli78f3c722023-05-16 10:32:54 +0000485 [[maybe_unused]] jvmtiHeapRootCallback heap_root_callback,
486 [[maybe_unused]] jvmtiStackReferenceCallback stack_ref_callback,
487 [[maybe_unused]] jvmtiObjectReferenceCallback object_ref_callback,
488 [[maybe_unused]] const void* user_data) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700489 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800490 ENSURE_HAS_CAP(env, can_tag_objects);
Alex Light49948e92016-08-11 15:35:28 -0700491 return ERR(NOT_IMPLEMENTED);
492 }
493
494 static jvmtiError IterateOverHeap(jvmtiEnv* env,
Stefano Cianciulli78f3c722023-05-16 10:32:54 +0000495 [[maybe_unused]] jvmtiHeapObjectFilter object_filter,
496 [[maybe_unused]] jvmtiHeapObjectCallback heap_object_callback,
497 [[maybe_unused]] const void* user_data) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700498 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800499 ENSURE_HAS_CAP(env, can_tag_objects);
Alex Light49948e92016-08-11 15:35:28 -0700500 return ERR(NOT_IMPLEMENTED);
501 }
502
Alex Light6a3fd512017-02-27 14:34:32 -0800503 static jvmtiError IterateOverInstancesOfClass(
504 jvmtiEnv* env,
Alex Lightbbbcb532018-08-30 12:50:27 -0700505 jclass klass,
506 jvmtiHeapObjectFilter object_filter,
507 jvmtiHeapObjectCallback heap_object_callback,
508 const void* user_data) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700509 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800510 ENSURE_HAS_CAP(env, can_tag_objects);
Alex Lightbbbcb532018-08-30 12:50:27 -0700511 HeapUtil heap_util(ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table.get());
512 return heap_util.IterateOverInstancesOfClass(
513 env, klass, object_filter, heap_object_callback, user_data);
Alex Light49948e92016-08-11 15:35:28 -0700514 }
515
516 static jvmtiError GetLocalObject(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700517 jthread thread,
518 jint depth,
519 jint slot,
520 jobject* value_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700521 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800522 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700523 return MethodUtil::GetLocalVariable(env, thread, depth, slot, value_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700524 }
525
526 static jvmtiError GetLocalInstance(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700527 jthread thread,
528 jint depth,
529 jobject* value_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700530 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800531 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700532 return MethodUtil::GetLocalInstance(env, thread, depth, value_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700533 }
534
535 static jvmtiError GetLocalInt(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700536 jthread thread,
537 jint depth,
538 jint slot,
539 jint* value_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700540 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800541 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700542 return MethodUtil::GetLocalVariable(env, thread, depth, slot, value_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700543 }
544
545 static jvmtiError GetLocalLong(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700546 jthread thread,
547 jint depth,
548 jint slot,
549 jlong* value_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700550 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800551 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700552 return MethodUtil::GetLocalVariable(env, thread, depth, slot, value_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700553 }
554
555 static jvmtiError GetLocalFloat(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700556 jthread thread,
557 jint depth,
558 jint slot,
559 jfloat* value_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700560 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800561 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700562 return MethodUtil::GetLocalVariable(env, thread, depth, slot, value_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700563 }
564
565 static jvmtiError GetLocalDouble(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700566 jthread thread,
567 jint depth,
568 jint slot,
569 jdouble* value_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700570 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800571 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700572 return MethodUtil::GetLocalVariable(env, thread, depth, slot, value_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700573 }
574
575 static jvmtiError SetLocalObject(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700576 jthread thread,
577 jint depth,
578 jint slot,
579 jobject value) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700580 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800581 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700582 return MethodUtil::SetLocalVariable(env, thread, depth, slot, value);
Alex Light49948e92016-08-11 15:35:28 -0700583 }
584
585 static jvmtiError SetLocalInt(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700586 jthread thread,
587 jint depth,
588 jint slot,
589 jint value) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700590 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800591 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700592 return MethodUtil::SetLocalVariable(env, thread, depth, slot, value);
Alex Light49948e92016-08-11 15:35:28 -0700593 }
594
595 static jvmtiError SetLocalLong(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700596 jthread thread,
597 jint depth,
598 jint slot,
599 jlong value) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700600 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800601 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700602 return MethodUtil::SetLocalVariable(env, thread, depth, slot, value);
Alex Light49948e92016-08-11 15:35:28 -0700603 }
604
605 static jvmtiError SetLocalFloat(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700606 jthread thread,
607 jint depth,
608 jint slot,
609 jfloat value) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700610 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800611 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700612 return MethodUtil::SetLocalVariable(env, thread, depth, slot, value);
Alex Light49948e92016-08-11 15:35:28 -0700613 }
614
615 static jvmtiError SetLocalDouble(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700616 jthread thread,
617 jint depth,
618 jint slot,
619 jdouble value) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700620 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800621 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700622 return MethodUtil::SetLocalVariable(env, thread, depth, slot, value);
Alex Light49948e92016-08-11 15:35:28 -0700623 }
624
Alex Lighta26e3492017-06-27 17:55:37 -0700625
626 static jvmtiError SetBreakpoint(jvmtiEnv* env, jmethodID method, jlocation location) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700627 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800628 ENSURE_HAS_CAP(env, can_generate_breakpoint_events);
Alex Lighta26e3492017-06-27 17:55:37 -0700629 return BreakpointUtil::SetBreakpoint(env, method, location);
Alex Light49948e92016-08-11 15:35:28 -0700630 }
631
Alex Lighta26e3492017-06-27 17:55:37 -0700632 static jvmtiError ClearBreakpoint(jvmtiEnv* env, jmethodID method, jlocation location) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700633 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800634 ENSURE_HAS_CAP(env, can_generate_breakpoint_events);
Alex Lighta26e3492017-06-27 17:55:37 -0700635 return BreakpointUtil::ClearBreakpoint(env, method, location);
Alex Light49948e92016-08-11 15:35:28 -0700636 }
637
Alex Light084fa372017-06-16 08:58:34 -0700638 static jvmtiError SetFieldAccessWatch(jvmtiEnv* env, jclass klass, jfieldID field) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700639 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800640 ENSURE_HAS_CAP(env, can_generate_field_access_events);
Alex Light084fa372017-06-16 08:58:34 -0700641 return FieldUtil::SetFieldAccessWatch(env, klass, field);
Alex Light49948e92016-08-11 15:35:28 -0700642 }
643
Alex Light084fa372017-06-16 08:58:34 -0700644 static jvmtiError ClearFieldAccessWatch(jvmtiEnv* env, jclass klass, jfieldID field) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700645 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800646 ENSURE_HAS_CAP(env, can_generate_field_access_events);
Alex Light084fa372017-06-16 08:58:34 -0700647 return FieldUtil::ClearFieldAccessWatch(env, klass, field);
Alex Light49948e92016-08-11 15:35:28 -0700648 }
649
Alex Light084fa372017-06-16 08:58:34 -0700650 static jvmtiError SetFieldModificationWatch(jvmtiEnv* env, jclass klass, jfieldID field) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700651 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800652 ENSURE_HAS_CAP(env, can_generate_field_modification_events);
Alex Light084fa372017-06-16 08:58:34 -0700653 return FieldUtil::SetFieldModificationWatch(env, klass, field);
Alex Light49948e92016-08-11 15:35:28 -0700654 }
655
Alex Light084fa372017-06-16 08:58:34 -0700656 static jvmtiError ClearFieldModificationWatch(jvmtiEnv* env, jclass klass, jfieldID field) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700657 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800658 ENSURE_HAS_CAP(env, can_generate_field_modification_events);
Alex Light084fa372017-06-16 08:58:34 -0700659 return FieldUtil::ClearFieldModificationWatch(env, klass, field);
Alex Light49948e92016-08-11 15:35:28 -0700660 }
661
662 static jvmtiError GetLoadedClasses(jvmtiEnv* env, jint* class_count_ptr, jclass** classes_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700663 ENSURE_VALID_ENV(env);
Andreas Gampede19eb92017-02-24 16:21:18 -0800664 HeapUtil heap_util(ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table.get());
Andreas Gampeaa8b60c2016-10-12 12:51:25 -0700665 return heap_util.GetLoadedClasses(env, class_count_ptr, classes_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700666 }
667
668 static jvmtiError GetClassLoaderClasses(jvmtiEnv* env,
669 jobject initiating_loader,
670 jint* class_count_ptr,
671 jclass** classes_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700672 ENSURE_VALID_ENV(env);
Andreas Gampe70f16392017-01-16 14:20:10 -0800673 return ClassUtil::GetClassLoaderClasses(env, initiating_loader, class_count_ptr, classes_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700674 }
675
676 static jvmtiError GetClassSignature(jvmtiEnv* env,
677 jclass klass,
678 char** signature_ptr,
679 char** generic_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700680 ENSURE_VALID_ENV(env);
Andreas Gampee492ae32016-10-28 19:34:57 -0700681 return ClassUtil::GetClassSignature(env, klass, signature_ptr, generic_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700682 }
683
684 static jvmtiError GetClassStatus(jvmtiEnv* env, jclass klass, jint* status_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700685 ENSURE_VALID_ENV(env);
Andreas Gampeff9d2092017-01-06 09:12:49 -0800686 return ClassUtil::GetClassStatus(env, klass, status_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700687 }
688
Alex Light6fa7b812017-06-16 09:04:29 -0700689 static jvmtiError GetSourceFileName(jvmtiEnv* env, jclass klass, char** source_name_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700690 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800691 ENSURE_HAS_CAP(env, can_get_source_file_name);
Alex Light6fa7b812017-06-16 09:04:29 -0700692 return ClassUtil::GetSourceFileName(env, klass, source_name_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700693 }
694
695 static jvmtiError GetClassModifiers(jvmtiEnv* env, jclass klass, jint* modifiers_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700696 ENSURE_VALID_ENV(env);
Andreas Gampe64013e52017-01-06 13:07:19 -0800697 return ClassUtil::GetClassModifiers(env, klass, modifiers_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700698 }
699
700 static jvmtiError GetClassMethods(jvmtiEnv* env,
701 jclass klass,
702 jint* method_count_ptr,
703 jmethodID** methods_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700704 ENSURE_VALID_ENV(env);
Andreas Gampe18fee4d2017-01-06 11:36:35 -0800705 return ClassUtil::GetClassMethods(env, klass, method_count_ptr, methods_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700706 }
707
708 static jvmtiError GetClassFields(jvmtiEnv* env,
709 jclass klass,
710 jint* field_count_ptr,
711 jfieldID** fields_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700712 ENSURE_VALID_ENV(env);
Andreas Gampeac587272017-01-05 15:21:34 -0800713 return ClassUtil::GetClassFields(env, klass, field_count_ptr, fields_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700714 }
715
716 static jvmtiError GetImplementedInterfaces(jvmtiEnv* env,
717 jclass klass,
718 jint* interface_count_ptr,
719 jclass** interfaces_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700720 ENSURE_VALID_ENV(env);
Andreas Gampe8b07e472017-01-06 14:20:39 -0800721 return ClassUtil::GetImplementedInterfaces(env, klass, interface_count_ptr, interfaces_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700722 }
723
724 static jvmtiError GetClassVersionNumbers(jvmtiEnv* env,
725 jclass klass,
726 jint* minor_version_ptr,
727 jint* major_version_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700728 ENSURE_VALID_ENV(env);
Andreas Gampe812a2442017-01-19 22:04:46 -0800729 return ClassUtil::GetClassVersionNumbers(env, klass, minor_version_ptr, major_version_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700730 }
731
732 static jvmtiError GetConstantPool(jvmtiEnv* env,
Stefano Cianciulli78f3c722023-05-16 10:32:54 +0000733 [[maybe_unused]] jclass klass,
734 [[maybe_unused]] jint* constant_pool_count_ptr,
735 [[maybe_unused]] jint* constant_pool_byte_count_ptr,
736 [[maybe_unused]] unsigned char** constant_pool_bytes_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700737 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800738 ENSURE_HAS_CAP(env, can_get_constant_pool);
Alex Light49948e92016-08-11 15:35:28 -0700739 return ERR(NOT_IMPLEMENTED);
740 }
741
742 static jvmtiError IsInterface(jvmtiEnv* env, jclass klass, jboolean* is_interface_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700743 ENSURE_VALID_ENV(env);
Andreas Gampe4fd66ec2017-01-05 14:42:13 -0800744 return ClassUtil::IsInterface(env, klass, is_interface_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700745 }
746
747 static jvmtiError IsArrayClass(jvmtiEnv* env,
748 jclass klass,
749 jboolean* is_array_class_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700750 ENSURE_VALID_ENV(env);
Andreas Gampe4fd66ec2017-01-05 14:42:13 -0800751 return ClassUtil::IsArrayClass(env, klass, is_array_class_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700752 }
753
754 static jvmtiError IsModifiableClass(jvmtiEnv* env,
755 jclass klass,
756 jboolean* is_modifiable_class_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700757 ENSURE_VALID_ENV(env);
Alex Lighte4a88632017-01-10 07:41:24 -0800758 return Redefiner::IsModifiableClass(env, klass, is_modifiable_class_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700759 }
760
761 static jvmtiError GetClassLoader(jvmtiEnv* env, jclass klass, jobject* classloader_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700762 ENSURE_VALID_ENV(env);
Andreas Gampe8f5b6032017-01-06 15:50:55 -0800763 return ClassUtil::GetClassLoader(env, klass, classloader_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700764 }
765
766 static jvmtiError GetSourceDebugExtension(jvmtiEnv* env,
Alex Light6fa7b812017-06-16 09:04:29 -0700767 jclass klass,
768 char** source_debug_extension_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700769 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800770 ENSURE_HAS_CAP(env, can_get_source_debug_extension);
Alex Light6fa7b812017-06-16 09:04:29 -0700771 return ClassUtil::GetSourceDebugExtension(env, klass, source_debug_extension_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700772 }
773
774 static jvmtiError RetransformClasses(jvmtiEnv* env, jint class_count, const jclass* classes) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700775 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800776 ENSURE_HAS_CAP(env, can_retransform_classes);
Alex Light3732beb2019-10-04 13:35:34 -0700777 return Transformer::RetransformClasses(env, class_count, classes);
Alex Light49948e92016-08-11 15:35:28 -0700778 }
779
780 static jvmtiError RedefineClasses(jvmtiEnv* env,
781 jint class_count,
782 const jvmtiClassDefinition* class_definitions) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700783 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800784 ENSURE_HAS_CAP(env, can_redefine_classes);
Alex Light3732beb2019-10-04 13:35:34 -0700785 return Redefiner::RedefineClasses(env, class_count, class_definitions);
Alex Light49948e92016-08-11 15:35:28 -0700786 }
787
788 static jvmtiError GetObjectSize(jvmtiEnv* env, jobject object, jlong* size_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700789 ENSURE_VALID_ENV(env);
Andreas Gampe50a4e492017-01-06 18:00:20 -0800790 return ObjectUtil::GetObjectSize(env, object, size_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700791 }
792
793 static jvmtiError GetObjectHashCode(jvmtiEnv* env, jobject object, jint* hash_code_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700794 ENSURE_VALID_ENV(env);
Andreas Gampe50a4e492017-01-06 18:00:20 -0800795 return ObjectUtil::GetObjectHashCode(env, object, hash_code_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700796 }
797
798 static jvmtiError GetObjectMonitorUsage(jvmtiEnv* env,
Alex Lightce568642017-09-05 16:54:25 -0700799 jobject object,
800 jvmtiMonitorUsage* info_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700801 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800802 ENSURE_HAS_CAP(env, can_get_monitor_info);
Alex Lightce568642017-09-05 16:54:25 -0700803 return ObjectUtil::GetObjectMonitorUsage(env, object, info_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700804 }
805
806 static jvmtiError GetFieldName(jvmtiEnv* env,
807 jclass klass,
808 jfieldID field,
809 char** name_ptr,
810 char** signature_ptr,
811 char** generic_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700812 ENSURE_VALID_ENV(env);
Andreas Gampeab2f0d02017-01-05 17:23:45 -0800813 return FieldUtil::GetFieldName(env, klass, field, name_ptr, signature_ptr, generic_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700814 }
815
816 static jvmtiError GetFieldDeclaringClass(jvmtiEnv* env,
817 jclass klass,
818 jfieldID field,
819 jclass* declaring_class_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700820 ENSURE_VALID_ENV(env);
Andreas Gampeab2f0d02017-01-05 17:23:45 -0800821 return FieldUtil::GetFieldDeclaringClass(env, klass, field, declaring_class_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700822 }
823
824 static jvmtiError GetFieldModifiers(jvmtiEnv* env,
825 jclass klass,
826 jfieldID field,
827 jint* modifiers_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700828 ENSURE_VALID_ENV(env);
Andreas Gampeab2f0d02017-01-05 17:23:45 -0800829 return FieldUtil::GetFieldModifiers(env, klass, field, modifiers_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700830 }
831
832 static jvmtiError IsFieldSynthetic(jvmtiEnv* env,
833 jclass klass,
834 jfieldID field,
835 jboolean* is_synthetic_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700836 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800837 ENSURE_HAS_CAP(env, can_get_synthetic_attribute);
Andreas Gampeab2f0d02017-01-05 17:23:45 -0800838 return FieldUtil::IsFieldSynthetic(env, klass, field, is_synthetic_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700839 }
840
841 static jvmtiError GetMethodName(jvmtiEnv* env,
842 jmethodID method,
843 char** name_ptr,
844 char** signature_ptr,
845 char** generic_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700846 ENSURE_VALID_ENV(env);
Andreas Gampe3c252f02016-10-27 18:25:17 -0700847 return MethodUtil::GetMethodName(env, method, name_ptr, signature_ptr, generic_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700848 }
849
850 static jvmtiError GetMethodDeclaringClass(jvmtiEnv* env,
851 jmethodID method,
852 jclass* declaring_class_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700853 ENSURE_VALID_ENV(env);
Andreas Gampe368a2082016-10-28 17:33:13 -0700854 return MethodUtil::GetMethodDeclaringClass(env, method, declaring_class_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700855 }
856
857 static jvmtiError GetMethodModifiers(jvmtiEnv* env,
858 jmethodID method,
859 jint* modifiers_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700860 ENSURE_VALID_ENV(env);
Andreas Gampe36bcd4f2016-10-28 18:07:18 -0700861 return MethodUtil::GetMethodModifiers(env, method, modifiers_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700862 }
863
864 static jvmtiError GetMaxLocals(jvmtiEnv* env,
865 jmethodID method,
866 jint* max_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700867 ENSURE_VALID_ENV(env);
Andreas Gampef71832e2017-01-09 11:38:04 -0800868 return MethodUtil::GetMaxLocals(env, method, max_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700869 }
870
871 static jvmtiError GetArgumentsSize(jvmtiEnv* env,
872 jmethodID method,
873 jint* size_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700874 ENSURE_VALID_ENV(env);
Andreas Gampef71832e2017-01-09 11:38:04 -0800875 return MethodUtil::GetArgumentsSize(env, method, size_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700876 }
877
878 static jvmtiError GetLineNumberTable(jvmtiEnv* env,
879 jmethodID method,
880 jint* entry_count_ptr,
881 jvmtiLineNumberEntry** table_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700882 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800883 ENSURE_HAS_CAP(env, can_get_line_numbers);
Andreas Gampeda3e5612016-12-13 19:00:53 -0800884 return MethodUtil::GetLineNumberTable(env, method, entry_count_ptr, table_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700885 }
886
887 static jvmtiError GetMethodLocation(jvmtiEnv* env,
888 jmethodID method,
889 jlocation* start_location_ptr,
890 jlocation* end_location_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700891 ENSURE_VALID_ENV(env);
Andreas Gampef71832e2017-01-09 11:38:04 -0800892 return MethodUtil::GetMethodLocation(env, method, start_location_ptr, end_location_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700893 }
894
895 static jvmtiError GetLocalVariableTable(jvmtiEnv* env,
Alex Lightce68cc62017-07-26 10:30:38 -0700896 jmethodID method,
897 jint* entry_count_ptr,
898 jvmtiLocalVariableEntry** table_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700899 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800900 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightce68cc62017-07-26 10:30:38 -0700901 return MethodUtil::GetLocalVariableTable(env, method, entry_count_ptr, table_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700902 }
903
904 static jvmtiError GetBytecodes(jvmtiEnv* env,
Alex Light4c174282017-07-05 10:18:18 -0700905 jmethodID method,
906 jint* bytecode_count_ptr,
907 unsigned char** bytecodes_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700908 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800909 ENSURE_HAS_CAP(env, can_get_bytecodes);
Alex Light4c174282017-07-05 10:18:18 -0700910 return MethodUtil::GetBytecodes(env, method, bytecode_count_ptr, bytecodes_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700911 }
912
913 static jvmtiError IsMethodNative(jvmtiEnv* env, jmethodID method, jboolean* is_native_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700914 ENSURE_VALID_ENV(env);
Andreas Gampefdeef522017-01-09 14:40:25 -0800915 return MethodUtil::IsMethodNative(env, method, is_native_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700916 }
917
918 static jvmtiError IsMethodSynthetic(jvmtiEnv* env, jmethodID method, jboolean* is_synthetic_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700919 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800920 ENSURE_HAS_CAP(env, can_get_synthetic_attribute);
Andreas Gampefdeef522017-01-09 14:40:25 -0800921 return MethodUtil::IsMethodSynthetic(env, method, is_synthetic_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700922 }
923
924 static jvmtiError IsMethodObsolete(jvmtiEnv* env, jmethodID method, jboolean* is_obsolete_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700925 ENSURE_VALID_ENV(env);
Andreas Gampefdeef522017-01-09 14:40:25 -0800926 return MethodUtil::IsMethodObsolete(env, method, is_obsolete_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700927 }
928
Stefano Cianciulli78f3c722023-05-16 10:32:54 +0000929 static jvmtiError SetNativeMethodPrefix(jvmtiEnv* env, [[maybe_unused]] const char* prefix) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700930 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800931 ENSURE_HAS_CAP(env, can_set_native_method_prefix);
Alex Light49948e92016-08-11 15:35:28 -0700932 return ERR(NOT_IMPLEMENTED);
933 }
934
Alex Light6a3fd512017-02-27 14:34:32 -0800935 static jvmtiError SetNativeMethodPrefixes(jvmtiEnv* env,
Stefano Cianciulli78f3c722023-05-16 10:32:54 +0000936 [[maybe_unused]] jint prefix_count,
937 [[maybe_unused]] char** prefixes) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700938 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800939 ENSURE_HAS_CAP(env, can_set_native_method_prefix);
Alex Light49948e92016-08-11 15:35:28 -0700940 return ERR(NOT_IMPLEMENTED);
941 }
942
943 static jvmtiError CreateRawMonitor(jvmtiEnv* env, const char* name, jrawMonitorID* monitor_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700944 ENSURE_VALID_ENV(env);
Andreas Gampe319dbe82017-01-09 16:42:21 -0800945 return MonitorUtil::CreateRawMonitor(env, name, monitor_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700946 }
947
948 static jvmtiError DestroyRawMonitor(jvmtiEnv* env, jrawMonitorID monitor) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700949 ENSURE_VALID_ENV(env);
Andreas Gampe319dbe82017-01-09 16:42:21 -0800950 return MonitorUtil::DestroyRawMonitor(env, monitor);
Alex Light49948e92016-08-11 15:35:28 -0700951 }
952
953 static jvmtiError RawMonitorEnter(jvmtiEnv* env, jrawMonitorID monitor) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700954 ENSURE_VALID_ENV(env);
Andreas Gampe319dbe82017-01-09 16:42:21 -0800955 return MonitorUtil::RawMonitorEnter(env, monitor);
Alex Light49948e92016-08-11 15:35:28 -0700956 }
957
958 static jvmtiError RawMonitorExit(jvmtiEnv* env, jrawMonitorID monitor) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700959 ENSURE_VALID_ENV(env);
Andreas Gampe319dbe82017-01-09 16:42:21 -0800960 return MonitorUtil::RawMonitorExit(env, monitor);
Alex Light49948e92016-08-11 15:35:28 -0700961 }
962
963 static jvmtiError RawMonitorWait(jvmtiEnv* env, jrawMonitorID monitor, jlong millis) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700964 ENSURE_VALID_ENV(env);
Andreas Gampe319dbe82017-01-09 16:42:21 -0800965 return MonitorUtil::RawMonitorWait(env, monitor, millis);
Alex Light49948e92016-08-11 15:35:28 -0700966 }
967
968 static jvmtiError RawMonitorNotify(jvmtiEnv* env, jrawMonitorID monitor) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700969 ENSURE_VALID_ENV(env);
Andreas Gampe319dbe82017-01-09 16:42:21 -0800970 return MonitorUtil::RawMonitorNotify(env, monitor);
Alex Light49948e92016-08-11 15:35:28 -0700971 }
972
973 static jvmtiError RawMonitorNotifyAll(jvmtiEnv* env, jrawMonitorID monitor) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700974 ENSURE_VALID_ENV(env);
Andreas Gampe319dbe82017-01-09 16:42:21 -0800975 return MonitorUtil::RawMonitorNotifyAll(env, monitor);
Alex Light49948e92016-08-11 15:35:28 -0700976 }
977
978 static jvmtiError SetJNIFunctionTable(jvmtiEnv* env, const jniNativeInterface* function_table) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700979 ENSURE_VALID_ENV(env);
Andreas Gampe6f8e4f02017-01-16 18:18:14 -0800980 return JNIUtil::SetJNIFunctionTable(env, function_table);
Alex Light49948e92016-08-11 15:35:28 -0700981 }
982
983 static jvmtiError GetJNIFunctionTable(jvmtiEnv* env, jniNativeInterface** function_table) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700984 ENSURE_VALID_ENV(env);
Andreas Gampe6f8e4f02017-01-16 18:18:14 -0800985 return JNIUtil::GetJNIFunctionTable(env, function_table);
Alex Light49948e92016-08-11 15:35:28 -0700986 }
987
Andreas Gampe77708d92016-10-07 11:48:21 -0700988 // TODO: This will require locking, so that an agent can't remove callbacks when we're dispatching
989 // an event.
Alex Light49948e92016-08-11 15:35:28 -0700990 static jvmtiError SetEventCallbacks(jvmtiEnv* env,
991 const jvmtiEventCallbacks* callbacks,
992 jint size_of_callbacks) {
Alex Lighte6574242016-08-17 09:56:24 -0700993 ENSURE_VALID_ENV(env);
Andreas Gampe77708d92016-10-07 11:48:21 -0700994 if (size_of_callbacks < 0) {
995 return ERR(ILLEGAL_ARGUMENT);
996 }
997
998 if (callbacks == nullptr) {
999 ArtJvmTiEnv::AsArtJvmTiEnv(env)->event_callbacks.reset();
1000 return ERR(NONE);
1001 }
1002
Alex Light8c2b9292017-11-09 13:21:01 -08001003 // Lock the event_info_mutex_ while we replace the callbacks.
1004 ArtJvmTiEnv* art_env = ArtJvmTiEnv::AsArtJvmTiEnv(env);
1005 art::WriterMutexLock lk(art::Thread::Current(), art_env->event_info_mutex_);
1006 std::unique_ptr<ArtJvmtiEventCallbacks> tmp(new ArtJvmtiEventCallbacks());
1007 // Copy over the extension events.
1008 tmp->CopyExtensionsFrom(art_env->event_callbacks.get());
1009 // Never overwrite the extension events.
Andreas Gampe77708d92016-10-07 11:48:21 -07001010 size_t copy_size = std::min(sizeof(jvmtiEventCallbacks),
1011 static_cast<size_t>(size_of_callbacks));
1012 copy_size = art::RoundDown(copy_size, sizeof(void*));
Alex Light8c2b9292017-11-09 13:21:01 -08001013 // Copy non-extension events.
Andreas Gampe77708d92016-10-07 11:48:21 -07001014 memcpy(tmp.get(), callbacks, copy_size);
1015
Alex Light8c2b9292017-11-09 13:21:01 -08001016 // replace the event table.
1017 art_env->event_callbacks = std::move(tmp);
Andreas Gampe77708d92016-10-07 11:48:21 -07001018
1019 return ERR(NONE);
Alex Light49948e92016-08-11 15:35:28 -07001020 }
1021
1022 static jvmtiError SetEventNotificationMode(jvmtiEnv* env,
1023 jvmtiEventMode mode,
1024 jvmtiEvent event_type,
1025 jthread event_thread,
1026 ...) {
Alex Lighte6574242016-08-17 09:56:24 -07001027 ENSURE_VALID_ENV(env);
Alex Light40d87f42017-01-18 10:27:06 -08001028 ArtJvmTiEnv* art_env = ArtJvmTiEnv::AsArtJvmTiEnv(env);
Alex Light0e841182018-02-12 17:42:50 +00001029 return gEventHandler->SetEvent(art_env,
Alex Light3dacdd62019-03-12 15:45:47 +00001030 event_thread,
Alex Light0e841182018-02-12 17:42:50 +00001031 GetArtJvmtiEvent(art_env, event_type),
1032 mode);
Alex Light49948e92016-08-11 15:35:28 -07001033 }
1034
Stefano Cianciulli78f3c722023-05-16 10:32:54 +00001035 static jvmtiError GenerateEvents(jvmtiEnv* env, [[maybe_unused]] jvmtiEvent event_type) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001036 ENSURE_VALID_ENV(env);
Alex Light6a3fd512017-02-27 14:34:32 -08001037 return OK;
Alex Light49948e92016-08-11 15:35:28 -07001038 }
1039
Alex Light1edc8cf2017-03-24 14:22:56 -07001040 static jvmtiError GetExtensionFunctions(jvmtiEnv* env,
Alex Light49948e92016-08-11 15:35:28 -07001041 jint* extension_count_ptr,
1042 jvmtiExtensionFunctionInfo** extensions) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001043 ENSURE_VALID_ENV(env);
Andreas Gamped73aba42017-05-03 21:40:26 -07001044 ENSURE_NON_NULL(extension_count_ptr);
1045 ENSURE_NON_NULL(extensions);
Alex Light3f33c0a2017-11-08 10:17:37 -08001046 return ExtensionUtil::GetExtensionFunctions(env, extension_count_ptr, extensions);
Alex Light49948e92016-08-11 15:35:28 -07001047 }
1048
Alex Light1edc8cf2017-03-24 14:22:56 -07001049 static jvmtiError GetExtensionEvents(jvmtiEnv* env,
Alex Light49948e92016-08-11 15:35:28 -07001050 jint* extension_count_ptr,
1051 jvmtiExtensionEventInfo** extensions) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001052 ENSURE_VALID_ENV(env);
Alex Light3f33c0a2017-11-08 10:17:37 -08001053 ENSURE_NON_NULL(extension_count_ptr);
1054 ENSURE_NON_NULL(extensions);
1055 return ExtensionUtil::GetExtensionEvents(env, extension_count_ptr, extensions);
Alex Light49948e92016-08-11 15:35:28 -07001056 }
1057
Alex Light1edc8cf2017-03-24 14:22:56 -07001058 static jvmtiError SetExtensionEventCallback(jvmtiEnv* env,
Alex Light3f33c0a2017-11-08 10:17:37 -08001059 jint extension_event_index,
1060 jvmtiExtensionEvent callback) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001061 ENSURE_VALID_ENV(env);
Alex Light8c2b9292017-11-09 13:21:01 -08001062 return ExtensionUtil::SetExtensionEventCallback(env,
1063 extension_event_index,
1064 callback,
Alex Light0e841182018-02-12 17:42:50 +00001065 gEventHandler);
Alex Light49948e92016-08-11 15:35:28 -07001066 }
1067
Alex Light2ce6fc82017-12-18 16:42:36 -08001068#define FOR_ALL_CAPABILITIES(FUN) \
1069 FUN(can_tag_objects) \
1070 FUN(can_generate_field_modification_events) \
1071 FUN(can_generate_field_access_events) \
1072 FUN(can_get_bytecodes) \
1073 FUN(can_get_synthetic_attribute) \
1074 FUN(can_get_owned_monitor_info) \
1075 FUN(can_get_current_contended_monitor) \
1076 FUN(can_get_monitor_info) \
1077 FUN(can_pop_frame) \
1078 FUN(can_redefine_classes) \
1079 FUN(can_signal_thread) \
1080 FUN(can_get_source_file_name) \
1081 FUN(can_get_line_numbers) \
1082 FUN(can_get_source_debug_extension) \
1083 FUN(can_access_local_variables) \
1084 FUN(can_maintain_original_method_order) \
1085 FUN(can_generate_single_step_events) \
1086 FUN(can_generate_exception_events) \
1087 FUN(can_generate_frame_pop_events) \
1088 FUN(can_generate_breakpoint_events) \
1089 FUN(can_suspend) \
1090 FUN(can_redefine_any_class) \
1091 FUN(can_get_current_thread_cpu_time) \
1092 FUN(can_get_thread_cpu_time) \
1093 FUN(can_generate_method_entry_events) \
1094 FUN(can_generate_method_exit_events) \
1095 FUN(can_generate_all_class_hook_events) \
1096 FUN(can_generate_compiled_method_load_events) \
1097 FUN(can_generate_monitor_events) \
1098 FUN(can_generate_vm_object_alloc_events) \
1099 FUN(can_generate_native_method_bind_events) \
1100 FUN(can_generate_garbage_collection_events) \
1101 FUN(can_generate_object_free_events) \
1102 FUN(can_force_early_return) \
1103 FUN(can_get_owned_monitor_stack_depth_info) \
1104 FUN(can_get_constant_pool) \
1105 FUN(can_set_native_method_prefix) \
1106 FUN(can_retransform_classes) \
1107 FUN(can_retransform_any_class) \
1108 FUN(can_generate_resource_exhaustion_heap_events) \
1109 FUN(can_generate_resource_exhaustion_threads_events)
1110
Alex Light49948e92016-08-11 15:35:28 -07001111 static jvmtiError GetPotentialCapabilities(jvmtiEnv* env, jvmtiCapabilities* capabilities_ptr) {
Alex Lighte6574242016-08-17 09:56:24 -07001112 ENSURE_VALID_ENV(env);
1113 ENSURE_NON_NULL(capabilities_ptr);
1114 *capabilities_ptr = kPotentialCapabilities;
Alex Light2ce6fc82017-12-18 16:42:36 -08001115 if (UNLIKELY(!IsFullJvmtiAvailable())) {
1116#define REMOVE_NONDEBUGGABLE_UNSUPPORTED(e) \
1117 do { \
1118 if (kNonDebuggableUnsupportedCapabilities.e == 1) { \
1119 capabilities_ptr->e = 0; \
1120 } \
1121 } while (false);
1122
1123 FOR_ALL_CAPABILITIES(REMOVE_NONDEBUGGABLE_UNSUPPORTED);
1124#undef REMOVE_NONDEBUGGABLE_UNSUPPORTED
1125 }
Alex Lighte6574242016-08-17 09:56:24 -07001126 return OK;
Alex Light49948e92016-08-11 15:35:28 -07001127 }
1128
1129 static jvmtiError AddCapabilities(jvmtiEnv* env, const jvmtiCapabilities* capabilities_ptr) {
Alex Lighte6574242016-08-17 09:56:24 -07001130 ENSURE_VALID_ENV(env);
1131 ENSURE_NON_NULL(capabilities_ptr);
1132 ArtJvmTiEnv* art_env = static_cast<ArtJvmTiEnv*>(env);
1133 jvmtiError ret = OK;
Alex Light34d8e082017-03-27 09:50:36 -07001134 jvmtiCapabilities changed = {};
1135 jvmtiCapabilities potential_capabilities = {};
Alex Light1d224962017-02-27 10:26:35 -08001136 ret = env->GetPotentialCapabilities(&potential_capabilities);
1137 if (ret != OK) {
1138 return ret;
1139 }
Alex Lighte6574242016-08-17 09:56:24 -07001140#define ADD_CAPABILITY(e) \
1141 do { \
1142 if (capabilities_ptr->e == 1) { \
Alex Light1d224962017-02-27 10:26:35 -08001143 if (potential_capabilities.e == 1) { \
Alex Light73afd322017-01-18 11:17:47 -08001144 if (art_env->capabilities.e != 1) { \
1145 art_env->capabilities.e = 1; \
1146 changed.e = 1; \
1147 }\
Alex Lighte6574242016-08-17 09:56:24 -07001148 } else { \
1149 ret = ERR(NOT_AVAILABLE); \
1150 } \
1151 } \
Alex Light2ce6fc82017-12-18 16:42:36 -08001152 } while (false);
Alex Lighte6574242016-08-17 09:56:24 -07001153
Alex Light2ce6fc82017-12-18 16:42:36 -08001154 FOR_ALL_CAPABILITIES(ADD_CAPABILITY);
Alex Lighte6574242016-08-17 09:56:24 -07001155#undef ADD_CAPABILITY
Alex Light0e841182018-02-12 17:42:50 +00001156 gEventHandler->HandleChangedCapabilities(ArtJvmTiEnv::AsArtJvmTiEnv(env),
1157 changed,
Andreas Gampe6e897762018-10-16 13:09:32 -07001158 /*added=*/true);
Alex Lighte6574242016-08-17 09:56:24 -07001159 return ret;
Alex Light49948e92016-08-11 15:35:28 -07001160 }
1161
1162 static jvmtiError RelinquishCapabilities(jvmtiEnv* env,
1163 const jvmtiCapabilities* capabilities_ptr) {
Alex Lighte6574242016-08-17 09:56:24 -07001164 ENSURE_VALID_ENV(env);
1165 ENSURE_NON_NULL(capabilities_ptr);
1166 ArtJvmTiEnv* art_env = reinterpret_cast<ArtJvmTiEnv*>(env);
Alex Light34d8e082017-03-27 09:50:36 -07001167 jvmtiCapabilities changed = {};
Alex Lighte6574242016-08-17 09:56:24 -07001168#define DEL_CAPABILITY(e) \
1169 do { \
1170 if (capabilities_ptr->e == 1) { \
Alex Light73afd322017-01-18 11:17:47 -08001171 if (art_env->capabilities.e == 1) { \
1172 art_env->capabilities.e = 0;\
1173 changed.e = 1; \
1174 } \
Alex Lighte6574242016-08-17 09:56:24 -07001175 } \
Alex Light2ce6fc82017-12-18 16:42:36 -08001176 } while (false);
Alex Lighte6574242016-08-17 09:56:24 -07001177
Alex Light2ce6fc82017-12-18 16:42:36 -08001178 FOR_ALL_CAPABILITIES(DEL_CAPABILITY);
Alex Lighte6574242016-08-17 09:56:24 -07001179#undef DEL_CAPABILITY
Alex Light0e841182018-02-12 17:42:50 +00001180 gEventHandler->HandleChangedCapabilities(ArtJvmTiEnv::AsArtJvmTiEnv(env),
1181 changed,
Andreas Gampe6e897762018-10-16 13:09:32 -07001182 /*added=*/false);
Alex Lighte6574242016-08-17 09:56:24 -07001183 return OK;
Alex Light49948e92016-08-11 15:35:28 -07001184 }
1185
Alex Light2ce6fc82017-12-18 16:42:36 -08001186#undef FOR_ALL_CAPABILITIES
1187
Alex Light49948e92016-08-11 15:35:28 -07001188 static jvmtiError GetCapabilities(jvmtiEnv* env, jvmtiCapabilities* capabilities_ptr) {
Alex Lighte6574242016-08-17 09:56:24 -07001189 ENSURE_VALID_ENV(env);
1190 ENSURE_NON_NULL(capabilities_ptr);
1191 ArtJvmTiEnv* artenv = reinterpret_cast<ArtJvmTiEnv*>(env);
1192 *capabilities_ptr = artenv->capabilities;
1193 return OK;
Alex Light49948e92016-08-11 15:35:28 -07001194 }
1195
Alex Light6a3fd512017-02-27 14:34:32 -08001196 static jvmtiError GetCurrentThreadCpuTimerInfo(jvmtiEnv* env,
Stefano Cianciulli78f3c722023-05-16 10:32:54 +00001197 [[maybe_unused]] jvmtiTimerInfo* info_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001198 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -08001199 ENSURE_HAS_CAP(env, can_get_current_thread_cpu_time);
Alex Light49948e92016-08-11 15:35:28 -07001200 return ERR(NOT_IMPLEMENTED);
1201 }
1202
Stefano Cianciulli78f3c722023-05-16 10:32:54 +00001203 static jvmtiError GetCurrentThreadCpuTime(jvmtiEnv* env, [[maybe_unused]] jlong* nanos_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001204 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -08001205 ENSURE_HAS_CAP(env, can_get_current_thread_cpu_time);
Alex Light49948e92016-08-11 15:35:28 -07001206 return ERR(NOT_IMPLEMENTED);
1207 }
1208
Alex Light6a3fd512017-02-27 14:34:32 -08001209 static jvmtiError GetThreadCpuTimerInfo(jvmtiEnv* env,
Stefano Cianciulli78f3c722023-05-16 10:32:54 +00001210 [[maybe_unused]] jvmtiTimerInfo* info_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001211 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -08001212 ENSURE_HAS_CAP(env, can_get_thread_cpu_time);
Alex Light49948e92016-08-11 15:35:28 -07001213 return ERR(NOT_IMPLEMENTED);
1214 }
1215
Alex Light6a3fd512017-02-27 14:34:32 -08001216 static jvmtiError GetThreadCpuTime(jvmtiEnv* env,
Stefano Cianciulli78f3c722023-05-16 10:32:54 +00001217 [[maybe_unused]] jthread thread,
1218 [[maybe_unused]] jlong* nanos_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001219 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -08001220 ENSURE_HAS_CAP(env, can_get_thread_cpu_time);
Alex Light49948e92016-08-11 15:35:28 -07001221 return ERR(NOT_IMPLEMENTED);
1222 }
1223
1224 static jvmtiError GetTimerInfo(jvmtiEnv* env, jvmtiTimerInfo* info_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001225 ENSURE_VALID_ENV(env);
Andreas Gampe35bcf812017-01-13 16:24:17 -08001226 return TimerUtil::GetTimerInfo(env, info_ptr);
Alex Light49948e92016-08-11 15:35:28 -07001227 }
1228
1229 static jvmtiError GetTime(jvmtiEnv* env, jlong* nanos_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001230 ENSURE_VALID_ENV(env);
Andreas Gampe35bcf812017-01-13 16:24:17 -08001231 return TimerUtil::GetTime(env, nanos_ptr);
Alex Light49948e92016-08-11 15:35:28 -07001232 }
1233
1234 static jvmtiError GetAvailableProcessors(jvmtiEnv* env, jint* processor_count_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001235 ENSURE_VALID_ENV(env);
Andreas Gampe35bcf812017-01-13 16:24:17 -08001236 return TimerUtil::GetAvailableProcessors(env, processor_count_ptr);
Alex Light49948e92016-08-11 15:35:28 -07001237 }
1238
1239 static jvmtiError AddToBootstrapClassLoaderSearch(jvmtiEnv* env, const char* segment) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001240 ENSURE_VALID_ENV(env);
Andreas Gampece7732b2017-01-17 15:50:26 -08001241 return SearchUtil::AddToBootstrapClassLoaderSearch(env, segment);
Alex Light49948e92016-08-11 15:35:28 -07001242 }
1243
1244 static jvmtiError AddToSystemClassLoaderSearch(jvmtiEnv* env, const char* segment) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001245 ENSURE_VALID_ENV(env);
Andreas Gampece7732b2017-01-17 15:50:26 -08001246 return SearchUtil::AddToSystemClassLoaderSearch(env, segment);
Alex Light49948e92016-08-11 15:35:28 -07001247 }
1248
1249 static jvmtiError GetSystemProperties(jvmtiEnv* env, jint* count_ptr, char*** property_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001250 ENSURE_VALID_ENV(env);
Andreas Gampe1bdaf732017-01-09 19:21:06 -08001251 return PropertiesUtil::GetSystemProperties(env, count_ptr, property_ptr);
Alex Light49948e92016-08-11 15:35:28 -07001252 }
1253
1254 static jvmtiError GetSystemProperty(jvmtiEnv* env, const char* property, char** value_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001255 ENSURE_VALID_ENV(env);
Andreas Gampe1bdaf732017-01-09 19:21:06 -08001256 return PropertiesUtil::GetSystemProperty(env, property, value_ptr);
Alex Light49948e92016-08-11 15:35:28 -07001257 }
1258
1259 static jvmtiError SetSystemProperty(jvmtiEnv* env, const char* property, const char* value) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001260 ENSURE_VALID_ENV(env);
Andreas Gampe1bdaf732017-01-09 19:21:06 -08001261 return PropertiesUtil::SetSystemProperty(env, property, value);
Alex Light49948e92016-08-11 15:35:28 -07001262 }
1263
1264 static jvmtiError GetPhase(jvmtiEnv* env, jvmtiPhase* phase_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001265 ENSURE_VALID_ENV(env);
Andreas Gampe96eca782017-01-19 19:45:30 -08001266 return PhaseUtil::GetPhase(env, phase_ptr);
Alex Light49948e92016-08-11 15:35:28 -07001267 }
1268
1269 static jvmtiError DisposeEnvironment(jvmtiEnv* env) {
Alex Lighte6574242016-08-17 09:56:24 -07001270 ENSURE_VALID_ENV(env);
Alex Light092a4042017-07-12 08:46:44 -07001271 ArtJvmTiEnv* tienv = ArtJvmTiEnv::AsArtJvmTiEnv(env);
Alex Light0e841182018-02-12 17:42:50 +00001272 gEventHandler->RemoveArtJvmTiEnv(tienv);
Alex Light092a4042017-07-12 08:46:44 -07001273 art::Runtime::Current()->RemoveSystemWeakHolder(tienv->object_tag_table.get());
1274 ThreadUtil::RemoveEnvironment(tienv);
1275 delete tienv;
Alex Light49948e92016-08-11 15:35:28 -07001276 return OK;
1277 }
1278
1279 static jvmtiError SetEnvironmentLocalStorage(jvmtiEnv* env, const void* data) {
Alex Lighte6574242016-08-17 09:56:24 -07001280 ENSURE_VALID_ENV(env);
Alex Light49948e92016-08-11 15:35:28 -07001281 reinterpret_cast<ArtJvmTiEnv*>(env)->local_data = const_cast<void*>(data);
1282 return OK;
1283 }
1284
1285 static jvmtiError GetEnvironmentLocalStorage(jvmtiEnv* env, void** data_ptr) {
Alex Lighte6574242016-08-17 09:56:24 -07001286 ENSURE_VALID_ENV(env);
Alex Light49948e92016-08-11 15:35:28 -07001287 *data_ptr = reinterpret_cast<ArtJvmTiEnv*>(env)->local_data;
1288 return OK;
1289 }
1290
1291 static jvmtiError GetVersionNumber(jvmtiEnv* env, jint* version_ptr) {
Alex Lighte6574242016-08-17 09:56:24 -07001292 ENSURE_VALID_ENV(env);
Alex Light2ce6fc82017-12-18 16:42:36 -08001293 *version_ptr = ArtJvmTiEnv::AsArtJvmTiEnv(env)->ti_version;
Alex Light49948e92016-08-11 15:35:28 -07001294 return OK;
1295 }
1296
1297 static jvmtiError GetErrorName(jvmtiEnv* env, jvmtiError error, char** name_ptr) {
Alex Lighte6574242016-08-17 09:56:24 -07001298 ENSURE_NON_NULL(name_ptr);
Andreas Gampe95c466d2017-05-08 14:50:47 -07001299 auto copy_fn = [&](const char* name_cstr) {
1300 jvmtiError res;
1301 JvmtiUniquePtr<char[]> copy = CopyString(env, name_cstr, &res);
1302 if (copy == nullptr) {
1303 *name_ptr = nullptr;
1304 return res;
1305 } else {
1306 *name_ptr = copy.release();
1307 return OK;
1308 }
1309 };
Alex Light49948e92016-08-11 15:35:28 -07001310 switch (error) {
Andreas Gampe95c466d2017-05-08 14:50:47 -07001311#define ERROR_CASE(e) case (JVMTI_ERROR_ ## e) : \
1312 return copy_fn("JVMTI_ERROR_"#e);
Alex Light49948e92016-08-11 15:35:28 -07001313 ERROR_CASE(NONE);
1314 ERROR_CASE(INVALID_THREAD);
1315 ERROR_CASE(INVALID_THREAD_GROUP);
1316 ERROR_CASE(INVALID_PRIORITY);
1317 ERROR_CASE(THREAD_NOT_SUSPENDED);
Andreas Gampe95c466d2017-05-08 14:50:47 -07001318 ERROR_CASE(THREAD_SUSPENDED);
Alex Light49948e92016-08-11 15:35:28 -07001319 ERROR_CASE(THREAD_NOT_ALIVE);
1320 ERROR_CASE(INVALID_OBJECT);
1321 ERROR_CASE(INVALID_CLASS);
1322 ERROR_CASE(CLASS_NOT_PREPARED);
1323 ERROR_CASE(INVALID_METHODID);
1324 ERROR_CASE(INVALID_LOCATION);
1325 ERROR_CASE(INVALID_FIELDID);
1326 ERROR_CASE(NO_MORE_FRAMES);
1327 ERROR_CASE(OPAQUE_FRAME);
1328 ERROR_CASE(TYPE_MISMATCH);
1329 ERROR_CASE(INVALID_SLOT);
1330 ERROR_CASE(DUPLICATE);
1331 ERROR_CASE(NOT_FOUND);
1332 ERROR_CASE(INVALID_MONITOR);
1333 ERROR_CASE(NOT_MONITOR_OWNER);
1334 ERROR_CASE(INTERRUPT);
1335 ERROR_CASE(INVALID_CLASS_FORMAT);
1336 ERROR_CASE(CIRCULAR_CLASS_DEFINITION);
1337 ERROR_CASE(FAILS_VERIFICATION);
1338 ERROR_CASE(UNSUPPORTED_REDEFINITION_METHOD_ADDED);
1339 ERROR_CASE(UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED);
1340 ERROR_CASE(INVALID_TYPESTATE);
1341 ERROR_CASE(UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED);
1342 ERROR_CASE(UNSUPPORTED_REDEFINITION_METHOD_DELETED);
1343 ERROR_CASE(UNSUPPORTED_VERSION);
1344 ERROR_CASE(NAMES_DONT_MATCH);
1345 ERROR_CASE(UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED);
1346 ERROR_CASE(UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED);
1347 ERROR_CASE(UNMODIFIABLE_CLASS);
1348 ERROR_CASE(NOT_AVAILABLE);
1349 ERROR_CASE(MUST_POSSESS_CAPABILITY);
1350 ERROR_CASE(NULL_POINTER);
1351 ERROR_CASE(ABSENT_INFORMATION);
1352 ERROR_CASE(INVALID_EVENT_TYPE);
1353 ERROR_CASE(ILLEGAL_ARGUMENT);
1354 ERROR_CASE(NATIVE_METHOD);
1355 ERROR_CASE(CLASS_LOADER_UNSUPPORTED);
1356 ERROR_CASE(OUT_OF_MEMORY);
1357 ERROR_CASE(ACCESS_DENIED);
1358 ERROR_CASE(WRONG_PHASE);
1359 ERROR_CASE(INTERNAL);
1360 ERROR_CASE(UNATTACHED_THREAD);
1361 ERROR_CASE(INVALID_ENVIRONMENT);
1362#undef ERROR_CASE
Alex Light49948e92016-08-11 15:35:28 -07001363 }
Andreas Gampe95c466d2017-05-08 14:50:47 -07001364
1365 return ERR(ILLEGAL_ARGUMENT);
Alex Light49948e92016-08-11 15:35:28 -07001366 }
1367
Alex Light1edc8cf2017-03-24 14:22:56 -07001368 static jvmtiError SetVerboseFlag(jvmtiEnv* env,
Alex Light6a3fd512017-02-27 14:34:32 -08001369 jvmtiVerboseFlag flag,
1370 jboolean value) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001371 ENSURE_VALID_ENV(env);
Alex Light8f951832020-02-24 14:31:54 -08001372 return LogUtil::SetVerboseFlag(env, flag, value);
Alex Light49948e92016-08-11 15:35:28 -07001373 }
1374
Alex Light1edc8cf2017-03-24 14:22:56 -07001375 static jvmtiError GetJLocationFormat(jvmtiEnv* env, jvmtiJlocationFormat* format_ptr) {
1376 ENSURE_VALID_ENV(env);
Andreas Gampeacfc9572017-01-17 18:36:56 -08001377 // Report BCI as jlocation format. We report dex bytecode indices.
1378 if (format_ptr == nullptr) {
1379 return ERR(NULL_POINTER);
1380 }
1381 *format_ptr = jvmtiJlocationFormat::JVMTI_JLOCATION_JVMBCI;
1382 return ERR(NONE);
Alex Light49948e92016-08-11 15:35:28 -07001383 }
1384};
1385
1386static bool IsJvmtiVersion(jint version) {
1387 return version == JVMTI_VERSION_1 ||
1388 version == JVMTI_VERSION_1_0 ||
1389 version == JVMTI_VERSION_1_1 ||
1390 version == JVMTI_VERSION_1_2 ||
1391 version == JVMTI_VERSION;
1392}
1393
Andreas Gampede19eb92017-02-24 16:21:18 -08001394extern const jvmtiInterface_1 gJvmtiInterface;
Alex Light092a4042017-07-12 08:46:44 -07001395
Alex Light2ce6fc82017-12-18 16:42:36 -08001396ArtJvmTiEnv::ArtJvmTiEnv(art::JavaVMExt* runtime, EventHandler* event_handler, jint version)
Andreas Gampede19eb92017-02-24 16:21:18 -08001397 : art_vm(runtime),
1398 local_data(nullptr),
Alex Light2ce6fc82017-12-18 16:42:36 -08001399 ti_version(version),
Alex Lightb6106d52017-10-18 15:02:15 -07001400 capabilities(),
Alex Lightae45cbb2018-10-18 15:49:56 -07001401 event_info_mutex_("jvmtiEnv_EventInfoMutex"),
1402 last_error_mutex_("jvmtiEnv_LastErrorMutex", art::LockLevel::kGenericBottomLock) {
Yi Kongc57c6802018-10-29 14:28:56 -07001403 object_tag_table = std::make_unique<ObjectTagTable>(event_handler, this);
Andreas Gampede19eb92017-02-24 16:21:18 -08001404 functions = &gJvmtiInterface;
1405}
1406
Alex Light49948e92016-08-11 15:35:28 -07001407// Creates a jvmtiEnv and returns it with the art::ti::Env that is associated with it. new_art_ti
1408// is a pointer to the uninitialized memory for an art::ti::Env.
Alex Light2ce6fc82017-12-18 16:42:36 -08001409static void CreateArtJvmTiEnv(art::JavaVMExt* vm, jint version, /*out*/void** new_jvmtiEnv) {
Alex Light0e841182018-02-12 17:42:50 +00001410 struct ArtJvmTiEnv* env = new ArtJvmTiEnv(vm, gEventHandler, version);
Alex Light49948e92016-08-11 15:35:28 -07001411 *new_jvmtiEnv = env;
Andreas Gampe77708d92016-10-07 11:48:21 -07001412
Alex Light0e841182018-02-12 17:42:50 +00001413 gEventHandler->RegisterArtJvmTiEnv(env);
Andreas Gampede19eb92017-02-24 16:21:18 -08001414
1415 art::Runtime::Current()->AddSystemWeakHolder(
1416 ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table.get());
Alex Light49948e92016-08-11 15:35:28 -07001417}
1418
1419// A hook that the runtime uses to allow plugins to handle GetEnv calls. It returns true and
1420// places the return value in 'env' if this library can handle the GetEnv request. Otherwise
1421// returns false and does not modify the 'env' pointer.
1422static jint GetEnvHandler(art::JavaVMExt* vm, /*out*/void** env, jint version) {
Alex Light2ce6fc82017-12-18 16:42:36 -08001423 // JavaDebuggable will either be set by the runtime as it is starting up or the plugin if it's
1424 // loaded early enough. If this is false we cannot guarantee conformance to all JVMTI behaviors
1425 // due to optimizations. We will only allow agents to get ArtTiEnvs using the kArtTiVersion.
1426 if (IsFullJvmtiAvailable() && IsJvmtiVersion(version)) {
1427 CreateArtJvmTiEnv(vm, JVMTI_VERSION, env);
1428 return JNI_OK;
1429 } else if (version == kArtTiVersion) {
1430 CreateArtJvmTiEnv(vm, kArtTiVersion, env);
Alex Light49948e92016-08-11 15:35:28 -07001431 return JNI_OK;
1432 } else {
1433 printf("version 0x%x is not valid!", version);
Alex Light0fba1862021-01-27 16:14:30 -08001434 if (IsJvmtiVersion(version)) {
1435 LOG(ERROR) << "JVMTI Version 0x" << std::hex << version << " requested but the runtime is not"
1436 << " debuggable! Only limited, best effort kArtTiVersion"
1437 << " (0x" << std::hex << kArtTiVersion << ") environments are available. If"
1438 << " possible, rebuild your apk in debuggable mode or start the runtime with"
1439 << " the `-Xcompiler-option --debuggable` flags.";
1440 }
Alex Light49948e92016-08-11 15:35:28 -07001441 return JNI_EVERSION;
1442 }
1443}
1444
1445// The plugin initialization function. This adds the jvmti environment.
1446extern "C" bool ArtPlugin_Initialize() {
Andreas Gampee08a2be2016-10-06 13:13:30 -07001447 art::Runtime* runtime = art::Runtime::Current();
Andreas Gampe96eca782017-01-19 19:45:30 -08001448
Alex Light986914b2019-11-19 01:12:25 +00001449 gAllocManager = new AllocationManager;
Alex Light0e841182018-02-12 17:42:50 +00001450 gDeoptManager = new DeoptManager;
1451 gEventHandler = new EventHandler;
1452
1453 gDeoptManager->Setup();
Andreas Gampe96eca782017-01-19 19:45:30 -08001454 if (runtime->IsStarted()) {
1455 PhaseUtil::SetToLive();
1456 } else {
1457 PhaseUtil::SetToOnLoad();
1458 }
Alex Light0e841182018-02-12 17:42:50 +00001459 PhaseUtil::Register(gEventHandler);
1460 ThreadUtil::Register(gEventHandler);
1461 ClassUtil::Register(gEventHandler);
1462 DumpUtil::Register(gEventHandler);
1463 MethodUtil::Register(gEventHandler);
Alex Light72d7e942019-07-23 13:10:20 -07001464 HeapExtensions::Register(gEventHandler);
Andreas Gampecefaa142017-01-23 15:04:59 -08001465 SearchUtil::Register();
Andreas Gampe9e38a502017-03-06 08:19:26 -08001466 HeapUtil::Register();
Alex Lightc18eba32019-09-24 14:36:27 -07001467 FieldUtil::Register(gEventHandler);
1468 BreakpointUtil::Register(gEventHandler);
Alex Light3732beb2019-10-04 13:35:34 -07001469 Transformer::Register(gEventHandler);
Mythri Allebe282e12022-10-06 12:05:26 +00001470 gDeoptManager->FinishSetup();
Andreas Gampee08a2be2016-10-06 13:13:30 -07001471 runtime->GetJavaVM()->AddEnvironmentHook(GetEnvHandler);
Andreas Gampe96eca782017-01-19 19:45:30 -08001472
Alex Light49948e92016-08-11 15:35:28 -07001473 return true;
1474}
1475
Andreas Gampeeafaf572017-01-20 12:34:15 -08001476extern "C" bool ArtPlugin_Deinitialize() {
Mythri Alle1285ef92022-10-26 09:44:06 +00001477 // When runtime is shutting down, it is not necessary to unregister callbacks or update
1478 // instrumentation levels. Removing callbacks require a GC critical section in some cases and
1479 // when runtime is shutting down we already stop GC and hence it is not safe to request to
1480 // enter a GC critical section.
1481 if (art::Runtime::Current()->IsShuttingDown(art::Thread::Current())) {
1482 return true;
1483 }
1484
Alex Light0e841182018-02-12 17:42:50 +00001485 gEventHandler->Shutdown();
1486 gDeoptManager->Shutdown();
Andreas Gampeeafaf572017-01-20 12:34:15 -08001487 PhaseUtil::Unregister();
1488 ThreadUtil::Unregister();
Andreas Gampee6377462017-01-20 17:37:50 -08001489 ClassUtil::Unregister();
Andreas Gampeeb0cea12017-01-23 08:50:04 -08001490 DumpUtil::Unregister();
Alex Lightd78ddec2017-04-18 15:20:38 -07001491 MethodUtil::Unregister();
Andreas Gampecefaa142017-01-23 15:04:59 -08001492 SearchUtil::Unregister();
Andreas Gampe9e38a502017-03-06 08:19:26 -08001493 HeapUtil::Unregister();
Alex Lightc18eba32019-09-24 14:36:27 -07001494 FieldUtil::Unregister();
1495 BreakpointUtil::Unregister();
Andreas Gampeeafaf572017-01-20 12:34:15 -08001496
Alex Light0e841182018-02-12 17:42:50 +00001497 // TODO It would be good to delete the gEventHandler and gDeoptManager here but we cannot since
1498 // daemon threads might be suspended and we want to make sure that even if they wake up briefly
1499 // they won't hit deallocated memory. By this point none of the functions will do anything since
1500 // they have already shutdown.
1501
Andreas Gampeeafaf572017-01-20 12:34:15 -08001502 return true;
1503}
1504
Alex Light49948e92016-08-11 15:35:28 -07001505// The actual struct holding all of the entrypoints into the jvmti interface.
1506const jvmtiInterface_1 gJvmtiInterface = {
Alex Light6ac57502017-01-19 15:05:06 -08001507 nullptr, // reserved1
Alex Light49948e92016-08-11 15:35:28 -07001508 JvmtiFunctions::SetEventNotificationMode,
Alex Light0e692732017-01-10 15:00:05 -08001509 nullptr, // reserved3
Alex Light49948e92016-08-11 15:35:28 -07001510 JvmtiFunctions::GetAllThreads,
1511 JvmtiFunctions::SuspendThread,
1512 JvmtiFunctions::ResumeThread,
1513 JvmtiFunctions::StopThread,
1514 JvmtiFunctions::InterruptThread,
1515 JvmtiFunctions::GetThreadInfo,
1516 JvmtiFunctions::GetOwnedMonitorInfo, // 10
1517 JvmtiFunctions::GetCurrentContendedMonitor,
1518 JvmtiFunctions::RunAgentThread,
1519 JvmtiFunctions::GetTopThreadGroups,
1520 JvmtiFunctions::GetThreadGroupInfo,
1521 JvmtiFunctions::GetThreadGroupChildren,
1522 JvmtiFunctions::GetFrameCount,
1523 JvmtiFunctions::GetThreadState,
1524 JvmtiFunctions::GetCurrentThread,
1525 JvmtiFunctions::GetFrameLocation,
1526 JvmtiFunctions::NotifyFramePop, // 20
1527 JvmtiFunctions::GetLocalObject,
1528 JvmtiFunctions::GetLocalInt,
1529 JvmtiFunctions::GetLocalLong,
1530 JvmtiFunctions::GetLocalFloat,
1531 JvmtiFunctions::GetLocalDouble,
1532 JvmtiFunctions::SetLocalObject,
1533 JvmtiFunctions::SetLocalInt,
1534 JvmtiFunctions::SetLocalLong,
1535 JvmtiFunctions::SetLocalFloat,
1536 JvmtiFunctions::SetLocalDouble, // 30
1537 JvmtiFunctions::CreateRawMonitor,
1538 JvmtiFunctions::DestroyRawMonitor,
1539 JvmtiFunctions::RawMonitorEnter,
1540 JvmtiFunctions::RawMonitorExit,
1541 JvmtiFunctions::RawMonitorWait,
1542 JvmtiFunctions::RawMonitorNotify,
1543 JvmtiFunctions::RawMonitorNotifyAll,
1544 JvmtiFunctions::SetBreakpoint,
1545 JvmtiFunctions::ClearBreakpoint,
1546 nullptr, // reserved40
1547 JvmtiFunctions::SetFieldAccessWatch,
1548 JvmtiFunctions::ClearFieldAccessWatch,
1549 JvmtiFunctions::SetFieldModificationWatch,
1550 JvmtiFunctions::ClearFieldModificationWatch,
1551 JvmtiFunctions::IsModifiableClass,
1552 JvmtiFunctions::Allocate,
1553 JvmtiFunctions::Deallocate,
1554 JvmtiFunctions::GetClassSignature,
1555 JvmtiFunctions::GetClassStatus,
1556 JvmtiFunctions::GetSourceFileName, // 50
1557 JvmtiFunctions::GetClassModifiers,
1558 JvmtiFunctions::GetClassMethods,
1559 JvmtiFunctions::GetClassFields,
1560 JvmtiFunctions::GetImplementedInterfaces,
1561 JvmtiFunctions::IsInterface,
1562 JvmtiFunctions::IsArrayClass,
1563 JvmtiFunctions::GetClassLoader,
1564 JvmtiFunctions::GetObjectHashCode,
1565 JvmtiFunctions::GetObjectMonitorUsage,
1566 JvmtiFunctions::GetFieldName, // 60
1567 JvmtiFunctions::GetFieldDeclaringClass,
1568 JvmtiFunctions::GetFieldModifiers,
1569 JvmtiFunctions::IsFieldSynthetic,
1570 JvmtiFunctions::GetMethodName,
1571 JvmtiFunctions::GetMethodDeclaringClass,
1572 JvmtiFunctions::GetMethodModifiers,
1573 nullptr, // reserved67
1574 JvmtiFunctions::GetMaxLocals,
1575 JvmtiFunctions::GetArgumentsSize,
1576 JvmtiFunctions::GetLineNumberTable, // 70
1577 JvmtiFunctions::GetMethodLocation,
1578 JvmtiFunctions::GetLocalVariableTable,
1579 JvmtiFunctions::SetNativeMethodPrefix,
1580 JvmtiFunctions::SetNativeMethodPrefixes,
1581 JvmtiFunctions::GetBytecodes,
1582 JvmtiFunctions::IsMethodNative,
1583 JvmtiFunctions::IsMethodSynthetic,
1584 JvmtiFunctions::GetLoadedClasses,
1585 JvmtiFunctions::GetClassLoaderClasses,
1586 JvmtiFunctions::PopFrame, // 80
1587 JvmtiFunctions::ForceEarlyReturnObject,
1588 JvmtiFunctions::ForceEarlyReturnInt,
1589 JvmtiFunctions::ForceEarlyReturnLong,
1590 JvmtiFunctions::ForceEarlyReturnFloat,
1591 JvmtiFunctions::ForceEarlyReturnDouble,
1592 JvmtiFunctions::ForceEarlyReturnVoid,
1593 JvmtiFunctions::RedefineClasses,
1594 JvmtiFunctions::GetVersionNumber,
1595 JvmtiFunctions::GetCapabilities,
1596 JvmtiFunctions::GetSourceDebugExtension, // 90
1597 JvmtiFunctions::IsMethodObsolete,
1598 JvmtiFunctions::SuspendThreadList,
1599 JvmtiFunctions::ResumeThreadList,
1600 nullptr, // reserved94
1601 nullptr, // reserved95
1602 nullptr, // reserved96
1603 nullptr, // reserved97
1604 nullptr, // reserved98
1605 nullptr, // reserved99
1606 JvmtiFunctions::GetAllStackTraces, // 100
1607 JvmtiFunctions::GetThreadListStackTraces,
1608 JvmtiFunctions::GetThreadLocalStorage,
1609 JvmtiFunctions::SetThreadLocalStorage,
1610 JvmtiFunctions::GetStackTrace,
1611 nullptr, // reserved105
1612 JvmtiFunctions::GetTag,
1613 JvmtiFunctions::SetTag,
1614 JvmtiFunctions::ForceGarbageCollection,
1615 JvmtiFunctions::IterateOverObjectsReachableFromObject,
1616 JvmtiFunctions::IterateOverReachableObjects, // 110
1617 JvmtiFunctions::IterateOverHeap,
1618 JvmtiFunctions::IterateOverInstancesOfClass,
1619 nullptr, // reserved113
1620 JvmtiFunctions::GetObjectsWithTags,
1621 JvmtiFunctions::FollowReferences,
1622 JvmtiFunctions::IterateThroughHeap,
1623 nullptr, // reserved117
1624 nullptr, // reserved118
1625 nullptr, // reserved119
1626 JvmtiFunctions::SetJNIFunctionTable, // 120
1627 JvmtiFunctions::GetJNIFunctionTable,
1628 JvmtiFunctions::SetEventCallbacks,
1629 JvmtiFunctions::GenerateEvents,
1630 JvmtiFunctions::GetExtensionFunctions,
1631 JvmtiFunctions::GetExtensionEvents,
1632 JvmtiFunctions::SetExtensionEventCallback,
1633 JvmtiFunctions::DisposeEnvironment,
1634 JvmtiFunctions::GetErrorName,
1635 JvmtiFunctions::GetJLocationFormat,
1636 JvmtiFunctions::GetSystemProperties, // 130
1637 JvmtiFunctions::GetSystemProperty,
1638 JvmtiFunctions::SetSystemProperty,
1639 JvmtiFunctions::GetPhase,
1640 JvmtiFunctions::GetCurrentThreadCpuTimerInfo,
1641 JvmtiFunctions::GetCurrentThreadCpuTime,
1642 JvmtiFunctions::GetThreadCpuTimerInfo,
1643 JvmtiFunctions::GetThreadCpuTime,
1644 JvmtiFunctions::GetTimerInfo,
1645 JvmtiFunctions::GetTime,
1646 JvmtiFunctions::GetPotentialCapabilities, // 140
1647 nullptr, // reserved141
1648 JvmtiFunctions::AddCapabilities,
1649 JvmtiFunctions::RelinquishCapabilities,
1650 JvmtiFunctions::GetAvailableProcessors,
1651 JvmtiFunctions::GetClassVersionNumbers,
1652 JvmtiFunctions::GetConstantPool,
1653 JvmtiFunctions::GetEnvironmentLocalStorage,
1654 JvmtiFunctions::SetEnvironmentLocalStorage,
1655 JvmtiFunctions::AddToBootstrapClassLoaderSearch,
1656 JvmtiFunctions::SetVerboseFlag, // 150
1657 JvmtiFunctions::AddToSystemClassLoaderSearch,
1658 JvmtiFunctions::RetransformClasses,
1659 JvmtiFunctions::GetOwnedMonitorStackDepthInfo,
1660 JvmtiFunctions::GetObjectSize,
1661 JvmtiFunctions::GetLocalInstance,
1662};
1663
1664}; // namespace openjdkjvmti