Buggy code:
public class RecoveredMethod extends RecoveredElement implements TerminalTokens { public AbstractMethodDeclaration methodDeclaration ; public RecoveredType [ ] localTypes ; public int localTypeCount ; public RecoveredBlock methodBody ; public boolean discardBody = true ; public RecoveredMethod ( AbstractMethodDeclaration methodDeclaration , RecoveredElement parent , int bracketBalance , Parser parser ) { } public RecoveredElement add ( Block nestedBlockDeclaration , int bracketBalanceValue ) { } public RecoveredElement add ( FieldDeclaration fieldDeclaration , int bracketBalanceValue ) { } public RecoveredElement add ( LocalDeclaration localDeclaration , int bracketBalanceValue ) { } public RecoveredElement add ( Statement statement , int bracketBalanceValue ) { } public RecoveredElement add ( TypeDeclaration typeDeclaration , int bracketBalanceValue ) { } public boolean bodyStartsAtHeaderEnd ( ) { } public ASTNode parseTree ( ) { } public int sourceEnd ( ) { } public String toString ( int tab ) { } public void updateBodyStart ( int bodyStart ) { } public AbstractMethodDeclaration updatedMethodDeclaration ( ) { } public void updateFromParserState ( ) { if ( ( this . bodyStartsAtHeaderEnd ( ) ) && ( ( this . parent ) != null ) ) { Parser parser = this . parser ( ) ; if ( ( ( parser . listLength ) > 0 ) && ( ( parser . astLengthPtr ) > 0 ) ) { if ( ( methodDeclaration . sourceEnd ) == ( parser . rParenPos ) ) { int length = parser . astLengthStack [ parser . astLengthPtr ] ; int astPtr = ( parser . astPtr ) - length ; boolean canConsume = astPtr >= 0 ; if ( canConsume ) { if ( ! ( ( parser . astStack [ astPtr ] ) instanceof AbstractMethodDeclaration ) ) { canConsume = false ; } for ( int i = 1 , max = length + 1 ; i < max ; i ++ ) { if ( ! ( ( parser . astStack [ ( astPtr + i ) ] ) instanceof TypeReference ) ) { canConsume = false ; } } } if ( canConsume ) { parser . consumeMethodHeaderThrowsClause ( ) ; } else { parser . listLength = 0 ; } } else { if ( ( ( parser . currentToken ) == ( TerminalTokens . TokenNameLPAREN ) ) || ( ( parser . currentToken ) == ( TerminalTokens . TokenNameSEMICOLON ) ) ) { ( parser . astLengthStack [ parser . astLengthPtr ] ) -- ; ( parser . astPtr ) -- ; ( parser . listLength ) -- ; parser . currentToken = 0 ; } int argLength = parser . astLengthStack [ parser . astLengthPtr ] ; int argStart = ( ( parser . astPtr ) - argLength ) + 1 ; boolean needUpdateRParenPos = ( parser . rParenPos ) < ( parser . lParenPos ) ; MemberValuePair [ ] memberValuePairs = null ; <START_BUG> if ( ( argLength > 0 ) && ( ( parser . astStack [ parser . astPtr ] ) instanceof MemberValuePair ) ) { <END_BUG> System . arraycopy ( parser . astStack , argStart , ( memberValuePairs = new MemberValuePair [ argLength ] ) , 0 , argLength ) ; ( parser . astLengthPtr ) -- ; parser . astPtr -= argLength ; argLength = parser . astLengthStack [ parser . astLengthPtr ] ; argStart = ( ( parser . astPtr ) - argLength ) + 1 ; needUpdateRParenPos = true ; } int count ; for ( count = 0 ; count < argLength ; count ++ ) { ASTNode aNode = parser . astStack [ ( argStart + count ) ] ; if ( aNode instanceof Argument ) { Argument argument = ( ( Argument ) ( aNode ) ) ; char [ ] [ ] argTypeName = argument . type . getTypeName ( ) ; if ( ( ( ( argument . modifiers ) & ( ~ ( ClassFileConstants . AccFinal ) ) ) != 0 ) || ( ( ( argTypeName . length ) == 1 ) && ( CharOperation . equals ( argTypeName [ 0 ] , TypeBinding . VOID . sourceName ( ) ) ) ) ) { parser . astLengthStack [ parser . astLengthPtr ] = count ; parser . astPtr = ( argStart + count ) - 1 ; parser . listLength = count ; parser . currentToken = 0 ; break ; } if ( needUpdateRParenPos ) parser . rParenPos = ( argument . sourceEnd ) + 1 ; } else { parser . astLengthStack [ parser . astLengthPtr ] = count ; parser . astPtr = ( argStart + count ) - 1 ; parser . listLength = count ; parser . currentToken = 0 ; break ; } } if ( ( ( parser . listLength ) > 0 ) && ( ( parser . astLengthPtr ) > 0 ) ) { int length = parser . astLengthStack [ parser . astLengthPtr ] ; int astPtr = ( parser . astPtr ) - length ; boolean canConsume = astPtr >= 0 ; if ( canConsume ) { if ( ! ( ( parser . astStack [ astPtr ] ) instanceof AbstractMethodDeclaration ) ) { canConsume = false ; } for ( int i = 1 , max = length + 1 ; i < max ; i ++ ) { if ( ! ( ( parser . astStack [ ( astPtr + i ) ] ) instanceof Argument ) ) { canConsume = false ; } } } if ( canConsume ) { parser . consumeMethodHeaderRightParen ( ) ; if ( ( parser . currentElement ) == ( this ) ) { methodDeclaration . sourceEnd = methodDeclaration . arguments [ ( ( methodDeclaration . arguments . length ) - 1 ) ] . sourceEnd ; methodDeclaration . bodyStart = ( methodDeclaration . sourceEnd ) + 1 ; parser . lastCheckPoint = methodDeclaration . bodyStart ; } } }

Fix:
while ( ( argLength > 0 ) && ( ( parser . astStack [ parser . astPtr ] ) instanceof MemberValuePair ) ) {