If @loader is not NULL then it should be used to load the class. Signed-off-by: Tomek Grabiec <tgrab...@gmail.com> --- include/vm/preload.h | 2 ++ vm/jato.c | 46 ++++++++++++++++++++++++++++++++++------------ vm/preload.c | 9 +++++++++ 3 files changed, 45 insertions(+), 12 deletions(-)
diff --git a/include/vm/preload.h b/include/vm/preload.h index a7c36f0..29a4f45 100644 --- a/include/vm/preload.h +++ b/include/vm/preload.h @@ -44,6 +44,7 @@ extern struct vm_class *vm_java_lang_Integer; extern struct vm_class *vm_java_lang_Long; extern struct vm_class *vm_java_lang_Short; extern struct vm_class *vm_java_lang_IllegalArgumentException; +extern struct vm_class *vm_java_lang_ClassLoader; extern struct vm_class *vm_boolean_class; extern struct vm_class *vm_char_class; extern struct vm_class *vm_float_class; @@ -97,6 +98,7 @@ extern struct vm_method *vm_java_lang_Float_init; extern struct vm_method *vm_java_lang_Integer_init; extern struct vm_method *vm_java_lang_Long_init; extern struct vm_method *vm_java_lang_Short_init; +extern struct vm_method *vm_java_lang_ClassLoader_loadClass; int preload_vm_classes(void); diff --git a/vm/jato.c b/vm/jato.c index 5cbba7a..347843d 100644 --- a/vm/jato.c +++ b/vm/jato.c @@ -452,28 +452,40 @@ static struct vm_object * native_vmclass_forname(struct vm_object *name, jboolean initialize, struct vm_object *loader) { + struct vm_class *class; + char *class_name; + if (!name) { signal_new_exception(vm_java_lang_NullPointerException, NULL); goto throw; } - char *class_name = vm_string_to_cstr(name); - if (!class_name) { - NOT_IMPLEMENTED; - return NULL; - } + if (loader != NULL) { + struct vm_object *obj; - /* TODO: use @loader to load the class. */ - struct vm_class *class = classloader_load(class_name); + obj = vm_call_method_object(vm_java_lang_ClassLoader_loadClass, + loader, name); + if (exception_occurred()) + return NULL; - free(class_name); + if (!obj) + goto throw; - if (!class) { - signal_new_exception(vm_java_lang_ClassNotFoundException, - class_name); - goto throw; + class = vm_class_get_class_from_class_object(obj); + } else { + class_name = vm_string_to_cstr(name); + if (!class_name) { + NOT_IMPLEMENTED; + return NULL; + } + + class = classloader_load(class_name); + free(class_name); } + if (!class) + goto throw; + if (initialize) { vm_class_ensure_init(class); if (exception_occurred()) @@ -483,6 +495,16 @@ native_vmclass_forname(struct vm_object *name, jboolean initialize, return class->object; throw: + class_name = vm_string_to_cstr(name); + + if (!class_name) { + NOT_IMPLEMENTED; + return NULL; + } + + signal_new_exception(vm_java_lang_ClassNotFoundException, + class_name); + free(class_name); return NULL; } diff --git a/vm/preload.c b/vm/preload.c index b039bff..2b7866d 100644 --- a/vm/preload.c +++ b/vm/preload.c @@ -73,6 +73,7 @@ struct vm_class *vm_array_of_java_lang_reflect_Constructor; struct vm_class *vm_array_of_java_lang_reflect_Field; struct vm_class *vm_array_of_java_lang_Class; struct vm_class *vm_java_lang_IllegalArgumentException; +struct vm_class *vm_java_lang_ClassLoader; struct vm_class *vm_java_lang_Byte; struct vm_class *vm_java_lang_Boolean; struct vm_class *vm_java_lang_Character; @@ -135,6 +136,7 @@ static const struct preload_entry preload_entries[] = { { "java/lang/Integer", &vm_java_lang_Integer }, { "java/lang/Double", &vm_java_lang_Double }, { "java/lang/Long", &vm_java_lang_Long }, + { "java/lang/ClassLoader", &vm_java_lang_ClassLoader}, }; static const struct preload_entry primitive_preload_entries[] = { @@ -229,6 +231,7 @@ struct vm_method *vm_java_lang_Float_init; struct vm_method *vm_java_lang_Integer_init; struct vm_method *vm_java_lang_Long_init; struct vm_method *vm_java_lang_Short_init; +struct vm_method *vm_java_lang_ClassLoader_loadClass; static const struct method_preload_entry method_preload_entries[] = { { @@ -369,6 +372,12 @@ static const struct method_preload_entry method_preload_entries[] = { "(I)V", &vm_java_lang_Integer_init, }, + { + &vm_java_lang_ClassLoader, + "loadClass", + "(Ljava/lang/String;)Ljava/lang/Class;", + &vm_java_lang_ClassLoader_loadClass, + }, }; int preload_vm_classes(void) -- 1.6.0.6 ------------------------------------------------------------------------------ Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july _______________________________________________ Jatovm-devel mailing list Jatovm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jatovm-devel