Signed-off-by: Vegard Nossum <vegard.nos...@gmail.com> --- include/vm/class.h | 1 + vm/class.c | 38 ++++++++++++++++++++++++++++++++++++++ vm/itable.c | 23 +---------------------- 3 files changed, 40 insertions(+), 22 deletions(-)
diff --git a/include/vm/class.h b/include/vm/class.h index cf07dc7..a76b03d 100644 --- a/include/vm/class.h +++ b/include/vm/class.h @@ -36,6 +36,7 @@ struct vm_class { char *name; struct vm_class *super; + struct vm_class **interfaces; struct vm_field *fields; struct vm_method *methods; diff --git a/vm/class.c b/vm/class.c index 05500f1..d4f099b 100644 --- a/vm/class.c +++ b/vm/class.c @@ -183,6 +183,44 @@ int vm_class_link(struct vm_class *vmc, const struct cafebabe_class *class) vmc->super = NULL; } + vmc->interfaces + = malloc(sizeof(*vmc->interfaces) * class->interfaces_count); + if (!vmc->interfaces) { + NOT_IMPLEMENTED; + return -1; + } + + for (unsigned int i = 0; i < class->interfaces_count; ++i) { + uint16_t idx = class->interfaces[i]; + + const struct cafebabe_constant_info_class *interface; + if (cafebabe_class_constant_get_class(class, idx, &interface)) { + NOT_IMPLEMENTED; + return -1; + } + + const struct cafebabe_constant_info_utf8 *name; + if (cafebabe_class_constant_get_utf8(class, + interface->name_index, &name)) + { + NOT_IMPLEMENTED; + return -1; + } + + char *c_name = strndup((char *) name->bytes, name->length); + if (!c_name) { + NOT_IMPLEMENTED; + return -1; + } + + struct vm_class *vmi = classloader_load(c_name); + free(c_name); + if (!vmi) + return -1; + + vmc->interfaces[i] = vmi; + } + vmc->fields = malloc(sizeof(*vmc->fields) * class->fields_count); if (!vmc->fields) { NOT_IMPLEMENTED; diff --git a/vm/itable.c b/vm/itable.c index 2174260..a3a8606 100644 --- a/vm/itable.c +++ b/vm/itable.c @@ -98,29 +98,8 @@ static int itable_add_entries(struct vm_class *vmc, struct list_head *itable) } } - /* XXX: Move this to class linking? */ for (unsigned int i = 0; i < class->interfaces_count; ++i) { - uint16_t idx = class->interfaces[i]; - - const struct cafebabe_constant_info_class *interface; - if (cafebabe_class_constant_get_class(class, idx, &interface)) - return -1; - - const struct cafebabe_constant_info_utf8 *name; - if (cafebabe_class_constant_get_utf8(class, - interface->name_index, &name)) - return -1; - - char *c_name = strndup((char *) name->bytes, name->length); - if (!c_name) - return -1; - - struct vm_class *vmi = classloader_load(c_name); - free(c_name); - if (!vmi) - return -1; - - int ret = itable_add_entries(vmi, itable); + int ret = itable_add_entries(vmc->interfaces[i], itable); if (ret) return ret; } -- 1.6.0.4 ------------------------------------------------------------------------------ _______________________________________________ Jatovm-devel mailing list Jatovm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jatovm-devel