---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

Reply via email to