1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2013 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker *
4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker *
8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker *
10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker */
16*795d594fSAndroid Build Coastguard Worker
17*795d594fSAndroid Build Coastguard Worker #include <stdio.h>
18*795d594fSAndroid Build Coastguard Worker
19*795d594fSAndroid Build Coastguard Worker #include "android-base/macros.h"
20*795d594fSAndroid Build Coastguard Worker
21*795d594fSAndroid Build Coastguard Worker #include "jni.h"
22*795d594fSAndroid Build Coastguard Worker #include "jvmti.h"
23*795d594fSAndroid Build Coastguard Worker #include "scoped_local_ref.h"
24*795d594fSAndroid Build Coastguard Worker
25*795d594fSAndroid Build Coastguard Worker // Test infrastructure
26*795d594fSAndroid Build Coastguard Worker #include "jni_helper.h"
27*795d594fSAndroid Build Coastguard Worker #include "jvmti_helper.h"
28*795d594fSAndroid Build Coastguard Worker #include "test_env.h"
29*795d594fSAndroid Build Coastguard Worker
30*795d594fSAndroid Build Coastguard Worker namespace art {
31*795d594fSAndroid Build Coastguard Worker namespace Test910Methods {
32*795d594fSAndroid Build Coastguard Worker
Java_art_Test910_getMethodName(JNIEnv * env,jclass klass,jobject method)33*795d594fSAndroid Build Coastguard Worker extern "C" JNIEXPORT jobjectArray JNICALL Java_art_Test910_getMethodName(
34*795d594fSAndroid Build Coastguard Worker JNIEnv* env, [[maybe_unused]] jclass klass, jobject method) {
35*795d594fSAndroid Build Coastguard Worker jmethodID id = env->FromReflectedMethod(method);
36*795d594fSAndroid Build Coastguard Worker
37*795d594fSAndroid Build Coastguard Worker char* name;
38*795d594fSAndroid Build Coastguard Worker char* sig;
39*795d594fSAndroid Build Coastguard Worker char* gen;
40*795d594fSAndroid Build Coastguard Worker jvmtiError result = jvmti_env->GetMethodName(id, &name, &sig, &gen);
41*795d594fSAndroid Build Coastguard Worker if (JvmtiErrorToException(env, jvmti_env, result)) {
42*795d594fSAndroid Build Coastguard Worker return nullptr;
43*795d594fSAndroid Build Coastguard Worker }
44*795d594fSAndroid Build Coastguard Worker
45*795d594fSAndroid Build Coastguard Worker auto callback = [&](jint i) {
46*795d594fSAndroid Build Coastguard Worker if (i == 0) {
47*795d594fSAndroid Build Coastguard Worker return name == nullptr ? nullptr : env->NewStringUTF(name);
48*795d594fSAndroid Build Coastguard Worker } else if (i == 1) {
49*795d594fSAndroid Build Coastguard Worker return sig == nullptr ? nullptr : env->NewStringUTF(sig);
50*795d594fSAndroid Build Coastguard Worker } else {
51*795d594fSAndroid Build Coastguard Worker return gen == nullptr ? nullptr : env->NewStringUTF(gen);
52*795d594fSAndroid Build Coastguard Worker }
53*795d594fSAndroid Build Coastguard Worker };
54*795d594fSAndroid Build Coastguard Worker jobjectArray ret = CreateObjectArray(env, 3, "java/lang/String", callback);
55*795d594fSAndroid Build Coastguard Worker
56*795d594fSAndroid Build Coastguard Worker // Need to deallocate the strings.
57*795d594fSAndroid Build Coastguard Worker if (name != nullptr) {
58*795d594fSAndroid Build Coastguard Worker jvmti_env->Deallocate(reinterpret_cast<unsigned char*>(name));
59*795d594fSAndroid Build Coastguard Worker }
60*795d594fSAndroid Build Coastguard Worker if (sig != nullptr) {
61*795d594fSAndroid Build Coastguard Worker jvmti_env->Deallocate(reinterpret_cast<unsigned char*>(sig));
62*795d594fSAndroid Build Coastguard Worker }
63*795d594fSAndroid Build Coastguard Worker if (gen != nullptr) {
64*795d594fSAndroid Build Coastguard Worker jvmti_env->Deallocate(reinterpret_cast<unsigned char*>(gen));
65*795d594fSAndroid Build Coastguard Worker }
66*795d594fSAndroid Build Coastguard Worker
67*795d594fSAndroid Build Coastguard Worker // Also run GetMethodName with all parameter pointers null to check for segfaults.
68*795d594fSAndroid Build Coastguard Worker jvmtiError result2 = jvmti_env->GetMethodName(id, nullptr, nullptr, nullptr);
69*795d594fSAndroid Build Coastguard Worker if (JvmtiErrorToException(env, jvmti_env, result2)) {
70*795d594fSAndroid Build Coastguard Worker return nullptr;
71*795d594fSAndroid Build Coastguard Worker }
72*795d594fSAndroid Build Coastguard Worker
73*795d594fSAndroid Build Coastguard Worker return ret;
74*795d594fSAndroid Build Coastguard Worker }
75*795d594fSAndroid Build Coastguard Worker
Java_art_Test910_getMethodDeclaringClass(JNIEnv * env,jclass klass,jobject method)76*795d594fSAndroid Build Coastguard Worker extern "C" JNIEXPORT jclass JNICALL Java_art_Test910_getMethodDeclaringClass(
77*795d594fSAndroid Build Coastguard Worker JNIEnv* env, [[maybe_unused]] jclass klass, jobject method) {
78*795d594fSAndroid Build Coastguard Worker jmethodID id = env->FromReflectedMethod(method);
79*795d594fSAndroid Build Coastguard Worker
80*795d594fSAndroid Build Coastguard Worker jclass declaring_class;
81*795d594fSAndroid Build Coastguard Worker jvmtiError result = jvmti_env->GetMethodDeclaringClass(id, &declaring_class);
82*795d594fSAndroid Build Coastguard Worker if (JvmtiErrorToException(env, jvmti_env, result)) {
83*795d594fSAndroid Build Coastguard Worker return nullptr;
84*795d594fSAndroid Build Coastguard Worker }
85*795d594fSAndroid Build Coastguard Worker
86*795d594fSAndroid Build Coastguard Worker return declaring_class;
87*795d594fSAndroid Build Coastguard Worker }
88*795d594fSAndroid Build Coastguard Worker
Java_art_Test910_getMethodModifiers(JNIEnv * env,jclass klass,jobject method)89*795d594fSAndroid Build Coastguard Worker extern "C" JNIEXPORT jint JNICALL Java_art_Test910_getMethodModifiers(
90*795d594fSAndroid Build Coastguard Worker JNIEnv* env, [[maybe_unused]] jclass klass, jobject method) {
91*795d594fSAndroid Build Coastguard Worker jmethodID id = env->FromReflectedMethod(method);
92*795d594fSAndroid Build Coastguard Worker
93*795d594fSAndroid Build Coastguard Worker jint modifiers;
94*795d594fSAndroid Build Coastguard Worker jvmtiError result = jvmti_env->GetMethodModifiers(id, &modifiers);
95*795d594fSAndroid Build Coastguard Worker if (JvmtiErrorToException(env, jvmti_env, result)) {
96*795d594fSAndroid Build Coastguard Worker return 0;
97*795d594fSAndroid Build Coastguard Worker }
98*795d594fSAndroid Build Coastguard Worker
99*795d594fSAndroid Build Coastguard Worker return modifiers;
100*795d594fSAndroid Build Coastguard Worker }
101*795d594fSAndroid Build Coastguard Worker
Java_art_Test910_getMaxLocals(JNIEnv * env,jclass klass,jobject method)102*795d594fSAndroid Build Coastguard Worker extern "C" JNIEXPORT jint JNICALL Java_art_Test910_getMaxLocals(
103*795d594fSAndroid Build Coastguard Worker JNIEnv* env, [[maybe_unused]] jclass klass, jobject method) {
104*795d594fSAndroid Build Coastguard Worker jmethodID id = env->FromReflectedMethod(method);
105*795d594fSAndroid Build Coastguard Worker
106*795d594fSAndroid Build Coastguard Worker jint max_locals;
107*795d594fSAndroid Build Coastguard Worker jvmtiError result = jvmti_env->GetMaxLocals(id, &max_locals);
108*795d594fSAndroid Build Coastguard Worker if (JvmtiErrorToException(env, jvmti_env, result)) {
109*795d594fSAndroid Build Coastguard Worker return -1;
110*795d594fSAndroid Build Coastguard Worker }
111*795d594fSAndroid Build Coastguard Worker
112*795d594fSAndroid Build Coastguard Worker return max_locals;
113*795d594fSAndroid Build Coastguard Worker }
114*795d594fSAndroid Build Coastguard Worker
Java_art_Test910_getArgumentsSize(JNIEnv * env,jclass klass,jobject method)115*795d594fSAndroid Build Coastguard Worker extern "C" JNIEXPORT jint JNICALL Java_art_Test910_getArgumentsSize(
116*795d594fSAndroid Build Coastguard Worker JNIEnv* env, [[maybe_unused]] jclass klass, jobject method) {
117*795d594fSAndroid Build Coastguard Worker jmethodID id = env->FromReflectedMethod(method);
118*795d594fSAndroid Build Coastguard Worker
119*795d594fSAndroid Build Coastguard Worker jint arguments;
120*795d594fSAndroid Build Coastguard Worker jvmtiError result = jvmti_env->GetArgumentsSize(id, &arguments);
121*795d594fSAndroid Build Coastguard Worker if (JvmtiErrorToException(env, jvmti_env, result)) {
122*795d594fSAndroid Build Coastguard Worker return -1;
123*795d594fSAndroid Build Coastguard Worker }
124*795d594fSAndroid Build Coastguard Worker
125*795d594fSAndroid Build Coastguard Worker return arguments;
126*795d594fSAndroid Build Coastguard Worker }
127*795d594fSAndroid Build Coastguard Worker
Java_art_Test910_getMethodLocationStart(JNIEnv * env,jclass klass,jobject method)128*795d594fSAndroid Build Coastguard Worker extern "C" JNIEXPORT jlong JNICALL Java_art_Test910_getMethodLocationStart(
129*795d594fSAndroid Build Coastguard Worker JNIEnv* env, [[maybe_unused]] jclass klass, jobject method) {
130*795d594fSAndroid Build Coastguard Worker jmethodID id = env->FromReflectedMethod(method);
131*795d594fSAndroid Build Coastguard Worker
132*795d594fSAndroid Build Coastguard Worker jlong start;
133*795d594fSAndroid Build Coastguard Worker jlong end;
134*795d594fSAndroid Build Coastguard Worker jvmtiError result = jvmti_env->GetMethodLocation(id, &start, &end);
135*795d594fSAndroid Build Coastguard Worker if (JvmtiErrorToException(env, jvmti_env, result)) {
136*795d594fSAndroid Build Coastguard Worker return -1;
137*795d594fSAndroid Build Coastguard Worker }
138*795d594fSAndroid Build Coastguard Worker
139*795d594fSAndroid Build Coastguard Worker return start;
140*795d594fSAndroid Build Coastguard Worker }
141*795d594fSAndroid Build Coastguard Worker
Java_art_Test910_getMethodLocationEnd(JNIEnv * env,jclass klass,jobject method)142*795d594fSAndroid Build Coastguard Worker extern "C" JNIEXPORT jlong JNICALL Java_art_Test910_getMethodLocationEnd(
143*795d594fSAndroid Build Coastguard Worker JNIEnv* env, [[maybe_unused]] jclass klass, jobject method) {
144*795d594fSAndroid Build Coastguard Worker jmethodID id = env->FromReflectedMethod(method);
145*795d594fSAndroid Build Coastguard Worker
146*795d594fSAndroid Build Coastguard Worker jlong start;
147*795d594fSAndroid Build Coastguard Worker jlong end;
148*795d594fSAndroid Build Coastguard Worker jvmtiError result = jvmti_env->GetMethodLocation(id, &start, &end);
149*795d594fSAndroid Build Coastguard Worker if (JvmtiErrorToException(env, jvmti_env, result)) {
150*795d594fSAndroid Build Coastguard Worker return -1;
151*795d594fSAndroid Build Coastguard Worker }
152*795d594fSAndroid Build Coastguard Worker
153*795d594fSAndroid Build Coastguard Worker return end;
154*795d594fSAndroid Build Coastguard Worker }
155*795d594fSAndroid Build Coastguard Worker
Java_art_Test910_isMethodNative(JNIEnv * env,jclass klass,jobject method)156*795d594fSAndroid Build Coastguard Worker extern "C" JNIEXPORT jboolean JNICALL Java_art_Test910_isMethodNative(
157*795d594fSAndroid Build Coastguard Worker JNIEnv* env, [[maybe_unused]] jclass klass, jobject method) {
158*795d594fSAndroid Build Coastguard Worker jmethodID id = env->FromReflectedMethod(method);
159*795d594fSAndroid Build Coastguard Worker
160*795d594fSAndroid Build Coastguard Worker jboolean is_native;
161*795d594fSAndroid Build Coastguard Worker jvmtiError result = jvmti_env->IsMethodNative(id, &is_native);
162*795d594fSAndroid Build Coastguard Worker if (JvmtiErrorToException(env, jvmti_env, result)) {
163*795d594fSAndroid Build Coastguard Worker return JNI_FALSE;
164*795d594fSAndroid Build Coastguard Worker }
165*795d594fSAndroid Build Coastguard Worker
166*795d594fSAndroid Build Coastguard Worker return is_native;
167*795d594fSAndroid Build Coastguard Worker }
168*795d594fSAndroid Build Coastguard Worker
Java_art_Test910_isMethodObsolete(JNIEnv * env,jclass klass,jobject method)169*795d594fSAndroid Build Coastguard Worker extern "C" JNIEXPORT jboolean JNICALL Java_art_Test910_isMethodObsolete(
170*795d594fSAndroid Build Coastguard Worker JNIEnv* env, [[maybe_unused]] jclass klass, jobject method) {
171*795d594fSAndroid Build Coastguard Worker jmethodID id = env->FromReflectedMethod(method);
172*795d594fSAndroid Build Coastguard Worker
173*795d594fSAndroid Build Coastguard Worker jboolean is_obsolete;
174*795d594fSAndroid Build Coastguard Worker jvmtiError result = jvmti_env->IsMethodObsolete(id, &is_obsolete);
175*795d594fSAndroid Build Coastguard Worker if (JvmtiErrorToException(env, jvmti_env, result)) {
176*795d594fSAndroid Build Coastguard Worker return JNI_FALSE;
177*795d594fSAndroid Build Coastguard Worker }
178*795d594fSAndroid Build Coastguard Worker
179*795d594fSAndroid Build Coastguard Worker return is_obsolete;
180*795d594fSAndroid Build Coastguard Worker }
181*795d594fSAndroid Build Coastguard Worker
Java_art_Test910_isMethodSynthetic(JNIEnv * env,jclass klass,jobject method)182*795d594fSAndroid Build Coastguard Worker extern "C" JNIEXPORT jboolean JNICALL Java_art_Test910_isMethodSynthetic(
183*795d594fSAndroid Build Coastguard Worker JNIEnv* env, [[maybe_unused]] jclass klass, jobject method) {
184*795d594fSAndroid Build Coastguard Worker jmethodID id = env->FromReflectedMethod(method);
185*795d594fSAndroid Build Coastguard Worker
186*795d594fSAndroid Build Coastguard Worker jboolean is_synthetic;
187*795d594fSAndroid Build Coastguard Worker jvmtiError result = jvmti_env->IsMethodSynthetic(id, &is_synthetic);
188*795d594fSAndroid Build Coastguard Worker if (JvmtiErrorToException(env, jvmti_env, result)) {
189*795d594fSAndroid Build Coastguard Worker return JNI_FALSE;
190*795d594fSAndroid Build Coastguard Worker }
191*795d594fSAndroid Build Coastguard Worker
192*795d594fSAndroid Build Coastguard Worker return is_synthetic;
193*795d594fSAndroid Build Coastguard Worker }
194*795d594fSAndroid Build Coastguard Worker
195*795d594fSAndroid Build Coastguard Worker } // namespace Test910Methods
196*795d594fSAndroid Build Coastguard Worker } // namespace art
197