Signed-off-by: Vegard Nossum <[email protected]>
---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel