Signed-off-by: Vegard Nossum <[email protected]>
---
vm/class.c | 23 +++++++++++++++++++++++
1 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/vm/class.c b/vm/class.c
index abd3a5b..aced89b 100644
--- a/vm/class.c
+++ b/vm/class.c
@@ -204,6 +204,22 @@ static int insert_interface_method(struct vm_class *vmc,
return array_append(extra_methods, vmm);
}
+static int compare_method_signatures(const void *a, const void *b)
+{
+ const struct vm_method *x = *(const struct vm_method **) a;
+ const struct vm_method *y = *(const struct vm_method **) b;
+
+ int name = strcmp(x->name, y->name);
+ if (name)
+ return name;
+
+ int type = strcmp(x->type, y->type);
+ if (type)
+ return type;
+
+ return 0;
+}
+
int vm_class_link(struct vm_class *vmc, const struct cafebabe_class *class)
{
vmc->class = class;
@@ -416,6 +432,13 @@ int vm_class_link(struct vm_class *vmc, const struct
cafebabe_class *class)
}
}
+ /* We need to weed out duplicate signatures in order to avoid a
+ * situation where two interfaces define the same method and a class
+ * implements both interfaces. We shouldn't add two methods with the
+ * same signature to the same class. */
+ array_qsort(&extra_methods, &compare_method_signatures);
+ array_unique(&extra_methods, &compare_method_signatures);
+
vmc->nr_methods = class->methods_count + extra_methods.size;
vmc->methods = malloc(sizeof(*vmc->methods) * vmc->nr_methods);
--
1.6.0.4
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
Jatovm-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel