Those classes must have the same vtable as their
super class - java.lang.Object

Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 include/vm/class.h |    1 +
 vm/class.c         |   19 +++++++++++++++++++
 vm/classloader.c   |   26 ++++++++++----------------
 3 files changed, 30 insertions(+), 16 deletions(-)

diff --git a/include/vm/class.h b/include/vm/class.h
index f355a4f..bbee5c0 100644
--- a/include/vm/class.h
+++ b/include/vm/class.h
@@ -62,6 +62,7 @@ struct vm_class {
 };
 
 int vm_class_link(struct vm_class *vmc, const struct cafebabe_class *class);
+int vm_class_link_bogus_class(struct vm_class *vmc, const char *class_name);
 int vm_class_init(struct vm_class *vmc);
 
 static inline int vm_class_ensure_init(struct vm_class *vmc)
diff --git a/vm/class.c b/vm/class.c
index 1236fb1..aecda8a 100644
--- a/vm/class.c
+++ b/vm/class.c
@@ -251,6 +251,25 @@ int vm_class_link(struct vm_class *vmc, const struct 
cafebabe_class *class)
        return 0;
 }
 
+int vm_class_link_bogus_class(struct vm_class *vmc, const char *class_name)
+{
+       vmc->name = strdup(class_name);
+       if (!vmc->name)
+               return -ENOMEM;
+
+       vmc->class = NULL;
+       vmc->state = VM_CLASS_LINKED;
+       vmc->super = vm_java_lang_Object;
+       vmc->fields = NULL;
+       vmc->methods = NULL;
+       vmc->object_size = 0;
+
+       vmc->vtable_size = vm_java_lang_Object->vtable_size;
+       vmc->vtable.native_ptr = vm_java_lang_Object->vtable.native_ptr;
+
+       return 0;
+}
+
 int vm_class_init(struct vm_class *vmc)
 {
        assert(vmc->state == VM_CLASS_LINKED);
diff --git a/vm/classloader.c b/vm/classloader.c
index b29d4fa..01376a5 100644
--- a/vm/classloader.c
+++ b/vm/classloader.c
@@ -293,17 +293,14 @@ struct vm_class *classloader_load_primitive(const char 
*class_name)
                return NULL;
        }
 
-       class->class = NULL;
-       class->state = VM_CLASS_LINKED;
-       class->name = strdup(class_name);
-       class->super = vm_java_lang_Object;
-       class->fields = NULL;
-       class->methods = NULL;
-       class->object_size = 0;
-       class->vtable_size = 0;
        class->primitive_vm_type = str_to_type(class_name);
        class->kind = VM_CLASS_KIND_PRIMITIVE;
 
+       if (vm_class_link_bogus_class(class, class_name)) {
+               NOT_IMPLEMENTED;
+               return NULL;
+       }
+
        return class;
 }
 
@@ -327,16 +324,13 @@ struct vm_class *load_array_class(const char *class_name)
                return NULL;
        }
 
-       array_class->class = NULL;
-       array_class->state = VM_CLASS_LINKED;
-       array_class->name = strdup(class_name);
-       array_class->super = vm_java_lang_Object;
-       array_class->fields = NULL;
-       array_class->methods = NULL;
-       array_class->object_size = 0;
-       array_class->vtable_size = 0;
        array_class->kind = VM_CLASS_KIND_ARRAY;
 
+       if (vm_class_link_bogus_class(array_class, class_name)) {
+               NOT_IMPLEMENTED;
+               return NULL;
+       }
+
        if (str_to_type(class_name + 1) != J_REFERENCE) {
                array_class->array_element_class =
                        classloader_load_primitive(elem_class_name);
-- 
1.6.0.6


------------------------------------------------------------------------------
_______________________________________________
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to