anchor.diff:        visit(node.finallyBlock)(rk, ek, () {
           addStatement(make.functionInvocation(finallyContName));
         });
  +      // Entering the finally block from the try block of a try/catch/finally
  +      // is one of two places where we jump out of a place to one with a
  +      // different handler (the other is entering the catch block from the try
  +      // block.  We need to have an appropriate exception handler in place for
  +      // catching synchronous exceptions.
  +      var exceptionName = newName('e');
  +      var stackTraceName = newName('s');
  +      if (node.catchClauses.isNotEmpty) {
  +        finallyBlock = make.tryStatement(finallyBlock,
  +            [make.catchClause(null, exceptionName, stackTraceName,
  +                 make.block([make.functionInvocation(ek,
  +                     [make.identifier(exceptionName),
  +                      make.identifier(stackTraceName)])]))]);
  +      }
   
         breakTargets = breakTargets.map(newBreakTarget).toList();
         continueTargets = continueTargets.map(newContinueTarget).toList();
  
positive.code: 
      currentBlock = savedBlock;
      addStatement(make.functionDeclarationStatement(joinName, [], joinBlock));
      var catchName = _translateCatchClauses(node.catchClauses, rk, ek, sk);
  
      var tryBlock = currentBlock = make.emptyBlock();
  
negative.code:         addStatement(make.functionInvocation(finallyName,
              [make.functionExpression([], returnBlock)]));
        };
        ek = make.parenthesizedExpression(
            make.functionExpression([exceptionName, stackTraceName],
                make.functionInvocation(finallyName,
  