From: twisti Date: Fri, 5 Nov 2004 14:00:22 +0000 (+0000) Subject: - made defineClass to work X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=c75218b24cfedaecce953e3650f1a5c8551442b1;p=cacao.git - made defineClass to work - handle exceptions in getPrimitiveClass --- diff --git a/nat/VMClassLoader.c b/nat/VMClassLoader.c index 6281c0d32..5a37a2ef3 100644 --- a/nat/VMClassLoader.c +++ b/nat/VMClassLoader.c @@ -28,7 +28,7 @@ Changes: Joseph Wenninger - $Id: VMClassLoader.c 1344 2004-07-21 17:12:53Z twisti $ + $Id: VMClassLoader.c 1447 2004-11-05 14:00:22Z twisti $ */ @@ -57,13 +57,23 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_defineClass(JNIE log_text("Java_java_lang_VMClassLoader_defineClass called"); + if (off < 0 || len < 0 || off + len > buf->header.size) { + *exceptionptr = + new_exception(string_java_lang_IndexOutOfBoundsException); + return NULL; + } + /* call JNI-function to load the class */ c = (*env)->DefineClass(env, - javastring_tochar((java_objectheader*) name), + javastring_tochar((java_objectheader *) name), (jobject) this, - (const jbyte *) &buf[off], + (const jbyte *) &buf->data[off], len); + /* exception? return! */ + if (!c) + return NULL; + use_class_as_object(c); return (java_lang_Class *) c; @@ -71,7 +81,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_defineClass(JNIE /* - * Class: java/lang/Class + * Class: java/lang/ClassLoader * Method: getPrimitiveClass * Signature: (Ljava/lang/String;)Ljava/lang/Class; */ @@ -80,20 +90,24 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_getPrimitiveClas classinfo *c; utf *u = javastring_toutf(name, false); - if (u) { - /* get primitive class */ - c = class_new(u); - class_load(c); - class_init(c); - use_class_as_object(c); - - return (java_lang_Class *) c; + /* illegal primitive classname specified */ + if (!u) { + *exceptionptr = new_exception(string_java_lang_ClassNotFoundException); + return NULL; } - /* illegal primitive classname specified */ - *exceptionptr = new_exception(string_java_lang_ClassNotFoundException); + /* get primitive class */ + c = class_new(u); - return NULL; + if (!class_load(c)) + return NULL; + + if (!class_init(c)) + return NULL; + + use_class_as_object(c); + + return (java_lang_Class *) c; } diff --git a/src/native/vm/VMClassLoader.c b/src/native/vm/VMClassLoader.c index 6281c0d32..5a37a2ef3 100644 --- a/src/native/vm/VMClassLoader.c +++ b/src/native/vm/VMClassLoader.c @@ -28,7 +28,7 @@ Changes: Joseph Wenninger - $Id: VMClassLoader.c 1344 2004-07-21 17:12:53Z twisti $ + $Id: VMClassLoader.c 1447 2004-11-05 14:00:22Z twisti $ */ @@ -57,13 +57,23 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_defineClass(JNIE log_text("Java_java_lang_VMClassLoader_defineClass called"); + if (off < 0 || len < 0 || off + len > buf->header.size) { + *exceptionptr = + new_exception(string_java_lang_IndexOutOfBoundsException); + return NULL; + } + /* call JNI-function to load the class */ c = (*env)->DefineClass(env, - javastring_tochar((java_objectheader*) name), + javastring_tochar((java_objectheader *) name), (jobject) this, - (const jbyte *) &buf[off], + (const jbyte *) &buf->data[off], len); + /* exception? return! */ + if (!c) + return NULL; + use_class_as_object(c); return (java_lang_Class *) c; @@ -71,7 +81,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_defineClass(JNIE /* - * Class: java/lang/Class + * Class: java/lang/ClassLoader * Method: getPrimitiveClass * Signature: (Ljava/lang/String;)Ljava/lang/Class; */ @@ -80,20 +90,24 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_getPrimitiveClas classinfo *c; utf *u = javastring_toutf(name, false); - if (u) { - /* get primitive class */ - c = class_new(u); - class_load(c); - class_init(c); - use_class_as_object(c); - - return (java_lang_Class *) c; + /* illegal primitive classname specified */ + if (!u) { + *exceptionptr = new_exception(string_java_lang_ClassNotFoundException); + return NULL; } - /* illegal primitive classname specified */ - *exceptionptr = new_exception(string_java_lang_ClassNotFoundException); + /* get primitive class */ + c = class_new(u); - return NULL; + if (!class_load(c)) + return NULL; + + if (!class_init(c)) + return NULL; + + use_class_as_object(c); + + return (java_lang_Class *) c; }