/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
package org.jikesrvm.objectmodel;
import org.jikesrvm.VM;
import org.jikesrvm.compilers.common.CodeArray;
import org.vmmagic.Intrinsic;
import org.vmmagic.pragma.NonMoving;
import org.vmmagic.pragma.Uninterruptible;
import org.vmmagic.pragma.UninterruptibleNoWarn;
/**
* This class represents an instance of an interface method table, at runtime it
* is an array with CodeArray elements.
*/
@NonMoving
public final class IMT implements RuntimeTable<CodeArray> {
/**
* The backing data used during boot image writing.
*/
private final CodeArray[] data;
/**
* Private constructor. Can not create instances.
*/
private IMT() {
this.data = new CodeArray[TIBLayoutConstants.IMT_METHOD_SLOTS];
}
@Override
public CodeArray[] getBacking() {
if (VM.VerifyAssertions) VM._assert(!VM.runningVM);
return data;
}
/**
* Creates an IMT.
*
* @return The created IMT instance.
*/
public static IMT allocate() {
if (VM.VerifyAssertions && VM.runningVM) VM._assert(VM.NOT_REACHED);
return new IMT();
}
/**
* Gets an entry in the IMT.
*
* @param index The index of the entry to get
* @return The value of that entry
*/
@Override
@Intrinsic
@Uninterruptible
public CodeArray get(int index) {
if (VM.VerifyAssertions && VM.runningVM) VM._assert(VM.NOT_REACHED);
return data[index];
}
/**
* Sets an entry in the IMT.
*
* @param index The index of the entry to set
* @param value The value to set the entry to.
*/
@Override
@Intrinsic
@UninterruptibleNoWarn("Interruptible code not reachable at runtime")
public void set(int index, CodeArray value) {
if (VM.VerifyAssertions && VM.runningVM) VM._assert(VM.NOT_REACHED);
data[index] = value;
}
/**
* Returns the length of the IMT
*/
@Override
@Intrinsic
@Uninterruptible
public int length() {
if (VM.VerifyAssertions && VM.runningVM) VM._assert(VM.NOT_REACHED);
return data.length;
}
}