anchor.diff:      int tag = readByte();
       switch (tag) {
         case Tag.ExpressionStatement:
  -        return new ExpressionStatement(readExpression());
  +        return _readExpressionStatement();
         case Tag.Block:
  -        return readBlock();
  +        return _readBlock();
         case Tag.AssertBlock:
  -        return readAssertBlock();
  +        return _readAssertBlock();
         case Tag.EmptyStatement:
  -        return new EmptyStatement();
  +        return _readEmptyStatement();
         case Tag.AssertStatement:
  -        return new AssertStatement(readExpression(),
  -            conditionStartOffset: readOffset(),
  -            conditionEndOffset: readOffset(),
  -            message: readExpressionOption());
  +        return _readAssertStatement();
         case Tag.LabeledStatement:
  -        LabeledStatement label = new LabeledStatement(null);
  -        labelStack.add(label);
  -        label.body = readStatement()..parent = label;
  -        labelStack.removeLast();
  -        return label;
  +        return _readLabeledStatement();
         case Tag.BreakStatement:
  -        int offset = readOffset();
  -        int index = readUInt30();
  -        return new BreakStatement(labelStack[labelStackBase + index])
  -          ..fileOffset = offset;
  +        return _readBreakStatement();
         case Tag.WhileStatement:
  -        int offset = readOffset();
  -        return new WhileStatement(readExpression(), readStatement())
  -          ..fileOffset = offset;
  +        return _readWhileStatement();
         case Tag.DoStatement:
  -        int offset = readOffset();
  -        return new DoStatement(readStatement(), readExpression())
  -          ..fileOffset = offset;
  +        return _readDoStatement();
         case Tag.ForStatement:
  -        int variableStackHeight = variableStack.length;
  -        int offset = readOffset();
  -        List<VariableDeclaration> variables =
  -            readAndPushVariableDeclarationList();
  -        Expression condition = readExpressionOption();
  -        List<Expression> updates = readExpressionList();
  -        Statement body = readStatement();
  -        variableStack.length = variableStackHeight;
  -        return new ForStatement(variables, condition, updates, body)
  -          ..fileOffset = offset;
  +        return _readForStatement();
         case Tag.ForInStatement:
         case Tag.AsyncForInStatement:
  -        bool isAsync = tag == Tag.AsyncForInStatement;
  -        int variableStackHeight = variableStack.length;
  -        int offset = readOffset();
  -        int bodyOffset = readOffset();
  -        VariableDeclaration variable = readAndPushVariableDeclaration();
  -        Expression iterable = readExpression();
  -        Statement body = readStatement();
  -        variableStack.length = variableStackHeight;
  -        return new ForInStatement(variable, iterable, body, isAsync: isAsync)
  -          ..fileOffset = offset
  -          ..bodyOffset = bodyOffset;
  +        return _readForInStatement(tag);
         case Tag.SwitchStatement:
  -        int offset = readOffset();
  -        Expression expression = readExpression();
  -        int count = readUInt30();
  -        List<SwitchCase> cases =
  -            new List<SwitchCase>.filled(count, null, growable: true);
  -        for (int i = 0; i < count; ++i) {
  -          cases[i] = new SwitchCase.empty();
  -        }
  -        switchCaseStack.addAll(cases);
  -        for (int i = 0; i < cases.length; ++i) {
  -          readSwitchCaseInto(cases[i]);
  -        }
  -        switchCaseStack.length -= count;
  -        return new SwitchStatement(expression, cases)..fileOffset = offset;
  +        return _readSwitchStatement();
         case Tag.ContinueSwitchStatement:
  -        int offset = readOffset();
  -        int index = readUInt30();
  -        return new ContinueSwitchStatement(
  -            switchCaseStack[switchCaseStackBase + index])
  -          ..fileOffset = offset;
  +        return _readContinueSwitchStatement();
         case Tag.IfStatement:
  -        int offset = readOffset();
  -        return new IfStatement(
  -            readExpression(), readStatement(), readStatementOrNullIfEmpty())
  -          ..fileOffset = offset;
  +        return _readIfStatement();
         case Tag.ReturnStatement:
  -        int offset = readOffset();
  -        return new ReturnStatement(readExpressionOption())..fileOffset = offset;
  +        return _readReturnStatement();
         case Tag.TryCatch:
  -        Statement body = readStatement();
  -        int flags = readByte();
  -        return new TryCatch(body, readCatchList(), isSynthetic: flags & 2 == 2);
  +        return _readTryCatch();
         case Tag.TryFinally:
  -        return new TryFinally(readStatement(), readStatement());
  +        return _readTryFinally();
         case Tag.YieldStatement:
  -        int offset = readOffset();
  -        int flags = readByte();
  -        return new YieldStatement(readExpression(),
  -            isYieldStar: flags & YieldStatement.FlagYieldStar != 0,
  -            isNative: flags & YieldStatement.FlagNative != 0)
  -          ..fileOffset = offset;
  +        return _readYieldStatement();
         case Tag.VariableDeclaration:
  -        VariableDeclaration variable = readVariableDeclaration();
  -        variableStack.add(variable); // Will be popped by the enclosing scope.
  -        return variable;
  +        return _readVariableDeclaration();
         case Tag.FunctionDeclaration:
  -        int offset = readOffset();
  -        VariableDeclaration variable = readVariableDeclaration();
  -        variableStack.add(variable); // Will be popped by the enclosing scope.
  -        FunctionNode function = readFunctionNode();
  -        return new FunctionDeclaration(variable, function)..fileOffset = offset;
  +        return _readFunctionDeclaration();
         default:
           throw fail('unexpected statement tag: $tag');
       }
  +  }
  +
  +  Statement _readExpressionStatement() {
  +    return new ExpressionStatement(readExpression());
  +  }
  +
  +  Statement _readEmptyStatement() {
  +    return new EmptyStatement();
  +  }
  +
  +  Statement _readAssertStatement() {
  +    return new AssertStatement(readExpression(),
  +        conditionStartOffset: readOffset(),
  +        conditionEndOffset: readOffset(),
  +        message: readExpressionOption());
  +  }
  +
  +  Statement _readLabeledStatement() {
  +    LabeledStatement label = new LabeledStatement(null);
  +    labelStack.add(label);
  +    label.body = readStatement()..parent = label;
  +    labelStack.removeLast();
  +    return label;
  +  }
  +
  +  Statement _readBreakStatement() {
  +    int offset = readOffset();
  +    int index = readUInt30();
  +    return new BreakStatement(labelStack[labelStackBase + index])
  +      ..fileOffset = offset;
  +  }
  +
  +  Statement _readWhileStatement() {
  +    int offset = readOffset();
  +    return new WhileStatement(readExpression(), readStatement())
  +      ..fileOffset = offset;
  +  }
  +
  +  Statement _readDoStatement() {
  +    int offset = readOffset();
  +    return new DoStatement(readStatement(), readExpression())
  +      ..fileOffset = offset;
  +  }
  +
  +  Statement _readForStatement() {
  +    int variableStackHeight = variableStack.length;
  +    int offset = readOffset();
  +    List<VariableDeclaration> variables = readAndPushVariableDeclarationList();
  +    Expression condition = readExpressionOption();
  +    List<Expression> updates = readExpressionList();
  +    Statement body = readStatement();
  +    variableStack.length = variableStackHeight;
  +    return new ForStatement(variables, condition, updates, body)
  +      ..fileOffset = offset;
  +  }
  +
  +  Statement _readForInStatement(int tag) {
  +    bool isAsync = tag == Tag.AsyncForInStatement;
  +    int variableStackHeight = variableStack.length;
  +    int offset = readOffset();
  +    int bodyOffset = readOffset();
  +    VariableDeclaration variable = readAndPushVariableDeclaration();
  +    Expression iterable = readExpression();
  +    Statement body = readStatement();
  +    variableStack.length = variableStackHeight;
  +    return new ForInStatement(variable, iterable, body, isAsync: isAsync)
  +      ..fileOffset = offset
  +      ..bodyOffset = bodyOffset;
  +  }
  +
  +  Statement _readSwitchStatement() {
  +    int offset = readOffset();
  +    Expression expression = readExpression();
  +    int count = readUInt30();
  +    List<SwitchCase> cases =
  +        new List<SwitchCase>.filled(count, null, growable: true);
  +    for (int i = 0; i < count; ++i) {
  +      cases[i] = new SwitchCase.empty();
  +    }
  +    switchCaseStack.addAll(cases);
  +    for (int i = 0; i < cases.length; ++i) {
  +      readSwitchCaseInto(cases[i]);
  +    }
  +    switchCaseStack.length -= count;
  +    return new SwitchStatement(expression, cases)..fileOffset = offset;
  +  }
  +
  +  Statement _readContinueSwitchStatement() {
  +    int offset = readOffset();
  +    int index = readUInt30();
  +    return new ContinueSwitchStatement(
  +        switchCaseStack[switchCaseStackBase + index])
  +      ..fileOffset = offset;
  +  }
  +
  +  Statement _readIfStatement() {
  +    int offset = readOffset();
  +    return new IfStatement(
  +        readExpression(), readStatement(), readStatementOrNullIfEmpty())
  +      ..fileOffset = offset;
  +  }
  +
  +  Statement _readReturnStatement() {
  +    int offset = readOffset();
  +    return new ReturnStatement(readExpressionOption())..fileOffset = offset;
  +  }
  +
  +  Statement _readTryCatch() {
  +    Statement body = readStatement();
  +    int flags = readByte();
  +    return new TryCatch(body, readCatchList(), isSynthetic: flags & 2 == 2);
  +  }
  +
  +  Statement _readTryFinally() {
  +    return new TryFinally(readStatement(), readStatement());
  +  }
  +
  +  Statement _readYieldStatement() {
  +    int offset = readOffset();
  +    int flags = readByte();
  +    return new YieldStatement(readExpression(),
  +        isYieldStar: flags & YieldStatement.FlagYieldStar != 0,
  +        isNative: flags & YieldStatement.FlagNative != 0)
  +      ..fileOffset = offset;
  +  }
  +
  +  Statement _readVariableDeclaration() {
  +    VariableDeclaration variable = readVariableDeclaration();
  +    variableStack.add(variable); // Will be popped by the enclosing scope.
  +    return variable;
  +  }
  +
  +  Statement _readFunctionDeclaration() {
  +    int offset = readOffset();
  +    VariableDeclaration variable = readVariableDeclaration();
  +    variableStack.add(variable); // Will be popped by the enclosing scope.
  +    FunctionNode function = readFunctionNode();
  +    return new FunctionDeclaration(variable, function)..fileOffset = offset;
     }
   
     void readSwitchCaseInto(SwitchCase caseNode) {
  
positive.code:     bool isSynthetic = readByte() == 1;
      switch (tag) {
        case Tag.InvalidInitializer:
          return new InvalidInitializer();
        case Tag.FieldInitializer:
          Reference reference = readMemberReference();
          Expression value = readExpression();
          return new FieldInitializer.byReference(reference, value)
            ..isSynthetic = isSynthetic;
        case Tag.SuperInitializer:
          int offset = readOffset();
          Reference reference = readMemberReference();
          Arguments arguments = readArguments();
          return new SuperInitializer.byReference(reference, arguments)
            ..isSynthetic = isSynthetic
            ..fileOffset = offset;
        case Tag.RedirectingInitializer:
          int offset = readOffset();
          return new RedirectingInitializer.byReference(
              readMemberReference(), readArguments())
            ..fileOffset = offset;
        case Tag.LocalInitializer:
          return new LocalInitializer(readAndPushVariableDeclaration());
        case Tag.AssertInitializer:
          return new AssertInitializer(readStatement());
        default:
          throw fail('unexpected initializer tag: $tag');
      }
    }
  
    FunctionNode readFunctionNodeOption(bool lazyLoadBody, int outerEndOffset) {
  
negative.code:     Constant constant = _constantTable[offset];
      assert(constant != null);
      return constant;
    }
  
    List<Constant> _readConstantReferenceList() {
      final int length = readUInt30();
      final List<Constant> list =
          new List<Constant>.filled(length, null, growable: true);
      for (int i = 0; i < length; i++) {
        list[i] = readConstantReference();
      }
      return list;
    }
  
    Uri readUriReference() {
  