function writevtable!()

in src/FlatBuffers/builder.jl [122:205]


function writevtable!(b::Builder)
    
    
    prepend!(b, SOffsetT(0))

    objectOffset = offset(b)
    existingVtable = UOffsetT(0)

    
    i = findlast(!iszero, b.vtable)
    if i !== nothing
        resize!(b.vtable, i)
    end

    
    
    
    
    
    for i = length(b.vtables):-1:1
        
        vt2Offset = b.vtables[i]
        vt2Start = length(b.bytes) - vt2Offset
        vt2Len = readbuffer(b.bytes, vt2Start, VOffsetT)

        metadata = VtableMetadataFields * sizeof(VOffsetT)
        vt2End = vt2Start + vt2Len
        vt2 = view(b.bytes, (vt2Start + metadata + 1):vt2End) 

        
        
        if vtableEqual(b.vtable, objectOffset, vt2)
            existingVtable = vt2Offset
            break
        end
    end

    if existingVtable == 0
        

        
        
        for i = length(b.vtable):-1:1
            off::UOffsetT = 0
            if b.vtable[i] != 0
                
                
                off = objectOffset - b.vtable[i]
            end
            prepend!(b, VOffsetT(off))
        end

        

        
        objectSize = objectOffset - b.objectend
        prepend!(b, VOffsetT(objectSize))

        
        vbytes = (length(b.vtable) + VtableMetadataFields) * sizeof(VOffsetT)
        prepend!(b, VOffsetT(vbytes))

        
        
        objectStart = SOffsetT(length(b.bytes) - objectOffset)
        write(b, objectStart, SOffsetT(offset(b) - objectOffset))

        
        
        push!(b.vtables, offset(b))
    else
        

        objectStart = SOffsetT(length(b.bytes) - objectOffset)
        b.head = objectStart

        
        
        write(b, b.head, SOffsetT(existingVtable) - SOffsetT(objectOffset))
    end

    empty!(b.vtable)
    return objectOffset
end