         }
     }
 
-    // Parse index/type marker that starts each field.
-    // This also bookmarks the start of field for a possible skip().
+    /// Private: Get the tag that starts a new field.
+    /// This also bookmarks the start of field for a possible skip().
     private mutating func getTag() throws -> FieldTag? {
         fieldStartP = p
         fieldEndP = nil
         return try getTagWithoutUpdatingFieldStart()
     }
 
-    // Parse index/type marker that starts each field.
-    // Used during skipping to avoid updating the field start offset.
+    /// Private: Parse and validate the next tag without
+    /// bookmarking the start of the field.  This is used within
+    /// skip() to skip over fields within a group.
     private mutating func getTagWithoutUpdatingFieldStart() throws -> FieldTag? {
         if available < 1 {
             return nil
         }
-        let t = try getRawVarint()
+        let t = try decodeVarint()
         if t < UInt64(UInt32.max) {
             guard let tag = FieldTag(rawValue: UInt32(truncatingBitPattern: t)) else {
                 throw DecodingError.malformedProtobuf

        self.extensions = extensions
    }

    // Since this is called for every field, I've taken some
    // pains to optimize it, including unrolling a tweaked version
    // of the varint parser.
    public mutating func nextFieldNumber() throws -> Int? {
        if fieldNumber > 0 {
            if let override = unknownOverride {
                if unknownData == nil {

        }
    }

    /// Private: Parse the next raw varint from the input.
    private mutating func decodeVarint() throws -> UInt64 {
        if available < 1 {
            throw DecodingError.truncatedInput
        }
