Program: 77217
Project: 77217
Buggy source:
/** 
 * Generate an indy method call to the meta factory
 */
private JCExpression makeMetafactoryIndyCall(TranslationContext<?> context,int refKind,Symbol refSym,List<JCExpression> indy_args){
  JCFunctionalExpression tree=context.tree;
  MethodSymbol samSym=(MethodSymbol)types.findDescriptorSymbol(tree.type.tsym);
  List<Object> staticArgs=List.<Object>of(typeToMethodType(samSym.type),new Pool.MethodHandle(refKind,refSym,types),typeToMethodType(tree.getDescriptorType(types)));
  ListBuffer<Type> indy_args_types=new ListBuffer<>();
  for (  JCExpression arg : indy_args) {
    indy_args_types.append(arg.type);
  }
  MethodType indyType=new MethodType(indy_args_types.toList(),tree.type,List.<Type>nil(),syms.methodClass);
  Name metafactoryName=context.needsAltMetafactory() ? names.altMetafactory : names.metafactory;
  if (context.needsAltMetafactory()) {
    ListBuffer<Object> markers=new ListBuffer<>();
    for (    Type t : tree.targets.tail) {
      if (t.tsym != syms.serializableType.tsym) {
        markers.append(t.tsym);
      }
    }
    int flags=context.isSerializable() ? FLAG_SERIALIZABLE : 0;
    boolean hasMarkers=markers.nonEmpty();
    boolean hasBridges=context.bridges.nonEmpty();
    if (hasMarkers) {
      flags|=FLAG_MARKERS;
    }
    if (hasBridges) {
      flags|=FLAG_BRIDGES;
    }
    staticArgs=staticArgs.append(flags);
    if (hasMarkers) {
      staticArgs=staticArgs.append(markers.length());
      staticArgs=staticArgs.appendList(markers.toList());
    }
    if (hasBridges) {
      staticArgs=staticArgs.append(context.bridges.length() - 1);
      for (      Symbol s : context.bridges) {
        Type s_erasure=s.erasure(types);
        if (!types.isSameType(s_erasure,samSym.erasure(types))) {
          staticArgs=staticArgs.append(s.erasure(types));
        }
      }
    }
    if (context.isSerializable()) {
      int prevPos=make.pos;
      try {
        make.at(kInfo.clazz);
        addDeserializationCase(refKind,refSym,tree.type,samSym,tree,staticArgs,indyType);
      }
  finally {
        make.at(prevPos);
      }
    }
  }
  return makeIndyCall(tree,syms.lambdaMetafactory,metafactoryName,staticArgs,indyType,indy_args,samSym.name);
}

Fixed version (ground truth):
/** 
 * Generate an indy method call to the meta factory
 */
private JCExpression makeMetafactoryIndyCall(TranslationContext<?> context,int refKind,Symbol refSym,List<JCExpression> indy_args){
  JCFunctionalExpression tree=context.tree;
  MethodSymbol samSym=(MethodSymbol)types.findDescriptorSymbol(tree.type.tsym);
  List<Object> staticArgs=List.<Object>of(typeToMethodType(samSym.type),new Pool.MethodHandle(refKind,refSym,types),typeToMethodType(tree.getDescriptorType(types)));
  ListBuffer<Type> indy_args_types=new ListBuffer<>();
  for (  JCExpression arg : indy_args) {
    indy_args_types.append(arg.type);
  }
  MethodType indyType=new MethodType(indy_args_types.toList(),tree.type,List.<Type>nil(),syms.methodClass);
  Name metafactoryName=context.needsAltMetafactory() ? names.altMetafactory : names.metafactory;
  if (context.needsAltMetafactory()) {
    ListBuffer<Object> markers=new ListBuffer<>();
    for (    Type t : tree.targets.tail) {
      if (t.tsym != syms.serializableType.tsym) {
        markers.append(t.tsym);
      }
    }
    int flags=context.isSerializable() ? FLAG_SERIALIZABLE : 0;
    boolean hasMarkers=markers.nonEmpty();
    boolean hasBridges=context.bridges.nonEmpty();
    if (hasMarkers) {
      flags|=FLAG_MARKERS;
    }
    if (hasBridges) {
      flags|=FLAG_BRIDGES;
    }
    staticArgs=staticArgs.append(flags);
    if (hasMarkers) {
      staticArgs=staticArgs.append(markers.length());
      staticArgs=staticArgs.appendList(markers.toList());
    }
    if (hasBridges) {
      staticArgs=staticArgs.append(context.bridges.length() - 1);
      for (      Symbol s : context.bridges) {
        Type s_erasure=s.erasure(types);
        if (!types.isSameType(s_erasure,samSym.erasure(types))) {
          staticArgs=staticArgs.append(s.erasure(types));
        }
      }
    }
    if (context.isSerializable()) {
      addDeserializationCase(refKind,refSym,tree.type,samSym,tree,staticArgs,indyType);
    }
  }
  return makeIndyCall(tree,syms.lambdaMetafactory,metafactoryName,staticArgs,indyType,indy_args,samSym.name);
}