Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: java_lang_VMClassLoader.c 7408 2007-02-26 22:11:38Z twisti $
-
*/
#include "mm/memory.h"
#include "native/jni.h"
+#include "native/llni.h"
#include "native/native.h"
#include "native/include/java_lang_Class.h"
#include "native/include/java_lang_String.h"
#include "native/include/java_lang_ClassLoader.h"
#include "native/include/java_util_Vector.h"
+#include "native/include/java_lang_VMClassLoader.h"
+
#include "native/vm/java_lang_ClassLoader.h"
#include "toolbox/logging.h"
#include "vm/builtin.h"
#include "vm/exceptions.h"
#include "vm/initialize.h"
+#include "vm/primitive.h"
#include "vm/stringlocal.h"
#include "vm/vm.h"
#endif
+/* native methods implemented by this file ************************************/
+
+static JNINativeMethod methods[] = {
+ { "defineClass", "(Ljava/lang/ClassLoader;Ljava/lang/String;[BIILjava/security/ProtectionDomain;)Ljava/lang/Class;", (void *) (ptrint) &Java_java_lang_VMClassLoader_defineClass },
+ { "getPrimitiveClass", "(C)Ljava/lang/Class;", (void *) (ptrint) &Java_java_lang_VMClassLoader_getPrimitiveClass },
+ { "resolveClass", "(Ljava/lang/Class;)V", (void *) (ptrint) &Java_java_lang_VMClassLoader_resolveClass },
+ { "loadClass", "(Ljava/lang/String;Z)Ljava/lang/Class;", (void *) (ptrint) &Java_java_lang_VMClassLoader_loadClass },
+ { "nativeGetResources", "(Ljava/lang/String;)Ljava/util/Vector;", (void *) (ptrint) &Java_java_lang_VMClassLoader_nativeGetResources },
+ { "defaultAssertionStatus", "()Z", (void *) (ptrint) &Java_java_lang_VMClassLoader_defaultAssertionStatus },
+ { "findLoadedClass", "(Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/Class;", (void *) (ptrint) &Java_java_lang_VMClassLoader_findLoadedClass },
+};
+
+
+/* _Jv_java_lang_VMClassLoader_init ********************************************
+
+ Register native functions.
+
+*******************************************************************************/
+
+void _Jv_java_lang_VMClassLoader_init(void)
+{
+ utf *u;
+
+ u = utf_new_char("java/lang/VMClassLoader");
+
+ native_method_register(u, methods, NATIVE_METHODS_COUNT);
+}
+
+
/*
* Class: java/lang/VMClassLoader
* Method: defineClass
* Signature: (Ljava/lang/ClassLoader;Ljava/lang/String;[BIILjava/security/ProtectionDomain;)Ljava/lang/Class;
*/
-JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_defineClass(JNIEnv *env, jclass clazz, java_lang_ClassLoader *cl, java_lang_String *name, java_bytearray *data, s4 offset, s4 len, java_security_ProtectionDomain *pd)
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_defineClass(JNIEnv *env, jclass clazz, java_lang_ClassLoader *cl, java_lang_String *name, java_handle_bytearray_t *data, s4 offset, s4 len, java_security_ProtectionDomain *pd)
{
return _Jv_java_lang_ClassLoader_defineClass(cl, name, data, offset, len, pd);
}
JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_getPrimitiveClass(JNIEnv *env, jclass clazz, s4 type)
{
classinfo *c;
- s4 index;
-
- /* get primitive class */
-
- switch (type) {
- case 'I':
- index = PRIMITIVETYPE_INT;
- break;
- case 'J':
- index = PRIMITIVETYPE_LONG;
- break;
- case 'F':
- index = PRIMITIVETYPE_FLOAT;
- break;
- case 'D':
- index = PRIMITIVETYPE_DOUBLE;
- break;
- case 'B':
- index = PRIMITIVETYPE_BYTE;
- break;
- case 'C':
- index = PRIMITIVETYPE_CHAR;
- break;
- case 'S':
- index = PRIMITIVETYPE_SHORT;
- break;
- case 'Z':
- index = PRIMITIVETYPE_BOOLEAN;
- break;
- case 'V':
- index = PRIMITIVETYPE_VOID;
- break;
- default:
- exceptions_throw_noclassdeffounderror(utf_null);
- c = NULL;
- }
- c = primitivetype_table[index].class_primitive;
+ c = primitive_class_get_by_char(type);
+
+ if (c == NULL) {
+ exceptions_throw_classnotfoundexception(utf_null);
+ return NULL;
+ }
- return (java_lang_Class *) c;
+ return LLNI_classinfo_wrap(c);
}
{
classinfo *ci;
- ci = (classinfo *) c;
+ ci = LLNI_classinfo_unwrap(c);
if (!ci) {
exceptions_throw_nullpointerexception();
* Method: loadClass
* Signature: (Ljava/lang/String;Z)Ljava/lang/Class;
*/
-JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_loadClass(JNIEnv *env, jclass clazz, java_lang_String *name, jboolean resolve)
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_loadClass(JNIEnv *env, jclass clazz, java_lang_String *name, s4 resolve)
{
- classinfo *c;
- utf *u;
- java_objectheader *xptr;
+ classinfo *c;
+ utf *u;
if (name == NULL) {
exceptions_throw_nullpointerexception();
/* create utf string in which '.' is replaced by '/' */
- u = javastring_toutf(name, true);
+ u = javastring_toutf((java_handle_t *) name, true);
/* load class */
c = load_class_bootstrap(u);
if (c == NULL)
- goto exception;
+ return NULL;
/* resolve class -- if requested */
/* if (resolve) */
if (!link_class(c))
- goto exception;
-
- return (java_lang_Class *) c;
-
- exception:
- xptr = exceptions_get_exception();
-
- c = xptr->vftbl->class;
-
- /* if the exception is a NoClassDefFoundError, we replace it with a
- ClassNotFoundException, otherwise return the exception */
+ return NULL;
- if (c == class_java_lang_NoClassDefFoundError) {
- /* clear exceptionptr, because builtin_new checks for
- ExceptionInInitializerError */
- exceptions_clear_exception();
-
- exceptions_throw_classnotfoundexception(u);
- }
-
- return NULL;
+ return LLNI_classinfo_wrap(c);
}
*/
JNIEXPORT java_util_Vector* JNICALL Java_java_lang_VMClassLoader_nativeGetResources(JNIEnv *env, jclass clazz, java_lang_String *name)
{
- jobject o; /* vector being created */
+ java_handle_t *o; /* vector being created */
methodinfo *m; /* "add" method of vector */
- java_lang_String *path; /* path to be added */
+ java_handle_t *path; /* path to be added */
list_classpath_entry *lce; /* classpath entry */
utf *utfname; /* utf to look for */
char *buffer; /* char buffer */
/* get the resource name as utf string */
- utfname = javastring_toutf(name, false);
- if (!utfname)
+ utfname = javastring_toutf((java_handle_t *) name, false);
+
+ if (utfname == NULL)
return NULL;
/* copy it to a char buffer */
- namelen = utf_bytes(utfname);
+ namelen = utf_bytes(utfname);
searchlen = namelen;
- bufsize = namelen + strlen("0");
- buffer = MNEW(char, bufsize);
+ bufsize = namelen + strlen("0");
+ buffer = MNEW(char, bufsize);
utf_copy(buffer, utfname);
namestart = buffer;
o = native_new_and_init(class_java_util_Vector);
- if (!o)
+ if (o == NULL)
goto return_NULL;
/* get Vector.add() method */
NULL,
true);
- if (!m)
+ if (m == NULL)
goto return_NULL;
/* iterate over all classpath entries */
/* if a resource was found, add it to the vector */
- if (path) {
+ if (path != NULL) {
ret = vm_call_method_int(m, o, path);
if (exceptions_get_exception() != NULL)
* Method: findLoadedClass
* Signature: (Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/Class;
*/
-JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_findLoadedClass(JNIEnv *env, jclass clazz, java_lang_ClassLoader *cl, java_lang_String *name)
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_findLoadedClass(JNIEnv *env, jclass clazz, java_lang_ClassLoader *loader, java_lang_String *name)
{
- classinfo *c;
- utf *u;
+ classloader *cl;
+ classinfo *c;
+ utf *u;
+
+ cl = (classloader *) loader;
/* replace `.' by `/', this is required by the classcache */
- u = javastring_toutf(name, true);
+ u = javastring_toutf((java_handle_t *) name, true);
/* lookup for defining classloader */
- c = classcache_lookup_defined((classloader *) cl, u);
+ c = classcache_lookup_defined(cl, u);
/* if not found, lookup for initiating classloader */
if (c == NULL)
- c = classcache_lookup((classloader *) cl, u);
+ c = classcache_lookup(cl, u);
- return (java_lang_Class *) c;
+ return LLNI_classinfo_wrap(c);
}