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