if (VM.VerifyAssertions) VM.assert(iTable != null);
if (VM.VerifyAssertions) VM._assert(iTable != null);
  public static Object[] findITable(Object[] tib, int id)     throws IncompatibleClassChangeError, VM_ResolutionException {    Object[] iTables =       (Object[])tib[TIB_ITABLES_TIB_INDEX];    if (VM.DirectlyIndexedITables) {      // ITable is at fixed offset      return (Object[])iTables[id];    } else {      // Search for the right ITable      VM_Type I = VM_Class.getInterface(id);      if (iTables != null) {	// check the cache at slot 0	Object[] iTable = (Object[])iTables[0];	if (iTable[0] == I) { 	  return iTable; // cache hit :)	}	  	// cache miss :(	// Have to search the 'real' entries for the iTable	for (int i=1; i<iTables.length; i++) {	  iTable = (Object[])iTables[i];	  if (iTable[0] == I) { 	    // found it; update cache	    iTables[0] = iTable;	    return iTable;	  }        }      }      // Didn't find the itable, so we don't yet know if       // the class implements the interface. :(((       // Therefore, we need to establish that and then       // look for the iTable again.      VM_Class C = (VM_Class)tib[0];      if (!VM_Runtime.isAssignableWith(I, C)) throw new IncompatibleClassChangeError();      synchronized (C) {	installITable(C, (VM_Class)I);      }      Object[] iTable = findITable(tib, id);      if (VM.VerifyAssertions) VM.assert(iTable != null);      return iTable;    }  }