1/*
2 * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26#include <jni.h>
27
28#include "JPLISAgent.h"
29#include "JPLISAssert.h"
30#include "Utilities.h"
31#include "JavaExceptions.h"
32#include "FileSystemSupport.h" /* For uintptr_t */
33#include "sun_instrument_InstrumentationImpl.h"
34
35/*
36 * Copyright 2003 Wily Technology, Inc.
37 */
38
39/**
40 * This module contains the native method implementations to back the
41 * sun.instrument.InstrumentationImpl class.
42 * The bridge between Java and native code is built by storing a native
43 * pointer to the JPLISAgent data structure in a 64 bit scalar field
44 * in the InstrumentationImpl instance which is passed to each method.
45 */
46
47
48/*
49 * Native methods
50 */
51
52/*
53 * Declare library specific JNI_Onload entry if static build
54 */
55DEF_STATIC_JNI_OnLoad
56
57/*
58 * Class: sun_instrument_InstrumentationImpl
59 * Method: isModifiableClass0
60 * Signature: (Ljava/lang/Class;)Z
61 */
62JNIEXPORT jboolean JNICALL
63Java_sun_instrument_InstrumentationImpl_isModifiableClass0
64 (JNIEnv * jnienv, jobject implThis, jlong agent, jclass clazz) {
65 return isModifiableClass(jnienv, (JPLISAgent*)(intptr_t)agent, clazz);
66}
67
68/*
69 * Class: sun_instrument_InstrumentationImpl
70 * Method: isRetransformClassesSupported0
71 * Signature: ()Z
72 */
73JNIEXPORT jboolean JNICALL
74Java_sun_instrument_InstrumentationImpl_isRetransformClassesSupported0
75 (JNIEnv * jnienv, jobject implThis, jlong agent) {
76 return isRetransformClassesSupported(jnienv, (JPLISAgent*)(intptr_t)agent);
77}
78
79/*
80 * Class: sun_instrument_InstrumentationImpl
81 * Method: setHasTransformers
82 * Signature: (Z)V
83 */
84JNIEXPORT void JNICALL
85Java_sun_instrument_InstrumentationImpl_setHasTransformers
86 (JNIEnv * jnienv, jobject implThis, jlong agent, jboolean has) {
87 setHasTransformers(jnienv, (JPLISAgent*)(intptr_t)agent, has);
88}
89
90/*
91 * Class: sun_instrument_InstrumentationImpl
92 * Method: setHasRetransformableTransformers
93 * Signature: (Z)V
94 */
95JNIEXPORT void JNICALL
96Java_sun_instrument_InstrumentationImpl_setHasRetransformableTransformers
97 (JNIEnv * jnienv, jobject implThis, jlong agent, jboolean has) {
98 setHasRetransformableTransformers(jnienv, (JPLISAgent*)(intptr_t)agent, has);
99}
100
101/*
102 * Class: sun_instrument_InstrumentationImpl
103 * Method: retransformClasses0
104 * Signature: ([Ljava/lang/Class;)V
105 */
106JNIEXPORT void JNICALL
107Java_sun_instrument_InstrumentationImpl_retransformClasses0
108 (JNIEnv * jnienv, jobject implThis, jlong agent, jobjectArray classes) {
109 retransformClasses(jnienv, (JPLISAgent*)(intptr_t)agent, classes);
110}
111
112/*
113 * Class: sun_instrument_InstrumentationImpl
114 * Method: redefineClasses0
115 * Signature: ([Ljava/lang/instrument/ClassDefinition;)V
116 */
117JNIEXPORT void JNICALL Java_sun_instrument_InstrumentationImpl_redefineClasses0
118 (JNIEnv * jnienv, jobject implThis, jlong agent, jobjectArray classDefinitions) {
119 redefineClasses(jnienv, (JPLISAgent*)(intptr_t)agent, classDefinitions);
120}
121
122/*
123 * Class: sun_instrument_InstrumentationImpl
124 * Method: getAllLoadedClasses0
125 * Signature: ()[Ljava/lang/Class;
126 */
127JNIEXPORT jobjectArray JNICALL Java_sun_instrument_InstrumentationImpl_getAllLoadedClasses0
128 (JNIEnv * jnienv, jobject implThis, jlong agent) {
129 return getAllLoadedClasses(jnienv, (JPLISAgent*)(intptr_t)agent);
130}
131
132/*
133 * Class: sun_instrument_InstrumentationImpl
134 * Method: getInitiatedClasses0
135 * Signature: (Ljava/lang/ClassLoader;)[Ljava/lang/Class;
136 */
137JNIEXPORT jobjectArray JNICALL Java_sun_instrument_InstrumentationImpl_getInitiatedClasses0
138 (JNIEnv * jnienv, jobject implThis, jlong agent, jobject classLoader) {
139 return getInitiatedClasses(jnienv, (JPLISAgent*)(intptr_t)agent, classLoader);
140}
141
142/*
143 * Class: sun_instrument_InstrumentationImpl
144 * Method: getObjectSize0
145 * Signature: (Ljava/lang/Object;)J
146 */
147JNIEXPORT jlong JNICALL Java_sun_instrument_InstrumentationImpl_getObjectSize0
148 (JNIEnv * jnienv, jobject implThis, jlong agent, jobject objectToSize) {
149 return getObjectSize(jnienv, (JPLISAgent*)(intptr_t)agent, objectToSize);
150}
151
152
153/*
154 * Class: sun_instrument_InstrumentationImpl
155 * Method: appendToClassLoaderSearch0
156 * Signature: (Ljava/lang/String;Z)V
157 */
158JNIEXPORT void JNICALL Java_sun_instrument_InstrumentationImpl_appendToClassLoaderSearch0
159 (JNIEnv * jnienv, jobject implThis, jlong agent, jstring jarFile, jboolean isBootLoader) {
160 appendToClassLoaderSearch(jnienv, (JPLISAgent*)(intptr_t)agent, jarFile, isBootLoader);
161}
162
163
164/*
165 * Class: sun_instrument_InstrumentationImpl
166 * Method: setNativeMethodPrefixes
167 * Signature: ([Ljava/lang/String;Z)V
168 */
169JNIEXPORT void JNICALL Java_sun_instrument_InstrumentationImpl_setNativeMethodPrefixes
170 (JNIEnv * jnienv, jobject implThis, jlong agent, jobjectArray prefixArray, jboolean isRetransformable) {
171 setNativeMethodPrefixes(jnienv, (JPLISAgent*)(intptr_t)agent, prefixArray, isRetransformable);
172}
173
174
175/*
176 * Class: sun_instrument_InstrumentationImpl
177 * Method: loadAgent0
178 */
179JNIEXPORT void JNICALL Java_sun_instrument_InstrumentationImpl_loadAgent0
180 (JNIEnv* env, jclass clazz, jstring jarfile)
181{
182 extern jint loadAgent(JNIEnv* env, jstring path);
183 if (loadAgent(env, jarfile) != JNI_OK) {
184 if (!(*env)->ExceptionCheck(env)) {
185 createAndThrowInternalError(env);
186 }
187 }
188}
189
190