Program: 73988
Project: 73988
Buggy source:
/** 
 * If this actor is opaque, transfer any data from the input ports of this composite to the ports connected on the inside, and then invoke the fire() method of its local director. The transfer is accomplished by calling the transferInputs() method of the local director (the exact behavior of which depends on the domain).  If the actor is not opaque, throw an exception. This method is read-synchronized on the workspace, so the fire() method of the director need not be (assuming it is only called from here).  After the fire() method of the director returns, send any output data created by calling the local director's transferOutputs method.
 * @exception IllegalActionException If there is no director, or ifthe director's fire() method throws it, or if the actor is not opaque.
 */
public void fire() throws IllegalActionException {
  if (_fireMethod == null) {
    if (_debugging) {
      _debug("String_Node_Str");
    }
    System.out.println("String_Node_Str");
    super.fire();
    return;
  }
  try {
    if (_debugging) {
      _debug("String_Node_Str");
    }
    List<Object> argList=new LinkedList<Object>();
    Iterator<?> inputPorts=inputPortList().iterator();
    while (inputPorts.hasNext()) {
      TypedIOPort port=(TypedIOPort)inputPorts.next();
      int rate=DFUtilities.getTokenConsumptionRate(port);
      Type type=((TypedIOPort)port).getType();
      Object tokenHolder=null;
      int numberOfChannels=port.getWidth() < port.getWidthInside() ? port.getWidth() : port.getWidthInside();
      if (type == BaseType.INT) {
        tokenHolder=new int[numberOfChannels][];
      }
 else       if (type == BaseType.DOUBLE) {
        tokenHolder=new double[numberOfChannels][];
      }
 else       if (type == BaseType.BOOLEAN) {
        tokenHolder=new boolean[numberOfChannels][];
      }
 else {
      }
      for (int i=0; i < port.getWidth(); i++) {
        try {
          if (i < port.getWidthInside()) {
            if (port.hasToken(i,rate)) {
              Token[] tokens=port.get(i,rate);
              if (_debugging) {
                _debug(getName(),"String_Node_Str" + port.getName());
              }
              if (type == BaseType.INT) {
                if (rate > 1) {
                  int[] intTokens=new int[rate];
                  for (int k=0; k < rate; k++) {
                    intTokens[k]=((IntToken)tokens[k]).intValue();
                  }
                  tokenHolder=intTokens;
                }
 else {
                  tokenHolder=((IntToken)tokens[0]).intValue();
                }
              }
 else               if (type == BaseType.DOUBLE) {
                if (rate > 1) {
                  for (int k=0; k < rate; k++) {
                    double[] doubleTokens=new double[rate];
                    doubleTokens[k]=((DoubleToken)tokens[k]).doubleValue();
                    tokenHolder=doubleTokens;
                  }
                }
 else {
                  tokenHolder=((DoubleToken)tokens[0]).doubleValue();
                }
              }
 else               if (type == BaseType.BOOLEAN) {
                if (rate > 1) {
                  boolean[] booleanTokens=new boolean[rate];
                  for (int k=0; k < rate; k++) {
                    booleanTokens[k]=((BooleanToken)tokens[k]).booleanValue();
                  }
                  tokenHolder=booleanTokens;
                }
 else {
                  tokenHolder=((BooleanToken)tokens[0]).booleanValue();
                }
              }
 else {
              }
              argList.add(tokenHolder);
            }
 else {
              throw new IllegalActionException(this,port,"String_Node_Str" + rate + "String_Node_Str"+ "String_Node_Str");
            }
          }
 else {
            if (_debugging) {
              _debug(getName(),"String_Node_Str" + port.getName());
            }
            if (port.hasToken(i)) {
              port.get(i);
            }
          }
        }
 catch (        NoTokenException ex) {
          throw new InternalErrorException(this,ex,null);
        }
      }
    }
    Object[] tokensToAllOutputPorts;
    tokensToAllOutputPorts=(Object[])_fireMethod.invoke(_objectWrapper,argList.toArray());
    int portNumber=0;
    for (    Object port : outputPortList()) {
      IOPort iOPort=(IOPort)port;
      _transferOutputs(iOPort,tokensToAllOutputPorts[portNumber++]);
    }
    if (_debugging) {
      _debug("String_Node_Str");
    }
  }
 catch (  IllegalArgumentException e) {
    throw new IllegalActionException(this,e,"String_Node_Str");
  }
catch (  IllegalAccessException e) {
    throw new IllegalActionException(this,e,"String_Node_Str");
  }
catch (  InvocationTargetException e) {
    throw new IllegalActionException(this,e,"String_Node_Str");
  }
}

Fixed version (ground truth):
/** 
 * If this actor is opaque, transfer any data from the input ports of this composite to the ports connected on the inside, and then invoke the fire() method of its local director. The transfer is accomplished by calling the transferInputs() method of the local director (the exact behavior of which depends on the domain).  If the actor is not opaque, throw an exception. This method is read-synchronized on the workspace, so the fire() method of the director need not be (assuming it is only called from here).  After the fire() method of the director returns, send any output data created by calling the local director's transferOutputs method.
 * @exception IllegalActionException If there is no director, or ifthe director's fire() method throws it, or if the actor is not opaque.
 */
public void fire() throws IllegalActionException {
  if (_fireMethod == null) {
    if (_debugging) {
      _debug("String_Node_Str");
    }
    System.out.println("String_Node_Str");
    super.fire();
    return;
  }
  try {
    if (_debugging) {
      _debug("String_Node_Str");
    }
    List<Object> argList=new LinkedList<Object>();
    Iterator<?> inputPorts=inputPortList().iterator();
    while (inputPorts.hasNext()) {
      TypedIOPort port=(TypedIOPort)inputPorts.next();
      int rate=DFUtilities.getTokenConsumptionRate(port);
      Type type=((TypedIOPort)port).getType();
      Object tokenHolder=null;
      int numberOfChannels=port.getWidth() < port.getWidthInside() ? port.getWidth() : port.getWidthInside();
      if (type == BaseType.INT) {
        tokenHolder=new int[numberOfChannels][];
      }
 else       if (type == BaseType.DOUBLE) {
        tokenHolder=new double[numberOfChannels][];
      }
 else       if (type == BaseType.BOOLEAN) {
        tokenHolder=new boolean[numberOfChannels][];
      }
 else {
      }
      for (int i=0; i < port.getWidth(); i++) {
        try {
          if (i < port.getWidthInside()) {
            if (port.hasToken(i,rate)) {
              Token[] tokens=port.get(i,rate);
              if (_debugging) {
                _debug(getName(),"String_Node_Str" + port.getName());
              }
              if (type == BaseType.INT) {
                if (rate > 1) {
                  Integer[] intTokens=new Integer[rate];
                  for (int k=0; k < rate; k++) {
                    intTokens[k]=((IntToken)tokens[k]).intValue();
                  }
                  tokenHolder=intTokens;
                }
 else {
                  tokenHolder=((IntToken)tokens[0]).intValue();
                }
              }
 else               if (type == BaseType.DOUBLE) {
                if (rate > 1) {
                  for (int k=0; k < rate; k++) {
                    Double[] doubleTokens=new Double[rate];
                    doubleTokens[k]=((DoubleToken)tokens[k]).doubleValue();
                    tokenHolder=doubleTokens;
                  }
                }
 else {
                  tokenHolder=((DoubleToken)tokens[0]).doubleValue();
                }
              }
 else               if (type == BaseType.BOOLEAN) {
                if (rate > 1) {
                  Boolean[] booleanTokens=new Boolean[rate];
                  for (int k=0; k < rate; k++) {
                    booleanTokens[k]=((BooleanToken)tokens[k]).booleanValue();
                  }
                  tokenHolder=booleanTokens;
                }
 else {
                  tokenHolder=((BooleanToken)tokens[0]).booleanValue();
                }
              }
 else {
              }
              argList.add(tokenHolder);
            }
 else {
              throw new IllegalActionException(this,port,"String_Node_Str" + rate + "String_Node_Str"+ "String_Node_Str");
            }
          }
 else {
            if (_debugging) {
              _debug(getName(),"String_Node_Str" + port.getName());
            }
            if (port.hasToken(i)) {
              port.get(i);
            }
          }
        }
 catch (        NoTokenException ex) {
          throw new InternalErrorException(this,ex,null);
        }
      }
    }
    Object[] tokensToAllOutputPorts;
    tokensToAllOutputPorts=(Object[])_fireMethod.invoke(_objectWrapper,argList.toArray());
    int portNumber=0;
    for (    Object port : outputPortList()) {
      IOPort iOPort=(IOPort)port;
      _transferOutputs(iOPort,tokensToAllOutputPorts[portNumber++]);
    }
    if (_debugging) {
      _debug("String_Node_Str");
    }
  }
 catch (  IllegalArgumentException e) {
    throw new IllegalActionException(this,e,"String_Node_Str");
  }
catch (  IllegalAccessException e) {
    throw new IllegalActionException(this,e,"String_Node_Str");
  }
catch (  InvocationTargetException e) {
    throw new IllegalActionException(this,e,"String_Node_Str");
  }
}