[Python/JS/TS] Codegen SizeOf method for structs (#6136)

* [Python] Codegen SizeOf classmethod for structs

This codegens a `SizeOf()` classmethod for all structs since we can't
determine the size of a FlatBuffer generated struct from Python otherwise.

* [JS/TS] Codegen sizeOf static method for structs

This codegens a `sizeOf()` static method for all structs since we can't
determine the size of a FlatBuffer generated struct from JavaScript or
TypeScript otherwise.
This commit is contained in:
Anass Al
2020-09-28 08:54:50 -07:00
committed by GitHub
parent 641309a5bf
commit 689bfafa7e
14 changed files with 133 additions and 0 deletions

View File

@@ -1795,6 +1795,18 @@ class JsTsGenerator : public BaseGenerator {
code += "}\n\n";
}
// Emit the size of the struct.
if (struct_def.fixed) {
GenDocComment(code_ptr, GenTypeAnnotation(kReturns, "number", "", false));
if (lang_.language == IDLOptions::kTs) {
code += "static sizeOf():number {\n";
} else {
code += object_name + ".sizeOf = function() {\n";
}
code += " return " + NumToString(struct_def.bytesize) + ";\n";
code += "}\n\n";
}
// Emit a factory constructor
if (struct_def.fixed) {
std::string annotations =

View File

@@ -621,6 +621,16 @@ class PythonGenerator : public BaseGenerator {
}
}
// Generate struct sizeof.
void GenStructSizeOf(const StructDef &struct_def, std::string *code_ptr) {
auto &code = *code_ptr;
code += Indent + "@classmethod\n";
code += Indent + "def SizeOf(cls):\n";
code +=
Indent + Indent + "return " + NumToString(struct_def.bytesize) + "\n";
code += "\n";
}
// Generate table constructors, conditioned on its members' types.
void GenTableBuilders(const StructDef &struct_def, std::string *code_ptr) {
GetStartOfTable(struct_def, code_ptr);
@@ -678,6 +688,9 @@ class PythonGenerator : public BaseGenerator {
// Generate a special function to test file_identifier
GenHasFileIdentifier(struct_def, code_ptr);
}
} else {
// Generates the SizeOf method for all structs.
GenStructSizeOf(struct_def, code_ptr);
}
// Generates the Init method that sets the field in a pre-existing
// accessor object. This is to allow object reuse.

View File

@@ -9,6 +9,10 @@ np = import_numpy()
class Ability(object):
__slots__ = ['_tab']
@classmethod
def SizeOf(cls):
return 8
# Ability
def Init(self, buf, pos):
self._tab = flatbuffers.table.Table(buf, pos)

View File

@@ -9,6 +9,10 @@ np = import_numpy()
class ArrayStruct(object):
__slots__ = ['_tab']
@classmethod
def SizeOf(cls):
return 160
# ArrayStruct
def Init(self, buf, pos):
self._tab = flatbuffers.table.Table(buf, pos)

View File

@@ -9,6 +9,10 @@ np = import_numpy()
class NestedStruct(object):
__slots__ = ['_tab']
@classmethod
def SizeOf(cls):
return 32
# NestedStruct
def Init(self, buf, pos):
self._tab = flatbuffers.table.Table(buf, pos)

View File

@@ -9,6 +9,10 @@ np = import_numpy()
class Test(object):
__slots__ = ['_tab']
@classmethod
def SizeOf(cls):
return 4
# Test
def Init(self, buf, pos):
self._tab = flatbuffers.table.Table(buf, pos)

View File

@@ -9,6 +9,10 @@ np = import_numpy()
class Vec3(object):
__slots__ = ['_tab']
@classmethod
def SizeOf(cls):
return 32
# Vec3
def Init(self, buf, pos):
self._tab = flatbuffers.table.Table(buf, pos)

View File

@@ -342,6 +342,13 @@ MyGame.Example.Test.prototype.mutate_b = function(value) {
return true;
};
/**
* @returns {number}
*/
MyGame.Example.Test.sizeOf = function() {
return 4;
}
/**
* @param {flatbuffers.Builder} builder
* @param {number} a
@@ -573,6 +580,13 @@ MyGame.Example.Vec3.prototype.test3 = function(obj) {
return (obj || new MyGame.Example.Test).__init(this.bb_pos + 26, this.bb);
};
/**
* @returns {number}
*/
MyGame.Example.Vec3.sizeOf = function() {
return 32;
}
/**
* @param {flatbuffers.Builder} builder
* @param {number} x
@@ -659,6 +673,13 @@ MyGame.Example.Ability.prototype.mutate_distance = function(value) {
return true;
};
/**
* @returns {number}
*/
MyGame.Example.Ability.sizeOf = function() {
return 8;
}
/**
* @param {flatbuffers.Builder} builder
* @param {number} id

View File

@@ -376,6 +376,13 @@ mutate_b(value:number):boolean {
return true;
};
/**
* @returns number
*/
static sizeOf():number {
return 4;
}
/**
* @param flatbuffers.Builder builder
* @param number a
@@ -668,6 +675,13 @@ test3(obj?:MyGame.Example.Test):MyGame.Example.Test|null {
return (obj || new MyGame.Example.Test()).__init(this.bb_pos + 26, this.bb!);
};
/**
* @returns number
*/
static sizeOf():number {
return 32;
}
/**
* @param flatbuffers.Builder builder
* @param number x
@@ -811,6 +825,13 @@ mutate_distance(value:number):boolean {
return true;
};
/**
* @returns number
*/
static sizeOf():number {
return 8;
}
/**
* @param flatbuffers.Builder builder
* @param number id

View File

@@ -9,6 +9,10 @@ np = import_numpy()
class StructInNestedNS(object):
__slots__ = ['_tab']
@classmethod
def SizeOf(cls):
return 8
# StructInNestedNS
def Init(self, buf, pos):
self._tab = flatbuffers.table.Table(buf, pos)

View File

@@ -205,6 +205,13 @@ NamespaceA.NamespaceB.StructInNestedNS.getFullyQualifiedName = function() {
return 'NamespaceA.NamespaceB.StructInNestedNS';
}
/**
* @returns {number}
*/
NamespaceA.NamespaceB.StructInNestedNS.sizeOf = function() {
return 8;
}
/**
* @param {flatbuffers.Builder} builder
* @param {number} a

View File

@@ -204,6 +204,13 @@ static getFullyQualifiedName():string {
return 'NamespaceA.NamespaceB.StructInNestedNS';
}
/**
* @returns number
*/
static sizeOf():number {
return 8;
}
/**
* @param flatbuffers.Builder builder
* @param number a

View File

@@ -185,6 +185,13 @@ Rapunzel.getFullyQualifiedName = function() {
return 'Rapunzel';
}
/**
* @returns {number}
*/
Rapunzel.sizeOf = function() {
return 4;
}
/**
* @param {flatbuffers.Builder} builder
* @param {number} hair_length
@@ -245,6 +252,13 @@ BookReader.getFullyQualifiedName = function() {
return 'BookReader';
}
/**
* @returns {number}
*/
BookReader.sizeOf = function() {
return 4;
}
/**
* @param {flatbuffers.Builder} builder
* @param {number} books_read

View File

@@ -221,6 +221,13 @@ static getFullyQualifiedName():string {
return 'Rapunzel';
}
/**
* @returns number
*/
static sizeOf():number {
return 4;
}
/**
* @param flatbuffers.Builder builder
* @param number hair_length
@@ -310,6 +317,13 @@ static getFullyQualifiedName():string {
return 'BookReader';
}
/**
* @returns number
*/
static sizeOf():number {
return 4;
}
/**
* @param flatbuffers.Builder builder
* @param number books_read