mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-01 19:58:15 +00:00
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:
@@ -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)
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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
|
||||||
Reference in New Issue
Block a user