anchor.diff:          }
           line = stream.readLine();
         }
  -      if (status != null) {
  +      if (_status != null) {
           _timer.cancel();
  -        // For crashing processes, let the exit handler deal with it.
  -        if (!status.contains("CRASH")) {
  -          _reportResult(status);
  -        }
  +        _stdoutDone();
         }
       };
     }
   
     Function _readStderr(StringInputStream stream, List<String> buffer) {
  +    var ignoreStreams = _ignoreStreams;  // Capture this mutable object.
       return () {
  +      if (ignoreStreams.value) {
  +        while (stream.readLine() != null) {
  +	  // Do nothing.
  +        }
  +	return;
  +      }
  +      // Otherwise, process output and call _reportResult() when done.
         var line = stream.readLine();
         while (line != null) {
           if (line.startsWith('>>> EOF STDERR')) {
  
positive.code:     return Strings.join(arguments, ' ').concat('\n');
    }
  
    void _testCompleted() {
      var test = _currentTest;
      _currentTest = null;
      test.completed();
    }
  
    int _reportResult(String output) {
      _stdoutDrained = true;
      // output = '>>> TEST {PASS, FAIL, OK, CRASH, FAIL, TIMEOUT}'
      var outcome = output.split(" ")[2];
      var exitCode = 0;
      if (outcome == "CRASH") exitCode = -10;
      if (outcome == "FAIL" || outcome == "TIMEOUT") exitCode = 1;
      new TestOutput.fromCase(_currentTest, exitCode, (outcome == "TIMEOUT"),
                              _testStdout, _testStderr,
                              new Date.now().difference(_startTime));
      // Move on when both stdout and stderr has been drained. If the test
      // crashed, we restarted the process and therefore do not attempt to
      // drain stderr.
      if (_stderrDrained || (_currentTest.output.hasCrashed)) _testCompleted();
    }
  
    void _stderrDone() {
      _stderrDrained = true;
      // Move on when both stdout and stderr has been drained.
      if (_stdoutDrained) _testCompleted();
    }
  
    Function _readStdout(StringInputStream stream, List<String> buffer) {
      return () {
        var status;
        var line = stream.readLine();
        while (line != null) {
          if (line.startsWith('>>> TEST')) {
            status = line;
          } else if (line.startsWith('>>> BATCH START')) {
            // ignore
          } else if (line.startsWith('>>> ')) {
  
negative.code:   }
  }
  
  /**
   * This class holds a value, that can be changed.  It is used when
   * closures need a shared value, that they can all change and read.
   */
  class MutableValue<T> {
    MutableValue(T this.value);
    T value;
  }
  
  class BatchRunnerProcess {
    String _executable;
    List<String> _batchArguments;
  