Program: 100228
Project: 100228
Buggy source:
public IMethod getMethod(Selector selector){
  if (DEBUG) {
    Trace.println("String_Node_Str" + selector + "String_Node_Str"+ this);
  }
  if (methodMap == null) {
    try {
      computeMethodMap();
    }
 catch (    InvalidClassFileException e1) {
      e1.printStackTrace();
      Assertions.UNREACHABLE();
    }
  }
  IMethod result=methodMap.get(selector);
  if (result != null) {
    return result;
  }
  if (inheritCache != null) {
    result=inheritCache.get(selector);
    if (result != null) {
      return result;
    }
  }
  try {
    if (!selector.equals(MethodReference.clinitSelector) && !selector.equals(MethodReference.initSelector)) {
      ShrikeClass superclass=(ShrikeClass)getSuperclass();
      if (superclass != null) {
        IMethod inherit=superclass.getMethod(selector);
        if (inherit != null) {
          if (inheritCache == null) {
            inheritCache=new BimodalMap<Selector,IMethod>(5);
          }
          inheritCache.put(selector,inherit);
          return inherit;
        }
      }
    }
  }
 catch (  ClassHierarchyException e) {
    Assertions.UNREACHABLE();
  }
  try {
    if (isInterface() || isAbstract()) {
      final Iterator<IClass> it=(isInterface()) ? getAllAncestorInterfaces().iterator() : getAllImplementedInterfaces().iterator();
      while (it.hasNext()) {
        IClass k=it.next();
        result=k.getMethod(selector);
        if (result != null) {
          return result;
        }
      }
    }
  }
 catch (  ClassHierarchyException e) {
    e.printStackTrace();
    Assertions.UNREACHABLE("String_Node_Str" + this);
  }
  return null;
}

Fixed version (ground truth):
public IMethod getMethod(Selector selector){
  if (DEBUG) {
    Trace.println("String_Node_Str" + selector + "String_Node_Str"+ this);
  }
  if (methodMap == null) {
    try {
      computeMethodMap();
    }
 catch (    InvalidClassFileException e1) {
      e1.printStackTrace();
      Assertions.UNREACHABLE();
    }
  }
  IMethod result=methodMap.get(selector);
  if (result != null) {
    return result;
  }
  if (inheritCache != null) {
    result=inheritCache.get(selector);
    if (result != null) {
      return result;
    }
  }
  try {
    if (!selector.equals(MethodReference.clinitSelector) && !selector.equals(MethodReference.initSelector)) {
      ShrikeClass superclass=(ShrikeClass)getSuperclass();
      if (superclass != null) {
        IMethod inherit=superclass.getMethod(selector);
        if (inherit != null) {
          if (inheritCache == null) {
            inheritCache=new BimodalMap<Selector,IMethod>(5);
          }
          inheritCache.put(selector,inherit);
          return inherit;
        }
      }
    }
  }
 catch (  ClassHierarchyException e) {
    Assertions.UNREACHABLE();
  }
  try {
    if (isInterface() || isAbstract()) {
      final Iterator<IClass> it=getAllImplementedInterfaces().iterator();
      while (it.hasNext()) {
        IClass k=it.next();
        result=k.getMethod(selector);
        if (result != null) {
          return result;
        }
      }
    }
  }
 catch (  ClassHierarchyException e) {
    e.printStackTrace();
    Assertions.UNREACHABLE("String_Node_Str" + this);
  }
  return null;
}