Program: 98080
Project: 98080
Buggy source:
private final void writeClassInfo(Class<?> cls,Object val){
  if (cls == null) {
    out.writeByte(SerializerTools.REF_NULL_ID);
    return;
  }
  Byte id=SerializerTools.PRE_DEF_CLASSES_MAP.get(cls);
  if (id != null) {
    out.writeByte(id);
    return;
  }
  if (isPersistentCapable(cls)) {
    out.writeByte(SerializerTools.REF_PERS_ID);
    if (val != null) {
      long soid=((ZooPC)val).jdoZooGetClassDef().getOid();
      out.writeLong(soid);
    }
 else {
      long soid=cache.getSchema(cls,node).getOid();
      out.writeLong(soid);
    }
    return;
  }
  if (GenericObject.class == cls) {
    out.writeByte(SerializerTools.REF_PERS_ID);
    if (val != null) {
      long soid=((GenericObject)val).getClassDef().getOid();
      out.writeLong(soid);
    }
 else {
      long soid=cache.getSchema(cls,node).getOid();
      out.writeLong(soid);
    }
    return;
  }
  if (GOProxy.class.isAssignableFrom(cls)) {
    out.writeByte(SerializerTools.REF_PERS_ID);
    if (val != null) {
      long soid=((GOProxy)val).getGenericObject().getClassDef().getOid();
      out.writeLong(soid);
    }
 else {
      long soid=cache.getSchema(cls,node).getOid();
      out.writeLong(soid);
    }
    return;
  }
  if (cls.isArray()) {
    out.writeByte(SerializerTools.REF_ARRAY_ID);
    return;
  }
  id=usedClasses.get(cls);
  if (id != null) {
    out.writeByte(id);
    return;
  }
  out.writeByte(SerializerTools.REF_CUSTOM_CLASS_ID);
  writeString(cls.getName());
  int idInt=(usedClasses.size() + 1 + SerializerTools.REF_CLS_OFS);
  if (idInt > 125) {
    throw DBLogger.newFatal("String_Node_Str" + idInt);
  }
  usedClasses.put(cls,(byte)idInt);
}

Fixed version (ground truth):
private final void writeClassInfo(Class<?> cls,Object val){
  if (cls == null) {
    out.writeByte(SerializerTools.REF_NULL_ID);
    return;
  }
  Byte id=SerializerTools.PRE_DEF_CLASSES_MAP.get(cls);
  if (id != null) {
    out.writeByte(id);
    return;
  }
  if (isPersistentCapable(cls)) {
    out.writeByte(SerializerTools.REF_PERS_ID);
    if (val != null) {
      long soid=((ZooPC)val).jdoZooGetClassDef().getOid();
      out.writeLong(soid);
    }
 else {
      long soid=cache.getSchema(cls,node).getOid();
      out.writeLong(soid);
    }
    return;
  }
  if (GenericObject.class == cls) {
    out.writeByte(SerializerTools.REF_PERS_ID);
    if (val != null) {
      long soid=((GenericObject)val).getClassDef().getOid();
      out.writeLong(soid);
    }
 else {
      long soid=cache.getSchema(cls,node).getOid();
      out.writeLong(soid);
    }
    return;
  }
  if (GOProxy.class.isAssignableFrom(cls)) {
    out.writeByte(SerializerTools.REF_PERS_ID);
    if (val != null) {
      long soid=((GOProxy)val).getGenericObject().getClassDef().getOid();
      out.writeLong(soid);
    }
 else {
      long soid=cache.getSchema(cls,node).getOid();
      out.writeLong(soid);
    }
    return;
  }
  if (cls.isArray()) {
    out.writeByte(SerializerTools.REF_ARRAY_ID);
    return;
  }
  id=usedClasses.get(cls);
  if (id != null) {
    out.writeByte(id);
    return;
  }
  out.writeByte(SerializerTools.REF_CUSTOM_CLASS_ID);
  writeString(cls.getName());
  int idInt=(usedClasses.size() + 1 + SerializerTools.REF_CLS_OFS);
  if (idInt > 125) {
    throw DBLogger.newFatalInternal("String_Node_Str" + idInt);
  }
  usedClasses.put(cls,(byte)idInt);
}