---intro private vmtype
Signed-off-by: Tomek Grabiec <[email protected]>
---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel