aboutsummaryrefslogtreecommitdiff
path: root/libjava/java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java')
-rw-r--r--libjava/java/lang/Class.h32
-rw-r--r--libjava/java/lang/natClass.cc17
2 files changed, 22 insertions, 27 deletions
diff --git a/libjava/java/lang/Class.h b/libjava/java/lang/Class.h
index 62e280c..787e263 100644
--- a/libjava/java/lang/Class.h
+++ b/libjava/java/lang/Class.h
@@ -120,23 +120,14 @@ struct _Jv_Method
{ return this + 1; }
};
-// Interface Dispatch Tables
-union _Jv_IDispatchTable
+// The table used to resolve interface calls.
+struct _Jv_IDispatchTable
{
- struct
- {
- // Index into interface's ioffsets.
- jshort iindex;
- jshort itable_length;
- // Class Interface dispatch table.
- void **itable;
- } cls;
-
- struct
- {
- // Offsets into implementation class itables.
- jshort *ioffsets;
- } iface;
+ // Index into interface's ioffsets.
+ jshort iindex;
+ jshort itable_length;
+ // Class Interface dispatch table.
+ void *itable[0];
};
// Used by _Jv_Linker::get_interfaces ()
@@ -600,8 +591,13 @@ private:
jshort depth;
// Vector of this class's superclasses, ordered by decreasing depth.
jclass *ancestors;
- // Interface Dispatch Table.
- _Jv_IDispatchTable *idt;
+ // In a regular class, this field points to the Class Interface Dispatch
+ // Table. In an interface, it points to the ioffsets table.
+ union
+ {
+ _Jv_IDispatchTable *idt;
+ jshort *ioffsets;
+ };
// Pointer to the class that represents an array of this class.
jclass arrayclass;
// Security Domain to which this class belongs (or null).
diff --git a/libjava/java/lang/natClass.cc b/libjava/java/lang/natClass.cc
index 04a5bc4..8972cb2 100644
--- a/libjava/java/lang/natClass.cc
+++ b/libjava/java/lang/natClass.cc
@@ -985,8 +985,8 @@ void *
_Jv_LookupInterfaceMethodIdx (jclass klass, jclass iface, int method_idx)
{
_Jv_IDispatchTable *cldt = klass->idt;
- int idx = iface->idt->iface.ioffsets[cldt->cls.iindex] + method_idx;
- return cldt->cls.itable[idx];
+ int idx = iface->ioffsets[cldt->iindex] + method_idx;
+ return cldt->itable[idx];
}
jboolean
@@ -1013,16 +1013,15 @@ _Jv_IsAssignableFrom (jclass source, jclass target)
return _Jv_InterfaceAssignableFrom (source, target);
_Jv_IDispatchTable *cl_idt = source->idt;
- _Jv_IDispatchTable *if_idt = target->idt;
- if (__builtin_expect ((if_idt == NULL), false))
+ if (__builtin_expect ((target->ioffsets == NULL), false))
return false; // No class implementing TARGET has been loaded.
- jshort cl_iindex = cl_idt->cls.iindex;
- if (cl_iindex < if_idt->iface.ioffsets[0])
+ jshort cl_iindex = cl_idt->iindex;
+ if (cl_iindex < target->ioffsets[0])
{
- jshort offset = if_idt->iface.ioffsets[cl_iindex];
- if (offset != -1 && offset < cl_idt->cls.itable_length
- && cl_idt->cls.itable[offset] == target)
+ jshort offset = target->ioffsets[cl_iindex];
+ if (offset != -1 && offset < cl_idt->itable_length
+ && cl_idt->itable[offset] == target)
return true;
}
return false;