Program: 171606
Project: 171606
Buggy source:
/** 
 * Responsible for creating WHILE and IF statements It calculates the commands for the beginning and end of the loop The ending is stored in an OpenLoop to be added when then loop is closed
 * @param ROM Command list to modify
 */
public static void compileLoopStart(ArrayList<Command> ROM){
  String type=tokens.remove(0);
  OpenLoop loop=new OpenLoop(type);
  loops.add(0,loop);
  tokens.remove(0);
  ArrayList<Command> cond=new ArrayList<Command>();
  Arg arg1=compileRef(cond,false);
  String op=tokens.remove(0);
  Arg arg2=new Arg(0);
  if (op.equals("String_Node_Str")) {
    op="String_Node_Str";
  }
 else {
    arg2=compileRef(cond,false);
    tokens.remove(0);
  }
  String oBrace=tokens.remove(0);
  while (!oBrace.equals("String_Node_Str")) {
    loop.name+="String_Node_Str" + oBrace;
    oBrace=tokens.remove(0);
  }
  if (type.equals("String_Node_Str")) {
    Arg test=null;
    if (arg2.mode == 0 && op.equals("String_Node_Str")) {
      arg2.val++;
      op="String_Node_Str";
    }
    if (arg1.mode == 0 && op.equals("String_Node_Str")) {
      arg1.val--;
      op="String_Node_Str";
    }
    if (arg2.mode == 0 && op.equals("String_Node_Str")) {
      arg2.val--;
      op="String_Node_Str";
    }
    if (arg1.mode == 0 && op.equals("String_Node_Str")) {
      arg1.val++;
      op="String_Node_Str";
    }
    ROM.add(new Command("String_Node_Str",new Arg(-1),new Arg("String_Node_Str" + loop,0),new Arg(address.get(ProgramCounter)),"String_Node_Str" + loop));
    if (op.equals("String_Node_Str") || op.equals("String_Node_Str") || op.equals("String_Node_Str")|| op.equals("String_Node_Str")) {
      if (op.startsWith("String_Node_Str")) {
        Arg temp=arg1;
        arg1=arg2;
        arg2=temp;
      }
      if (arg2.mode == 0 && arg2.val == 0) {
        test=arg1;
      }
 else {
        if (!op.endsWith("String_Node_Str")) {
          freeS(arg1);
        }
        freeS(arg2);
        Arg testdest=mallocS();
        test=testdest.dup();
        test.mode++;
        if (op.endsWith("String_Node_Str")) {
          cond.add(new Command("String_Node_Str",arg2,new Arg(1),testdest));
        }
        cond.add(new Command("String_Node_Str",arg1,arg2,testdest));
      }
      cond.add(new Command("String_Node_Str",test,new Arg("String_Node_Str" + loop,delaySlots + 1),new Arg(address.get(ProgramCounter))));
    }
 else     if (op.equals("String_Node_Str")) {
      if (arg2.mode == 0 && arg2.val == 0) {
        test=arg1;
      }
 else       if (arg1.mode == 0 && arg1.val == 0) {
        test=arg2;
      }
 else {
        freeS(arg1);
        freeS(arg2);
        Arg testdest=mallocS();
        test=testdest.dup();
        test.mode++;
        cond.add(new Command("String_Node_Str",arg1,arg2,testdest));
      }
      cond.add(new Command("String_Node_Str",test,new Arg("String_Node_Str" + loop,delaySlots + 1),new Arg(address.get(ProgramCounter))));
    }
    if (optimizeDelay) {
      compileDelaySlots(ROM);
      int endloc=cond.size() - 1;
      if (endloc > delaySlots) {
        endloc=delaySlots;
      }
      cond.get(endloc).tag="String_Node_Str" + loop;
      for (int i=0; i < endloc; i++) {
        ROM.set(ROM.size() - delaySlots + i,cond.get(i));
      }
      compileDelaySlots(cond);
      loop.commands=cond;
    }
 else {
      compileDelaySlots(ROM);
      cond.get(0).tag="String_Node_Str" + loop;
      compileDelaySlots(cond);
      loop.commands=cond;
    }
  }
 else   if (type.equals("String_Node_Str")) {
    ROM.addAll(cond);
    Arg test=null;
    if (arg2.mode == 0 && op.equals("String_Node_Str")) {
      arg2.val--;
      op="String_Node_Str";
    }
    if (arg1.mode == 0 && op.equals("String_Node_Str")) {
      arg1.val++;
      op="String_Node_Str";
    }
    if (arg2.mode == 0 && op.equals("String_Node_Str")) {
      arg2.val++;
      op="String_Node_Str";
    }
    if (arg1.mode == 0 && op.equals("String_Node_Str")) {
      arg1.val--;
      op="String_Node_Str";
    }
    if (op.equals("String_Node_Str")) {
      if (arg2.mode == 0 && arg2.val == 0) {
        test=arg1;
      }
 else       if (arg1.mode == 0 && arg1.val == 0) {
        test=arg2;
      }
 else {
        freeS(arg1);
        freeS(arg2);
        Arg testdest=mallocS();
        test=testdest.dup();
        test.mode++;
        ROM.add(new Command("String_Node_Str",arg1,arg2,testdest));
      }
      ROM.add(new Command("String_Node_Str",test,new Arg("String_Node_Str" + loop,1),new Arg(address.get(ProgramCounter))));
      compileDelaySlots(ROM);
      ROM.get(ROM.size() - delaySlots - 1).tag="String_Node_Str" + loop;
    }
 else     if (op.equals("String_Node_Str") || op.equals("String_Node_Str")) {
      if (op.equals("String_Node_Str")) {
        Arg temp=arg1;
        arg1=arg2;
        arg2=temp;
      }
      if (arg2.mode == 0 && arg2.val == 0) {
        test=arg1;
      }
 else {
        freeS(arg1);
        freeS(arg2);
        Arg testdest=mallocS();
        test=testdest.dup();
        test.mode++;
        ROM.add(new Command("String_Node_Str",arg1,arg2,testdest));
      }
      ROM.add(new Command("String_Node_Str",test,new Arg("String_Node_Str" + loop,1),new Arg(address.get(ProgramCounter))));
      compileDelaySlots(ROM);
      ROM.get(ROM.size() - delaySlots - 1).tag="String_Node_Str" + loop;
    }
 else     if (op.equals("String_Node_Str") || op.equals("String_Node_Str")) {
      if (op.equals("String_Node_Str")) {
        Arg temp=arg1;
        arg1=arg2;
        arg2=temp;
      }
      freeS(arg2);
      Arg testdest=mallocS();
      test=testdest.dup();
      test.mode++;
      ROM.add(new Command("String_Node_Str",arg1,new Arg(1),testdest));
      ROM.add(new Command("String_Node_Str",test,arg2,testdest));
      ROM.add(new Command("String_Node_Str",test,new Arg("String_Node_Str" + loop,1),new Arg(address.get(ProgramCounter))));
      compileDelaySlots(ROM);
      ROM.get(ROM.size() - delaySlots - 1).tag="String_Node_Str" + loop;
    }
  }
}

Fixed version (ground truth):
/** 
 * Responsible for creating WHILE and IF statements It calculates the commands for the beginning and end of the loop The ending is stored in an OpenLoop to be added when then loop is closed
 * @param ROM Command list to modify
 */
public static void compileLoopStart(ArrayList<Command> ROM){
  String type=tokens.remove(0);
  OpenLoop loop=new OpenLoop(type);
  loops.add(0,loop);
  tokens.remove(0);
  ArrayList<Command> cond=new ArrayList<Command>();
  Arg arg1=compileRef(cond,false);
  String op=tokens.remove(0);
  Arg arg2=new Arg(0);
  if (op.equals("String_Node_Str")) {
    op="String_Node_Str";
  }
 else {
    arg2=compileRef(cond,false);
    tokens.remove(0);
  }
  String oBrace=tokens.remove(0);
  while (!oBrace.equals("String_Node_Str")) {
    loop.name+="String_Node_Str" + oBrace;
    oBrace=tokens.remove(0);
  }
  if (type.equals("String_Node_Str")) {
    Arg test=null;
    if (arg2.mode == 0 && op.equals("String_Node_Str")) {
      arg2.val++;
      op="String_Node_Str";
    }
    if (arg1.mode == 0 && op.equals("String_Node_Str")) {
      arg1.val--;
      op="String_Node_Str";
    }
    if (arg2.mode == 0 && op.equals("String_Node_Str")) {
      arg2.val--;
      op="String_Node_Str";
    }
    if (arg1.mode == 0 && op.equals("String_Node_Str")) {
      arg1.val++;
      op="String_Node_Str";
    }
    ROM.add(new Command("String_Node_Str",new Arg(-1),new Arg("String_Node_Str" + loop,0),new Arg(address.get(ProgramCounter)),"String_Node_Str" + loop));
    if (op.equals("String_Node_Str") || op.equals("String_Node_Str") || op.equals("String_Node_Str")|| op.equals("String_Node_Str")) {
      if (op.startsWith("String_Node_Str")) {
        Arg temp=arg1;
        arg1=arg2;
        arg2=temp;
      }
      if (arg2.mode == 0 && arg2.val == 0) {
        test=arg1;
      }
 else {
        if (!op.endsWith("String_Node_Str")) {
          freeS(arg1);
        }
        freeS(arg2);
        Arg testdest=mallocS();
        test=testdest.dup();
        test.mode++;
        if (op.endsWith("String_Node_Str")) {
          cond.add(new Command("String_Node_Str",arg2,new Arg(1),testdest));
        }
        cond.add(new Command("String_Node_Str",arg1,arg2,testdest));
      }
      cond.add(new Command("String_Node_Str",test,new Arg("String_Node_Str" + loop,delaySlots + 1),new Arg(address.get(ProgramCounter))));
    }
 else     if (op.equals("String_Node_Str")) {
      if (arg2.mode == 0 && arg2.val == 0) {
        test=arg1;
      }
 else       if (arg1.mode == 0 && arg1.val == 0) {
        test=arg2;
      }
 else {
        freeS(arg1);
        freeS(arg2);
        Arg testdest=mallocS();
        test=testdest.dup();
        test.mode++;
        cond.add(new Command("String_Node_Str",arg1,arg2,testdest));
      }
      cond.add(new Command("String_Node_Str",test,new Arg("String_Node_Str" + loop,delaySlots + 1),new Arg(address.get(ProgramCounter))));
    }
    if (optimizeDelay) {
      compileDelaySlots(ROM);
      int endloc=cond.size() - 1;
      if (endloc > delaySlots) {
        endloc=delaySlots;
      }
      cond.get(endloc).tags.add("String_Node_Str" + loop);
      for (int i=0; i < endloc; i++) {
        ROM.set(ROM.size() - delaySlots + i,cond.get(i));
      }
      compileDelaySlots(cond);
      loop.commands=cond;
    }
 else {
      compileDelaySlots(ROM);
      cond.get(0).tags.add("String_Node_Str" + loop);
      compileDelaySlots(cond);
      loop.commands=cond;
    }
  }
 else   if (type.equals("String_Node_Str")) {
    ROM.addAll(cond);
    Arg test=null;
    if (arg2.mode == 0 && op.equals("String_Node_Str")) {
      arg2.val--;
      op="String_Node_Str";
    }
    if (arg1.mode == 0 && op.equals("String_Node_Str")) {
      arg1.val++;
      op="String_Node_Str";
    }
    if (arg2.mode == 0 && op.equals("String_Node_Str")) {
      arg2.val++;
      op="String_Node_Str";
    }
    if (arg1.mode == 0 && op.equals("String_Node_Str")) {
      arg1.val--;
      op="String_Node_Str";
    }
    if (op.equals("String_Node_Str")) {
      if (arg2.mode == 0 && arg2.val == 0) {
        test=arg1;
      }
 else       if (arg1.mode == 0 && arg1.val == 0) {
        test=arg2;
      }
 else {
        freeS(arg1);
        freeS(arg2);
        Arg testdest=mallocS();
        test=testdest.dup();
        test.mode++;
        ROM.add(new Command("String_Node_Str",arg1,arg2,testdest));
      }
      ROM.add(new Command("String_Node_Str",test,new Arg("String_Node_Str" + loop,1),new Arg(address.get(ProgramCounter))));
      compileDelaySlots(ROM);
      ROM.get(ROM.size() - delaySlots - 1).tags.add("String_Node_Str" + loop);
    }
 else     if (op.equals("String_Node_Str") || op.equals("String_Node_Str")) {
      if (op.equals("String_Node_Str")) {
        Arg temp=arg1;
        arg1=arg2;
        arg2=temp;
      }
      if (arg2.mode == 0 && arg2.val == 0) {
        test=arg1;
      }
 else {
        freeS(arg1);
        freeS(arg2);
        Arg testdest=mallocS();
        test=testdest.dup();
        test.mode++;
        ROM.add(new Command("String_Node_Str",arg1,arg2,testdest));
      }
      ROM.add(new Command("String_Node_Str",test,new Arg("String_Node_Str" + loop,1),new Arg(address.get(ProgramCounter))));
      compileDelaySlots(ROM);
      ROM.get(ROM.size() - delaySlots - 1).tags.add("String_Node_Str" + loop);
    }
 else     if (op.equals("String_Node_Str") || op.equals("String_Node_Str")) {
      if (op.equals("String_Node_Str")) {
        Arg temp=arg1;
        arg1=arg2;
        arg2=temp;
      }
      freeS(arg2);
      Arg testdest=mallocS();
      test=testdest.dup();
      test.mode++;
      ROM.add(new Command("String_Node_Str",arg1,new Arg(1),testdest));
      ROM.add(new Command("String_Node_Str",test,arg2,testdest));
      ROM.add(new Command("String_Node_Str",test,new Arg("String_Node_Str" + loop,1),new Arg(address.get(ProgramCounter))));
      compileDelaySlots(ROM);
      ROM.get(ROM.size() - delaySlots - 1).tags.add("String_Node_Str" + loop);
    }
  }
}