mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-15 08:48:52 +00:00
memory leak fix + php/js/python transition to class based generator
This commit is contained in:
@@ -906,8 +906,8 @@ class CppGenerator : public BaseGenerator {
|
|||||||
|
|
||||||
bool GenerateCPP(const Parser &parser, const std::string &path,
|
bool GenerateCPP(const Parser &parser, const std::string &path,
|
||||||
const std::string &file_name) {
|
const std::string &file_name) {
|
||||||
cpp::CppGenerator *generator = new cpp::CppGenerator(parser, path, file_name);
|
cpp::CppGenerator generator(parser, path, file_name);
|
||||||
return generator->generate();
|
return generator.generate();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string CPPMakeRule(const Parser &parser,
|
std::string CPPMakeRule(const Parser &parser,
|
||||||
|
|||||||
@@ -1195,9 +1195,8 @@ class GeneralGenerator : public BaseGenerator {
|
|||||||
|
|
||||||
bool GenerateGeneral(const Parser &parser, const std::string &path,
|
bool GenerateGeneral(const Parser &parser, const std::string &path,
|
||||||
const std::string &file_name) {
|
const std::string &file_name) {
|
||||||
general::GeneralGenerator *generator =
|
general::GeneralGenerator generator(parser, path, file_name);
|
||||||
new general::GeneralGenerator(parser, path, file_name);
|
return generator.generate();
|
||||||
return generator->generate();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string ClassFileName(const LanguageParameters &lang,
|
static std::string ClassFileName(const LanguageParameters &lang,
|
||||||
|
|||||||
@@ -688,8 +688,8 @@ class GoGenerator : public BaseGenerator {
|
|||||||
|
|
||||||
bool GenerateGo(const Parser &parser, const std::string &path,
|
bool GenerateGo(const Parser &parser, const std::string &path,
|
||||||
const std::string &file_name) {
|
const std::string &file_name) {
|
||||||
go::GoGenerator *generator = new go::GoGenerator(parser, path, file_name);
|
go::GoGenerator generator(parser, path, file_name);
|
||||||
return generator->generate();
|
return generator.generate();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace flatbuffers
|
} // namespace flatbuffers
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
#include "flatbuffers/flatbuffers.h"
|
#include "flatbuffers/flatbuffers.h"
|
||||||
#include "flatbuffers/idl.h"
|
#include "flatbuffers/idl.h"
|
||||||
#include "flatbuffers/util.h"
|
#include "flatbuffers/util.h"
|
||||||
|
#include "flatbuffers/code_generators.h"
|
||||||
|
|
||||||
namespace flatbuffers {
|
namespace flatbuffers {
|
||||||
namespace js {
|
namespace js {
|
||||||
@@ -661,60 +662,76 @@ static void GenStruct(const Parser &parser, StructDef &struct_def,
|
|||||||
|
|
||||||
} // namespace js
|
} // namespace js
|
||||||
|
|
||||||
// Iterate through all definitions we haven't generate code for (enums, structs,
|
|
||||||
// and tables) and output them to a single file.
|
|
||||||
std::string GenerateJS(const Parser &parser) {
|
|
||||||
using namespace js;
|
|
||||||
|
|
||||||
// Generate code for all the enum declarations.
|
|
||||||
std::string enum_code, exports_code;
|
|
||||||
for (auto it = parser.enums_.vec.begin();
|
|
||||||
it != parser.enums_.vec.end(); ++it) {
|
|
||||||
GenEnum(**it, &enum_code, &exports_code);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate code for all structs, then all tables.
|
|
||||||
std::string decl_code;
|
|
||||||
for (auto it = parser.structs_.vec.begin();
|
|
||||||
it != parser.structs_.vec.end(); ++it) {
|
|
||||||
GenStruct(parser, **it, &decl_code, &exports_code);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only output file-level code if there were any declarations.
|
|
||||||
if (enum_code.length() || decl_code.length()) {
|
|
||||||
std::string code;
|
|
||||||
code = "// automatically generated by the FlatBuffers compiler,"
|
|
||||||
" do not modify\n\n";
|
|
||||||
|
|
||||||
// Generate code for all the namespace declarations.
|
|
||||||
GenNamespaces(parser, &code, &exports_code);
|
|
||||||
|
|
||||||
// Output the main declaration code from above.
|
|
||||||
code += enum_code;
|
|
||||||
code += decl_code;
|
|
||||||
|
|
||||||
if (!exports_code.empty() && !parser.opts.skip_js_exports) {
|
|
||||||
code += "// Exports for Node.js and RequireJS\n";
|
|
||||||
code += exports_code;
|
|
||||||
}
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
return std::string();
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::string GeneratedFileName(const std::string &path,
|
static std::string GeneratedFileName(const std::string &path,
|
||||||
const std::string &file_name) {
|
const std::string &file_name) {
|
||||||
return path + file_name + "_generated.js";
|
return path + file_name + "_generated.js";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GenerateJS(const Parser &parser,
|
namespace js {
|
||||||
const std::string &path,
|
// Iterate through all definitions we haven't generate code for (enums, structs,
|
||||||
const std::string &file_name) {
|
// and tables) and output them to a single file.
|
||||||
auto code = GenerateJS(parser);
|
class JsGenerator : public BaseGenerator {
|
||||||
|
public:
|
||||||
|
JsGenerator(const Parser &parser, const std::string &path,
|
||||||
|
const std::string &file_name)
|
||||||
|
: BaseGenerator(parser, path, file_name){};
|
||||||
|
// Iterate through all definitions we haven't generate code for (enums,
|
||||||
|
// structs, and tables) and output them to a single file.
|
||||||
|
bool generate() {
|
||||||
|
std::string enum_code, struct_code, exports_code, code;
|
||||||
|
generateEnums(&enum_code, &exports_code);
|
||||||
|
generateStructs(&struct_code, &exports_code);
|
||||||
|
|
||||||
|
// Only output file-level code if there were any declarations.
|
||||||
|
if (enum_code.length() || struct_code.length()) {
|
||||||
|
code +=
|
||||||
|
"// automatically generated by the FlatBuffers compiler, do not "
|
||||||
|
"modify\n\n";
|
||||||
|
|
||||||
|
// Generate code for all the namespace declarations.
|
||||||
|
GenNamespaces(parser_, &code, &exports_code);
|
||||||
|
|
||||||
|
// Output the main declaration code from above.
|
||||||
|
code += enum_code;
|
||||||
|
code += struct_code;
|
||||||
|
|
||||||
|
if (!exports_code.empty() && !parser_.opts.skip_js_exports) {
|
||||||
|
code += "// Exports for Node.js and RequireJS\n";
|
||||||
|
code += exports_code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return !code.length() ||
|
return !code.length() ||
|
||||||
SaveFile(GeneratedFileName(path, file_name).c_str(), code, false);
|
SaveFile(GeneratedFileName(path_, file_name_).c_str(), code, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Generate code for all enums.
|
||||||
|
void generateEnums(std::string *enum_code_ptr,
|
||||||
|
std::string *exports_code_ptr) {
|
||||||
|
for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();
|
||||||
|
++it) {
|
||||||
|
auto &enum_def = **it;
|
||||||
|
GenEnum(enum_def, enum_code_ptr, exports_code_ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate code for all structs.
|
||||||
|
void generateStructs(std::string *decl_code_ptr,
|
||||||
|
std::string *exports_code_ptr) {
|
||||||
|
for (auto it = parser_.structs_.vec.begin();
|
||||||
|
it != parser_.structs_.vec.end(); ++it) {
|
||||||
|
auto &struct_def = **it;
|
||||||
|
GenStruct(parser_, struct_def, decl_code_ptr, exports_code_ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace js
|
||||||
|
|
||||||
|
bool GenerateJS(const Parser &parser, const std::string &path,
|
||||||
|
const std::string &file_name) {
|
||||||
|
js::JsGenerator generator(parser, path, file_name);
|
||||||
|
return generator.generate();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string JSMakeRule(const Parser &parser,
|
std::string JSMakeRule(const Parser &parser,
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
#include "flatbuffers/flatbuffers.h"
|
#include "flatbuffers/flatbuffers.h"
|
||||||
#include "flatbuffers/idl.h"
|
#include "flatbuffers/idl.h"
|
||||||
#include "flatbuffers/util.h"
|
#include "flatbuffers/util.h"
|
||||||
|
#include "flatbuffers/code_generators.h"
|
||||||
|
|
||||||
namespace flatbuffers {
|
namespace flatbuffers {
|
||||||
namespace php {
|
namespace php {
|
||||||
@@ -974,29 +975,47 @@ namespace php {
|
|||||||
code += Indent + "}\n";
|
code += Indent + "}\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace php
|
class PhpGenerator : public BaseGenerator {
|
||||||
|
public:
|
||||||
|
PhpGenerator(const Parser &parser, const std::string &path,
|
||||||
|
const std::string &file_name)
|
||||||
|
: BaseGenerator(parser, path, file_name){};
|
||||||
|
bool generate() {
|
||||||
|
if (!generateEnums()) return false;
|
||||||
|
if (!generateStructs()) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool GeneratePhp(const Parser &parser,
|
private:
|
||||||
const std::string &path,
|
bool generateEnums() {
|
||||||
const std::string & /*file_name*/) {
|
for (auto it = parser_.enums_.vec.begin();
|
||||||
for (auto it = parser.enums_.vec.begin();
|
it != parser_.enums_.vec.end(); ++it) {
|
||||||
it != parser.enums_.vec.end(); ++it) {
|
auto &enum_def = **it;
|
||||||
std::string enumcode;
|
std::string enumcode;
|
||||||
php::GenEnum(**it, &enumcode);
|
GenEnum(enum_def, &enumcode);
|
||||||
|
if (!SaveType(parser_, enum_def, enumcode, path_, false))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (!php::SaveType(parser, **it, enumcode, path, false))
|
bool generateStructs() {
|
||||||
return false;
|
for (auto it = parser_.structs_.vec.begin();
|
||||||
|
it != parser_.structs_.vec.end(); ++it) {
|
||||||
|
auto &struct_def = **it;
|
||||||
|
std::string declcode;
|
||||||
|
GenStruct(parser_, struct_def, &declcode);
|
||||||
|
if (!SaveType(parser_, struct_def, declcode, path_, true))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace php
|
||||||
|
|
||||||
|
bool GeneratePhp(const Parser &parser, const std::string &path,
|
||||||
|
const std::string &file_name) {
|
||||||
|
php::PhpGenerator generator(parser, path, file_name);
|
||||||
|
return generator.generate();
|
||||||
}
|
}
|
||||||
|
} // namespace flatbuffers
|
||||||
for (auto it = parser.structs_.vec.begin();
|
|
||||||
it != parser.structs_.vec.end(); ++it) {
|
|
||||||
std::string declcode;
|
|
||||||
php::GenStruct(parser, **it, &declcode);
|
|
||||||
|
|
||||||
if (!php::SaveType(parser, **it, declcode, path, true))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} // namespace flatbuffers
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
#include "flatbuffers/flatbuffers.h"
|
#include "flatbuffers/flatbuffers.h"
|
||||||
#include "flatbuffers/idl.h"
|
#include "flatbuffers/idl.h"
|
||||||
#include "flatbuffers/util.h"
|
#include "flatbuffers/util.h"
|
||||||
|
#include "flatbuffers/code_generators.h"
|
||||||
|
|
||||||
namespace flatbuffers {
|
namespace flatbuffers {
|
||||||
namespace python {
|
namespace python {
|
||||||
@@ -634,28 +635,47 @@ static void GenStructBuilder(const StructDef &struct_def,
|
|||||||
EndBuilderBody(code_ptr);
|
EndBuilderBody(code_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class PythonGenerator : public BaseGenerator {
|
||||||
|
public:
|
||||||
|
PythonGenerator(const Parser &parser, const std::string &path,
|
||||||
|
const std::string &file_name)
|
||||||
|
: BaseGenerator(parser, path, file_name){};
|
||||||
|
bool generate() {
|
||||||
|
if (!generateEnums()) return false;
|
||||||
|
if (!generateStructs()) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool generateEnums() {
|
||||||
|
for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();
|
||||||
|
++it) {
|
||||||
|
auto &enum_def = **it;
|
||||||
|
std::string enumcode;
|
||||||
|
GenEnum(enum_def, &enumcode);
|
||||||
|
if (!SaveType(parser_, enum_def, enumcode, path_, false)) return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool generateStructs() {
|
||||||
|
for (auto it = parser_.structs_.vec.begin();
|
||||||
|
it != parser_.structs_.vec.end(); ++it) {
|
||||||
|
auto &struct_def = **it;
|
||||||
|
std::string declcode;
|
||||||
|
GenStruct(struct_def, &declcode, parser_.root_struct_def_);
|
||||||
|
if (!SaveType(parser_, struct_def, declcode, path_, true)) return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace python
|
} // namespace python
|
||||||
|
|
||||||
bool GeneratePython(const Parser &parser,
|
bool GeneratePython(const Parser &parser, const std::string &path,
|
||||||
const std::string &path,
|
const std::string &file_name) {
|
||||||
const std::string & /*file_name*/) {
|
python::PythonGenerator generator(parser, path, file_name);
|
||||||
for (auto it = parser.enums_.vec.begin();
|
return generator.generate();
|
||||||
it != parser.enums_.vec.end(); ++it) {
|
|
||||||
std::string enumcode;
|
|
||||||
python::GenEnum(**it, &enumcode);
|
|
||||||
if (!python::SaveType(parser, **it, enumcode, path, false))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto it = parser.structs_.vec.begin();
|
|
||||||
it != parser.structs_.vec.end(); ++it) {
|
|
||||||
std::string declcode;
|
|
||||||
python::GenStruct(**it, &declcode, parser.root_struct_def_);
|
|
||||||
if (!python::SaveType(parser, **it, declcode, path, true))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace flatbuffers
|
} // namespace flatbuffers
|
||||||
|
|||||||
Reference in New Issue
Block a user