Buggy code:
public class MessageSend extends Expression implements InvocationSite { public Expression receiver ; public char [ ] selector ; public Expression [ ] arguments ; public MethodBinding binding ; protected MethodBinding codegenBinding ; MethodBinding syntheticAccessor ; public TypeBinding expectedType ; public long nameSourcePosition ; public TypeBinding receiverType ; public TypeBinding qualifyingType ; public TypeBinding genericCast ; public TypeReference [ ] typeArguments ; public TypeBinding [ ] genericTypeArguments ; public FlowInfo analyseCode ( BlockScope currentScope , FlowContext flowContext , FlowInfo flowInfo ) { } public void computeConversion ( Scope scope , TypeBinding runtimeTimeType , TypeBinding compileTimeType ) { } public void generateCode ( BlockScope currentScope , CodeStream codeStream , boolean valueRequired ) { int pc = codeStream . position ; boolean isStatic = this . codegenBinding . isStatic ( ) ; if ( ( ( ! isStatic ) && ( ( ( bits ) & ( ASTNode . DepthMASK ) ) != 0 ) ) && ( receiver . isImplicitThis ( ) ) ) { ReferenceBinding targetType = currentScope . enclosingSourceType ( ) . enclosingTypeAt ( ( ( ( bits ) & ( ASTNode . DepthMASK ) ) > > ( ASTNode . DepthSHIFT ) ) ) ; Object [ ] path = currentScope . getEmulationPath ( targetType , true , false ) ; codeStream . generateOuterAccess ( path , this , targetType , currentScope ) ; } else { receiver . generateCode ( currentScope , codeStream , ( ! isStatic ) ) ; } <START_BUG> if ( binding . isVararg ( ) ) { <END_BUG> TypeBinding [ ] params = binding . parameters ; int lastIndex = ( params . length ) - 1 ; for ( int i = 0 ; i < lastIndex ; i ++ ) { arguments [ i ] . generateCode ( currentScope , codeStream , true ) ; } ArrayBinding varArgsType = ( ( ArrayBinding ) ( params [ lastIndex ] ) ) ; int argLength = ( ( arguments ) == null ) ? 0 : arguments . length ; if ( lastIndex < argLength ) { if ( ( ( params . length ) == argLength ) && ( ( varArgsType . dimensions ( ) ) == ( arguments [ lastIndex ] . resolvedType . dimensions ( ) ) ) ) { arguments [ lastIndex ] . generateCode ( currentScope , codeStream , true ) ; } else { codeStream . generateInlinedValue ( ( argLength - lastIndex ) ) ; codeStream . newArray ( currentScope , varArgsType ) ; int elementsTypeID = varArgsType . elementsType ( ) . id ; for ( int i = 0 , max = argLength - lastIndex ; i < max ; i ++ ) { codeStream . dup ( ) ; codeStream . generateInlinedValue ( i ) ; arguments [ ( i + lastIndex ) ] . generateCode ( currentScope , codeStream , true ) ; codeStream . arrayAtPut ( elementsTypeID , false ) ; } } } else { codeStream . generateInlinedValue ( 0 ) ; codeStream . newArray ( currentScope , varArgsType ) ; } } else if ( ( arguments ) != null ) { for ( int i = 0 , max = arguments . length ; i < max ; i ++ ) { arguments [ i ] . generateCode ( currentScope , codeStream , true ) ; } } if ( ( syntheticAccessor ) == null ) { if ( isStatic ) { codeStream . invokestatic ( this . codegenBinding ) ; } else { if ( ( receiver . isSuper ( ) ) || ( this . codegenBinding . isPrivate ( ) ) ) { codeStream . invokespecial ( this . codegenBinding ) ; } else { if ( this . codegenBinding . declaringClass . isInterface ( ) ) { codeStream . invokeinterface ( this . codegenBinding ) ; } else { codeStream . invokevirtual ( this . codegenBinding ) ; } } } } else { codeStream . invokestatic ( syntheticAccessor ) ; } if ( valueRequired ) { codeStream . generateImplicitConversion ( implicitConversion ) ; if ( ( this . genericCast ) != null ) codeStream . checkcast ( this . genericCast ) ; } else { switch ( binding . returnType . id ) { case TypeIds . T_long : case TypeIds . T_double : codeStream . pop2 ( ) ; break ; case TypeIds . T_void : break ; default : codeStream . pop ( ) ; } } codeStream . recordPositionsFrom ( pc , ( ( int ) ( ( this . nameSourcePosition ) > > > 32 ) ) ) ; } public TypeBinding [ ] genericTypeArguments ( ) { } public boolean isSuperAccess ( ) { } public boolean isTypeAccess ( ) { } public void manageSyntheticAccessIfNecessary ( BlockScope currentScope , FlowInfo flowInfo ) { } public StringBuffer printExpression ( int indent , StringBuffer output ) { } public TypeBinding resolveType ( BlockScope scope ) { } public void setActualReceiverType ( ReferenceBinding receiverType ) { } public void setExpectedType ( TypeBinding expectedType ) { } public void setDepth ( int depth ) { } public void setFieldIndex ( int depth ) { } public void traverse ( ASTVisitor visitor , BlockScope blockScope ) { } }

Fix:
if ( binding . isVarargs ( ) ) {