001 /* 002 * This file is part of the Jikes RVM project (http://jikesrvm.org). 003 * 004 * This file is licensed to You under the Eclipse Public License (EPL); 005 * You may not use this file except in compliance with the License. You 006 * may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/eclipse-1.0.php 009 * 010 * See the COPYRIGHT.txt file distributed with this work for information 011 * regarding copyright ownership. 012 */ 013 package org.jikesrvm.objectmodel; 014 015 import org.jikesrvm.VM; 016 import org.vmmagic.Intrinsic; 017 import org.vmmagic.pragma.NonMoving; 018 import org.vmmagic.pragma.Uninterruptible; 019 import org.vmmagic.pragma.UninterruptibleNoWarn; 020 021 /** 022 * This class represents an instance of an array of interface tables. 023 */ 024 @NonMoving 025 public final class ITableArray implements RuntimeTable<ITable> { 026 027 /** 028 * The backing data used during boot image writing. 029 */ 030 private final ITable[] backingData; 031 032 /** 033 * Private constructor. Can not create instances. 034 */ 035 private ITableArray(int size) { 036 this.backingData = new ITable[size]; 037 } 038 039 /** 040 * Return the backing array (for boot image writing) 041 */ 042 @Override 043 public ITable[] getBacking() { 044 if (VM.VerifyAssertions) VM._assert(!VM.runningVM); 045 return backingData; 046 } 047 048 /** 049 * Create a new array of {@link ITable} of the specified size. 050 * 051 * @param size The size of the array 052 * @return The created ITableArray instance 053 */ 054 public static ITableArray allocate(int size) { 055 if (VM.VerifyAssertions && VM.runningVM) VM._assert(VM.NOT_REACHED); 056 return new ITableArray(size); 057 } 058 059 /** 060 * Get an {@link ITable} entry from the array. 061 * 062 * @param index The index of the entry to get 063 * @return The value of that entry 064 */ 065 @Override 066 @Intrinsic 067 @Uninterruptible 068 public ITable get(int index) { 069 if (VM.VerifyAssertions && VM.runningVM) VM._assert(VM.NOT_REACHED); 070 return backingData[index]; 071 } 072 073 /** 074 * Set an {@link ITable} entry in the array. 075 * 076 * @param index The index of the entry to set 077 * @param value The value to set the entry to. 078 */ 079 @Override 080 @Intrinsic 081 @UninterruptibleNoWarn("Interruptible code not reachable at runtime") 082 public void set(int index, ITable value) { 083 if (VM.VerifyAssertions && VM.runningVM) VM._assert(VM.NOT_REACHED); 084 backingData[index] = value; 085 } 086 087 /** 088 * Return the length of the array of {@link ITable} 089 */ 090 @Override 091 @Intrinsic 092 @Uninterruptible 093 public int length() { 094 if (VM.VerifyAssertions && VM.runningVM) VM._assert(VM.NOT_REACHED); 095 return backingData.length; 096 } 097 }