J. Duke | 319a3b9 | 2007-12-01 00:00:00 +0000 | [diff] [blame^] | 1 | /* |
| 2 | * Copyright 1994-2004 Sun Microsystems, Inc. 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. Sun designates this |
| 8 | * particular file as subject to the "Classpath" exception as provided |
| 9 | * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, |
| 22 | * CA 95054 USA or visit www.sun.com if you need additional information or |
| 23 | * have any questions. |
| 24 | */ |
| 25 | |
| 26 | /*- |
| 27 | * Implementation of class Class |
| 28 | * |
| 29 | * former threadruntime.c, Sun Sep 22 12:09:39 1991 |
| 30 | */ |
| 31 | |
| 32 | #include <string.h> |
| 33 | #include <stdlib.h> |
| 34 | |
| 35 | #include "jni.h" |
| 36 | #include "jni_util.h" |
| 37 | #include "jvm.h" |
| 38 | #include "java_lang_Class.h" |
| 39 | |
| 40 | /* defined in libverify.so/verify.dll (src file common/check_format.c) */ |
| 41 | extern jboolean VerifyClassname(char *utf_name, jboolean arrayAllowed); |
| 42 | extern jboolean VerifyFixClassname(char *utf_name); |
| 43 | |
| 44 | #define OBJ "Ljava/lang/Object;" |
| 45 | #define CLS "Ljava/lang/Class;" |
| 46 | #define CPL "Lsun/reflect/ConstantPool;" |
| 47 | #define STR "Ljava/lang/String;" |
| 48 | #define JCL "Ljava/lang/ClassLoader;" |
| 49 | #define FLD "Ljava/lang/reflect/Field;" |
| 50 | #define MHD "Ljava/lang/reflect/Method;" |
| 51 | #define CTR "Ljava/lang/reflect/Constructor;" |
| 52 | #define PD "Ljava/security/ProtectionDomain;" |
| 53 | #define BA "[B" |
| 54 | |
| 55 | static JNINativeMethod methods[] = { |
| 56 | {"getName0", "()" STR, (void *)&JVM_GetClassName}, |
| 57 | {"getSuperclass", "()" CLS, NULL}, |
| 58 | {"getInterfaces", "()[" CLS, (void *)&JVM_GetClassInterfaces}, |
| 59 | {"getClassLoader0", "()" JCL, (void *)&JVM_GetClassLoader}, |
| 60 | {"isInterface", "()Z", (void *)&JVM_IsInterface}, |
| 61 | {"getSigners", "()[" OBJ, (void *)&JVM_GetClassSigners}, |
| 62 | {"setSigners", "([" OBJ ")V", (void *)&JVM_SetClassSigners}, |
| 63 | {"isArray", "()Z", (void *)&JVM_IsArrayClass}, |
| 64 | {"isPrimitive", "()Z", (void *)&JVM_IsPrimitiveClass}, |
| 65 | {"getComponentType", "()" CLS, (void *)&JVM_GetComponentType}, |
| 66 | {"getModifiers", "()I", (void *)&JVM_GetClassModifiers}, |
| 67 | {"getDeclaredFields0","(Z)[" FLD, (void *)&JVM_GetClassDeclaredFields}, |
| 68 | {"getDeclaredMethods0","(Z)[" MHD, (void *)&JVM_GetClassDeclaredMethods}, |
| 69 | {"getDeclaredConstructors0","(Z)[" CTR, (void *)&JVM_GetClassDeclaredConstructors}, |
| 70 | {"getProtectionDomain0", "()" PD, (void *)&JVM_GetProtectionDomain}, |
| 71 | {"setProtectionDomain0", "(" PD ")V", (void *)&JVM_SetProtectionDomain}, |
| 72 | {"getDeclaredClasses0", "()[" CLS, (void *)&JVM_GetDeclaredClasses}, |
| 73 | {"getDeclaringClass", "()" CLS, (void *)&JVM_GetDeclaringClass}, |
| 74 | {"getGenericSignature", "()" STR, (void *)&JVM_GetClassSignature}, |
| 75 | {"getRawAnnotations", "()" BA, (void *)&JVM_GetClassAnnotations}, |
| 76 | {"getConstantPool", "()" CPL, (void *)&JVM_GetClassConstantPool}, |
| 77 | {"desiredAssertionStatus0","("CLS")Z",(void *)&JVM_DesiredAssertionStatus}, |
| 78 | {"getEnclosingMethod0", "()[" OBJ, (void *)&JVM_GetEnclosingMethodInfo} |
| 79 | }; |
| 80 | |
| 81 | #undef OBJ |
| 82 | #undef CLS |
| 83 | #undef STR |
| 84 | #undef JCL |
| 85 | #undef FLD |
| 86 | #undef MHD |
| 87 | #undef CTR |
| 88 | #undef PD |
| 89 | |
| 90 | JNIEXPORT void JNICALL |
| 91 | Java_java_lang_Class_registerNatives(JNIEnv *env, jclass cls) |
| 92 | { |
| 93 | methods[1].fnPtr = (void *)(*env)->GetSuperclass; |
| 94 | (*env)->RegisterNatives(env, cls, methods, |
| 95 | sizeof(methods)/sizeof(JNINativeMethod)); |
| 96 | } |
| 97 | |
| 98 | JNIEXPORT jclass JNICALL |
| 99 | Java_java_lang_Class_forName0(JNIEnv *env, jclass this, jstring classname, |
| 100 | jboolean initialize, jobject loader) |
| 101 | { |
| 102 | char *clname; |
| 103 | jclass cls = 0; |
| 104 | char buf[128]; |
| 105 | int len; |
| 106 | int unicode_len; |
| 107 | |
| 108 | if (classname == NULL) { |
| 109 | JNU_ThrowNullPointerException(env, 0); |
| 110 | return 0; |
| 111 | } |
| 112 | |
| 113 | len = (*env)->GetStringUTFLength(env, classname); |
| 114 | unicode_len = (*env)->GetStringLength(env, classname); |
| 115 | if (len >= sizeof(buf)) { |
| 116 | clname = malloc(len + 1); |
| 117 | if (clname == NULL) { |
| 118 | JNU_ThrowOutOfMemoryError(env, NULL); |
| 119 | return NULL; |
| 120 | } |
| 121 | } else { |
| 122 | clname = buf; |
| 123 | } |
| 124 | (*env)->GetStringUTFRegion(env, classname, 0, unicode_len, clname); |
| 125 | |
| 126 | if (VerifyFixClassname(clname) == JNI_TRUE) { |
| 127 | /* slashes present in clname, use name b4 translation for exception */ |
| 128 | (*env)->GetStringUTFRegion(env, classname, 0, unicode_len, clname); |
| 129 | JNU_ThrowClassNotFoundException(env, clname); |
| 130 | goto done; |
| 131 | } |
| 132 | |
| 133 | if (!VerifyClassname(clname, JNI_TRUE)) { /* expects slashed name */ |
| 134 | JNU_ThrowClassNotFoundException(env, clname); |
| 135 | goto done; |
| 136 | } |
| 137 | |
| 138 | cls = JVM_FindClassFromClassLoader(env, clname, initialize, |
| 139 | loader, JNI_FALSE); |
| 140 | |
| 141 | done: |
| 142 | if (clname != buf) { |
| 143 | free(clname); |
| 144 | } |
| 145 | return cls; |
| 146 | } |
| 147 | |
| 148 | JNIEXPORT jboolean JNICALL |
| 149 | Java_java_lang_Class_isInstance(JNIEnv *env, jobject cls, jobject obj) |
| 150 | { |
| 151 | if (obj == NULL) { |
| 152 | return JNI_FALSE; |
| 153 | } |
| 154 | return (*env)->IsInstanceOf(env, obj, (jclass)cls); |
| 155 | } |
| 156 | |
| 157 | JNIEXPORT jboolean JNICALL |
| 158 | Java_java_lang_Class_isAssignableFrom(JNIEnv *env, jobject cls, jobject cls2) |
| 159 | { |
| 160 | if (cls2 == NULL) { |
| 161 | JNU_ThrowNullPointerException(env, 0); |
| 162 | return JNI_FALSE; |
| 163 | } |
| 164 | return (*env)->IsAssignableFrom(env, cls2, cls); |
| 165 | } |
| 166 | |
| 167 | JNIEXPORT jclass JNICALL |
| 168 | Java_java_lang_Class_getPrimitiveClass(JNIEnv *env, |
| 169 | jclass cls, |
| 170 | jstring name) |
| 171 | { |
| 172 | const char *utfName; |
| 173 | jclass result; |
| 174 | |
| 175 | if (name == NULL) { |
| 176 | JNU_ThrowNullPointerException(env, 0); |
| 177 | return NULL; |
| 178 | } |
| 179 | |
| 180 | utfName = (*env)->GetStringUTFChars(env, name, 0); |
| 181 | if (utfName == 0) |
| 182 | return NULL; |
| 183 | |
| 184 | result = JVM_FindPrimitiveClass(env, utfName); |
| 185 | |
| 186 | (*env)->ReleaseStringUTFChars(env, name, utfName); |
| 187 | |
| 188 | return result; |
| 189 | } |