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 #include "jni.h" 21 #include "jvmti.h" 22 #include "scoped_local_ref.h" 23 24 // Test infrastructure 25 #include "jni_helper.h" 26 #include "test_env.h" 27 28 namespace art { 29 namespace Test918Fields { 30 31 extern "C" JNIEXPORT jobjectArray JNICALL Java_art_Test918_getFieldName( 32 JNIEnv* env, jclass klass, jobject field) { 33 jfieldID id = env->FromReflectedField(field); 34 35 char* name; 36 char* sig; 37 char* gen; 38 // Note: technically putting the caller class here is wrong, but we don't need it, anyways. 39 jvmtiError result = jvmti_env->GetFieldName(klass, id, &name, &sig, &gen); 40 if (result != JVMTI_ERROR_NONE) { 41 char* err; 42 jvmti_env->GetErrorName(result, &err); 43 printf("Failure running GetFieldName: %s\n", err); 44 jvmti_env->Deallocate(reinterpret_cast<unsigned char*>(err)); 45 return nullptr; 46 } 47 48 auto callback = [&](jint i) { 49 if (i == 0) { 50 return name == nullptr ? nullptr : env->NewStringUTF(name); 51 } else if (i == 1) { 52 return sig == nullptr ? nullptr : env->NewStringUTF(sig); 53 } else { 54 return gen == nullptr ? nullptr : env->NewStringUTF(gen); 55 } 56 }; 57 jobjectArray ret = CreateObjectArray(env, 3, "java/lang/String", callback); 58 59 // Need to deallocate the strings. 60 if (name != nullptr) { 61 jvmti_env->Deallocate(reinterpret_cast<unsigned char*>(name)); 62 } 63 if (sig != nullptr) { 64 jvmti_env->Deallocate(reinterpret_cast<unsigned char*>(sig)); 65 } 66 if (gen != nullptr) { 67 jvmti_env->Deallocate(reinterpret_cast<unsigned char*>(gen)); 68 } 69 70 // Also run GetMethodName with all parameter pointers null to check for segfaults. 71 jvmtiError result2 = jvmti_env->GetFieldName(klass, id, nullptr, nullptr, nullptr); 72 if (result2 != JVMTI_ERROR_NONE) { 73 char* err; 74 jvmti_env->GetErrorName(result2, &err); 75 printf("Failure running GetFieldName(null, null, null): %s\n", err); 76 jvmti_env->Deallocate(reinterpret_cast<unsigned char*>(err)); 77 return nullptr; 78 } 79 80 return ret; 81 } 82 83 extern "C" JNIEXPORT jclass JNICALL Java_art_Test918_getFieldDeclaringClass( 84 JNIEnv* env, jclass klass, jobject field) { 85 jfieldID id = env->FromReflectedField(field); 86 87 jclass declaring_class; 88 jvmtiError result = jvmti_env->GetFieldDeclaringClass(klass, id, &declaring_class); 89 if (result != JVMTI_ERROR_NONE) { 90 char* err; 91 jvmti_env->GetErrorName(result, &err); 92 printf("Failure running GetFieldDeclaringClass: %s\n", err); 93 jvmti_env->Deallocate(reinterpret_cast<unsigned char*>(err)); 94 return nullptr; 95 } 96 97 return declaring_class; 98 } 99 100 extern "C" JNIEXPORT jint JNICALL Java_art_Test918_getFieldModifiers( 101 JNIEnv* env, jclass klass, jobject field) { 102 jfieldID id = env->FromReflectedField(field); 103 104 jint modifiers; 105 jvmtiError result = jvmti_env->GetFieldModifiers(klass, id, &modifiers); 106 if (result != JVMTI_ERROR_NONE) { 107 char* err; 108 jvmti_env->GetErrorName(result, &err); 109 printf("Failure running GetFieldModifiers: %s\n", err); 110 jvmti_env->Deallocate(reinterpret_cast<unsigned char*>(err)); 111 return 0; 112 } 113 114 return modifiers; 115 } 116 117 extern "C" JNIEXPORT jboolean JNICALL Java_art_Test918_isFieldSynthetic( 118 JNIEnv* env, jclass klass, jobject field) { 119 jfieldID id = env->FromReflectedField(field); 120 121 jboolean synth; 122 jvmtiError result = jvmti_env->IsFieldSynthetic(klass, id, &synth); 123 if (result != JVMTI_ERROR_NONE) { 124 char* err; 125 jvmti_env->GetErrorName(result, &err); 126 printf("Failure running IsFieldSynthetic: %s\n", err); 127 jvmti_env->Deallocate(reinterpret_cast<unsigned char*>(err)); 128 return 0; 129 } 130 131 return synth; 132 } 133 134 } // namespace Test918Fields 135 } // namespace art 136