This fixes the lighthouse ticket:
http://jato.lighthouseapp.com/projects/29055-jato/tickets/4
Actually, the ticket describes a slightly different scenario. The scenario
from the ticket:
interface A {
void foo();
}
interface B {
void foo();
}
class C implements A, B {
void foo() { ... }
}
Here, the itable for C will contain two entries, one for A.foo() and one
for B.foo(). However, we _must_ do this, since we use the _method address_
as the hidden parameter to the itable resolution stub. If we omitted one
of them, the resolution stub would not be able to find it, e.g.:
C c = new C();
((A) c).foo(); // would succeed
((B) c).foo(); // would fail
What the ticket is meant to describe, however, is that we may get the same
method (from the same class) in the itable:
interface I {
void foo();
}
class A implements I {
void foo() { ... }
}
class B extends A implements I {
void foo() { ... }
}
Here, before this patch, we would add I.foo() twice to the itable of B.
Signed-off-by: Vegard Nossum <[email protected]>
---
vm/itable.c | 31 +++++++++++++------------------
1 files changed, 13 insertions(+), 18 deletions(-)
diff --git a/vm/itable.c b/vm/itable.c
index 83ede3e..b1aaee4 100644
--- a/vm/itable.c
+++ b/vm/itable.c
@@ -29,6 +29,8 @@
#include <stdio.h>
#include <stdlib.h>
+#include "lib/array.h"
+
#include "vm/classloader.h"
#include "vm/backtrace.h"
#include "vm/class.h"
@@ -167,34 +169,27 @@ static void *itable_create_conflict_resolver(struct
vm_class *vmc,
return vm_method_call_ptr(entry->c_method);
}
- unsigned int nr_entries = 0;
- struct itable_entry *entry;
- list_for_each_entry(entry, methods, node)
- ++nr_entries;
+ struct array sorted_table;
+ array_init(&sorted_table);
+ array_resize(&sorted_table, 64);
- struct itable_entry **sorted_table
- = malloc(nr_entries * sizeof(*sorted_table));
- if (!sorted_table) {
- NOT_IMPLEMENTED;
- return &itable_resolver_stub_error;
- }
-
- unsigned int i = 0;
+ struct itable_entry *entry;
list_for_each_entry(entry, methods, node)
- sorted_table[i++] = entry;
+ array_append(&sorted_table, entry);
- qsort(sorted_table, nr_entries, sizeof(*sorted_table),
- &itable_entry_compare);
+ array_qsort(&sorted_table, &itable_entry_compare);
+ array_unique(&sorted_table, &itable_entry_compare);
- void *ret = emit_itable_resolver_stub(vmc, sorted_table, nr_entries);
- free(sorted_table);
+ void *ret = emit_itable_resolver_stub(vmc,
+ (struct itable_entry **) sorted_table.ptr, sorted_table.size);
+ array_destroy(&sorted_table);
return ret;
}
static void trace_itable(struct vm_class *vmc, struct list_head *itable)
{
- trace_printf("trace itable: %s\n", vmc->name);
+ trace_printf("trace itable (duplicates included): %s\n", vmc->name);
for (unsigned int i = 0; i < VM_ITABLE_SIZE; ++i) {
if (list_is_empty(&itable[i]))
--
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