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