Program: 74178
Project: 74178
Buggy source:
/** 
 * Override the base class to convert the token to the element type rather than to the type of the port.
 * @param channelIndex The index of the channel, from 0 to width-1
 * @param token The token to send
 * @exception NoRoomException If there is no room in the receiver.
 * @exception IllegalActionException Not thrown in this base class.
 */
public void sendInside(int channelIndex,Token token) throws IllegalActionException, NoRoomException {
  if (!(getContainer() instanceof IterateOverArray)) {
    super.sendInside(channelIndex,token);
    return;
  }
  Receiver[][] farReceivers;
  if (_debugging) {
    _debug("String_Node_Str" + channelIndex + "String_Node_Str"+ token);
  }
  try {
    try {
      _workspace.getReadAccess();
      ArrayType type=(ArrayType)getType();
      int compare=TypeLattice.compare(token.getType(),type.getElementType());
      if ((compare == CPO.HIGHER) || (compare == CPO.INCOMPARABLE)) {
        throw new IllegalActionException("String_Node_Str" + token.getType().toString() + "String_Node_Str"+ getFullName()+ "String_Node_Str"+ getType().toString());
      }
      farReceivers=deepGetReceivers();
      if ((farReceivers == null) || (farReceivers[channelIndex] == null)) {
        return;
      }
    }
  finally {
      _workspace.doneReading();
    }
    for (int j=0; j < farReceivers[channelIndex].length; j++) {
      TypedIOPort port=(TypedIOPort)farReceivers[channelIndex][j].getContainer();
      Token newToken=port.convert(token);
      farReceivers[channelIndex][j].put(newToken);
    }
  }
 catch (  ArrayIndexOutOfBoundsException ex) {
  }
}

Fixed version (ground truth):
/** 
 * Override the base class to convert the token to the element type rather than to the type of the port.
 * @param channelIndex The index of the channel, from 0 to width-1
 * @param token The token to send
 * @exception NoRoomException If there is no room in the receiver.
 * @exception IllegalActionException Not thrown in this base class.
 */
public void sendInside(int channelIndex,Token token) throws IllegalActionException, NoRoomException {
  if (!(getContainer() instanceof IterateOverArray)) {
    super.sendInside(channelIndex,token);
    return;
  }
  Receiver[][] farReceivers;
  if (_debugging) {
    _debug("String_Node_Str" + channelIndex + "String_Node_Str"+ token);
  }
  if (_hasPortEventListeners) {
    _notifyPortEventListeners(new IOPortEvent(this,IOPortEvent.SEND,channelIndex,true,token));
  }
  try {
    try {
      _workspace.getReadAccess();
      ArrayType type=(ArrayType)getType();
      int compare=TypeLattice.compare(token.getType(),type.getElementType());
      if ((compare == CPO.HIGHER) || (compare == CPO.INCOMPARABLE)) {
        throw new IllegalActionException("String_Node_Str" + token.getType().toString() + "String_Node_Str"+ getFullName()+ "String_Node_Str"+ getType().toString());
      }
      farReceivers=deepGetReceivers();
      if ((farReceivers == null) || (farReceivers[channelIndex] == null)) {
        return;
      }
    }
  finally {
      _workspace.doneReading();
    }
    for (int j=0; j < farReceivers[channelIndex].length; j++) {
      TypedIOPort port=(TypedIOPort)farReceivers[channelIndex][j].getContainer();
      Token newToken=port.convert(token);
      farReceivers[channelIndex][j].put(newToken);
    }
  }
 catch (  ArrayIndexOutOfBoundsException ex) {
  }
}