anchor.diff:    }
   
     /**
  +   * Return `true` if the [existing] VTable can be used instead of this.
  +   */
  +  bool canUseExistingVTable(_VTable existing) {
  +    assert(tail == null);
  +    assert(existing.tail != null);
  +    if (tableSize == existing.tableSize &&
  +        fieldOffsets.length == existing.fieldOffsets.length) {
  +      for (int i = 0; i < fieldOffsets.length; i++) {
  +        if (fieldOffsets[i] != existing.fieldOffsets[i]) {
  +          return false;
  +        }
  +      }
  +      return true;
  +    }
  +    return false;
  +  }
  +
  +  /**
  +   * Fill the [fieldOffsets] field.
  +   */
  +  void computeFieldOffsets(int tableTail) {
  +    assert(fieldOffsets.isEmpty);
  +    for (int fieldTail in fieldTails) {
  +      int fieldOffset = fieldTail == null ? 0 : tableTail - fieldTail;
  +      fieldOffsets.add(fieldOffset);
  +    }
  +  }
  +
  +  /**
      * Outputs this VTable to [buf], which is is expected to be aligned to 16-bit
      * and have at least [numOfUint16] 16-bit words available.
      */
  -  void output(ByteData buf, int bufOffset, int tableTail, int tableSize) {
  +  void output(ByteData buf, int bufOffset) {
       // VTable size.
       buf.setUint16(bufOffset, numOfUint16 * 2, Endianness.LITTLE_ENDIAN);
       bufOffset += 2;
  
positive.code:    * Add the [field] referencing an object with the given [offset].
     */
    void addOffset(int field, Offset offset) {
      if (_currentVTableBuilder == null) {
        throw new StateError('Start a table before adding values.');
      }
      if (offset != null) {
  
negative.code:    */
    int _currentTableEndTail;
  
    _VTable _currentVTable;
  
    Builder({this.initialSize: 1024}) {
      reset();
  