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:     };
    }
  
    void _exitHandler(exitCode) {
      if (_timer != null) _timer.cancel();
      _process.close();
      _startProcess(() {
        _reportResult(">>> TEST CRASH");
      });
    }
  
    void _timeoutHandler(ignore) {
      _process.onExit = (exitCode) {
        _process.close();
        _startProcess(() {
          _reportResult(">>> TEST TIMEOUT");
        });
      };
      _process.kill();
    }
  
  
negative.code:     _startTime = new Date.now();
      _testStdout = [];
      _testStderr = [];
      _status = null;
      _stdoutDrained = false;
      _stderrDrained = false;
      _ignoreStreams = new MutableValue<bool>(false);  // Captured by closures.
      _stdoutStream.onLine = _readStdout(_stdoutStream, _testStdout);
      _stderrStream.onLine = _readStderr(_stderrStream, _testStderr);
      _timer = new Timer(testCase.timeout * 1000, _timeoutHandler);
  