Feature: lua now file_ident aware (#8850)

* lua code not file ident aware

* update genned code

* make mac happy

* pr comments
This commit is contained in:
Justin Davis
2026-02-04 08:05:08 -05:00
committed by GitHub
parent b84b676c89
commit e53732b9b9
3 changed files with 87 additions and 5 deletions

View File

@@ -296,25 +296,62 @@ function mt:Slot(slotnum)
self.currentVTable[slotnum + 1] = self:Offset() self.currentVTable[slotnum + 1] = self:Offset()
end end
local function finish(self, rootTable, sizePrefix) local function finish(self, rootTable, sizePrefix, fileIdentifier)
UOffsetT:EnforceNumber(rootTable) UOffsetT:EnforceNumber(rootTable)
self:Prep(self.minalign, sizePrefix and 8 or 4) local hasFid = fileIdentifier ~= nil
self:PrependUOffsetTRelative(rootTable) if hasFid then
assert(#fileIdentifier == 4, "File identifier must be exactly 4 bytes")
end
local fid_byte_count = (hasFid and 4 or 0)
-- alignment:
-- root offset (4)
-- optional file id (4)
-- optional size prefix (4)
self:Prep(
self.minalign,
(sizePrefix and 4 or 0) +
4 +
fid_byte_count
)
-- root offset (points past file identifier if present)
self:PrependUOffsetTRelative(rootTable + fid_byte_count)
-- file identifier
if hasFid then
for i = 4, 1, -1 do
self:PrependByte(string.byte(fileIdentifier, i))
end
end
-- size prefix
if sizePrefix then if sizePrefix then
local size = self.bytes.size - self.head local size = self.bytes.size - self.head
Int32:EnforceNumber(size) Int32:EnforceNumber(size)
self:PrependInt32(size) self:PrependInt32(size)
end end
self.finished = true self.finished = true
return self.head return self.head
end end
function mt:Finish(rootTable) function mt:Finish(rootTable)
return finish(self, rootTable, false) return finish(self, rootTable, false, nil)
end end
function mt:FinishSizePrefixed(rootTable) function mt:FinishSizePrefixed(rootTable)
return finish(self, rootTable, true) return finish(self, rootTable, true, nil)
end
function mt:FinishWithIdentifier(rootTable, fileIdentifier)
return finish(self, rootTable, false, fileIdentifier)
end
function mt:FinishSizePrefixedWithIdentifier(rootTable, fileIdentifier)
return finish(self, rootTable, true, fileIdentifier)
end end
function mt:Prepend(flags, off) function mt:Prepend(flags, off)

View File

@@ -195,6 +195,13 @@ class LuaBfbsGenerator : public BaseBfbsGenerator {
code += "\n"; code += "\n";
if (object == root_object) { if (object == root_object) {
// emit file identifier if present
const auto ident = schema_->file_ident();
if (ident && ident->size() == 4) {
code += "local FileIdentifier = \"" + ident->str() + "\"\n";
code += "\n";
}
code += "function " + object_name + ".GetRootAs" + object_name + code += "function " + object_name + ".GetRootAs" + object_name +
"(buf, offset)\n"; "(buf, offset)\n";
code += " if type(buf) == \"string\" then\n"; code += " if type(buf) == \"string\" then\n";
@@ -455,6 +462,34 @@ class LuaBfbsGenerator : public BaseBfbsGenerator {
code += " return builder:EndObject()\n"; code += " return builder:EndObject()\n";
code += "end\n"; code += "end\n";
code += "\n"; code += "\n";
if (object == root_object) {
code += "function " + object_name + ".Finish" + object_name +
"Buffer(builder, offset)\n";
// emit file identifier if present
const auto ident = schema_->file_ident();
if (ident && ident->size() == 4) {
code += " builder:FinishWithIdentifier(offset, FileIdentifier)\n";
} else {
code += " builder:Finish(offset)\n";
}
code += "end\n";
code += "\n";
// size prefixed option
code += "function " + object_name + ".FinishSizePrefixed" +
object_name + "Buffer(builder, offset)\n";
// emit file identifier if present
if (ident && ident->size() == 4) {
code +=
" builder:FinishSizePrefixedWithIdentifier(offset, "
"FileIdentifier)\n";
} else {
code += " builder:FinishSizePrefixed(offset)\n";
}
code += "end\n";
code += "\n";
}
} }
EmitCodeBlock(code, object_name, ns, object->declaration_file()->str()); EmitCodeBlock(code, object_name, ns, object->declaration_file()->str());

View File

@@ -28,6 +28,8 @@ function Monster.New()
return o return o
end end
local FileIdentifier = "MONS"
function Monster.GetRootAsMonster(buf, offset) function Monster.GetRootAsMonster(buf, offset)
if type(buf) == "string" then if type(buf) == "string" then
buf = flatbuffers.binaryArray.New(buf) buf = flatbuffers.binaryArray.New(buf)
@@ -1099,4 +1101,12 @@ function Monster.End(builder)
return builder:EndObject() return builder:EndObject()
end end
function Monster.FinishMonsterBuffer(builder, offset)
builder:FinishWithIdentifier(offset, FileIdentifier)
end
function Monster.FinishSizePrefixedMonsterBuffer(builder, offset)
builder:FinishSizePrefixedWithIdentifier(offset, FileIdentifier)
end
return Monster return Monster