org.jikesrvm.classloader
Class TableBasedDynamicLinker

java.lang.Object
  extended by org.jikesrvm.classloader.TableBasedDynamicLinker
All Implemented Interfaces:
Constants, HeapLayoutConstants, ThinLockConstants, TIBLayoutConstants, SizeConstants

public class TableBasedDynamicLinker
extends Object
implements Constants

Dynamic linking via indirection tables.

The main idea for dynamic linking is that we maintain arrays of member offsets indexed by the member's dynamic linking id. The generated code at a dynamically linked site will load the appropriate value from the offset table and check to see if the value is valid. If it is, then no dynamic linking is required. If the value is invalid, then resolveDynamicLink is invoked to perform any required dynamic class loading. After member resolution and class loading completes, we can store the offset value in the offset table. Thus when resolve method returns, execution can be restarted by reloading/indexing the offset table.

NOTE: We believe that only use of invokespecial that could possibly require dynamic linking is that of invoking an object initializer.


Field Summary
private static int[] memberOffsets
          Linking table keyed by member reference IDs.
 
Fields inherited from interface org.jikesrvm.Constants
NOT_REACHED, REFLECTION_FPRS_BITS, REFLECTION_FPRS_MASK, REFLECTION_GPRS_BITS, REFLECTION_GPRS_MASK
 
Fields inherited from interface org.jikesrvm.objectmodel.ThinLockConstants
TL_DEDICATED_U16_OFFSET, TL_DEDICATED_U16_SHIFT, TL_LOCK_COUNT_MASK, TL_LOCK_COUNT_SHIFT, TL_LOCK_COUNT_UNIT, TL_LOCK_ID_MASK, TL_LOCK_ID_SHIFT, TL_NUM_BITS_RC, TL_NUM_BITS_STAT, TL_NUM_BITS_TID, TL_STAT_BIASABLE, TL_STAT_FAT, TL_STAT_MASK, TL_STAT_SHIFT, TL_STAT_THIN, TL_THREAD_ID_MASK, TL_THREAD_ID_SHIFT, TL_UNLOCK_MASK
 
Fields inherited from interface org.jikesrvm.SizeConstants
BITS_IN_ADDRESS, BITS_IN_BOOLEAN, BITS_IN_BYTE, BITS_IN_CHAR, BITS_IN_DOUBLE, BITS_IN_EXTENT, BITS_IN_FLOAT, BITS_IN_INT, BITS_IN_LONG, BITS_IN_OFFSET, BITS_IN_PAGE, BITS_IN_SHORT, BITS_IN_WORD, BYTES_IN_ADDRESS, BYTES_IN_BOOLEAN, BYTES_IN_BYTE, BYTES_IN_CHAR, BYTES_IN_DOUBLE, BYTES_IN_EXTENT, BYTES_IN_FLOAT, BYTES_IN_INT, BYTES_IN_LONG, BYTES_IN_OFFSET, BYTES_IN_PAGE, BYTES_IN_SHORT, BYTES_IN_WORD, LOG_BITS_IN_ADDRESS, LOG_BITS_IN_BOOLEAN, LOG_BITS_IN_BYTE, LOG_BITS_IN_CHAR, LOG_BITS_IN_DOUBLE, LOG_BITS_IN_EXTENT, LOG_BITS_IN_FLOAT, LOG_BITS_IN_INT, LOG_BITS_IN_LONG, LOG_BITS_IN_OFFSET, LOG_BITS_IN_PAGE, LOG_BITS_IN_SHORT, LOG_BITS_IN_WORD, LOG_BYTES_IN_ADDRESS, LOG_BYTES_IN_BOOLEAN, LOG_BYTES_IN_BYTE, LOG_BYTES_IN_CHAR, LOG_BYTES_IN_DOUBLE, LOG_BYTES_IN_EXTENT, LOG_BYTES_IN_FLOAT, LOG_BYTES_IN_INT, LOG_BYTES_IN_LONG, LOG_BYTES_IN_OFFSET, LOG_BYTES_IN_PAGE, LOG_BYTES_IN_SHORT, LOG_BYTES_IN_WORD
 
Fields inherited from interface org.jikesrvm.objectmodel.TIBLayoutConstants
IMT_METHOD_SLOTS, NEEDS_DYNAMIC_LINK, TIB_ARRAY_ELEMENT_TIB_INDEX, TIB_DOES_IMPLEMENT_INDEX, TIB_FIRST_SPECIALIZED_METHOD_INDEX, TIB_FIRST_VIRTUAL_METHOD_INDEX, TIB_INTERFACE_DISPATCH_TABLE_INDEX, TIB_SUPERCLASS_IDS_INDEX, TIB_TYPE_INDEX
 
Fields inherited from interface org.jikesrvm.HeapLayoutConstants
BAD_MAP_COMPRESSION, BOOT_IMAGE_CODE_END, BOOT_IMAGE_CODE_SIZE, BOOT_IMAGE_CODE_START, BOOT_IMAGE_DATA_END, BOOT_IMAGE_DATA_SIZE, BOOT_IMAGE_DATA_START, BOOT_IMAGE_END, BOOT_IMAGE_RMAP_END, BOOT_IMAGE_RMAP_START, MAX_BOOT_IMAGE_RMAP_SIZE, MAXIMUM_MAPPABLE
 
Constructor Summary
TableBasedDynamicLinker()
           
 
Method Summary
(package private) static void ensureCapacity(int id)
          Method invoked from MemberReference to ensure that there is space in the dynamic linking table for the given member reference.
static int resolveMember(int memberId)
          Cause dynamic linking of the RVMMember whose member reference id is given.
static int resolveMember(MemberReference ref)
          Cause dynamic linking of the argument MemberReference
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

memberOffsets

private static int[] memberOffsets
Linking table keyed by member reference IDs. Value indicates offset of member or whether the member needs linking.

Constructor Detail

TableBasedDynamicLinker

public TableBasedDynamicLinker()
Method Detail

resolveMember

public static int resolveMember(int memberId)
                         throws NoClassDefFoundError
Cause dynamic linking of the RVMMember whose member reference id is given. Invoked directly from (baseline) compiled code.

Parameters:
memberId - the dynamicLinkingId of the method to link.
Returns:
returns the offset of the member.
Throws:
NoClassDefFoundError

resolveMember

public static int resolveMember(MemberReference ref)
                         throws NoClassDefFoundError
Cause dynamic linking of the argument MemberReference

Parameters:
ref - reference to the member to link
Returns:
returns the offset of the member.
Throws:
NoClassDefFoundError

ensureCapacity

static void ensureCapacity(int id)
Method invoked from MemberReference to ensure that there is space in the dynamic linking table for the given member reference.