Program: 88836
Project: 88836
Buggy source:
protected Map<String,Object> readObject() throws ParseException, IOException {
  Map<String,Object> obj=this.containerFactory.createObjectContainer();
  if (c != '{')   throw new RuntimeException("String_Node_Str");
  handler.startObject();
  boolean needData=false;
  boolean acceptData=true;
  for (; ; ) {
    read();
switch (c) {
case ' ':
case '\r':
case '\t':
case '\n':
      continue;
case ':':
case ']':
case '[':
case '{':
    throw new ParseException(pos,ERROR_UNEXPECTED_CHAR,c);
case '}':
  if (needData && !acceptUselessComma)   throw new ParseException(pos,ERROR_UNEXPECTED_CHAR,(char)c);
read();
handler.endObject();
return obj;
case ',':
if (needData && !acceptUselessComma) throw new ParseException(pos,ERROR_UNEXPECTED_CHAR,(char)c);
acceptData=needData=true;
continue;
case '"':
case '\'':
default :
int keyStart=pos;
if (c == '\"' || c == '\'') {
readString();
}
 else {
readNQString(stopKey);
if (!acceptNonQuote) throw new ParseException(pos,ERROR_UNEXPECTED_TOKEN,xs);
}
String key=xs;
if (!acceptData) throw new ParseException(pos,ERROR_UNEXPECTED_TOKEN,key);
handler.startObjectEntry(key);
while (c != ':' && c != EOI) {
read();
}
if (c == EOI) throw new ParseException(pos - 1,ERROR_UNEXPECTED_EOF,null);
readNoEnd();
Object duplicate=obj.put(key,readMain(stopValue));
if (duplicate != null) throw new ParseException(keyStart,ERROR_UNEXPECTED_DUPLICATE_KEY,key);
handler.endObjectEntry();
if (c == '}') {
read();
handler.endObject();
return obj;
}
if (c == EOI) throw new ParseException(pos - 1,ERROR_UNEXPECTED_EOF,null);
if (c == ',') acceptData=needData=true;
 else acceptData=needData=false;
continue;
}
}
}

Fixed version (ground truth):
protected Map<String,Object> readObject() throws ParseException, IOException {
  Map<String,Object> obj=this.containerFactory.createObjectContainer();
  if (c != '{')   throw new RuntimeException("String_Node_Str");
  handler.startObject();
  boolean needData=false;
  boolean acceptData=true;
  for (; ; ) {
    read();
switch (c) {
case ' ':
case '\r':
case '\t':
case '\n':
      continue;
case ':':
case ']':
case '[':
case '{':
    throw new ParseException(pos,ERROR_UNEXPECTED_CHAR,c);
case '}':
  if (needData && !acceptUselessComma)   throw new ParseException(pos,ERROR_UNEXPECTED_CHAR,(char)c);
read();
handler.endObject();
return obj;
case ',':
if (needData && !acceptUselessComma) throw new ParseException(pos,ERROR_UNEXPECTED_CHAR,(char)c);
acceptData=needData=true;
continue;
case '"':
case '\'':
default :
int keyStart=pos;
if (c == '\"' || c == '\'') {
readString();
}
 else {
readNQString(stopKey);
if (!acceptNonQuote) throw new ParseException(pos,ERROR_UNEXPECTED_TOKEN,xs);
}
String key=xs;
if (!acceptData) throw new ParseException(pos,ERROR_UNEXPECTED_TOKEN,key);
handler.startObjectEntry(key);
skipSpace();
if (c != ':') {
if (c == EOI) throw new ParseException(pos - 1,ERROR_UNEXPECTED_EOF,null);
throw new ParseException(pos - 1,ERROR_UNEXPECTED_CHAR,c);
}
readNoEnd();
Object duplicate=obj.put(key,readMain(stopValue));
if (duplicate != null) throw new ParseException(keyStart,ERROR_UNEXPECTED_DUPLICATE_KEY,key);
handler.endObjectEntry();
if (c == '}') {
read();
handler.endObject();
return obj;
}
if (c == EOI) throw new ParseException(pos - 1,ERROR_UNEXPECTED_EOF,null);
if (c == ',') acceptData=needData=true;
 else acceptData=needData=false;
continue;
}
}
}