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

Reply via email to