If @loader is not NULL then it should be used to load the class.
Signed-off-by: Tomek Grabiec <[email protected]>
---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel