anchor.diff:      JumpCollector join = new ForwardJumpCollector(environment);
       IrBuilder tryCatchBuilder = makeDelimitedBuilder();
   
  -    // Variables that are boxed due to being captured in a closure are boxed
  -    // for their entire lifetime, and so they do not need to be boxed on
  -    // entry to any try block.  They are not filtered out before this because
  -    // we can not identify all of them in the same pass where we identify the
  -    // variables assigned in the try (they may be captured by a closure after
  -    // the try statement).
  +    // Variables treated as mutable in a try are not mutable outside of it.
  +    // Work with a copy of the outer builder's mutable variables.
  +    tryCatchBuilder.mutableVariables =
  +        new Map<Local, ir.MutableVariable>.from(mutableVariables);
       for (LocalVariableElement variable in tryStatementInfo.boxedOnEntry) {
         assert(!tryCatchBuilder.isInMutableVariable(variable));
         ir.Primitive value = tryCatchBuilder.buildLocalVariableGet(variable);
  
positive.code:     _init(constantSystem, currentElement);
    }
  
    Map<ast.TryStatement, TryStatementInfo> get tryStatements => null;
    Set<Local> get mutableCapturedVariables => null;
    bool isInMutableVariable(Local local) => false;
    void makeMutableVariable(Local local) {}
    void removeMutableVariable(Local local) {}
  
    void enterInitializers() {
      assert(jsState.inInitializers == false);
      jsState.inInitializers = true;
  
negative.code:     for (LocalVariableElement variable in tryStatementInfo.boxedOnEntry) {
        assert(catchBuilder.isInMutableVariable(variable));
        ir.Primitive value = catchBuilder.buildLocalVariableGet(variable);
        // After this point, the variables that were boxed on entry to the try
        // are no longer treated as mutable.
        catchBuilder.removeMutableVariable(variable);
        catchBuilder.environment.update(variable, value);
      }
  