xref: /aosp_15_r20/art/test/910-methods/methods.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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