Program: 44150
Project: 44150
Buggy source:
/** 
 * Expects the next object of the given tokenizer to be an array and parses it into the given   {@link ParseContext}
 * @param cx
 * @param tokenizer
 * @throws InstantiationException
 * @throws IllegalAccessException
 * @throws InvocationTargetException
 * @throws NoSuchMethodException
 */
private void parseArrayInto(ParseContext cx,JSONTokenizer tokenizer) throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
  boolean containerIsCollection=Collection.class.isAssignableFrom(cx.target.getClass());
  boolean first=true;
  while (true) {
    Token valueToken=tokenizer.next();
    TokenType valueType=valueToken.type();
    if (valueType == TokenType.BRACKET_CLOSE) {
      break;
    }
    if (!first) {
      valueToken.expect(TokenType.COMMA);
      valueToken=tokenizer.next();
      valueType=valueToken.type();
    }
    Object value;
    Class typeHint=getTypeHint(cx,cx.getParsePathInfo("String_Node_Str"),tokenizer,"String_Node_Str",false,valueType.isPrimitive());
    if (valueType.isPrimitive()) {
      value=valueToken.value();
      if (typeHint != null) {
        value=convertValueTo(value,typeHint,typeConvertersByClass);
      }
    }
 else {
      Object newTarget=null;
      if (valueType == TokenType.BRACE_OPEN) {
        JSONClassInfo classInfo=TypeAnalyzer.getClassInfo(objectSupport,typeHint);
        newTarget=createNewTargetInstance(typeHint,classInfo,true);
        parseObjectInto(cx.push(newTarget,null,"String_Node_Str",classInfo),tokenizer);
        newTarget=DelayedConstructor.unwrap(newTarget);
        if (classInfo != null) {
          Method postConstructMethod=classInfo.getPostConstructMethod();
          if (postConstructMethod != null) {
            postConstructMethod.invoke(newTarget);
          }
        }
      }
 else       if (valueType == TokenType.BRACKET_OPEN) {
        JSONClassInfo classInfo=TypeAnalyzer.getClassInfo(objectSupport,typeHint);
        newTarget=createNewTargetInstance(typeHint,classInfo,false);
        parseArrayInto(cx.push(newTarget,null,"String_Node_Str",classInfo),tokenizer);
        newTarget=DelayedConstructor.unwrap(newTarget);
        if (classInfo != null) {
          Method postConstructMethod=classInfo.getPostConstructMethod();
          if (postConstructMethod != null) {
            postConstructMethod.invoke(newTarget);
          }
        }
      }
 else {
        throw new JSONParseException("String_Node_Str" + valueToken);
      }
      value=newTarget;
    }
    if (containerIsCollection) {
      ((Collection)cx.target).add(value);
    }
 else {
      throw new JSONParseException("String_Node_Str" + value + "String_Node_Str"+ cx.target+ "String_Node_Str"+ cx.target.getClass()+ "String_Node_Str");
    }
    first=false;
  }
}

Fixed version (ground truth):
/** 
 * Expects the next object of the given tokenizer to be an array and parses it into the given   {@link ParseContext}
 * @param cx            parse context
 * @param tokenizer     tokenizer
 * @throws InstantiationException       if an object instantiation goes wrong
 * @throws IllegalAccessException       if a method cannot be accessed in the currrent security context
 * @throws InvocationTargetException    if an exception occured in the methods used to set parsed information
 * @throws NoSuchMethodException        if a method is mysteriously missing suddenly
 */
private void parseArrayInto(ParseContext cx,JSONTokenizer tokenizer) throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
  boolean containerIsCollection=Collection.class.isAssignableFrom(cx.target.getClass());
  boolean first=true;
  while (true) {
    Token valueToken=tokenizer.next();
    TokenType valueType=valueToken.type();
    if (valueType == TokenType.BRACKET_CLOSE) {
      break;
    }
    if (!first) {
      valueToken.expect(TokenType.COMMA);
      valueToken=tokenizer.next();
      valueType=valueToken.type();
    }
    Object value;
    Class typeHint=getTypeHint(cx,cx.getParsePathInfo("String_Node_Str"),tokenizer,"String_Node_Str",false,valueType.isPrimitive());
    if (valueType.isPrimitive()) {
      value=valueToken.value();
      if (typeHint != null) {
        value=convertValueTo(value,typeHint,typeConvertersByClass);
      }
    }
 else {
      Object newTarget=null;
      if (valueType == TokenType.BRACE_OPEN) {
        JSONClassInfo classInfo=TypeAnalyzer.getClassInfo(objectSupport,typeHint);
        newTarget=createNewTargetInstance(typeHint,classInfo,true);
        parseObjectInto(cx.push(newTarget,null,"String_Node_Str",classInfo),tokenizer);
        newTarget=DelayedConstructor.unwrap(newTarget);
        if (classInfo != null) {
          Method postConstructMethod=classInfo.getPostConstructMethod();
          if (postConstructMethod != null) {
            postConstructMethod.invoke(newTarget);
          }
        }
      }
 else       if (valueType == TokenType.BRACKET_OPEN) {
        JSONClassInfo classInfo=TypeAnalyzer.getClassInfo(objectSupport,typeHint);
        newTarget=createNewTargetInstance(typeHint,classInfo,false);
        parseArrayInto(cx.push(newTarget,null,"String_Node_Str",classInfo),tokenizer);
        newTarget=DelayedConstructor.unwrap(newTarget);
        if (classInfo != null) {
          Method postConstructMethod=classInfo.getPostConstructMethod();
          if (postConstructMethod != null) {
            postConstructMethod.invoke(newTarget);
          }
        }
      }
 else {
        throw new JSONParseException("String_Node_Str" + valueToken);
      }
      value=newTarget;
    }
    if (containerIsCollection) {
      ((Collection)cx.target).add(value);
    }
 else {
      throw new JSONParseException("String_Node_Str" + value + "String_Node_Str"+ cx.target+ "String_Node_Str"+ cx.target.getClass()+ "String_Node_Str");
    }
    first=false;
  }
}