/*
* 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.jni;
import org.jikesrvm.VM;
import org.jikesrvm.compilers.common.CodeArray;
import org.jikesrvm.objectmodel.RuntimeTable;
import org.vmmagic.Intrinsic;
import org.vmmagic.pragma.NonMoving;
import org.vmmagic.pragma.Uninterruptible;
import org.vmmagic.pragma.UninterruptibleNoWarn;
/**
* This class holds a JNI function table, at runtime it is an array with
* CodeArray elements
*/
@NonMoving
public final class FunctionTable implements RuntimeTable<CodeArray> {
/**
* The backing data used during boot image writing.
*/
private final CodeArray[] data;
/**
* Private constructor. Can not create instances.
* @param size size of the function table
*/
private FunctionTable(int size) {
this.data = new CodeArray[size];
}
/**
* Create a new ITable of the specified size.
*
* @param size The size of the ITable
* @return The created ITable instance.
*/
public static FunctionTable allocate(int size) {
if (VM.VerifyAssertions && VM.runningVM) VM._assert(VM.NOT_REACHED);
return new FunctionTable(size);
}
@Override
public CodeArray[] getBacking() {
if (VM.VerifyAssertions) VM._assert(!VM.runningVM);
return data;
}
/**
* Get an ITable entry.
*
* @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];
}
/**
* Set an ITable entry.
*
* @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;
}
/**
* Return the length of the ITable
*/
@Override
@Intrinsic
@Uninterruptible
public int length() {
if (VM.VerifyAssertions && VM.runningVM) VM._assert(VM.NOT_REACHED);
return data.length;
}
}