2009/7/1 Tomek Grabiec <tgrab...@gmail.com>: > ---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
Typo > + 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; This probably needs to set ->static_size too, but I think that's my fault from the past :-) > + > + 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) { What's this change? I can't tell the difference. Maybe gmail screwed up the indentation. > 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; > } Hm. There _could_ fail, but (currently) only as the result of malloc() failure. The benefit of a table is that we only need to write the error check once. On the other hand, we're not going to have more than these 8 primitive classes anyway, so it might make more sense to check them directly. What do you think? (I think we _should_ check for errors here, regardless, for the sake of principle.) Apart from that: Acked-by: Vegard Nossum <vegard.nos...@gmail.com> Vegard ------------------------------------------------------------------------------ _______________________________________________ Jatovm-devel mailing list Jatovm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jatovm-devel