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

Reply via email to