anchor.diff:    }
   
     LocalsHandler(this.inferrer, this.compiler)
  -      : locals = new Map<Element, TypeMask>(),
  +      : locals = new VariableScope(),
           capturedAndBoxed = new Map<Element, Element>(),
           fieldsInitializedInConstructor = new Map<Element, TypeMask>(),
           inTryBlock = false,
           isThisExposed = true;
  +
     LocalsHandler.from(LocalsHandler other, {bool inTryBlock: false})
  -      : locals = new Map<Element, TypeMask>.from(other.locals),
  +      : locals = new VariableScope(other.locals),
           capturedAndBoxed = new Map<Element, Element>.from(
               other.capturedAndBoxed),
           fieldsInitializedInConstructor = new Map<Element, TypeMask>.from(
  
positive.code:    * whether the merge changed one of the variables types in [first].
     */
    bool merge(LocalsHandler other, {bool discardIfAborts: true}) {
      bool changed = false;
      List<Element> toRemove = <Element>[];
      // Iterating over a map and just updating its entries is OK.
      locals.forEach((Element local, TypeMask oldType) {
        TypeMask otherType = other.locals[local];
        bool isCaptured = capturedAndBoxed.containsKey(local);
        if (otherType == null) {
          if (!isCaptured) {
            // If [local] is not in the other map and is not captured
            // and boxed, we know it is not a
            // local we want to keep. For example, in an if/else, we don't
            // want to keep variables declared in the if or in the else
            // branch at the merge point.
            toRemove.add(local);
          }
          return;
        }
        if (!isCaptured && aborts && discardIfAborts) {
          locals[local] = otherType;
        } else if (!isCaptured && other.aborts && discardIfAborts) {
          // Don't do anything.
        } else {
          TypeMask type = computeLUB(oldType, otherType, compiler);
          if (type != oldType) changed = true;
          locals[local] = type;
        }
      });
  
  
negative.code:     saved.merge(locals);
      locals = saved;
      for (Node catchBlock in node.catchBlocks) {
        saved = locals;
        locals = new LocalsHandler.from(locals);
        visit(catchBlock);
        saved.merge(locals);
        locals = saved;
  