Cc: Arthur HUILLET <arthur.huil...@free.fr>
Signed-off-by: Pekka Enberg <penb...@cs.helsinki.fi>
---
 vm/classloader.c |    9 ++++++---
 vm/preload.c     |   45 +++++++++++++++++++++++++++++++--------------
 2 files changed, 37 insertions(+), 17 deletions(-)

diff --git a/vm/classloader.c b/vm/classloader.c
index c31ae24..66a9b93 100644
--- a/vm/classloader.c
+++ b/vm/classloader.c
@@ -466,10 +466,8 @@ load_array_class(struct vm_object *loader, const char 
*class_name)
        assert(class_name[0] == '[');
 
        array_class = malloc(sizeof *array_class);
-       if (!array_class) {
-               NOT_IMPLEMENTED;
+       if (!array_class)
                return NULL;
-       }
 
        elem_class_name =
                vm_class_get_array_element_class_name(class_name);
@@ -483,6 +481,11 @@ load_array_class(struct vm_object *loader, const char 
*class_name)
        else
                elem_class = classloader_load(loader, elem_class_name);
 
+       if (!elem_class) {
+               free(array_class);
+               return NULL;
+       }
+
        array_class->classloader = elem_class->classloader;
 
        if (vm_class_link_array_class(array_class, elem_class, class_name)) {
diff --git a/vm/preload.c b/vm/preload.c
index 47b6e40..c32f17c 100644
--- a/vm/preload.c
+++ b/vm/preload.c
@@ -35,9 +35,14 @@
 
 #include "jit/cu-mapping.h"
 
+enum {
+       PRELOAD_OPTIONAL,
+};
+
 struct preload_entry {
        const char *name;
        struct vm_class **class;
+       int optional;
 };
 
 struct vm_class *vm_java_lang_Object;
@@ -134,13 +139,19 @@ static const struct preload_entry preload_entries[] = {
        { "java/lang/VMThread", &vm_java_lang_VMThread },
        { "java/lang/IllegalMonitorStateException", 
&vm_java_lang_IllegalMonitorStateException },
        { "java/lang/System",   &vm_java_lang_System },
-       { "java/lang/reflect/Field", &vm_java_lang_reflect_Field },
-       { "java/lang/reflect/Constructor", &vm_java_lang_reflect_Constructor },
-       { "java/lang/reflect/Method", &vm_java_lang_reflect_Method },
+       { "java/lang/reflect/Field", &vm_java_lang_reflect_Field, 
PRELOAD_OPTIONAL },
+       { "java/lang/reflect/VMField", &vm_java_lang_reflect_Field, 
PRELOAD_OPTIONAL }, /* Classpath 0.98 */
+       { "java/lang/reflect/Constructor", &vm_java_lang_reflect_Constructor, 
PRELOAD_OPTIONAL },
+       { "java/lang/reflect/VMConstructor", &vm_java_lang_reflect_Constructor, 
PRELOAD_OPTIONAL }, /* Classpath 0.98 */
+       { "java/lang/reflect/Method", &vm_java_lang_reflect_Method, 
PRELOAD_OPTIONAL },
+       { "java/lang/reflect/VMMethod", &vm_java_lang_reflect_Method, 
PRELOAD_OPTIONAL }, /* Classpath 0.98 */
        { "[java/lang/Class",           &vm_array_of_java_lang_Class },
-       { "[java/lang/reflect/Constructor", 
&vm_array_of_java_lang_reflect_Constructor },
-       { "[java/lang/reflect/Field", &vm_array_of_java_lang_reflect_Field },
-       { "[java/lang/reflect/Method", &vm_array_of_java_lang_reflect_Method },
+       { "[java/lang/reflect/Constructor", 
&vm_array_of_java_lang_reflect_Constructor, PRELOAD_OPTIONAL },
+       { "[java/lang/reflect/VMConstructor", 
&vm_array_of_java_lang_reflect_Constructor, PRELOAD_OPTIONAL }, /* Classpath 
0.98 */
+       { "[java/lang/reflect/Field", &vm_array_of_java_lang_reflect_Field, 
PRELOAD_OPTIONAL },
+       { "[java/lang/reflect/VMField", &vm_array_of_java_lang_reflect_Field, 
PRELOAD_OPTIONAL }, /* Classpath 0.98 */
+       { "[java/lang/reflect/Method", &vm_array_of_java_lang_reflect_Method, 
PRELOAD_OPTIONAL },
+       { "[java/lang/reflect/VMMethod", &vm_array_of_java_lang_reflect_Method, 
PRELOAD_OPTIONAL }, /* Classpath 0.98 */
        { "java/lang/IllegalArgumentException", 
&vm_java_lang_IllegalArgumentException },
        { "java/lang/InterruptedException", &vm_java_lang_InterruptedException 
},
        { "java/lang/ClassFormatError", &vm_java_lang_ClassFormatError },
@@ -174,6 +185,7 @@ struct field_preload_entry {
        const char *name;
        const char *type;
        struct vm_field **field;
+       int optional;
 };
 
 struct vm_field *vm_java_lang_Class_vmdata;
@@ -218,10 +230,12 @@ static const struct field_preload_entry 
field_preload_entries[] = {
        { &vm_java_lang_VMThread, "vmdata", "Ljava/lang/Object;", 
&vm_java_lang_VMThread_vmdata },
        { &vm_java_lang_reflect_Constructor, "clazz", "Ljava/lang/Class;", 
&vm_java_lang_reflect_Constructor_clazz },
        { &vm_java_lang_reflect_Constructor, "slot", "I", 
&vm_java_lang_reflect_Constructor_slot },
-       { &vm_java_lang_reflect_Field, "declaringClass", "Ljava/lang/Class;", 
&vm_java_lang_reflect_Field_declaringClass },
+       { &vm_java_lang_reflect_Field, "declaringClass", "Ljava/lang/Class;", 
&vm_java_lang_reflect_Field_declaringClass, PRELOAD_OPTIONAL },
+       { &vm_java_lang_reflect_Field, "clazz", "Ljava/lang/Class;", 
&vm_java_lang_reflect_Field_declaringClass, PRELOAD_OPTIONAL  }, /* Classpath 
0.98 */
        { &vm_java_lang_reflect_Field, "slot", "I", 
&vm_java_lang_reflect_Field_slot },
        { &vm_java_lang_reflect_Field, "name", "Ljava/lang/String;", 
&vm_java_lang_reflect_Field_name },
-       { &vm_java_lang_reflect_Method, "declaringClass", "Ljava/lang/Class;", 
&vm_java_lang_reflect_Method_declaringClass },
+       { &vm_java_lang_reflect_Method, "declaringClass", "Ljava/lang/Class;", 
&vm_java_lang_reflect_Method_declaringClass, PRELOAD_OPTIONAL },
+       { &vm_java_lang_reflect_Method, "clazz", "Ljava/lang/Class;", 
&vm_java_lang_reflect_Method_declaringClass, PRELOAD_OPTIONAL }, /* Classpath 
0.98 */
        { &vm_java_lang_reflect_Method, "slot", "I", 
&vm_java_lang_reflect_Method_slot },
        { &vm_java_lang_reflect_Method, "name", "Ljava/lang/String;", 
&vm_java_lang_reflect_Method_name },
 };
@@ -520,6 +534,8 @@ int preload_vm_classes(void)
 
                struct vm_class *class = classloader_load(NULL, pe->name);
                if (!class) {
+                       if (pe->optional == PRELOAD_OPTIONAL)
+                               continue;
                        printf("%s\n", pe->name);
                        NOT_IMPLEMENTED;
                        return 1;
@@ -534,6 +550,8 @@ int preload_vm_classes(void)
 
                struct vm_class *class = classloader_load_primitive(pe->name);
                if (!class) {
+                       if (pe->optional == PRELOAD_OPTIONAL)
+                               continue;
                        warn("preload of %s failed", pe->name);
                        return -EINVAL;
                }
@@ -542,14 +560,13 @@ int preload_vm_classes(void)
        }
 
        for (unsigned int i = 0; i < ARRAY_SIZE(field_preload_entries); ++i) {
-               const struct field_preload_entry *pe
-                       = &field_preload_entries[i];
+               const struct field_preload_entry *pe = 
&field_preload_entries[i];
 
-               struct vm_field *field = vm_class_get_field(*pe->class,
-                       pe->name, pe->type);
+               struct vm_field *field = vm_class_get_field(*pe->class, 
pe->name, pe->type);
                if (!field) {
-                       warn("preload of %s.%s%s failed", (*pe->class)->name,
-                            pe->name, pe->type);
+                       if (pe->optional == PRELOAD_OPTIONAL)
+                               continue;
+                       warn("preload of %s.%s%s failed", (*pe->class)->name, 
pe->name, pe->type);
                        return -EINVAL;
                }
 
-- 
1.6.0.4


------------------------------------------------------------------------------
Return on Information:
Google Enterprise Search pays you back
Get the facts.
http://p.sf.net/sfu/google-dev2dev
_______________________________________________
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to