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