@@ -296,25 +296,62 @@ function mt:Slot(slotnum)
296296 self .currentVTable [slotnum + 1 ] = self :Offset ()
297297end
298298
299- local function finish (self , rootTable , sizePrefix )
299+ local function finish (self , rootTable , sizePrefix , fileIdentifier )
300300 UOffsetT :EnforceNumber (rootTable )
301- self :Prep (self .minalign , sizePrefix and 8 or 4 )
302- self :PrependUOffsetTRelative (rootTable )
301+ local hasFid = fileIdentifier ~= nil
302+ if hasFid then
303+ assert (# fileIdentifier == 4 , " File identifier must be exactly 4 bytes" )
304+ end
305+
306+ local fid_byte_count = (hasFid and 4 or 0 )
307+
308+ -- alignment:
309+ -- root offset (4)
310+ -- optional file id (4)
311+ -- optional size prefix (4)
312+ self :Prep (
313+ self .minalign ,
314+ (sizePrefix and 4 or 0 ) +
315+ 4 +
316+ fid_byte_count
317+ )
318+
319+ -- root offset (points past file identifier if present)
320+ self :PrependUOffsetTRelative (rootTable + fid_byte_count )
321+
322+ -- file identifier
323+ if hasFid then
324+ for i = 4 , 1 , - 1 do
325+ self :PrependByte (string.byte (fileIdentifier , i ))
326+ end
327+ end
328+
329+ -- size prefix
303330 if sizePrefix then
304331 local size = self .bytes .size - self .head
305332 Int32 :EnforceNumber (size )
306333 self :PrependInt32 (size )
307334 end
335+
308336 self .finished = true
309337 return self .head
310338end
311339
340+
312341function mt :Finish (rootTable )
313- return finish (self , rootTable , false )
342+ return finish (self , rootTable , false , nil )
314343end
315344
316345function mt :FinishSizePrefixed (rootTable )
317- return finish (self , rootTable , true )
346+ return finish (self , rootTable , true , nil )
347+ end
348+
349+ function mt :FinishWithIdentifier (rootTable , fileIdentifier )
350+ return finish (self , rootTable , false , fileIdentifier )
351+ end
352+
353+ function mt :FinishSizePrefixedWithIdentifier (rootTable , fileIdentifier )
354+ return finish (self , rootTable , true , fileIdentifier )
318355end
319356
320357function mt :Prepend (flags , off )
0 commit comments