---intro private vmtype Signed-off-by: Tomek Grabiec <tgrab...@gmail.com> --- include/vm/class.h | 5 +++ include/vm/classloader.h | 1 + include/vm/java_lang.h | 8 ++++++ vm/classloader.c | 63 ++++++++++++++++++++++++++++++++++++++------- vm/jato.c | 17 ++++++++++++ 5 files changed, 84 insertions(+), 10 deletions(-)
diff --git a/include/vm/class.h b/include/vm/class.h index 8c27366..d70cc83 100644 --- a/include/vm/class.h +++ b/include/vm/class.h @@ -43,6 +43,10 @@ struct vm_class { uint8_t *static_values; struct list_head static_fixup_site_list; + + /* For primitve type classes this holds a vm type + represented by this class. */ + enum vm_type primitive_vm_type; }; int vm_class_link(struct vm_class *vmc, const struct cafebabe_class *class); @@ -89,5 +93,6 @@ struct vm_method *vm_class_resolve_method_recursive(const struct vm_class *vmc, uint16_t i); bool vm_class_is_assignable_from(const struct vm_class *vmc, const struct vm_class *from); +bool vm_class_is_primitive_type_name(const char *class_name); #endif /* __CLASS_H */ diff --git a/include/vm/classloader.h b/include/vm/classloader.h index 885e588..44c66c4 100644 --- a/include/vm/classloader.h +++ b/include/vm/classloader.h @@ -8,5 +8,6 @@ struct vm_class; int classloader_add_to_classpath(const char *classpath); struct vm_class *classloader_load(const char *class_name); +struct vm_class *classloader_load_primitive(const char *class_name); #endif diff --git a/include/vm/java_lang.h b/include/vm/java_lang.h index 7a10325..218a358 100644 --- a/include/vm/java_lang.h +++ b/include/vm/java_lang.h @@ -5,6 +5,14 @@ extern struct vm_class *vm_java_lang_Object; extern struct vm_class *vm_java_lang_Class; extern struct vm_class *vm_java_lang_String; extern struct vm_class *vm_java_lang_Throwable; +extern struct vm_class *vm_boolean_class; +extern struct vm_class *vm_char_class; +extern struct vm_class *vm_float_class; +extern struct vm_class *vm_double_class; +extern struct vm_class *vm_byte_class; +extern struct vm_class *vm_short_class; +extern struct vm_class *vm_int_class; +extern struct vm_class *vm_long_class; extern struct vm_field *vm_java_lang_Class_vmdata; extern struct vm_field *vm_java_lang_String_offset; diff --git a/vm/classloader.c b/vm/classloader.c index 917d7c2..3096d7e 100644 --- a/vm/classloader.c +++ b/vm/classloader.c @@ -283,6 +283,34 @@ struct vm_class *load_class_from_classpath_file(const char *classpath, return result; } +static enum vm_type class_name_to_vm_type(const char *class_name) +{ + if (class_name[0] == 0 || class_name[1] != 0) + return J_VOID; + + switch (class_name[0]) { + case 'Z': + return J_BOOLEAN; + case 'C': + return J_CHAR; + case 'F': + return J_FLOAT; + case 'D': + return J_DOUBLE; + case 'B': + return J_BYTE; + case 'S': + return J_SHORT; + case 'I': + return J_INT; + case 'J': + return J_LONG; + } + + return J_VOID; +} + + struct vm_class *load_primitive_array_class(const char *class_name, unsigned int dimensions, char type) { @@ -302,6 +330,7 @@ struct vm_class *load_primitive_array_class(const char *class_name, array_class->methods = NULL; array_class->object_size = 0; array_class->vtable_size = 0; + array_class->primitive_vm_type = class_name_to_vm_type(class_name); return array_class; } @@ -329,6 +358,28 @@ struct vm_class *load_class_array_class(const char *array_class_name, return array_class; } +struct vm_class *classloader_load_primitive(const char *class_name) +{ + struct vm_class *class; + + class = malloc(sizeof *class); + if (!class) { + NOT_IMPLEMENTED; + 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; + + return class; +} + struct vm_class *load_array_class(const char *class_name) { const char *ptr; @@ -370,15 +421,7 @@ struct vm_class *load_array_class(const char *class_name) return ret; } - switch (*ptr) { - case 'B': - case 'C': - case 'D': - case 'F': - case 'I': - case 'J': - case 'S': - case 'Z': + if (class_name_to_vm_type(ptr)) { if (strlen(ptr) != 1) { NOT_IMPLEMENTED; return NULL; @@ -444,7 +487,7 @@ struct vm_class *classloader_load(const char *class_name) goto out; } - if (nr_classes == max_classes) { + if (nr_classes == max_classes) { new_max_classes = 1 + max_classes * 2; new_array = realloc(classes, new_max_classes * sizeof(struct classloader_class)); diff --git a/vm/jato.c b/vm/jato.c index cc94265..1968be5 100644 --- a/vm/jato.c +++ b/vm/jato.c @@ -162,6 +162,14 @@ struct vm_class *vm_java_lang_Object; struct vm_class *vm_java_lang_Class; struct vm_class *vm_java_lang_String; struct vm_class *vm_java_lang_Throwable; +struct vm_class *vm_boolean_class; +struct vm_class *vm_char_class; +struct vm_class *vm_float_class; +struct vm_class *vm_double_class; +struct vm_class *vm_byte_class; +struct vm_class *vm_short_class; +struct vm_class *vm_int_class; +struct vm_class *vm_long_class; static const struct preload_entry preload_entries[] = { { "java/lang/Object", &vm_java_lang_Object }, @@ -219,6 +227,15 @@ static int preload_vm_classes(void) *pe->field = field; } + vm_boolean_class = classloader_load_primitive("Z"); + vm_char_class = classloader_load_primitive("C"); + vm_float_class = classloader_load_primitive("F"); + vm_double_class = classloader_load_primitive("D"); + vm_byte_class = classloader_load_primitive("B"); + vm_short_class = classloader_load_primitive("S"); + vm_int_class = classloader_load_primitive("I"); + vm_long_class = classloader_load_primitive("J"); + return 0; } -- 1.6.0.6 ------------------------------------------------------------------------------ _______________________________________________ Jatovm-devel mailing list Jatovm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jatovm-devel