We need to separate the linking process of array classes and primitive
classes (that's what the JVM spec. wants us to use to represent "int")
for object and array cloning.

These linking functions should probably initialize _all_ the fields of
the VM class, we don't do that yet.

Signed-off-by: Vegard Nossum <vegard.nos...@gmail.com>
---
 include/vm/class.h |    6 ++----
 vm/class.c         |   31 ++++++++++++++++++++++++++++++-
 vm/classloader.c   |    7 ++-----
 3 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/include/vm/class.h b/include/vm/class.h
index 7705861..830b6d5 100644
--- a/include/vm/class.h
+++ b/include/vm/class.h
@@ -28,11 +28,8 @@ enum vm_class_kind {
 
 struct vm_class {
        enum vm_class_kind kind;
-
        const struct cafebabe_class *class;
-
        enum vm_class_state state;
-
        char *name;
 
        struct vm_class *super;
@@ -70,7 +67,8 @@ 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_link_primitive_class(struct vm_class *vmc, const char 
*class_name);
+int vm_class_link_array_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 784f5e5..0bf8137 100644
--- a/vm/class.c
+++ b/vm/class.c
@@ -312,24 +312,53 @@ 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)
+int vm_class_link_primitive_class(struct vm_class *vmc, const char *class_name)
 {
        vmc->name = strdup(class_name);
        if (!vmc->name)
                return -ENOMEM;
 
+       vmc->kind = VM_CLASS_KIND_PRIMITIVE;
        vmc->class = NULL;
        vmc->state = VM_CLASS_LINKED;
+
        vmc->super = vm_java_lang_Object;
+       vmc->interfaces = NULL;
        vmc->fields = NULL;
        vmc->methods = NULL;
+
        vmc->object_size = 0;
        vmc->static_size = 0;
+
+       vmc->vtable_size = vm_java_lang_Object->vtable_size;
+       vmc->vtable.native_ptr = vm_java_lang_Object->vtable.native_ptr;
+
        vmc->source_file_name = NULL;
+       return 0;
+}
+
+int vm_class_link_array_class(struct vm_class *vmc, const char *class_name)
+{
+       vmc->name = strdup(class_name);
+       if (!vmc->name)
+               return -ENOMEM;
+
+       vmc->kind = VM_CLASS_KIND_ARRAY;
+       vmc->class = NULL;
+       vmc->state = VM_CLASS_LINKED;
+
+       vmc->super = vm_java_lang_Object;
+       vmc->interfaces = NULL;
+       vmc->fields = NULL;
+       vmc->methods = NULL;
+
+       vmc->object_size = 0;
+       vmc->static_size = 0;
 
        vmc->vtable_size = vm_java_lang_Object->vtable_size;
        vmc->vtable.native_ptr = vm_java_lang_Object->vtable.native_ptr;
 
+       vmc->source_file_name = NULL;
        return 0;
 }
 
diff --git a/vm/classloader.c b/vm/classloader.c
index bbcf9c3..eba8ba6 100644
--- a/vm/classloader.c
+++ b/vm/classloader.c
@@ -333,9 +333,8 @@ struct vm_class *classloader_load_primitive(const char 
*class_name)
        }
 
        class->primitive_vm_type = str_to_type(class_name);
-       class->kind = VM_CLASS_KIND_PRIMITIVE;
 
-       if (vm_class_link_bogus_class(class, class_name)) {
+       if (vm_class_link_primitive_class(class, class_name)) {
                NOT_IMPLEMENTED;
                return NULL;
        }
@@ -365,9 +364,7 @@ struct vm_class *load_array_class(const char *class_name)
                return NULL;
        }
 
-       array_class->kind = VM_CLASS_KIND_ARRAY;
-
-       if (vm_class_link_bogus_class(array_class, class_name)) {
+       if (vm_class_link_array_class(array_class, class_name)) {
                NOT_IMPLEMENTED;
                return NULL;
        }
-- 
1.6.0.4


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

Reply via email to