Class.h (_Jv_IDispatchTable): Make it a struct.
2006-02-09 Bryce McKinlay <mckinlay@redhat.com> * java/lang/Class.h (_Jv_IDispatchTable): Make it a struct. Put 'itable' inline, instead of as a pointer. (java::lang::Class): Put 'idt' in anonymous union with 'ioffsets'. * link.cc (null_idt): Update definition. (_Jv_Linker::prepare_constant_time_tables): Allocate klass->idt as a single struct. Use _Jv_AllocBytes, not _Jv_AllocRawObj. (_Jv_Linker::generate_itable): Update to use 'ioffsets'. (_Jv_Linker::find_iindex): Likewise. Update comment. * java/lang/natClass.cc (_Jv_LookupInterfaceMethodIdx): Update for _Jv_IDispatchTable change. (_Jv_IsAssignableFrom): Likewise. From-SVN: r110818
This commit is contained in:
parent
c4bbc10564
commit
a286e145de
4 changed files with 57 additions and 53 deletions
|
@ -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).
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue