mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-24 15:46:10 +00:00
[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";
|
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
|
// Emit a factory constructor
|
||||||
if (struct_def.fixed) {
|
if (struct_def.fixed) {
|
||||||
std::string annotations =
|
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.
|
// Generate table constructors, conditioned on its members' types.
|
||||||
void GenTableBuilders(const StructDef &struct_def, std::string *code_ptr) {
|
void GenTableBuilders(const StructDef &struct_def, std::string *code_ptr) {
|
||||||
GetStartOfTable(struct_def, code_ptr);
|
GetStartOfTable(struct_def, code_ptr);
|
||||||
@@ -678,6 +688,9 @@ class PythonGenerator : public BaseGenerator {
|
|||||||
// Generate a special function to test file_identifier
|
// Generate a special function to test file_identifier
|
||||||
GenHasFileIdentifier(struct_def, code_ptr);
|
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
|
// Generates the Init method that sets the field in a pre-existing
|
||||||
// accessor object. This is to allow object reuse.
|
// accessor object. This is to allow object reuse.
|
||||||
|
|||||||
@@ -9,6 +9,10 @@ np = import_numpy()
|
|||||||
class Ability(object):
|
class Ability(object):
|
||||||
__slots__ = ['_tab']
|
__slots__ = ['_tab']
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def SizeOf(cls):
|
||||||
|
return 8
|
||||||
|
|
||||||
# Ability
|
# Ability
|
||||||
def Init(self, buf, pos):
|
def Init(self, buf, pos):
|
||||||
self._tab = flatbuffers.table.Table(buf, pos)
|
self._tab = flatbuffers.table.Table(buf, pos)
|
||||||
|
|||||||
@@ -9,6 +9,10 @@ np = import_numpy()
|
|||||||
class ArrayStruct(object):
|
class ArrayStruct(object):
|
||||||
__slots__ = ['_tab']
|
__slots__ = ['_tab']
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def SizeOf(cls):
|
||||||
|
return 160
|
||||||
|
|
||||||
# ArrayStruct
|
# ArrayStruct
|
||||||
def Init(self, buf, pos):
|
def Init(self, buf, pos):
|
||||||
self._tab = flatbuffers.table.Table(buf, pos)
|
self._tab = flatbuffers.table.Table(buf, pos)
|
||||||
|
|||||||
@@ -9,6 +9,10 @@ np = import_numpy()
|
|||||||
class NestedStruct(object):
|
class NestedStruct(object):
|
||||||
__slots__ = ['_tab']
|
__slots__ = ['_tab']
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def SizeOf(cls):
|
||||||
|
return 32
|
||||||
|
|
||||||
# NestedStruct
|
# NestedStruct
|
||||||
def Init(self, buf, pos):
|
def Init(self, buf, pos):
|
||||||
self._tab = flatbuffers.table.Table(buf, pos)
|
self._tab = flatbuffers.table.Table(buf, pos)
|
||||||
|
|||||||
@@ -9,6 +9,10 @@ np = import_numpy()
|
|||||||
class Test(object):
|
class Test(object):
|
||||||
__slots__ = ['_tab']
|
__slots__ = ['_tab']
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def SizeOf(cls):
|
||||||
|
return 4
|
||||||
|
|
||||||
# Test
|
# Test
|
||||||
def Init(self, buf, pos):
|
def Init(self, buf, pos):
|
||||||
self._tab = flatbuffers.table.Table(buf, pos)
|
self._tab = flatbuffers.table.Table(buf, pos)
|
||||||
|
|||||||
@@ -9,6 +9,10 @@ np = import_numpy()
|
|||||||
class Vec3(object):
|
class Vec3(object):
|
||||||
__slots__ = ['_tab']
|
__slots__ = ['_tab']
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def SizeOf(cls):
|
||||||
|
return 32
|
||||||
|
|
||||||
# Vec3
|
# Vec3
|
||||||
def Init(self, buf, pos):
|
def Init(self, buf, pos):
|
||||||
self._tab = flatbuffers.table.Table(buf, pos)
|
self._tab = flatbuffers.table.Table(buf, pos)
|
||||||
|
|||||||
@@ -342,6 +342,13 @@ MyGame.Example.Test.prototype.mutate_b = function(value) {
|
|||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns {number}
|
||||||
|
*/
|
||||||
|
MyGame.Example.Test.sizeOf = function() {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {flatbuffers.Builder} builder
|
* @param {flatbuffers.Builder} builder
|
||||||
* @param {number} a
|
* @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);
|
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 {flatbuffers.Builder} builder
|
||||||
* @param {number} x
|
* @param {number} x
|
||||||
@@ -659,6 +673,13 @@ MyGame.Example.Ability.prototype.mutate_distance = function(value) {
|
|||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns {number}
|
||||||
|
*/
|
||||||
|
MyGame.Example.Ability.sizeOf = function() {
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {flatbuffers.Builder} builder
|
* @param {flatbuffers.Builder} builder
|
||||||
* @param {number} id
|
* @param {number} id
|
||||||
|
|||||||
@@ -376,6 +376,13 @@ mutate_b(value:number):boolean {
|
|||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns number
|
||||||
|
*/
|
||||||
|
static sizeOf():number {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param flatbuffers.Builder builder
|
* @param flatbuffers.Builder builder
|
||||||
* @param number a
|
* @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!);
|
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 flatbuffers.Builder builder
|
||||||
* @param number x
|
* @param number x
|
||||||
@@ -811,6 +825,13 @@ mutate_distance(value:number):boolean {
|
|||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns number
|
||||||
|
*/
|
||||||
|
static sizeOf():number {
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param flatbuffers.Builder builder
|
* @param flatbuffers.Builder builder
|
||||||
* @param number id
|
* @param number id
|
||||||
|
|||||||
@@ -9,6 +9,10 @@ np = import_numpy()
|
|||||||
class StructInNestedNS(object):
|
class StructInNestedNS(object):
|
||||||
__slots__ = ['_tab']
|
__slots__ = ['_tab']
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def SizeOf(cls):
|
||||||
|
return 8
|
||||||
|
|
||||||
# StructInNestedNS
|
# StructInNestedNS
|
||||||
def Init(self, buf, pos):
|
def Init(self, buf, pos):
|
||||||
self._tab = flatbuffers.table.Table(buf, pos)
|
self._tab = flatbuffers.table.Table(buf, pos)
|
||||||
|
|||||||
@@ -205,6 +205,13 @@ NamespaceA.NamespaceB.StructInNestedNS.getFullyQualifiedName = function() {
|
|||||||
return 'NamespaceA.NamespaceB.StructInNestedNS';
|
return 'NamespaceA.NamespaceB.StructInNestedNS';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns {number}
|
||||||
|
*/
|
||||||
|
NamespaceA.NamespaceB.StructInNestedNS.sizeOf = function() {
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {flatbuffers.Builder} builder
|
* @param {flatbuffers.Builder} builder
|
||||||
* @param {number} a
|
* @param {number} a
|
||||||
|
|||||||
@@ -204,6 +204,13 @@ static getFullyQualifiedName():string {
|
|||||||
return 'NamespaceA.NamespaceB.StructInNestedNS';
|
return 'NamespaceA.NamespaceB.StructInNestedNS';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns number
|
||||||
|
*/
|
||||||
|
static sizeOf():number {
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param flatbuffers.Builder builder
|
* @param flatbuffers.Builder builder
|
||||||
* @param number a
|
* @param number a
|
||||||
|
|||||||
@@ -185,6 +185,13 @@ Rapunzel.getFullyQualifiedName = function() {
|
|||||||
return 'Rapunzel';
|
return 'Rapunzel';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns {number}
|
||||||
|
*/
|
||||||
|
Rapunzel.sizeOf = function() {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {flatbuffers.Builder} builder
|
* @param {flatbuffers.Builder} builder
|
||||||
* @param {number} hair_length
|
* @param {number} hair_length
|
||||||
@@ -245,6 +252,13 @@ BookReader.getFullyQualifiedName = function() {
|
|||||||
return 'BookReader';
|
return 'BookReader';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns {number}
|
||||||
|
*/
|
||||||
|
BookReader.sizeOf = function() {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {flatbuffers.Builder} builder
|
* @param {flatbuffers.Builder} builder
|
||||||
* @param {number} books_read
|
* @param {number} books_read
|
||||||
|
|||||||
@@ -221,6 +221,13 @@ static getFullyQualifiedName():string {
|
|||||||
return 'Rapunzel';
|
return 'Rapunzel';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns number
|
||||||
|
*/
|
||||||
|
static sizeOf():number {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param flatbuffers.Builder builder
|
* @param flatbuffers.Builder builder
|
||||||
* @param number hair_length
|
* @param number hair_length
|
||||||
@@ -310,6 +317,13 @@ static getFullyQualifiedName():string {
|
|||||||
return 'BookReader';
|
return 'BookReader';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns number
|
||||||
|
*/
|
||||||
|
static sizeOf():number {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param flatbuffers.Builder builder
|
* @param flatbuffers.Builder builder
|
||||||
* @param number books_read
|
* @param number books_read
|
||||||
|
|||||||
Reference in New Issue
Block a user