anchor.diff:      return catchName;
     }
   
  +
  +
  +  _finallyBreakTarget(String finallyName) => (JumpTarget target) {
  +    return new JumpTarget(target.labels,
  +        make.parenthesizedExpression(
  +            make.functionExpression([],
  +                make.functionInvocation(finallyName,
  +                    [target.expression]))));
  +  };
  +
  +  _finallyContinueTarget(String finallyName) => (JumpTarget target) {
  +    if (target.trampolineName == null) {
  +      return _finallyBreakTarget(finallyName)(target);
  +    }
  +    return new JumpTarget(target.labels,
  +        make.parenthesizedExpression(
  +            make.functionExpression([],
  +                make.functionInvocation(finallyName,
  +                    [make.functionExpression([], make.block(
  +                         [make.assignmentExpression(
  +                              make.identifier(target.trampolineName),
  +                              target.expression)]))]))));
  +  };
  +
     visitTryStatement(ast.TryStatement node) => (rk, ek, sk) {
       var savedBlock = currentBlock;
       var joinName = newName('join');
  
positive.code:     var savedContinueTargets = continueTargets;
      var finallyName, finallyContName, finallyBlock;
      if (node.finallyBlock != null) {
        JumpTarget newBreakTarget(JumpTarget target) {
          return new JumpTarget(target.labels,
              make.parenthesizedExpression(
                  make.functionExpression([],
                      make.functionInvocation(finallyName,
                          [target.expression]))));
        }
  
        JumpTarget newContinueTarget(JumpTarget target) {
          if (target.trampolineName == null) {
            return newBreakTarget(target);
          }
          return new JumpTarget(target.labels,
              make.parenthesizedExpression(
                  make.functionExpression([],
                      make.functionInvocation(finallyName,
                          [make.functionExpression([], make.block(
                               [make.assignmentExpression(
                                    make.identifier(target.trampolineName),
                                    target.expression)]))]))));
        }
  
        finallyName = newName('finally');
        finallyContName = newName('cont');
        finallyBlock = currentBlock = make.emptyBlock();
  
negative.code:     }
      return (rk, ek, sk) {
        return visit(node.iterator)(ek, (expr) {
          var savedBlock = currentBlock;
          var doneBlock = currentBlock = make.emptyBlock();
          var doneName = newName('done');
          if (currentStream != null) {
            addStatement(make.methodInvocation(
                make.identifier(currentStream), 'resume', []));
          }
          sk();
  
          var finallyBlock = currentBlock = make.emptyBlock();
          var finallyName = newName('finally');
          var finallyContName = newName('cont');
          var exceptionName = newName('e');
          var stackTraceName = newName('s');
          var streamName = newName('stream');
          addStatement(make.tryStatement(make.block(
              [make.methodInvocation(
                   make.newInstance(make.identifier('Future', 'value'),
                       [make.methodInvocation(
                            make.identifier(streamName), 'cancel', [])]),
                   'then',
                   [make.identifier(finallyContName)])]),
              [make.catchClause(null, exceptionName, stackTraceName,
                  make.block([ek.apply(exceptionName, stackTraceName)]))]));
  
          var catchBlock = currentBlock = make.emptyBlock();
          var catchName = newName('catch');
          addStatement(make.functionInvocation(finallyName,
              [make.functionExpression([],
                   ek.apply(exceptionName, stackTraceName))]));
  
          var listenBlock = currentBlock = make.emptyBlock();
          var parameter = newName('x');
  