forked from BigfootDev/flatbuffers
[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:
@@ -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 =
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user