blob: 7a2b638fd92f03c50c3f8b84d8869ae38ae85e05 [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
Andreas Gampedb6dcb62016-09-13 09:05:59 -070043#include "art_jvmti.h"
Andreas Gampe170331f2017-12-07 18:41:03 -080044#include "base/logging.h" // For gLogVerbosity.
Andreas Gampe77708d92016-10-07 11:48:21 -070045#include "base/mutex.h"
46#include "events-inl.h"
Vladimir Markoa3ad0cd2018-05-04 10:06:38 +010047#include "jni/jni_env_ext-inl.h"
Andreas Gampe6dee92e2016-09-12 19:58:13 -070048#include "obj_ptr-inl.h"
Alex Lighta01de592016-11-15 10:43:06 -080049#include "object_tagging.h"
Alex Light9c20a142016-08-23 15:05:12 -070050#include "runtime.h"
Andreas Gampe6dee92e2016-09-12 19:58:13 -070051#include "scoped_thread_state_change-inl.h"
Andreas Gampeb486a982017-06-01 13:45:54 -070052#include "thread-current-inl.h"
Alex Lighta01de592016-11-15 10:43:06 -080053#include "thread_list.h"
Alex Lightbf64a572017-07-05 10:34:49 -070054#include "ti_allocator.h"
Alex Lighta26e3492017-06-27 17:55:37 -070055#include "ti_breakpoint.h"
Andreas Gampee492ae32016-10-28 19:34:57 -070056#include "ti_class.h"
Andreas Gampeeb0cea12017-01-23 08:50:04 -080057#include "ti_dump.h"
Alex Light3f33c0a2017-11-08 10:17:37 -080058#include "ti_extension.h"
Andreas Gampeab2f0d02017-01-05 17:23:45 -080059#include "ti_field.h"
Andreas Gampeba8df692016-11-01 10:30:44 -070060#include "ti_heap.h"
Andreas Gampe6f8e4f02017-01-16 18:18:14 -080061#include "ti_jni.h"
Alex Lightae45cbb2018-10-18 15:49:56 -070062#include "ti_logging.h"
Andreas Gampe3c252f02016-10-27 18:25:17 -070063#include "ti_method.h"
Andreas Gampe319dbe82017-01-09 16:42:21 -080064#include "ti_monitor.h"
Andreas Gampe50a4e492017-01-06 18:00:20 -080065#include "ti_object.h"
Andreas Gampe96eca782017-01-19 19:45:30 -080066#include "ti_phase.h"
Andreas Gampe1bdaf732017-01-09 19:21:06 -080067#include "ti_properties.h"
Alex Lighta01de592016-11-15 10:43:06 -080068#include "ti_redefine.h"
Andreas Gampece7732b2017-01-17 15:50:26 -080069#include "ti_search.h"
Andreas Gampeb5eb94a2016-10-27 19:23:09 -070070#include "ti_stack.h"
Andreas Gampeaf13ab92017-01-11 20:57:40 -080071#include "ti_thread.h"
Andreas Gamped18d9e22017-01-16 16:08:45 +000072#include "ti_threadgroup.h"
Andreas Gampe35bcf812017-01-13 16:24:17 -080073#include "ti_timers.h"
Alex Light9c20a142016-08-23 15:05:12 -070074#include "transform.h"
Alex Light49948e92016-08-11 15:35:28 -070075
Alex Light49948e92016-08-11 15:35:28 -070076namespace openjdkjvmti {
77
Alex Light0e841182018-02-12 17:42:50 +000078// NB These are heap allocated to avoid the static destructors being run if an agent calls exit(3).
79// These should never be null.
80EventHandler* gEventHandler;
81DeoptManager* gDeoptManager;
Andreas Gampe6dee92e2016-09-12 19:58:13 -070082
Alex Lighte6574242016-08-17 09:56:24 -070083#define ENSURE_NON_NULL(n) \
84 do { \
85 if ((n) == nullptr) { \
86 return ERR(NULL_POINTER); \
87 } \
88 } while (false)
89
Alex Light2ce6fc82017-12-18 16:42:36 -080090// Returns whether we are able to use all jvmti features.
91static bool IsFullJvmtiAvailable() {
92 art::Runtime* runtime = art::Runtime::Current();
93 return runtime->GetInstrumentation()->IsForcedInterpretOnly() || runtime->IsJavaDebuggable();
94}
95
Alex Light49948e92016-08-11 15:35:28 -070096class JvmtiFunctions {
97 private:
Alex Light1edc8cf2017-03-24 14:22:56 -070098 static jvmtiError getEnvironmentError(jvmtiEnv* env) {
99 if (env == nullptr) {
100 return ERR(INVALID_ENVIRONMENT);
101 } else if (art::Thread::Current() == nullptr) {
102 return ERR(UNATTACHED_THREAD);
103 } else {
104 return OK;
105 }
Alex Light49948e92016-08-11 15:35:28 -0700106 }
107
Alex Light1edc8cf2017-03-24 14:22:56 -0700108#define ENSURE_VALID_ENV(env) \
109 do { \
110 jvmtiError ensure_valid_env_ ## __LINE__ = getEnvironmentError(env); \
111 if (ensure_valid_env_ ## __LINE__ != OK) { \
112 return ensure_valid_env_ ## __LINE__ ; \
113 } \
Alex Lighte6574242016-08-17 09:56:24 -0700114 } while (false)
115
116#define ENSURE_HAS_CAP(env, cap) \
117 do { \
Alex Lighte6574242016-08-17 09:56:24 -0700118 if (ArtJvmTiEnv::AsArtJvmTiEnv(env)->capabilities.cap != 1) { \
119 return ERR(MUST_POSSESS_CAPABILITY); \
120 } \
121 } while (false)
122
Alex Light49948e92016-08-11 15:35:28 -0700123 public:
124 static jvmtiError Allocate(jvmtiEnv* env, jlong size, unsigned char** mem_ptr) {
Alex Lighte6574242016-08-17 09:56:24 -0700125 ENSURE_VALID_ENV(env);
126 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 Lighte6574242016-08-17 09:56:24 -0700131 ENSURE_VALID_ENV(env);
Alex Lightbf64a572017-07-05 10:34:49 -0700132 return AllocUtil::Deallocate(env, mem);
Alex Light49948e92016-08-11 15:35:28 -0700133 }
134
135 static jvmtiError GetThreadState(jvmtiEnv* env, jthread thread, jint* thread_state_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700136 ENSURE_VALID_ENV(env);
Andreas Gampe72c19832017-01-12 13:22:16 -0800137 return ThreadUtil::GetThreadState(env, thread, thread_state_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700138 }
139
140 static jvmtiError GetCurrentThread(jvmtiEnv* env, jthread* thread_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700141 ENSURE_VALID_ENV(env);
Andreas Gampeaf13ab92017-01-11 20:57:40 -0800142 return ThreadUtil::GetCurrentThread(env, thread_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700143 }
144
145 static jvmtiError GetAllThreads(jvmtiEnv* env, jint* threads_count_ptr, jthread** threads_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700146 ENSURE_VALID_ENV(env);
Andreas Gampe85807442017-01-13 14:40:58 -0800147 return ThreadUtil::GetAllThreads(env, threads_count_ptr, threads_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700148 }
149
Alex Light88fd7202017-06-30 08:31:59 -0700150 static jvmtiError SuspendThread(jvmtiEnv* env, jthread thread) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700151 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800152 ENSURE_HAS_CAP(env, can_suspend);
Alex Light88fd7202017-06-30 08:31:59 -0700153 return ThreadUtil::SuspendThread(env, thread);
Alex Light49948e92016-08-11 15:35:28 -0700154 }
155
156 static jvmtiError SuspendThreadList(jvmtiEnv* env,
Alex Light88fd7202017-06-30 08:31:59 -0700157 jint request_count,
158 const jthread* request_list,
159 jvmtiError* results) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700160 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800161 ENSURE_HAS_CAP(env, can_suspend);
Alex Light88fd7202017-06-30 08:31:59 -0700162 return ThreadUtil::SuspendThreadList(env, request_count, request_list, results);
Alex Light49948e92016-08-11 15:35:28 -0700163 }
164
Alex Light88fd7202017-06-30 08:31:59 -0700165 static jvmtiError ResumeThread(jvmtiEnv* env, jthread thread) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700166 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800167 ENSURE_HAS_CAP(env, can_suspend);
Alex Light88fd7202017-06-30 08:31:59 -0700168 return ThreadUtil::ResumeThread(env, thread);
Alex Light49948e92016-08-11 15:35:28 -0700169 }
170
171 static jvmtiError ResumeThreadList(jvmtiEnv* env,
Alex Light88fd7202017-06-30 08:31:59 -0700172 jint request_count,
173 const jthread* request_list,
174 jvmtiError* results) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700175 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800176 ENSURE_HAS_CAP(env, can_suspend);
Alex Light88fd7202017-06-30 08:31:59 -0700177 return ThreadUtil::ResumeThreadList(env, request_count, request_list, results);
Alex Light49948e92016-08-11 15:35:28 -0700178 }
179
Alex Light54d39dc2017-09-25 17:00:16 -0700180 static jvmtiError StopThread(jvmtiEnv* env, jthread thread, jobject exception) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700181 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800182 ENSURE_HAS_CAP(env, can_signal_thread);
Alex Light54d39dc2017-09-25 17:00:16 -0700183 return ThreadUtil::StopThread(env, thread, exception);
Alex Light49948e92016-08-11 15:35:28 -0700184 }
185
Alex Light54d39dc2017-09-25 17:00:16 -0700186 static jvmtiError InterruptThread(jvmtiEnv* env, jthread thread) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700187 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800188 ENSURE_HAS_CAP(env, can_signal_thread);
Alex Light54d39dc2017-09-25 17:00:16 -0700189 return ThreadUtil::InterruptThread(env, thread);
Alex Light49948e92016-08-11 15:35:28 -0700190 }
191
192 static jvmtiError GetThreadInfo(jvmtiEnv* env, jthread thread, jvmtiThreadInfo* info_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700193 ENSURE_VALID_ENV(env);
Andreas Gampeaf13ab92017-01-11 20:57:40 -0800194 return ThreadUtil::GetThreadInfo(env, thread, info_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700195 }
196
197 static jvmtiError GetOwnedMonitorInfo(jvmtiEnv* env,
Alex Light88e1ddd2017-08-21 13:09:55 -0700198 jthread thread,
199 jint* owned_monitor_count_ptr,
200 jobject** owned_monitors_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700201 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800202 ENSURE_HAS_CAP(env, can_get_owned_monitor_info);
Alex Light88e1ddd2017-08-21 13:09:55 -0700203 return StackUtil::GetOwnedMonitorInfo(env,
204 thread,
205 owned_monitor_count_ptr,
206 owned_monitors_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700207 }
208
Alex Light88e1ddd2017-08-21 13:09:55 -0700209 static jvmtiError GetOwnedMonitorStackDepthInfo(jvmtiEnv* env,
210 jthread thread,
211 jint* monitor_info_count_ptr,
212 jvmtiMonitorStackDepthInfo** monitor_info_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700213 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800214 ENSURE_HAS_CAP(env, can_get_owned_monitor_stack_depth_info);
Alex Light88e1ddd2017-08-21 13:09:55 -0700215 return StackUtil::GetOwnedMonitorStackDepthInfo(env,
216 thread,
217 monitor_info_count_ptr,
218 monitor_info_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700219 }
220
221 static jvmtiError GetCurrentContendedMonitor(jvmtiEnv* env,
Alex Light41006c62017-09-14 09:51:14 -0700222 jthread thread,
223 jobject* monitor_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700224 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800225 ENSURE_HAS_CAP(env, can_get_current_contended_monitor);
Alex Light41006c62017-09-14 09:51:14 -0700226 return MonitorUtil::GetCurrentContendedMonitor(env, thread, monitor_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700227 }
228
229 static jvmtiError RunAgentThread(jvmtiEnv* env,
230 jthread thread,
231 jvmtiStartFunction proc,
232 const void* arg,
233 jint priority) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700234 ENSURE_VALID_ENV(env);
Andreas Gampe732b0ac2017-01-18 15:23:39 -0800235 return ThreadUtil::RunAgentThread(env, thread, proc, arg, priority);
Alex Light49948e92016-08-11 15:35:28 -0700236 }
237
238 static jvmtiError SetThreadLocalStorage(jvmtiEnv* env, jthread thread, const void* data) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700239 ENSURE_VALID_ENV(env);
Andreas Gampe7b3b3262017-01-19 20:40:42 -0800240 return ThreadUtil::SetThreadLocalStorage(env, thread, data);
Alex Light49948e92016-08-11 15:35:28 -0700241 }
242
243 static jvmtiError GetThreadLocalStorage(jvmtiEnv* env, jthread thread, void** data_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700244 ENSURE_VALID_ENV(env);
Andreas Gampe7b3b3262017-01-19 20:40:42 -0800245 return ThreadUtil::GetThreadLocalStorage(env, thread, data_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700246 }
247
248 static jvmtiError GetTopThreadGroups(jvmtiEnv* env,
249 jint* group_count_ptr,
250 jthreadGroup** groups_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700251 ENSURE_VALID_ENV(env);
Andreas Gamped18d9e22017-01-16 16:08:45 +0000252 return ThreadGroupUtil::GetTopThreadGroups(env, group_count_ptr, groups_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700253 }
254
255 static jvmtiError GetThreadGroupInfo(jvmtiEnv* env,
256 jthreadGroup group,
257 jvmtiThreadGroupInfo* info_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700258 ENSURE_VALID_ENV(env);
Andreas Gamped18d9e22017-01-16 16:08:45 +0000259 return ThreadGroupUtil::GetThreadGroupInfo(env, group, info_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700260 }
261
262 static jvmtiError GetThreadGroupChildren(jvmtiEnv* env,
263 jthreadGroup group,
264 jint* thread_count_ptr,
265 jthread** threads_ptr,
266 jint* group_count_ptr,
267 jthreadGroup** groups_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700268 ENSURE_VALID_ENV(env);
Andreas Gamped18d9e22017-01-16 16:08:45 +0000269 return ThreadGroupUtil::GetThreadGroupChildren(env,
270 group,
271 thread_count_ptr,
272 threads_ptr,
273 group_count_ptr,
274 groups_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700275 }
276
277 static jvmtiError GetStackTrace(jvmtiEnv* env,
278 jthread thread,
279 jint start_depth,
280 jint max_frame_count,
281 jvmtiFrameInfo* frame_buffer,
282 jint* count_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700283 ENSURE_VALID_ENV(env);
Andreas Gampeb5eb94a2016-10-27 19:23:09 -0700284 return StackUtil::GetStackTrace(env,
285 thread,
286 start_depth,
287 max_frame_count,
288 frame_buffer,
289 count_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700290 }
291
292 static jvmtiError GetAllStackTraces(jvmtiEnv* env,
293 jint max_frame_count,
294 jvmtiStackInfo** stack_info_ptr,
295 jint* thread_count_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700296 ENSURE_VALID_ENV(env);
Andreas Gampea1a27c62017-01-11 16:37:16 -0800297 return StackUtil::GetAllStackTraces(env, max_frame_count, stack_info_ptr, thread_count_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700298 }
299
300 static jvmtiError GetThreadListStackTraces(jvmtiEnv* env,
301 jint thread_count,
302 const jthread* thread_list,
303 jint max_frame_count,
304 jvmtiStackInfo** stack_info_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700305 ENSURE_VALID_ENV(env);
Andreas Gampeeba32fb2017-01-12 17:40:05 -0800306 return StackUtil::GetThreadListStackTraces(env,
307 thread_count,
308 thread_list,
309 max_frame_count,
310 stack_info_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700311 }
312
313 static jvmtiError GetFrameCount(jvmtiEnv* env, jthread thread, jint* count_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700314 ENSURE_VALID_ENV(env);
Andreas Gampef6f3b5f2017-01-13 09:21:42 -0800315 return StackUtil::GetFrameCount(env, thread, count_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700316 }
317
Alex Light0aa7a5a2018-10-10 15:58:14 +0000318 static jvmtiError PopFrame(jvmtiEnv* env, jthread thread) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700319 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800320 ENSURE_HAS_CAP(env, can_pop_frame);
Alex Light0aa7a5a2018-10-10 15:58:14 +0000321 return StackUtil::PopFrame(env, thread);
Alex Light49948e92016-08-11 15:35:28 -0700322 }
323
324 static jvmtiError GetFrameLocation(jvmtiEnv* env,
325 jthread thread,
326 jint depth,
327 jmethodID* method_ptr,
328 jlocation* location_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700329 ENSURE_VALID_ENV(env);
Andreas Gampef6f3b5f2017-01-13 09:21:42 -0800330 return StackUtil::GetFrameLocation(env, thread, depth, method_ptr, location_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700331 }
332
Alex Lighte814f9d2017-07-31 16:14:39 -0700333 static jvmtiError NotifyFramePop(jvmtiEnv* env, jthread thread, jint depth) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700334 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800335 ENSURE_HAS_CAP(env, can_generate_frame_pop_events);
Alex Lighte814f9d2017-07-31 16:14:39 -0700336 return StackUtil::NotifyFramePop(env, thread, depth);
Alex Light49948e92016-08-11 15:35:28 -0700337 }
338
Alex Light6a3fd512017-02-27 14:34:32 -0800339 static jvmtiError ForceEarlyReturnObject(jvmtiEnv* env,
340 jthread thread ATTRIBUTE_UNUSED,
341 jobject value ATTRIBUTE_UNUSED) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700342 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800343 ENSURE_HAS_CAP(env, can_force_early_return);
Alex Light49948e92016-08-11 15:35:28 -0700344 return ERR(NOT_IMPLEMENTED);
345 }
346
Alex Light6a3fd512017-02-27 14:34:32 -0800347 static jvmtiError ForceEarlyReturnInt(jvmtiEnv* env,
348 jthread thread ATTRIBUTE_UNUSED,
349 jint value ATTRIBUTE_UNUSED) {
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 Light49948e92016-08-11 15:35:28 -0700352 return ERR(NOT_IMPLEMENTED);
353 }
354
Alex Light6a3fd512017-02-27 14:34:32 -0800355 static jvmtiError ForceEarlyReturnLong(jvmtiEnv* env,
356 jthread thread ATTRIBUTE_UNUSED,
357 jlong value ATTRIBUTE_UNUSED) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700358 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800359 ENSURE_HAS_CAP(env, can_force_early_return);
Alex Light49948e92016-08-11 15:35:28 -0700360 return ERR(NOT_IMPLEMENTED);
361 }
362
Alex Light6a3fd512017-02-27 14:34:32 -0800363 static jvmtiError ForceEarlyReturnFloat(jvmtiEnv* env,
364 jthread thread ATTRIBUTE_UNUSED,
365 jfloat value ATTRIBUTE_UNUSED) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700366 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800367 ENSURE_HAS_CAP(env, can_force_early_return);
Alex Light49948e92016-08-11 15:35:28 -0700368 return ERR(NOT_IMPLEMENTED);
369 }
370
Alex Light6a3fd512017-02-27 14:34:32 -0800371 static jvmtiError ForceEarlyReturnDouble(jvmtiEnv* env,
372 jthread thread ATTRIBUTE_UNUSED,
373 jdouble value ATTRIBUTE_UNUSED) {
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 Light49948e92016-08-11 15:35:28 -0700376 return ERR(NOT_IMPLEMENTED);
377 }
378
Alex Light6a3fd512017-02-27 14:34:32 -0800379 static jvmtiError ForceEarlyReturnVoid(jvmtiEnv* env, jthread thread ATTRIBUTE_UNUSED) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700380 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800381 ENSURE_HAS_CAP(env, can_force_early_return);
Alex Light49948e92016-08-11 15:35:28 -0700382 return ERR(NOT_IMPLEMENTED);
383 }
384
385 static jvmtiError FollowReferences(jvmtiEnv* env,
386 jint heap_filter,
387 jclass klass,
388 jobject initial_object,
389 const jvmtiHeapCallbacks* callbacks,
390 const void* user_data) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700391 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800392 ENSURE_HAS_CAP(env, can_tag_objects);
Andreas Gampede19eb92017-02-24 16:21:18 -0800393 HeapUtil heap_util(ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table.get());
Andreas Gampe70bfc8a2016-11-03 11:04:15 -0700394 return heap_util.FollowReferences(env,
395 heap_filter,
396 klass,
397 initial_object,
398 callbacks,
399 user_data);
Alex Light49948e92016-08-11 15:35:28 -0700400 }
401
402 static jvmtiError IterateThroughHeap(jvmtiEnv* env,
403 jint heap_filter,
404 jclass klass,
405 const jvmtiHeapCallbacks* callbacks,
406 const void* user_data) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700407 ENSURE_VALID_ENV(env);
Alex Lighte6574242016-08-17 09:56:24 -0700408 ENSURE_HAS_CAP(env, can_tag_objects);
Andreas Gampede19eb92017-02-24 16:21:18 -0800409 HeapUtil heap_util(ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table.get());
Andreas Gampee54d9922016-10-11 19:55:37 -0700410 return heap_util.IterateThroughHeap(env, heap_filter, klass, callbacks, user_data);
Alex Light49948e92016-08-11 15:35:28 -0700411 }
412
413 static jvmtiError GetTag(jvmtiEnv* env, jobject object, jlong* tag_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700414 ENSURE_VALID_ENV(env);
Alex Lighte6574242016-08-17 09:56:24 -0700415 ENSURE_HAS_CAP(env, can_tag_objects);
Andreas Gampe6dee92e2016-09-12 19:58:13 -0700416
417 JNIEnv* jni_env = GetJniEnv(env);
418 if (jni_env == nullptr) {
419 return ERR(INTERNAL);
420 }
421
422 art::ScopedObjectAccess soa(jni_env);
423 art::ObjPtr<art::mirror::Object> obj = soa.Decode<art::mirror::Object>(object);
Andreas Gampede19eb92017-02-24 16:21:18 -0800424 if (!ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table->GetTag(obj.Ptr(), tag_ptr)) {
Andreas Gampe6dee92e2016-09-12 19:58:13 -0700425 *tag_ptr = 0;
426 }
427
428 return ERR(NONE);
Alex Light49948e92016-08-11 15:35:28 -0700429 }
430
431 static jvmtiError SetTag(jvmtiEnv* env, jobject object, jlong tag) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700432 ENSURE_VALID_ENV(env);
Alex Lighte6574242016-08-17 09:56:24 -0700433 ENSURE_HAS_CAP(env, can_tag_objects);
434
Andreas Gampe6dee92e2016-09-12 19:58:13 -0700435 if (object == nullptr) {
436 return ERR(NULL_POINTER);
437 }
438
439 JNIEnv* jni_env = GetJniEnv(env);
440 if (jni_env == nullptr) {
441 return ERR(INTERNAL);
442 }
443
444 art::ScopedObjectAccess soa(jni_env);
445 art::ObjPtr<art::mirror::Object> obj = soa.Decode<art::mirror::Object>(object);
Andreas Gampede19eb92017-02-24 16:21:18 -0800446 ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table->Set(obj.Ptr(), tag);
Andreas Gampe6dee92e2016-09-12 19:58:13 -0700447
448 return ERR(NONE);
Alex Light49948e92016-08-11 15:35:28 -0700449 }
450
451 static jvmtiError GetObjectsWithTags(jvmtiEnv* env,
452 jint tag_count,
453 const jlong* tags,
454 jint* count_ptr,
455 jobject** object_result_ptr,
456 jlong** tag_result_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700457 ENSURE_VALID_ENV(env);
Alex Lighte6574242016-08-17 09:56:24 -0700458 ENSURE_HAS_CAP(env, can_tag_objects);
459
Andreas Gampe5e6046b2016-10-25 12:05:53 -0700460 JNIEnv* jni_env = GetJniEnv(env);
461 if (jni_env == nullptr) {
462 return ERR(INTERNAL);
463 }
464
465 art::ScopedObjectAccess soa(jni_env);
Andreas Gampede19eb92017-02-24 16:21:18 -0800466 return ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table->GetTaggedObjects(env,
467 tag_count,
468 tags,
469 count_ptr,
470 object_result_ptr,
471 tag_result_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700472 }
473
474 static jvmtiError ForceGarbageCollection(jvmtiEnv* env) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700475 ENSURE_VALID_ENV(env);
Andreas Gampe8da6d032016-10-31 19:31:03 -0700476 return HeapUtil::ForceGarbageCollection(env);
Alex Light49948e92016-08-11 15:35:28 -0700477 }
478
479 static jvmtiError IterateOverObjectsReachableFromObject(
480 jvmtiEnv* env,
Alex Light6a3fd512017-02-27 14:34:32 -0800481 jobject object ATTRIBUTE_UNUSED,
482 jvmtiObjectReferenceCallback object_reference_callback ATTRIBUTE_UNUSED,
483 const void* user_data ATTRIBUTE_UNUSED) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700484 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800485 ENSURE_HAS_CAP(env, can_tag_objects);
Alex Light49948e92016-08-11 15:35:28 -0700486 return ERR(NOT_IMPLEMENTED);
487 }
488
Alex Light6a3fd512017-02-27 14:34:32 -0800489 static jvmtiError IterateOverReachableObjects(
490 jvmtiEnv* env,
491 jvmtiHeapRootCallback heap_root_callback ATTRIBUTE_UNUSED,
492 jvmtiStackReferenceCallback stack_ref_callback ATTRIBUTE_UNUSED,
493 jvmtiObjectReferenceCallback object_ref_callback ATTRIBUTE_UNUSED,
494 const void* user_data ATTRIBUTE_UNUSED) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700495 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800496 ENSURE_HAS_CAP(env, can_tag_objects);
Alex Light49948e92016-08-11 15:35:28 -0700497 return ERR(NOT_IMPLEMENTED);
498 }
499
500 static jvmtiError IterateOverHeap(jvmtiEnv* env,
Alex Light6a3fd512017-02-27 14:34:32 -0800501 jvmtiHeapObjectFilter object_filter ATTRIBUTE_UNUSED,
502 jvmtiHeapObjectCallback heap_object_callback ATTRIBUTE_UNUSED,
503 const void* user_data ATTRIBUTE_UNUSED) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700504 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800505 ENSURE_HAS_CAP(env, can_tag_objects);
Alex Light49948e92016-08-11 15:35:28 -0700506 return ERR(NOT_IMPLEMENTED);
507 }
508
Alex Light6a3fd512017-02-27 14:34:32 -0800509 static jvmtiError IterateOverInstancesOfClass(
510 jvmtiEnv* env,
Alex Lightbbbcb532018-08-30 12:50:27 -0700511 jclass klass,
512 jvmtiHeapObjectFilter object_filter,
513 jvmtiHeapObjectCallback heap_object_callback,
514 const void* user_data) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700515 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800516 ENSURE_HAS_CAP(env, can_tag_objects);
Alex Lightbbbcb532018-08-30 12:50:27 -0700517 HeapUtil heap_util(ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table.get());
518 return heap_util.IterateOverInstancesOfClass(
519 env, klass, object_filter, heap_object_callback, user_data);
Alex Light49948e92016-08-11 15:35:28 -0700520 }
521
522 static jvmtiError GetLocalObject(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700523 jthread thread,
524 jint depth,
525 jint slot,
526 jobject* value_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700527 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800528 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700529 return MethodUtil::GetLocalVariable(env, thread, depth, slot, value_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700530 }
531
532 static jvmtiError GetLocalInstance(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700533 jthread thread,
534 jint depth,
535 jobject* value_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700536 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800537 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700538 return MethodUtil::GetLocalInstance(env, thread, depth, value_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700539 }
540
541 static jvmtiError GetLocalInt(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700542 jthread thread,
543 jint depth,
544 jint slot,
545 jint* value_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700546 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800547 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700548 return MethodUtil::GetLocalVariable(env, thread, depth, slot, value_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700549 }
550
551 static jvmtiError GetLocalLong(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700552 jthread thread,
553 jint depth,
554 jint slot,
555 jlong* value_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700556 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800557 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700558 return MethodUtil::GetLocalVariable(env, thread, depth, slot, value_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700559 }
560
561 static jvmtiError GetLocalFloat(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700562 jthread thread,
563 jint depth,
564 jint slot,
565 jfloat* value_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700566 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800567 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700568 return MethodUtil::GetLocalVariable(env, thread, depth, slot, value_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700569 }
570
571 static jvmtiError GetLocalDouble(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700572 jthread thread,
573 jint depth,
574 jint slot,
575 jdouble* value_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700576 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800577 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700578 return MethodUtil::GetLocalVariable(env, thread, depth, slot, value_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700579 }
580
581 static jvmtiError SetLocalObject(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700582 jthread thread,
583 jint depth,
584 jint slot,
585 jobject value) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700586 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800587 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700588 return MethodUtil::SetLocalVariable(env, thread, depth, slot, value);
Alex Light49948e92016-08-11 15:35:28 -0700589 }
590
591 static jvmtiError SetLocalInt(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700592 jthread thread,
593 jint depth,
594 jint slot,
595 jint value) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700596 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800597 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700598 return MethodUtil::SetLocalVariable(env, thread, depth, slot, value);
Alex Light49948e92016-08-11 15:35:28 -0700599 }
600
601 static jvmtiError SetLocalLong(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700602 jthread thread,
603 jint depth,
604 jint slot,
605 jlong value) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700606 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800607 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700608 return MethodUtil::SetLocalVariable(env, thread, depth, slot, value);
Alex Light49948e92016-08-11 15:35:28 -0700609 }
610
611 static jvmtiError SetLocalFloat(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700612 jthread thread,
613 jint depth,
614 jint slot,
615 jfloat value) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700616 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800617 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700618 return MethodUtil::SetLocalVariable(env, thread, depth, slot, value);
Alex Light49948e92016-08-11 15:35:28 -0700619 }
620
621 static jvmtiError SetLocalDouble(jvmtiEnv* env,
Alex Lightbebd7bd2017-07-25 14:05:52 -0700622 jthread thread,
623 jint depth,
624 jint slot,
625 jdouble value) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700626 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800627 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightbebd7bd2017-07-25 14:05:52 -0700628 return MethodUtil::SetLocalVariable(env, thread, depth, slot, value);
Alex Light49948e92016-08-11 15:35:28 -0700629 }
630
Alex Lighta26e3492017-06-27 17:55:37 -0700631
632 static jvmtiError SetBreakpoint(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::SetBreakpoint(env, method, location);
Alex Light49948e92016-08-11 15:35:28 -0700636 }
637
Alex Lighta26e3492017-06-27 17:55:37 -0700638 static jvmtiError ClearBreakpoint(jvmtiEnv* env, jmethodID method, jlocation location) {
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_breakpoint_events);
Alex Lighta26e3492017-06-27 17:55:37 -0700641 return BreakpointUtil::ClearBreakpoint(env, method, location);
Alex Light49948e92016-08-11 15:35:28 -0700642 }
643
Alex Light084fa372017-06-16 08:58:34 -0700644 static jvmtiError SetFieldAccessWatch(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::SetFieldAccessWatch(env, klass, field);
Alex Light49948e92016-08-11 15:35:28 -0700648 }
649
Alex Light084fa372017-06-16 08:58:34 -0700650 static jvmtiError ClearFieldAccessWatch(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_access_events);
Alex Light084fa372017-06-16 08:58:34 -0700653 return FieldUtil::ClearFieldAccessWatch(env, klass, field);
Alex Light49948e92016-08-11 15:35:28 -0700654 }
655
Alex Light084fa372017-06-16 08:58:34 -0700656 static jvmtiError SetFieldModificationWatch(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::SetFieldModificationWatch(env, klass, field);
Alex Light49948e92016-08-11 15:35:28 -0700660 }
661
Alex Light084fa372017-06-16 08:58:34 -0700662 static jvmtiError ClearFieldModificationWatch(jvmtiEnv* env, jclass klass, jfieldID field) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700663 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800664 ENSURE_HAS_CAP(env, can_generate_field_modification_events);
Alex Light084fa372017-06-16 08:58:34 -0700665 return FieldUtil::ClearFieldModificationWatch(env, klass, field);
Alex Light49948e92016-08-11 15:35:28 -0700666 }
667
668 static jvmtiError GetLoadedClasses(jvmtiEnv* env, jint* class_count_ptr, jclass** classes_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700669 ENSURE_VALID_ENV(env);
Andreas Gampede19eb92017-02-24 16:21:18 -0800670 HeapUtil heap_util(ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table.get());
Andreas Gampeaa8b60c2016-10-12 12:51:25 -0700671 return heap_util.GetLoadedClasses(env, class_count_ptr, classes_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700672 }
673
674 static jvmtiError GetClassLoaderClasses(jvmtiEnv* env,
675 jobject initiating_loader,
676 jint* class_count_ptr,
677 jclass** classes_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700678 ENSURE_VALID_ENV(env);
Andreas Gampe70f16392017-01-16 14:20:10 -0800679 return ClassUtil::GetClassLoaderClasses(env, initiating_loader, class_count_ptr, classes_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700680 }
681
682 static jvmtiError GetClassSignature(jvmtiEnv* env,
683 jclass klass,
684 char** signature_ptr,
685 char** generic_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700686 ENSURE_VALID_ENV(env);
Andreas Gampee492ae32016-10-28 19:34:57 -0700687 return ClassUtil::GetClassSignature(env, klass, signature_ptr, generic_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700688 }
689
690 static jvmtiError GetClassStatus(jvmtiEnv* env, jclass klass, jint* status_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700691 ENSURE_VALID_ENV(env);
Andreas Gampeff9d2092017-01-06 09:12:49 -0800692 return ClassUtil::GetClassStatus(env, klass, status_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700693 }
694
Alex Light6fa7b812017-06-16 09:04:29 -0700695 static jvmtiError GetSourceFileName(jvmtiEnv* env, jclass klass, char** source_name_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700696 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800697 ENSURE_HAS_CAP(env, can_get_source_file_name);
Alex Light6fa7b812017-06-16 09:04:29 -0700698 return ClassUtil::GetSourceFileName(env, klass, source_name_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700699 }
700
701 static jvmtiError GetClassModifiers(jvmtiEnv* env, jclass klass, jint* modifiers_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700702 ENSURE_VALID_ENV(env);
Andreas Gampe64013e52017-01-06 13:07:19 -0800703 return ClassUtil::GetClassModifiers(env, klass, modifiers_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700704 }
705
706 static jvmtiError GetClassMethods(jvmtiEnv* env,
707 jclass klass,
708 jint* method_count_ptr,
709 jmethodID** methods_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700710 ENSURE_VALID_ENV(env);
Andreas Gampe18fee4d2017-01-06 11:36:35 -0800711 return ClassUtil::GetClassMethods(env, klass, method_count_ptr, methods_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700712 }
713
714 static jvmtiError GetClassFields(jvmtiEnv* env,
715 jclass klass,
716 jint* field_count_ptr,
717 jfieldID** fields_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700718 ENSURE_VALID_ENV(env);
Andreas Gampeac587272017-01-05 15:21:34 -0800719 return ClassUtil::GetClassFields(env, klass, field_count_ptr, fields_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700720 }
721
722 static jvmtiError GetImplementedInterfaces(jvmtiEnv* env,
723 jclass klass,
724 jint* interface_count_ptr,
725 jclass** interfaces_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700726 ENSURE_VALID_ENV(env);
Andreas Gampe8b07e472017-01-06 14:20:39 -0800727 return ClassUtil::GetImplementedInterfaces(env, klass, interface_count_ptr, interfaces_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700728 }
729
730 static jvmtiError GetClassVersionNumbers(jvmtiEnv* env,
731 jclass klass,
732 jint* minor_version_ptr,
733 jint* major_version_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700734 ENSURE_VALID_ENV(env);
Andreas Gampe812a2442017-01-19 22:04:46 -0800735 return ClassUtil::GetClassVersionNumbers(env, klass, minor_version_ptr, major_version_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700736 }
737
738 static jvmtiError GetConstantPool(jvmtiEnv* env,
Alex Light6a3fd512017-02-27 14:34:32 -0800739 jclass klass ATTRIBUTE_UNUSED,
740 jint* constant_pool_count_ptr ATTRIBUTE_UNUSED,
741 jint* constant_pool_byte_count_ptr ATTRIBUTE_UNUSED,
742 unsigned char** constant_pool_bytes_ptr ATTRIBUTE_UNUSED) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700743 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800744 ENSURE_HAS_CAP(env, can_get_constant_pool);
Alex Light49948e92016-08-11 15:35:28 -0700745 return ERR(NOT_IMPLEMENTED);
746 }
747
748 static jvmtiError IsInterface(jvmtiEnv* env, jclass klass, jboolean* is_interface_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700749 ENSURE_VALID_ENV(env);
Andreas Gampe4fd66ec2017-01-05 14:42:13 -0800750 return ClassUtil::IsInterface(env, klass, is_interface_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700751 }
752
753 static jvmtiError IsArrayClass(jvmtiEnv* env,
754 jclass klass,
755 jboolean* is_array_class_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700756 ENSURE_VALID_ENV(env);
Andreas Gampe4fd66ec2017-01-05 14:42:13 -0800757 return ClassUtil::IsArrayClass(env, klass, is_array_class_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700758 }
759
760 static jvmtiError IsModifiableClass(jvmtiEnv* env,
761 jclass klass,
762 jboolean* is_modifiable_class_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700763 ENSURE_VALID_ENV(env);
Alex Lighte4a88632017-01-10 07:41:24 -0800764 return Redefiner::IsModifiableClass(env, klass, is_modifiable_class_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700765 }
766
767 static jvmtiError GetClassLoader(jvmtiEnv* env, jclass klass, jobject* classloader_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700768 ENSURE_VALID_ENV(env);
Andreas Gampe8f5b6032017-01-06 15:50:55 -0800769 return ClassUtil::GetClassLoader(env, klass, classloader_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700770 }
771
772 static jvmtiError GetSourceDebugExtension(jvmtiEnv* env,
Alex Light6fa7b812017-06-16 09:04:29 -0700773 jclass klass,
774 char** source_debug_extension_ptr) {
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_get_source_debug_extension);
Alex Light6fa7b812017-06-16 09:04:29 -0700777 return ClassUtil::GetSourceDebugExtension(env, klass, source_debug_extension_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700778 }
779
780 static jvmtiError RetransformClasses(jvmtiEnv* env, jint class_count, const jclass* classes) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700781 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800782 ENSURE_HAS_CAP(env, can_retransform_classes);
Alex Light6ac57502017-01-19 15:05:06 -0800783 std::string error_msg;
784 jvmtiError res = Transformer::RetransformClasses(ArtJvmTiEnv::AsArtJvmTiEnv(env),
Alex Light0e841182018-02-12 17:42:50 +0000785 gEventHandler,
Alex Light6ac57502017-01-19 15:05:06 -0800786 art::Runtime::Current(),
787 art::Thread::Current(),
788 class_count,
789 classes,
790 &error_msg);
791 if (res != OK) {
Alex Lightae45cbb2018-10-18 15:49:56 -0700792 JVMTI_LOG(WARNING, env) << "FAILURE TO RETRANFORM " << error_msg;
Alex Light6ac57502017-01-19 15:05:06 -0800793 }
794 return res;
Alex Light49948e92016-08-11 15:35:28 -0700795 }
796
797 static jvmtiError RedefineClasses(jvmtiEnv* env,
798 jint class_count,
799 const jvmtiClassDefinition* class_definitions) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700800 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800801 ENSURE_HAS_CAP(env, can_redefine_classes);
Alex Light0e692732017-01-10 15:00:05 -0800802 std::string error_msg;
803 jvmtiError res = Redefiner::RedefineClasses(ArtJvmTiEnv::AsArtJvmTiEnv(env),
Alex Light0e841182018-02-12 17:42:50 +0000804 gEventHandler,
Alex Light0e692732017-01-10 15:00:05 -0800805 art::Runtime::Current(),
806 art::Thread::Current(),
807 class_count,
808 class_definitions,
809 &error_msg);
810 if (res != OK) {
Alex Lightae45cbb2018-10-18 15:49:56 -0700811 JVMTI_LOG(WARNING, env) << "FAILURE TO REDEFINE " << error_msg;
Alex Light0e692732017-01-10 15:00:05 -0800812 }
813 return res;
Alex Light49948e92016-08-11 15:35:28 -0700814 }
815
816 static jvmtiError GetObjectSize(jvmtiEnv* env, jobject object, jlong* size_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700817 ENSURE_VALID_ENV(env);
Andreas Gampe50a4e492017-01-06 18:00:20 -0800818 return ObjectUtil::GetObjectSize(env, object, size_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700819 }
820
821 static jvmtiError GetObjectHashCode(jvmtiEnv* env, jobject object, jint* hash_code_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700822 ENSURE_VALID_ENV(env);
Andreas Gampe50a4e492017-01-06 18:00:20 -0800823 return ObjectUtil::GetObjectHashCode(env, object, hash_code_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700824 }
825
826 static jvmtiError GetObjectMonitorUsage(jvmtiEnv* env,
Alex Lightce568642017-09-05 16:54:25 -0700827 jobject object,
828 jvmtiMonitorUsage* info_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700829 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800830 ENSURE_HAS_CAP(env, can_get_monitor_info);
Alex Lightce568642017-09-05 16:54:25 -0700831 return ObjectUtil::GetObjectMonitorUsage(env, object, info_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700832 }
833
834 static jvmtiError GetFieldName(jvmtiEnv* env,
835 jclass klass,
836 jfieldID field,
837 char** name_ptr,
838 char** signature_ptr,
839 char** generic_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700840 ENSURE_VALID_ENV(env);
Andreas Gampeab2f0d02017-01-05 17:23:45 -0800841 return FieldUtil::GetFieldName(env, klass, field, name_ptr, signature_ptr, generic_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700842 }
843
844 static jvmtiError GetFieldDeclaringClass(jvmtiEnv* env,
845 jclass klass,
846 jfieldID field,
847 jclass* declaring_class_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700848 ENSURE_VALID_ENV(env);
Andreas Gampeab2f0d02017-01-05 17:23:45 -0800849 return FieldUtil::GetFieldDeclaringClass(env, klass, field, declaring_class_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700850 }
851
852 static jvmtiError GetFieldModifiers(jvmtiEnv* env,
853 jclass klass,
854 jfieldID field,
855 jint* modifiers_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700856 ENSURE_VALID_ENV(env);
Andreas Gampeab2f0d02017-01-05 17:23:45 -0800857 return FieldUtil::GetFieldModifiers(env, klass, field, modifiers_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700858 }
859
860 static jvmtiError IsFieldSynthetic(jvmtiEnv* env,
861 jclass klass,
862 jfieldID field,
863 jboolean* is_synthetic_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700864 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800865 ENSURE_HAS_CAP(env, can_get_synthetic_attribute);
Andreas Gampeab2f0d02017-01-05 17:23:45 -0800866 return FieldUtil::IsFieldSynthetic(env, klass, field, is_synthetic_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700867 }
868
869 static jvmtiError GetMethodName(jvmtiEnv* env,
870 jmethodID method,
871 char** name_ptr,
872 char** signature_ptr,
873 char** generic_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700874 ENSURE_VALID_ENV(env);
Andreas Gampe3c252f02016-10-27 18:25:17 -0700875 return MethodUtil::GetMethodName(env, method, name_ptr, signature_ptr, generic_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700876 }
877
878 static jvmtiError GetMethodDeclaringClass(jvmtiEnv* env,
879 jmethodID method,
880 jclass* declaring_class_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700881 ENSURE_VALID_ENV(env);
Andreas Gampe368a2082016-10-28 17:33:13 -0700882 return MethodUtil::GetMethodDeclaringClass(env, method, declaring_class_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700883 }
884
885 static jvmtiError GetMethodModifiers(jvmtiEnv* env,
886 jmethodID method,
887 jint* modifiers_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700888 ENSURE_VALID_ENV(env);
Andreas Gampe36bcd4f2016-10-28 18:07:18 -0700889 return MethodUtil::GetMethodModifiers(env, method, modifiers_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700890 }
891
892 static jvmtiError GetMaxLocals(jvmtiEnv* env,
893 jmethodID method,
894 jint* max_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700895 ENSURE_VALID_ENV(env);
Andreas Gampef71832e2017-01-09 11:38:04 -0800896 return MethodUtil::GetMaxLocals(env, method, max_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700897 }
898
899 static jvmtiError GetArgumentsSize(jvmtiEnv* env,
900 jmethodID method,
901 jint* size_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700902 ENSURE_VALID_ENV(env);
Andreas Gampef71832e2017-01-09 11:38:04 -0800903 return MethodUtil::GetArgumentsSize(env, method, size_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700904 }
905
906 static jvmtiError GetLineNumberTable(jvmtiEnv* env,
907 jmethodID method,
908 jint* entry_count_ptr,
909 jvmtiLineNumberEntry** table_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700910 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800911 ENSURE_HAS_CAP(env, can_get_line_numbers);
Andreas Gampeda3e5612016-12-13 19:00:53 -0800912 return MethodUtil::GetLineNumberTable(env, method, entry_count_ptr, table_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700913 }
914
915 static jvmtiError GetMethodLocation(jvmtiEnv* env,
916 jmethodID method,
917 jlocation* start_location_ptr,
918 jlocation* end_location_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700919 ENSURE_VALID_ENV(env);
Andreas Gampef71832e2017-01-09 11:38:04 -0800920 return MethodUtil::GetMethodLocation(env, method, start_location_ptr, end_location_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700921 }
922
923 static jvmtiError GetLocalVariableTable(jvmtiEnv* env,
Alex Lightce68cc62017-07-26 10:30:38 -0700924 jmethodID method,
925 jint* entry_count_ptr,
926 jvmtiLocalVariableEntry** table_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700927 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800928 ENSURE_HAS_CAP(env, can_access_local_variables);
Alex Lightce68cc62017-07-26 10:30:38 -0700929 return MethodUtil::GetLocalVariableTable(env, method, entry_count_ptr, table_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700930 }
931
932 static jvmtiError GetBytecodes(jvmtiEnv* env,
Alex Light4c174282017-07-05 10:18:18 -0700933 jmethodID method,
934 jint* bytecode_count_ptr,
935 unsigned char** bytecodes_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700936 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800937 ENSURE_HAS_CAP(env, can_get_bytecodes);
Alex Light4c174282017-07-05 10:18:18 -0700938 return MethodUtil::GetBytecodes(env, method, bytecode_count_ptr, bytecodes_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700939 }
940
941 static jvmtiError IsMethodNative(jvmtiEnv* env, jmethodID method, jboolean* is_native_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700942 ENSURE_VALID_ENV(env);
Andreas Gampefdeef522017-01-09 14:40:25 -0800943 return MethodUtil::IsMethodNative(env, method, is_native_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700944 }
945
946 static jvmtiError IsMethodSynthetic(jvmtiEnv* env, jmethodID method, jboolean* is_synthetic_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700947 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800948 ENSURE_HAS_CAP(env, can_get_synthetic_attribute);
Andreas Gampefdeef522017-01-09 14:40:25 -0800949 return MethodUtil::IsMethodSynthetic(env, method, is_synthetic_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700950 }
951
952 static jvmtiError IsMethodObsolete(jvmtiEnv* env, jmethodID method, jboolean* is_obsolete_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700953 ENSURE_VALID_ENV(env);
Andreas Gampefdeef522017-01-09 14:40:25 -0800954 return MethodUtil::IsMethodObsolete(env, method, is_obsolete_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700955 }
956
Alex Light6a3fd512017-02-27 14:34:32 -0800957 static jvmtiError SetNativeMethodPrefix(jvmtiEnv* env, const char* prefix ATTRIBUTE_UNUSED) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700958 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800959 ENSURE_HAS_CAP(env, can_set_native_method_prefix);
Alex Light49948e92016-08-11 15:35:28 -0700960 return ERR(NOT_IMPLEMENTED);
961 }
962
Alex Light6a3fd512017-02-27 14:34:32 -0800963 static jvmtiError SetNativeMethodPrefixes(jvmtiEnv* env,
964 jint prefix_count ATTRIBUTE_UNUSED,
965 char** prefixes ATTRIBUTE_UNUSED) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700966 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -0800967 ENSURE_HAS_CAP(env, can_set_native_method_prefix);
Alex Light49948e92016-08-11 15:35:28 -0700968 return ERR(NOT_IMPLEMENTED);
969 }
970
971 static jvmtiError CreateRawMonitor(jvmtiEnv* env, const char* name, jrawMonitorID* monitor_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700972 ENSURE_VALID_ENV(env);
Andreas Gampe319dbe82017-01-09 16:42:21 -0800973 return MonitorUtil::CreateRawMonitor(env, name, monitor_ptr);
Alex Light49948e92016-08-11 15:35:28 -0700974 }
975
976 static jvmtiError DestroyRawMonitor(jvmtiEnv* env, jrawMonitorID monitor) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700977 ENSURE_VALID_ENV(env);
Andreas Gampe319dbe82017-01-09 16:42:21 -0800978 return MonitorUtil::DestroyRawMonitor(env, monitor);
Alex Light49948e92016-08-11 15:35:28 -0700979 }
980
981 static jvmtiError RawMonitorEnter(jvmtiEnv* env, jrawMonitorID monitor) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700982 ENSURE_VALID_ENV(env);
Andreas Gampe319dbe82017-01-09 16:42:21 -0800983 return MonitorUtil::RawMonitorEnter(env, monitor);
Alex Light49948e92016-08-11 15:35:28 -0700984 }
985
986 static jvmtiError RawMonitorExit(jvmtiEnv* env, jrawMonitorID monitor) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700987 ENSURE_VALID_ENV(env);
Andreas Gampe319dbe82017-01-09 16:42:21 -0800988 return MonitorUtil::RawMonitorExit(env, monitor);
Alex Light49948e92016-08-11 15:35:28 -0700989 }
990
991 static jvmtiError RawMonitorWait(jvmtiEnv* env, jrawMonitorID monitor, jlong millis) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700992 ENSURE_VALID_ENV(env);
Andreas Gampe319dbe82017-01-09 16:42:21 -0800993 return MonitorUtil::RawMonitorWait(env, monitor, millis);
Alex Light49948e92016-08-11 15:35:28 -0700994 }
995
996 static jvmtiError RawMonitorNotify(jvmtiEnv* env, jrawMonitorID monitor) {
Alex Light1edc8cf2017-03-24 14:22:56 -0700997 ENSURE_VALID_ENV(env);
Andreas Gampe319dbe82017-01-09 16:42:21 -0800998 return MonitorUtil::RawMonitorNotify(env, monitor);
Alex Light49948e92016-08-11 15:35:28 -0700999 }
1000
1001 static jvmtiError RawMonitorNotifyAll(jvmtiEnv* env, jrawMonitorID monitor) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001002 ENSURE_VALID_ENV(env);
Andreas Gampe319dbe82017-01-09 16:42:21 -08001003 return MonitorUtil::RawMonitorNotifyAll(env, monitor);
Alex Light49948e92016-08-11 15:35:28 -07001004 }
1005
1006 static jvmtiError SetJNIFunctionTable(jvmtiEnv* env, const jniNativeInterface* function_table) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001007 ENSURE_VALID_ENV(env);
Andreas Gampe6f8e4f02017-01-16 18:18:14 -08001008 return JNIUtil::SetJNIFunctionTable(env, function_table);
Alex Light49948e92016-08-11 15:35:28 -07001009 }
1010
1011 static jvmtiError GetJNIFunctionTable(jvmtiEnv* env, jniNativeInterface** function_table) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001012 ENSURE_VALID_ENV(env);
Andreas Gampe6f8e4f02017-01-16 18:18:14 -08001013 return JNIUtil::GetJNIFunctionTable(env, function_table);
Alex Light49948e92016-08-11 15:35:28 -07001014 }
1015
Andreas Gampe77708d92016-10-07 11:48:21 -07001016 // TODO: This will require locking, so that an agent can't remove callbacks when we're dispatching
1017 // an event.
Alex Light49948e92016-08-11 15:35:28 -07001018 static jvmtiError SetEventCallbacks(jvmtiEnv* env,
1019 const jvmtiEventCallbacks* callbacks,
1020 jint size_of_callbacks) {
Alex Lighte6574242016-08-17 09:56:24 -07001021 ENSURE_VALID_ENV(env);
Andreas Gampe77708d92016-10-07 11:48:21 -07001022 if (size_of_callbacks < 0) {
1023 return ERR(ILLEGAL_ARGUMENT);
1024 }
1025
1026 if (callbacks == nullptr) {
1027 ArtJvmTiEnv::AsArtJvmTiEnv(env)->event_callbacks.reset();
1028 return ERR(NONE);
1029 }
1030
Alex Light8c2b9292017-11-09 13:21:01 -08001031 // Lock the event_info_mutex_ while we replace the callbacks.
1032 ArtJvmTiEnv* art_env = ArtJvmTiEnv::AsArtJvmTiEnv(env);
1033 art::WriterMutexLock lk(art::Thread::Current(), art_env->event_info_mutex_);
1034 std::unique_ptr<ArtJvmtiEventCallbacks> tmp(new ArtJvmtiEventCallbacks());
1035 // Copy over the extension events.
1036 tmp->CopyExtensionsFrom(art_env->event_callbacks.get());
1037 // Never overwrite the extension events.
Andreas Gampe77708d92016-10-07 11:48:21 -07001038 size_t copy_size = std::min(sizeof(jvmtiEventCallbacks),
1039 static_cast<size_t>(size_of_callbacks));
1040 copy_size = art::RoundDown(copy_size, sizeof(void*));
Alex Light8c2b9292017-11-09 13:21:01 -08001041 // Copy non-extension events.
Andreas Gampe77708d92016-10-07 11:48:21 -07001042 memcpy(tmp.get(), callbacks, copy_size);
1043
Alex Light8c2b9292017-11-09 13:21:01 -08001044 // replace the event table.
1045 art_env->event_callbacks = std::move(tmp);
Andreas Gampe77708d92016-10-07 11:48:21 -07001046
1047 return ERR(NONE);
Alex Light49948e92016-08-11 15:35:28 -07001048 }
1049
1050 static jvmtiError SetEventNotificationMode(jvmtiEnv* env,
1051 jvmtiEventMode mode,
1052 jvmtiEvent event_type,
1053 jthread event_thread,
1054 ...) {
Alex Lighte6574242016-08-17 09:56:24 -07001055 ENSURE_VALID_ENV(env);
Andreas Gampe77708d92016-10-07 11:48:21 -07001056 art::Thread* art_thread = nullptr;
1057 if (event_thread != nullptr) {
Alex Light7ddc23d2017-09-22 15:33:41 -07001058 // TODO The locking around this call is less then what we really want.
Andreas Gampe77708d92016-10-07 11:48:21 -07001059 art::ScopedObjectAccess soa(art::Thread::Current());
1060 art::MutexLock mu(soa.Self(), *art::Locks::thread_list_lock_);
Alex Light7ddc23d2017-09-22 15:33:41 -07001061 jvmtiError err = ERR(INTERNAL);
1062 if (!ThreadUtil::GetAliveNativeThread(event_thread, soa, &art_thread, &err)) {
1063 return err;
1064 } else if (art_thread->IsStillStarting()) {
Andreas Gampe77708d92016-10-07 11:48:21 -07001065 return ERR(THREAD_NOT_ALIVE);
1066 }
1067 }
1068
Alex Light40d87f42017-01-18 10:27:06 -08001069 ArtJvmTiEnv* art_env = ArtJvmTiEnv::AsArtJvmTiEnv(env);
Alex Light0e841182018-02-12 17:42:50 +00001070 return gEventHandler->SetEvent(art_env,
1071 art_thread,
1072 GetArtJvmtiEvent(art_env, event_type),
1073 mode);
Alex Light49948e92016-08-11 15:35:28 -07001074 }
1075
Alex Light1edc8cf2017-03-24 14:22:56 -07001076 static jvmtiError GenerateEvents(jvmtiEnv* env,
Alex Light6a3fd512017-02-27 14:34:32 -08001077 jvmtiEvent event_type ATTRIBUTE_UNUSED) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001078 ENSURE_VALID_ENV(env);
Alex Light6a3fd512017-02-27 14:34:32 -08001079 return OK;
Alex Light49948e92016-08-11 15:35:28 -07001080 }
1081
Alex Light1edc8cf2017-03-24 14:22:56 -07001082 static jvmtiError GetExtensionFunctions(jvmtiEnv* env,
Alex Light49948e92016-08-11 15:35:28 -07001083 jint* extension_count_ptr,
1084 jvmtiExtensionFunctionInfo** extensions) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001085 ENSURE_VALID_ENV(env);
Andreas Gamped73aba42017-05-03 21:40:26 -07001086 ENSURE_NON_NULL(extension_count_ptr);
1087 ENSURE_NON_NULL(extensions);
Alex Light3f33c0a2017-11-08 10:17:37 -08001088 return ExtensionUtil::GetExtensionFunctions(env, extension_count_ptr, extensions);
Alex Light49948e92016-08-11 15:35:28 -07001089 }
1090
Alex Light1edc8cf2017-03-24 14:22:56 -07001091 static jvmtiError GetExtensionEvents(jvmtiEnv* env,
Alex Light49948e92016-08-11 15:35:28 -07001092 jint* extension_count_ptr,
1093 jvmtiExtensionEventInfo** extensions) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001094 ENSURE_VALID_ENV(env);
Alex Light3f33c0a2017-11-08 10:17:37 -08001095 ENSURE_NON_NULL(extension_count_ptr);
1096 ENSURE_NON_NULL(extensions);
1097 return ExtensionUtil::GetExtensionEvents(env, extension_count_ptr, extensions);
Alex Light49948e92016-08-11 15:35:28 -07001098 }
1099
Alex Light1edc8cf2017-03-24 14:22:56 -07001100 static jvmtiError SetExtensionEventCallback(jvmtiEnv* env,
Alex Light3f33c0a2017-11-08 10:17:37 -08001101 jint extension_event_index,
1102 jvmtiExtensionEvent callback) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001103 ENSURE_VALID_ENV(env);
Alex Light8c2b9292017-11-09 13:21:01 -08001104 return ExtensionUtil::SetExtensionEventCallback(env,
1105 extension_event_index,
1106 callback,
Alex Light0e841182018-02-12 17:42:50 +00001107 gEventHandler);
Alex Light49948e92016-08-11 15:35:28 -07001108 }
1109
Alex Light2ce6fc82017-12-18 16:42:36 -08001110#define FOR_ALL_CAPABILITIES(FUN) \
1111 FUN(can_tag_objects) \
1112 FUN(can_generate_field_modification_events) \
1113 FUN(can_generate_field_access_events) \
1114 FUN(can_get_bytecodes) \
1115 FUN(can_get_synthetic_attribute) \
1116 FUN(can_get_owned_monitor_info) \
1117 FUN(can_get_current_contended_monitor) \
1118 FUN(can_get_monitor_info) \
1119 FUN(can_pop_frame) \
1120 FUN(can_redefine_classes) \
1121 FUN(can_signal_thread) \
1122 FUN(can_get_source_file_name) \
1123 FUN(can_get_line_numbers) \
1124 FUN(can_get_source_debug_extension) \
1125 FUN(can_access_local_variables) \
1126 FUN(can_maintain_original_method_order) \
1127 FUN(can_generate_single_step_events) \
1128 FUN(can_generate_exception_events) \
1129 FUN(can_generate_frame_pop_events) \
1130 FUN(can_generate_breakpoint_events) \
1131 FUN(can_suspend) \
1132 FUN(can_redefine_any_class) \
1133 FUN(can_get_current_thread_cpu_time) \
1134 FUN(can_get_thread_cpu_time) \
1135 FUN(can_generate_method_entry_events) \
1136 FUN(can_generate_method_exit_events) \
1137 FUN(can_generate_all_class_hook_events) \
1138 FUN(can_generate_compiled_method_load_events) \
1139 FUN(can_generate_monitor_events) \
1140 FUN(can_generate_vm_object_alloc_events) \
1141 FUN(can_generate_native_method_bind_events) \
1142 FUN(can_generate_garbage_collection_events) \
1143 FUN(can_generate_object_free_events) \
1144 FUN(can_force_early_return) \
1145 FUN(can_get_owned_monitor_stack_depth_info) \
1146 FUN(can_get_constant_pool) \
1147 FUN(can_set_native_method_prefix) \
1148 FUN(can_retransform_classes) \
1149 FUN(can_retransform_any_class) \
1150 FUN(can_generate_resource_exhaustion_heap_events) \
1151 FUN(can_generate_resource_exhaustion_threads_events)
1152
Alex Light49948e92016-08-11 15:35:28 -07001153 static jvmtiError GetPotentialCapabilities(jvmtiEnv* env, jvmtiCapabilities* capabilities_ptr) {
Alex Lighte6574242016-08-17 09:56:24 -07001154 ENSURE_VALID_ENV(env);
1155 ENSURE_NON_NULL(capabilities_ptr);
1156 *capabilities_ptr = kPotentialCapabilities;
Alex Light2ce6fc82017-12-18 16:42:36 -08001157 if (UNLIKELY(!IsFullJvmtiAvailable())) {
1158#define REMOVE_NONDEBUGGABLE_UNSUPPORTED(e) \
1159 do { \
1160 if (kNonDebuggableUnsupportedCapabilities.e == 1) { \
1161 capabilities_ptr->e = 0; \
1162 } \
1163 } while (false);
1164
1165 FOR_ALL_CAPABILITIES(REMOVE_NONDEBUGGABLE_UNSUPPORTED);
1166#undef REMOVE_NONDEBUGGABLE_UNSUPPORTED
1167 }
Alex Lighte6574242016-08-17 09:56:24 -07001168 return OK;
Alex Light49948e92016-08-11 15:35:28 -07001169 }
1170
1171 static jvmtiError AddCapabilities(jvmtiEnv* env, const jvmtiCapabilities* capabilities_ptr) {
Alex Lighte6574242016-08-17 09:56:24 -07001172 ENSURE_VALID_ENV(env);
1173 ENSURE_NON_NULL(capabilities_ptr);
1174 ArtJvmTiEnv* art_env = static_cast<ArtJvmTiEnv*>(env);
1175 jvmtiError ret = OK;
Alex Light34d8e082017-03-27 09:50:36 -07001176 jvmtiCapabilities changed = {};
1177 jvmtiCapabilities potential_capabilities = {};
Alex Light1d224962017-02-27 10:26:35 -08001178 ret = env->GetPotentialCapabilities(&potential_capabilities);
1179 if (ret != OK) {
1180 return ret;
1181 }
Alex Lighte6574242016-08-17 09:56:24 -07001182#define ADD_CAPABILITY(e) \
1183 do { \
1184 if (capabilities_ptr->e == 1) { \
Alex Light1d224962017-02-27 10:26:35 -08001185 if (potential_capabilities.e == 1) { \
Alex Light73afd322017-01-18 11:17:47 -08001186 if (art_env->capabilities.e != 1) { \
1187 art_env->capabilities.e = 1; \
1188 changed.e = 1; \
1189 }\
Alex Lighte6574242016-08-17 09:56:24 -07001190 } else { \
1191 ret = ERR(NOT_AVAILABLE); \
1192 } \
1193 } \
Alex Light2ce6fc82017-12-18 16:42:36 -08001194 } while (false);
Alex Lighte6574242016-08-17 09:56:24 -07001195
Alex Light2ce6fc82017-12-18 16:42:36 -08001196 FOR_ALL_CAPABILITIES(ADD_CAPABILITY);
Alex Lighte6574242016-08-17 09:56:24 -07001197#undef ADD_CAPABILITY
Alex Light0e841182018-02-12 17:42:50 +00001198 gEventHandler->HandleChangedCapabilities(ArtJvmTiEnv::AsArtJvmTiEnv(env),
1199 changed,
Andreas Gampe6e897762018-10-16 13:09:32 -07001200 /*added=*/true);
Alex Lighte6574242016-08-17 09:56:24 -07001201 return ret;
Alex Light49948e92016-08-11 15:35:28 -07001202 }
1203
1204 static jvmtiError RelinquishCapabilities(jvmtiEnv* env,
1205 const jvmtiCapabilities* capabilities_ptr) {
Alex Lighte6574242016-08-17 09:56:24 -07001206 ENSURE_VALID_ENV(env);
1207 ENSURE_NON_NULL(capabilities_ptr);
1208 ArtJvmTiEnv* art_env = reinterpret_cast<ArtJvmTiEnv*>(env);
Alex Light34d8e082017-03-27 09:50:36 -07001209 jvmtiCapabilities changed = {};
Alex Lighte6574242016-08-17 09:56:24 -07001210#define DEL_CAPABILITY(e) \
1211 do { \
1212 if (capabilities_ptr->e == 1) { \
Alex Light73afd322017-01-18 11:17:47 -08001213 if (art_env->capabilities.e == 1) { \
1214 art_env->capabilities.e = 0;\
1215 changed.e = 1; \
1216 } \
Alex Lighte6574242016-08-17 09:56:24 -07001217 } \
Alex Light2ce6fc82017-12-18 16:42:36 -08001218 } while (false);
Alex Lighte6574242016-08-17 09:56:24 -07001219
Alex Light2ce6fc82017-12-18 16:42:36 -08001220 FOR_ALL_CAPABILITIES(DEL_CAPABILITY);
Alex Lighte6574242016-08-17 09:56:24 -07001221#undef DEL_CAPABILITY
Alex Light0e841182018-02-12 17:42:50 +00001222 gEventHandler->HandleChangedCapabilities(ArtJvmTiEnv::AsArtJvmTiEnv(env),
1223 changed,
Andreas Gampe6e897762018-10-16 13:09:32 -07001224 /*added=*/false);
Alex Lighte6574242016-08-17 09:56:24 -07001225 return OK;
Alex Light49948e92016-08-11 15:35:28 -07001226 }
1227
Alex Light2ce6fc82017-12-18 16:42:36 -08001228#undef FOR_ALL_CAPABILITIES
1229
Alex Light49948e92016-08-11 15:35:28 -07001230 static jvmtiError GetCapabilities(jvmtiEnv* env, jvmtiCapabilities* capabilities_ptr) {
Alex Lighte6574242016-08-17 09:56:24 -07001231 ENSURE_VALID_ENV(env);
1232 ENSURE_NON_NULL(capabilities_ptr);
1233 ArtJvmTiEnv* artenv = reinterpret_cast<ArtJvmTiEnv*>(env);
1234 *capabilities_ptr = artenv->capabilities;
1235 return OK;
Alex Light49948e92016-08-11 15:35:28 -07001236 }
1237
Alex Light6a3fd512017-02-27 14:34:32 -08001238 static jvmtiError GetCurrentThreadCpuTimerInfo(jvmtiEnv* env,
1239 jvmtiTimerInfo* info_ptr ATTRIBUTE_UNUSED) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001240 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -08001241 ENSURE_HAS_CAP(env, can_get_current_thread_cpu_time);
Alex Light49948e92016-08-11 15:35:28 -07001242 return ERR(NOT_IMPLEMENTED);
1243 }
1244
Alex Light6a3fd512017-02-27 14:34:32 -08001245 static jvmtiError GetCurrentThreadCpuTime(jvmtiEnv* env, jlong* nanos_ptr ATTRIBUTE_UNUSED) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001246 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -08001247 ENSURE_HAS_CAP(env, can_get_current_thread_cpu_time);
Alex Light49948e92016-08-11 15:35:28 -07001248 return ERR(NOT_IMPLEMENTED);
1249 }
1250
Alex Light6a3fd512017-02-27 14:34:32 -08001251 static jvmtiError GetThreadCpuTimerInfo(jvmtiEnv* env,
1252 jvmtiTimerInfo* info_ptr ATTRIBUTE_UNUSED) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001253 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -08001254 ENSURE_HAS_CAP(env, can_get_thread_cpu_time);
Alex Light49948e92016-08-11 15:35:28 -07001255 return ERR(NOT_IMPLEMENTED);
1256 }
1257
Alex Light6a3fd512017-02-27 14:34:32 -08001258 static jvmtiError GetThreadCpuTime(jvmtiEnv* env,
1259 jthread thread ATTRIBUTE_UNUSED,
1260 jlong* nanos_ptr ATTRIBUTE_UNUSED) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001261 ENSURE_VALID_ENV(env);
Alex Light9db679d2017-01-25 15:28:04 -08001262 ENSURE_HAS_CAP(env, can_get_thread_cpu_time);
Alex Light49948e92016-08-11 15:35:28 -07001263 return ERR(NOT_IMPLEMENTED);
1264 }
1265
1266 static jvmtiError GetTimerInfo(jvmtiEnv* env, jvmtiTimerInfo* info_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001267 ENSURE_VALID_ENV(env);
Andreas Gampe35bcf812017-01-13 16:24:17 -08001268 return TimerUtil::GetTimerInfo(env, info_ptr);
Alex Light49948e92016-08-11 15:35:28 -07001269 }
1270
1271 static jvmtiError GetTime(jvmtiEnv* env, jlong* nanos_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001272 ENSURE_VALID_ENV(env);
Andreas Gampe35bcf812017-01-13 16:24:17 -08001273 return TimerUtil::GetTime(env, nanos_ptr);
Alex Light49948e92016-08-11 15:35:28 -07001274 }
1275
1276 static jvmtiError GetAvailableProcessors(jvmtiEnv* env, jint* processor_count_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001277 ENSURE_VALID_ENV(env);
Andreas Gampe35bcf812017-01-13 16:24:17 -08001278 return TimerUtil::GetAvailableProcessors(env, processor_count_ptr);
Alex Light49948e92016-08-11 15:35:28 -07001279 }
1280
1281 static jvmtiError AddToBootstrapClassLoaderSearch(jvmtiEnv* env, const char* segment) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001282 ENSURE_VALID_ENV(env);
Andreas Gampece7732b2017-01-17 15:50:26 -08001283 return SearchUtil::AddToBootstrapClassLoaderSearch(env, segment);
Alex Light49948e92016-08-11 15:35:28 -07001284 }
1285
1286 static jvmtiError AddToSystemClassLoaderSearch(jvmtiEnv* env, const char* segment) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001287 ENSURE_VALID_ENV(env);
Andreas Gampece7732b2017-01-17 15:50:26 -08001288 return SearchUtil::AddToSystemClassLoaderSearch(env, segment);
Alex Light49948e92016-08-11 15:35:28 -07001289 }
1290
1291 static jvmtiError GetSystemProperties(jvmtiEnv* env, jint* count_ptr, char*** property_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001292 ENSURE_VALID_ENV(env);
Andreas Gampe1bdaf732017-01-09 19:21:06 -08001293 return PropertiesUtil::GetSystemProperties(env, count_ptr, property_ptr);
Alex Light49948e92016-08-11 15:35:28 -07001294 }
1295
1296 static jvmtiError GetSystemProperty(jvmtiEnv* env, const char* property, char** value_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001297 ENSURE_VALID_ENV(env);
Andreas Gampe1bdaf732017-01-09 19:21:06 -08001298 return PropertiesUtil::GetSystemProperty(env, property, value_ptr);
Alex Light49948e92016-08-11 15:35:28 -07001299 }
1300
1301 static jvmtiError SetSystemProperty(jvmtiEnv* env, const char* property, const char* value) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001302 ENSURE_VALID_ENV(env);
Andreas Gampe1bdaf732017-01-09 19:21:06 -08001303 return PropertiesUtil::SetSystemProperty(env, property, value);
Alex Light49948e92016-08-11 15:35:28 -07001304 }
1305
1306 static jvmtiError GetPhase(jvmtiEnv* env, jvmtiPhase* phase_ptr) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001307 ENSURE_VALID_ENV(env);
Andreas Gampe96eca782017-01-19 19:45:30 -08001308 return PhaseUtil::GetPhase(env, phase_ptr);
Alex Light49948e92016-08-11 15:35:28 -07001309 }
1310
1311 static jvmtiError DisposeEnvironment(jvmtiEnv* env) {
Alex Lighte6574242016-08-17 09:56:24 -07001312 ENSURE_VALID_ENV(env);
Alex Light092a4042017-07-12 08:46:44 -07001313 ArtJvmTiEnv* tienv = ArtJvmTiEnv::AsArtJvmTiEnv(env);
Alex Light0e841182018-02-12 17:42:50 +00001314 gEventHandler->RemoveArtJvmTiEnv(tienv);
Alex Light092a4042017-07-12 08:46:44 -07001315 art::Runtime::Current()->RemoveSystemWeakHolder(tienv->object_tag_table.get());
1316 ThreadUtil::RemoveEnvironment(tienv);
1317 delete tienv;
Alex Light49948e92016-08-11 15:35:28 -07001318 return OK;
1319 }
1320
1321 static jvmtiError SetEnvironmentLocalStorage(jvmtiEnv* env, const void* data) {
Alex Lighte6574242016-08-17 09:56:24 -07001322 ENSURE_VALID_ENV(env);
Alex Light49948e92016-08-11 15:35:28 -07001323 reinterpret_cast<ArtJvmTiEnv*>(env)->local_data = const_cast<void*>(data);
1324 return OK;
1325 }
1326
1327 static jvmtiError GetEnvironmentLocalStorage(jvmtiEnv* env, void** data_ptr) {
Alex Lighte6574242016-08-17 09:56:24 -07001328 ENSURE_VALID_ENV(env);
Alex Light49948e92016-08-11 15:35:28 -07001329 *data_ptr = reinterpret_cast<ArtJvmTiEnv*>(env)->local_data;
1330 return OK;
1331 }
1332
1333 static jvmtiError GetVersionNumber(jvmtiEnv* env, jint* version_ptr) {
Alex Lighte6574242016-08-17 09:56:24 -07001334 ENSURE_VALID_ENV(env);
Alex Light2ce6fc82017-12-18 16:42:36 -08001335 *version_ptr = ArtJvmTiEnv::AsArtJvmTiEnv(env)->ti_version;
Alex Light49948e92016-08-11 15:35:28 -07001336 return OK;
1337 }
1338
1339 static jvmtiError GetErrorName(jvmtiEnv* env, jvmtiError error, char** name_ptr) {
Alex Lighte6574242016-08-17 09:56:24 -07001340 ENSURE_NON_NULL(name_ptr);
Andreas Gampe95c466d2017-05-08 14:50:47 -07001341 auto copy_fn = [&](const char* name_cstr) {
1342 jvmtiError res;
1343 JvmtiUniquePtr<char[]> copy = CopyString(env, name_cstr, &res);
1344 if (copy == nullptr) {
1345 *name_ptr = nullptr;
1346 return res;
1347 } else {
1348 *name_ptr = copy.release();
1349 return OK;
1350 }
1351 };
Alex Light49948e92016-08-11 15:35:28 -07001352 switch (error) {
Andreas Gampe95c466d2017-05-08 14:50:47 -07001353#define ERROR_CASE(e) case (JVMTI_ERROR_ ## e) : \
1354 return copy_fn("JVMTI_ERROR_"#e);
Alex Light49948e92016-08-11 15:35:28 -07001355 ERROR_CASE(NONE);
1356 ERROR_CASE(INVALID_THREAD);
1357 ERROR_CASE(INVALID_THREAD_GROUP);
1358 ERROR_CASE(INVALID_PRIORITY);
1359 ERROR_CASE(THREAD_NOT_SUSPENDED);
Andreas Gampe95c466d2017-05-08 14:50:47 -07001360 ERROR_CASE(THREAD_SUSPENDED);
Alex Light49948e92016-08-11 15:35:28 -07001361 ERROR_CASE(THREAD_NOT_ALIVE);
1362 ERROR_CASE(INVALID_OBJECT);
1363 ERROR_CASE(INVALID_CLASS);
1364 ERROR_CASE(CLASS_NOT_PREPARED);
1365 ERROR_CASE(INVALID_METHODID);
1366 ERROR_CASE(INVALID_LOCATION);
1367 ERROR_CASE(INVALID_FIELDID);
1368 ERROR_CASE(NO_MORE_FRAMES);
1369 ERROR_CASE(OPAQUE_FRAME);
1370 ERROR_CASE(TYPE_MISMATCH);
1371 ERROR_CASE(INVALID_SLOT);
1372 ERROR_CASE(DUPLICATE);
1373 ERROR_CASE(NOT_FOUND);
1374 ERROR_CASE(INVALID_MONITOR);
1375 ERROR_CASE(NOT_MONITOR_OWNER);
1376 ERROR_CASE(INTERRUPT);
1377 ERROR_CASE(INVALID_CLASS_FORMAT);
1378 ERROR_CASE(CIRCULAR_CLASS_DEFINITION);
1379 ERROR_CASE(FAILS_VERIFICATION);
1380 ERROR_CASE(UNSUPPORTED_REDEFINITION_METHOD_ADDED);
1381 ERROR_CASE(UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED);
1382 ERROR_CASE(INVALID_TYPESTATE);
1383 ERROR_CASE(UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED);
1384 ERROR_CASE(UNSUPPORTED_REDEFINITION_METHOD_DELETED);
1385 ERROR_CASE(UNSUPPORTED_VERSION);
1386 ERROR_CASE(NAMES_DONT_MATCH);
1387 ERROR_CASE(UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED);
1388 ERROR_CASE(UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED);
1389 ERROR_CASE(UNMODIFIABLE_CLASS);
1390 ERROR_CASE(NOT_AVAILABLE);
1391 ERROR_CASE(MUST_POSSESS_CAPABILITY);
1392 ERROR_CASE(NULL_POINTER);
1393 ERROR_CASE(ABSENT_INFORMATION);
1394 ERROR_CASE(INVALID_EVENT_TYPE);
1395 ERROR_CASE(ILLEGAL_ARGUMENT);
1396 ERROR_CASE(NATIVE_METHOD);
1397 ERROR_CASE(CLASS_LOADER_UNSUPPORTED);
1398 ERROR_CASE(OUT_OF_MEMORY);
1399 ERROR_CASE(ACCESS_DENIED);
1400 ERROR_CASE(WRONG_PHASE);
1401 ERROR_CASE(INTERNAL);
1402 ERROR_CASE(UNATTACHED_THREAD);
1403 ERROR_CASE(INVALID_ENVIRONMENT);
1404#undef ERROR_CASE
Alex Light49948e92016-08-11 15:35:28 -07001405 }
Andreas Gampe95c466d2017-05-08 14:50:47 -07001406
1407 return ERR(ILLEGAL_ARGUMENT);
Alex Light49948e92016-08-11 15:35:28 -07001408 }
1409
Alex Light1edc8cf2017-03-24 14:22:56 -07001410 static jvmtiError SetVerboseFlag(jvmtiEnv* env,
Alex Light6a3fd512017-02-27 14:34:32 -08001411 jvmtiVerboseFlag flag,
1412 jboolean value) {
Alex Light1edc8cf2017-03-24 14:22:56 -07001413 ENSURE_VALID_ENV(env);
Andreas Gampef37e3022017-01-13 17:54:46 -08001414 if (flag == jvmtiVerboseFlag::JVMTI_VERBOSE_OTHER) {
1415 // OTHER is special, as it's 0, so can't do a bit check.
1416 bool val = (value == JNI_TRUE) ? true : false;
1417
1418 art::gLogVerbosity.collector = val;
1419 art::gLogVerbosity.compiler = val;
1420 art::gLogVerbosity.deopt = val;
1421 art::gLogVerbosity.heap = val;
1422 art::gLogVerbosity.jdwp = val;
1423 art::gLogVerbosity.jit = val;
1424 art::gLogVerbosity.monitor = val;
1425 art::gLogVerbosity.oat = val;
1426 art::gLogVerbosity.profiler = val;
1427 art::gLogVerbosity.signals = val;
1428 art::gLogVerbosity.simulator = val;
1429 art::gLogVerbosity.startup = val;
1430 art::gLogVerbosity.third_party_jni = val;
1431 art::gLogVerbosity.threads = val;
1432 art::gLogVerbosity.verifier = val;
Andreas Gampe92d77202017-12-06 20:49:00 -08001433 // Do not set verifier-debug.
Andreas Gampef37e3022017-01-13 17:54:46 -08001434 art::gLogVerbosity.image = val;
1435
1436 // Note: can't switch systrace_lock_logging. That requires changing entrypoints.
1437
1438 art::gLogVerbosity.agents = val;
1439 } else {
1440 // Spec isn't clear whether "flag" is a mask or supposed to be single. We implement the mask
1441 // semantics.
1442 constexpr std::underlying_type<jvmtiVerboseFlag>::type kMask =
1443 jvmtiVerboseFlag::JVMTI_VERBOSE_GC |
1444 jvmtiVerboseFlag::JVMTI_VERBOSE_CLASS |
1445 jvmtiVerboseFlag::JVMTI_VERBOSE_JNI;
1446 if ((flag & ~kMask) != 0) {
1447 return ERR(ILLEGAL_ARGUMENT);
1448 }
1449
1450 bool val = (value == JNI_TRUE) ? true : false;
1451
1452 if ((flag & jvmtiVerboseFlag::JVMTI_VERBOSE_GC) != 0) {
1453 art::gLogVerbosity.gc = val;
1454 }
1455
1456 if ((flag & jvmtiVerboseFlag::JVMTI_VERBOSE_CLASS) != 0) {
1457 art::gLogVerbosity.class_linker = val;
1458 }
1459
1460 if ((flag & jvmtiVerboseFlag::JVMTI_VERBOSE_JNI) != 0) {
1461 art::gLogVerbosity.jni = val;
1462 }
1463 }
1464
1465 return ERR(NONE);
Alex Light49948e92016-08-11 15:35:28 -07001466 }
1467
Alex Light1edc8cf2017-03-24 14:22:56 -07001468 static jvmtiError GetJLocationFormat(jvmtiEnv* env, jvmtiJlocationFormat* format_ptr) {
1469 ENSURE_VALID_ENV(env);
Andreas Gampeacfc9572017-01-17 18:36:56 -08001470 // Report BCI as jlocation format. We report dex bytecode indices.
1471 if (format_ptr == nullptr) {
1472 return ERR(NULL_POINTER);
1473 }
1474 *format_ptr = jvmtiJlocationFormat::JVMTI_JLOCATION_JVMBCI;
1475 return ERR(NONE);
Alex Light49948e92016-08-11 15:35:28 -07001476 }
1477};
1478
1479static bool IsJvmtiVersion(jint version) {
1480 return version == JVMTI_VERSION_1 ||
1481 version == JVMTI_VERSION_1_0 ||
1482 version == JVMTI_VERSION_1_1 ||
1483 version == JVMTI_VERSION_1_2 ||
1484 version == JVMTI_VERSION;
1485}
1486
Andreas Gampede19eb92017-02-24 16:21:18 -08001487extern const jvmtiInterface_1 gJvmtiInterface;
Alex Light092a4042017-07-12 08:46:44 -07001488
Alex Light2ce6fc82017-12-18 16:42:36 -08001489ArtJvmTiEnv::ArtJvmTiEnv(art::JavaVMExt* runtime, EventHandler* event_handler, jint version)
Andreas Gampede19eb92017-02-24 16:21:18 -08001490 : art_vm(runtime),
1491 local_data(nullptr),
Alex Light2ce6fc82017-12-18 16:42:36 -08001492 ti_version(version),
Alex Lightb6106d52017-10-18 15:02:15 -07001493 capabilities(),
Alex Lightae45cbb2018-10-18 15:49:56 -07001494 event_info_mutex_("jvmtiEnv_EventInfoMutex"),
1495 last_error_mutex_("jvmtiEnv_LastErrorMutex", art::LockLevel::kGenericBottomLock) {
Yi Kongc57c6802018-10-29 14:28:56 -07001496 object_tag_table = std::make_unique<ObjectTagTable>(event_handler, this);
Andreas Gampede19eb92017-02-24 16:21:18 -08001497 functions = &gJvmtiInterface;
1498}
1499
Alex Light49948e92016-08-11 15:35:28 -07001500// Creates a jvmtiEnv and returns it with the art::ti::Env that is associated with it. new_art_ti
1501// is a pointer to the uninitialized memory for an art::ti::Env.
Alex Light2ce6fc82017-12-18 16:42:36 -08001502static void CreateArtJvmTiEnv(art::JavaVMExt* vm, jint version, /*out*/void** new_jvmtiEnv) {
Alex Light0e841182018-02-12 17:42:50 +00001503 struct ArtJvmTiEnv* env = new ArtJvmTiEnv(vm, gEventHandler, version);
Alex Light49948e92016-08-11 15:35:28 -07001504 *new_jvmtiEnv = env;
Andreas Gampe77708d92016-10-07 11:48:21 -07001505
Alex Light0e841182018-02-12 17:42:50 +00001506 gEventHandler->RegisterArtJvmTiEnv(env);
Andreas Gampede19eb92017-02-24 16:21:18 -08001507
1508 art::Runtime::Current()->AddSystemWeakHolder(
1509 ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table.get());
Alex Light49948e92016-08-11 15:35:28 -07001510}
1511
1512// A hook that the runtime uses to allow plugins to handle GetEnv calls. It returns true and
1513// places the return value in 'env' if this library can handle the GetEnv request. Otherwise
1514// returns false and does not modify the 'env' pointer.
1515static jint GetEnvHandler(art::JavaVMExt* vm, /*out*/void** env, jint version) {
Alex Light2ce6fc82017-12-18 16:42:36 -08001516 // JavaDebuggable will either be set by the runtime as it is starting up or the plugin if it's
1517 // loaded early enough. If this is false we cannot guarantee conformance to all JVMTI behaviors
1518 // due to optimizations. We will only allow agents to get ArtTiEnvs using the kArtTiVersion.
1519 if (IsFullJvmtiAvailable() && IsJvmtiVersion(version)) {
1520 CreateArtJvmTiEnv(vm, JVMTI_VERSION, env);
1521 return JNI_OK;
1522 } else if (version == kArtTiVersion) {
1523 CreateArtJvmTiEnv(vm, kArtTiVersion, env);
Alex Light49948e92016-08-11 15:35:28 -07001524 return JNI_OK;
1525 } else {
1526 printf("version 0x%x is not valid!", version);
1527 return JNI_EVERSION;
1528 }
1529}
1530
1531// The plugin initialization function. This adds the jvmti environment.
1532extern "C" bool ArtPlugin_Initialize() {
Andreas Gampee08a2be2016-10-06 13:13:30 -07001533 art::Runtime* runtime = art::Runtime::Current();
Andreas Gampe96eca782017-01-19 19:45:30 -08001534
Alex Light0e841182018-02-12 17:42:50 +00001535 gDeoptManager = new DeoptManager;
1536 gEventHandler = new EventHandler;
1537
1538 gDeoptManager->Setup();
Andreas Gampe96eca782017-01-19 19:45:30 -08001539 if (runtime->IsStarted()) {
1540 PhaseUtil::SetToLive();
1541 } else {
1542 PhaseUtil::SetToOnLoad();
1543 }
Alex Light0e841182018-02-12 17:42:50 +00001544 PhaseUtil::Register(gEventHandler);
1545 ThreadUtil::Register(gEventHandler);
1546 ClassUtil::Register(gEventHandler);
1547 DumpUtil::Register(gEventHandler);
1548 MethodUtil::Register(gEventHandler);
Andreas Gampecefaa142017-01-23 15:04:59 -08001549 SearchUtil::Register();
Andreas Gampe9e38a502017-03-06 08:19:26 -08001550 HeapUtil::Register();
Alex Lightca97ada2018-02-02 09:25:31 -08001551 Transformer::Setup();
Andreas Gampe96eca782017-01-19 19:45:30 -08001552
Alex Light2ce6fc82017-12-18 16:42:36 -08001553 {
1554 // Make sure we can deopt anything we need to.
Nicolas Geoffray226805d2018-12-14 10:59:02 +00001555 art::ScopedSuspendAll ssa(__FUNCTION__);
Alex Light0e841182018-02-12 17:42:50 +00001556 gDeoptManager->FinishSetup();
Alex Light2ce6fc82017-12-18 16:42:36 -08001557 }
1558
Andreas Gampee08a2be2016-10-06 13:13:30 -07001559 runtime->GetJavaVM()->AddEnvironmentHook(GetEnvHandler);
Andreas Gampe96eca782017-01-19 19:45:30 -08001560
Alex Light49948e92016-08-11 15:35:28 -07001561 return true;
1562}
1563
Andreas Gampeeafaf572017-01-20 12:34:15 -08001564extern "C" bool ArtPlugin_Deinitialize() {
Alex Light0e841182018-02-12 17:42:50 +00001565 gEventHandler->Shutdown();
1566 gDeoptManager->Shutdown();
Andreas Gampeeafaf572017-01-20 12:34:15 -08001567 PhaseUtil::Unregister();
1568 ThreadUtil::Unregister();
Andreas Gampee6377462017-01-20 17:37:50 -08001569 ClassUtil::Unregister();
Andreas Gampeeb0cea12017-01-23 08:50:04 -08001570 DumpUtil::Unregister();
Alex Lightd78ddec2017-04-18 15:20:38 -07001571 MethodUtil::Unregister();
Andreas Gampecefaa142017-01-23 15:04:59 -08001572 SearchUtil::Unregister();
Andreas Gampe9e38a502017-03-06 08:19:26 -08001573 HeapUtil::Unregister();
Andreas Gampeeafaf572017-01-20 12:34:15 -08001574
Alex Light0e841182018-02-12 17:42:50 +00001575 // TODO It would be good to delete the gEventHandler and gDeoptManager here but we cannot since
1576 // daemon threads might be suspended and we want to make sure that even if they wake up briefly
1577 // they won't hit deallocated memory. By this point none of the functions will do anything since
1578 // they have already shutdown.
1579
Andreas Gampeeafaf572017-01-20 12:34:15 -08001580 return true;
1581}
1582
Alex Light49948e92016-08-11 15:35:28 -07001583// The actual struct holding all of the entrypoints into the jvmti interface.
1584const jvmtiInterface_1 gJvmtiInterface = {
Alex Light6ac57502017-01-19 15:05:06 -08001585 nullptr, // reserved1
Alex Light49948e92016-08-11 15:35:28 -07001586 JvmtiFunctions::SetEventNotificationMode,
Alex Light0e692732017-01-10 15:00:05 -08001587 nullptr, // reserved3
Alex Light49948e92016-08-11 15:35:28 -07001588 JvmtiFunctions::GetAllThreads,
1589 JvmtiFunctions::SuspendThread,
1590 JvmtiFunctions::ResumeThread,
1591 JvmtiFunctions::StopThread,
1592 JvmtiFunctions::InterruptThread,
1593 JvmtiFunctions::GetThreadInfo,
1594 JvmtiFunctions::GetOwnedMonitorInfo, // 10
1595 JvmtiFunctions::GetCurrentContendedMonitor,
1596 JvmtiFunctions::RunAgentThread,
1597 JvmtiFunctions::GetTopThreadGroups,
1598 JvmtiFunctions::GetThreadGroupInfo,
1599 JvmtiFunctions::GetThreadGroupChildren,
1600 JvmtiFunctions::GetFrameCount,
1601 JvmtiFunctions::GetThreadState,
1602 JvmtiFunctions::GetCurrentThread,
1603 JvmtiFunctions::GetFrameLocation,
1604 JvmtiFunctions::NotifyFramePop, // 20
1605 JvmtiFunctions::GetLocalObject,
1606 JvmtiFunctions::GetLocalInt,
1607 JvmtiFunctions::GetLocalLong,
1608 JvmtiFunctions::GetLocalFloat,
1609 JvmtiFunctions::GetLocalDouble,
1610 JvmtiFunctions::SetLocalObject,
1611 JvmtiFunctions::SetLocalInt,
1612 JvmtiFunctions::SetLocalLong,
1613 JvmtiFunctions::SetLocalFloat,
1614 JvmtiFunctions::SetLocalDouble, // 30
1615 JvmtiFunctions::CreateRawMonitor,
1616 JvmtiFunctions::DestroyRawMonitor,
1617 JvmtiFunctions::RawMonitorEnter,
1618 JvmtiFunctions::RawMonitorExit,
1619 JvmtiFunctions::RawMonitorWait,
1620 JvmtiFunctions::RawMonitorNotify,
1621 JvmtiFunctions::RawMonitorNotifyAll,
1622 JvmtiFunctions::SetBreakpoint,
1623 JvmtiFunctions::ClearBreakpoint,
1624 nullptr, // reserved40
1625 JvmtiFunctions::SetFieldAccessWatch,
1626 JvmtiFunctions::ClearFieldAccessWatch,
1627 JvmtiFunctions::SetFieldModificationWatch,
1628 JvmtiFunctions::ClearFieldModificationWatch,
1629 JvmtiFunctions::IsModifiableClass,
1630 JvmtiFunctions::Allocate,
1631 JvmtiFunctions::Deallocate,
1632 JvmtiFunctions::GetClassSignature,
1633 JvmtiFunctions::GetClassStatus,
1634 JvmtiFunctions::GetSourceFileName, // 50
1635 JvmtiFunctions::GetClassModifiers,
1636 JvmtiFunctions::GetClassMethods,
1637 JvmtiFunctions::GetClassFields,
1638 JvmtiFunctions::GetImplementedInterfaces,
1639 JvmtiFunctions::IsInterface,
1640 JvmtiFunctions::IsArrayClass,
1641 JvmtiFunctions::GetClassLoader,
1642 JvmtiFunctions::GetObjectHashCode,
1643 JvmtiFunctions::GetObjectMonitorUsage,
1644 JvmtiFunctions::GetFieldName, // 60
1645 JvmtiFunctions::GetFieldDeclaringClass,
1646 JvmtiFunctions::GetFieldModifiers,
1647 JvmtiFunctions::IsFieldSynthetic,
1648 JvmtiFunctions::GetMethodName,
1649 JvmtiFunctions::GetMethodDeclaringClass,
1650 JvmtiFunctions::GetMethodModifiers,
1651 nullptr, // reserved67
1652 JvmtiFunctions::GetMaxLocals,
1653 JvmtiFunctions::GetArgumentsSize,
1654 JvmtiFunctions::GetLineNumberTable, // 70
1655 JvmtiFunctions::GetMethodLocation,
1656 JvmtiFunctions::GetLocalVariableTable,
1657 JvmtiFunctions::SetNativeMethodPrefix,
1658 JvmtiFunctions::SetNativeMethodPrefixes,
1659 JvmtiFunctions::GetBytecodes,
1660 JvmtiFunctions::IsMethodNative,
1661 JvmtiFunctions::IsMethodSynthetic,
1662 JvmtiFunctions::GetLoadedClasses,
1663 JvmtiFunctions::GetClassLoaderClasses,
1664 JvmtiFunctions::PopFrame, // 80
1665 JvmtiFunctions::ForceEarlyReturnObject,
1666 JvmtiFunctions::ForceEarlyReturnInt,
1667 JvmtiFunctions::ForceEarlyReturnLong,
1668 JvmtiFunctions::ForceEarlyReturnFloat,
1669 JvmtiFunctions::ForceEarlyReturnDouble,
1670 JvmtiFunctions::ForceEarlyReturnVoid,
1671 JvmtiFunctions::RedefineClasses,
1672 JvmtiFunctions::GetVersionNumber,
1673 JvmtiFunctions::GetCapabilities,
1674 JvmtiFunctions::GetSourceDebugExtension, // 90
1675 JvmtiFunctions::IsMethodObsolete,
1676 JvmtiFunctions::SuspendThreadList,
1677 JvmtiFunctions::ResumeThreadList,
1678 nullptr, // reserved94
1679 nullptr, // reserved95
1680 nullptr, // reserved96
1681 nullptr, // reserved97
1682 nullptr, // reserved98
1683 nullptr, // reserved99
1684 JvmtiFunctions::GetAllStackTraces, // 100
1685 JvmtiFunctions::GetThreadListStackTraces,
1686 JvmtiFunctions::GetThreadLocalStorage,
1687 JvmtiFunctions::SetThreadLocalStorage,
1688 JvmtiFunctions::GetStackTrace,
1689 nullptr, // reserved105
1690 JvmtiFunctions::GetTag,
1691 JvmtiFunctions::SetTag,
1692 JvmtiFunctions::ForceGarbageCollection,
1693 JvmtiFunctions::IterateOverObjectsReachableFromObject,
1694 JvmtiFunctions::IterateOverReachableObjects, // 110
1695 JvmtiFunctions::IterateOverHeap,
1696 JvmtiFunctions::IterateOverInstancesOfClass,
1697 nullptr, // reserved113
1698 JvmtiFunctions::GetObjectsWithTags,
1699 JvmtiFunctions::FollowReferences,
1700 JvmtiFunctions::IterateThroughHeap,
1701 nullptr, // reserved117
1702 nullptr, // reserved118
1703 nullptr, // reserved119
1704 JvmtiFunctions::SetJNIFunctionTable, // 120
1705 JvmtiFunctions::GetJNIFunctionTable,
1706 JvmtiFunctions::SetEventCallbacks,
1707 JvmtiFunctions::GenerateEvents,
1708 JvmtiFunctions::GetExtensionFunctions,
1709 JvmtiFunctions::GetExtensionEvents,
1710 JvmtiFunctions::SetExtensionEventCallback,
1711 JvmtiFunctions::DisposeEnvironment,
1712 JvmtiFunctions::GetErrorName,
1713 JvmtiFunctions::GetJLocationFormat,
1714 JvmtiFunctions::GetSystemProperties, // 130
1715 JvmtiFunctions::GetSystemProperty,
1716 JvmtiFunctions::SetSystemProperty,
1717 JvmtiFunctions::GetPhase,
1718 JvmtiFunctions::GetCurrentThreadCpuTimerInfo,
1719 JvmtiFunctions::GetCurrentThreadCpuTime,
1720 JvmtiFunctions::GetThreadCpuTimerInfo,
1721 JvmtiFunctions::GetThreadCpuTime,
1722 JvmtiFunctions::GetTimerInfo,
1723 JvmtiFunctions::GetTime,
1724 JvmtiFunctions::GetPotentialCapabilities, // 140
1725 nullptr, // reserved141
1726 JvmtiFunctions::AddCapabilities,
1727 JvmtiFunctions::RelinquishCapabilities,
1728 JvmtiFunctions::GetAvailableProcessors,
1729 JvmtiFunctions::GetClassVersionNumbers,
1730 JvmtiFunctions::GetConstantPool,
1731 JvmtiFunctions::GetEnvironmentLocalStorage,
1732 JvmtiFunctions::SetEnvironmentLocalStorage,
1733 JvmtiFunctions::AddToBootstrapClassLoaderSearch,
1734 JvmtiFunctions::SetVerboseFlag, // 150
1735 JvmtiFunctions::AddToSystemClassLoaderSearch,
1736 JvmtiFunctions::RetransformClasses,
1737 JvmtiFunctions::GetOwnedMonitorStackDepthInfo,
1738 JvmtiFunctions::GetObjectSize,
1739 JvmtiFunctions::GetLocalInstance,
1740};
1741
1742}; // namespace openjdkjvmti