org.jikesrvm.classloader
Class TableBasedDynamicLinker
java.lang.Object
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.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.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 |
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 |
memberOffsets
private static int[] memberOffsets
- Linking table keyed by member reference IDs. Value indicates offset of
member or whether the member needs linking.
TableBasedDynamicLinker
public TableBasedDynamicLinker()
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.