Buggy code:
public class INode extends AST { public ArrayList < AST > children ; public INode ( ASTType type , int lineNo , Object ... children ) { } public INode add ( ArrayList < AST > nodes ) { } private void indent ( int level ) { } public void dump ( int level ) { } @ Override public String toString ( ) { } @ Override public ASTValue eval ( WordsEnvironment environment ) throws WordsException { } private ASTValue evalAdd ( WordsEnvironment environment ) { } private ASTValue evalAlias ( WordsEnvironment environment ) { } private ASTValue evalAnd ( WordsEnvironment environment ) { } private ASTValue evalAssign ( WordsEnvironment environment ) { } private ASTValue evalClassStatementList ( WordsEnvironment environment ) { } private ASTValue evalCreateClass ( WordsEnvironment environment ) { } private ASTValue evalCreateObj ( WordsEnvironment environment ) throws WordsException { } private ASTValue evalDefineAction ( WordsEnvironment environment ) { } private ASTValue evalDefineProperty ( WordsEnvironment environment ) { } private ASTValue evalEquals ( WordsEnvironment environment ) { } private ASTValue evalExit ( WordsEnvironment environment ) { } private ASTValue evalExponentiate ( WordsEnvironment environment ) { } private ASTValue evalGEQ ( WordsEnvironment environment ) { } private ASTValue evalGreater ( WordsEnvironment environment ) { } private ASTValue evalIdentifierList ( WordsEnvironment environment ) { } private ASTValue evalIf ( WordsEnvironment environment ) { } private ASTValue evalLEQ ( WordsEnvironment environment ) { } private ASTValue evalLess ( WordsEnvironment environment ) { } private ASTValue evalListenerPerm ( WordsEnvironment environment ) { } private ASTValue evalListenerTemp ( WordsEnvironment environment ) { } private ASTValue evalMovesPredicate ( WordsEnvironment environment ) { } private ASTValue evalMultiply ( WordsEnvironment environment ) { } private ASTValue evalNegate ( WordsEnvironment environment ) { } private ASTValue evalNot ( WordsEnvironment environment ) { } private ASTValue evalOr ( WordsEnvironment environment ) { } private ASTValue evalParameter ( WordsEnvironment environment ) { } private ASTValue evalParameterList ( WordsEnvironment environment ) { } private ASTValue evalPosition ( WordsEnvironment environment ) throws WordsException { } private ASTValue evalQueueAction ( WordsEnvironment environment ) { } private ASTValue evalQueueAssign ( WordsEnvironment environment ) { } private ASTValue evalQueueAssignProperty ( WordsEnvironment environment ) { } private ASTValue evalQueueAssignPropertyList ( WordsEnvironment environment ) { } private ASTValue evalQueueMove ( WordsEnvironment environment ) throws WordsException { } private ASTValue evalQueueSay ( WordsEnvironment environment ) throws WordsException { ASTValue referenceObject = children . get ( 0 ) . eval ( environment ) ; ASTValue identifier = children . get ( 1 ) . eval ( environment ) ; <START_BUG> ASTValue message = children . get ( 2 ) . eval ( environment ) ; <END_BUG> ASTValue doNow = ( ( children . get ( 3 ) ) != null ) ? children . get ( 3 ) . eval ( environment ) : null ; WordsObject object ; if ( referenceObject . type . equals ( OBJ ) ) { WordsProperty property = referenceObject . objValue . getProperty ( identifier . stringValue ) ; if ( ( property . type ) != ( PropertyType . OBJECT ) ) { throw new InvalidTypeException ( this . lineNo , OBJ . toString ( ) , property . type . toString ( ) ) ; } object = property . objProperty ; } else { object = environment . getObject ( identifier . stringValue ) ; } if ( ( message . type ) != ( ValueType . STRING ) ) { throw new InvalidTypeException ( this . lineNo , STRING . toString ( ) , message . type . toString ( ) ) ; } WordsSay action = new WordsSay ( message . stringValue ) ; if ( doNow == null ) { object . enqueueAction ( action ) ; } else { object . enqueueActionAtFront ( action ) ; } return null ; } private ASTValue evalQueueStop ( WordsEnvironment environment ) { } private ASTValue evalQueueWait ( WordsEnvironment environment ) { } private ASTValue evalReferenceList ( WordsEnvironment environment ) { } private ASTValue evalRemove ( WordsEnvironment environment ) { } private ASTValue evalRepeat ( WordsEnvironment environment ) throws WordsException { } private ASTValue evalReset ( WordsEnvironment environment ) { } private ASTValue evalRetrieveProperty ( WordsEnvironment environment ) { } private ASTValue evalSaysPredicate ( WordsEnvironment environment ) { } private ASTValue evalStatementList ( WordsEnvironment environment ) { } private ASTValue evalSubject ( WordsEnvironment environment ) { } private ASTValue evalSubtract ( WordsEnvironment environment ) { } private ASTValue evalTouchesPredicate ( WordsEnvironment environment ) { } private ASTValue evalWaitsPredicate ( WordsEnvironment environment ) { } private ASTValue evalWhile ( WordsEnvironment environment ) { } }

Fix:
ASTValue message = children . get ( 2 ) . eval ( environment ) . getStringCoercedVal ( ) ;