mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-06 21:37:36 +00:00
Merge branch 'master' of github.com:google/flatbuffers
This commit is contained in:
6
src/clang-format-all.sh
Normal file
6
src/clang-format-all.sh
Normal file
@@ -0,0 +1,6 @@
|
||||
# Running it twice corrects some bugs in clang-format.
|
||||
for run in {1..2}
|
||||
do
|
||||
clang-format -i -style=file include/flatbuffers/* src/*.cpp tests/*.cpp samples/*.cpp grpc/src/compiler/schema_interface.h grpc/tests/*.cpp
|
||||
done
|
||||
git checkout include/flatbuffers/reflection_generated.h
|
||||
6
src/clang-format-git.sh
Normal file
6
src/clang-format-git.sh
Normal file
@@ -0,0 +1,6 @@
|
||||
# Running it twice corrects some bugs in clang-format.
|
||||
for run in {1..2}
|
||||
do
|
||||
git clang-format HEAD^ -- include/flatbuffers/* src/*.cpp tests/*.cpp samples/*.cpp grpc/src/compiler/schema_interface.h grpc/tests/*.cpp
|
||||
done
|
||||
git checkout include/flatbuffers/reflection_generated.h
|
||||
@@ -1,2 +0,0 @@
|
||||
clang-format -i -style=file include/flatbuffers/* src/*.cpp tests/test.cpp samples/*.cpp grpc/src/compiler/schema_interface.h grpc/tests/*.cpp
|
||||
git checkout include/flatbuffers/reflection_generated.h
|
||||
@@ -15,12 +15,14 @@
|
||||
*/
|
||||
|
||||
#include "flatbuffers/code_generators.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include "flatbuffers/base.h"
|
||||
#include "flatbuffers/util.h"
|
||||
|
||||
#include <cmath>
|
||||
|
||||
#include "flatbuffers/base.h"
|
||||
#include "flatbuffers/util.h"
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable : 4127) // C4127: conditional expression is constant
|
||||
@@ -285,6 +287,80 @@ std::string SimpleFloatConstantGenerator::NaN(float v) const {
|
||||
return this->NaN(static_cast<double>(v));
|
||||
}
|
||||
|
||||
std::string JavaCSharpMakeRule(const Parser &parser, const std::string &path,
|
||||
const std::string &file_name) {
|
||||
FLATBUFFERS_ASSERT(parser.opts.lang == IDLOptions::kJava ||
|
||||
parser.opts.lang == IDLOptions::kCSharp);
|
||||
|
||||
std::string file_extension =
|
||||
(parser.opts.lang == IDLOptions::kJava) ? ".java" : ".cs";
|
||||
|
||||
std::string make_rule;
|
||||
|
||||
for (auto it = parser.enums_.vec.begin(); it != parser.enums_.vec.end();
|
||||
++it) {
|
||||
auto &enum_def = **it;
|
||||
if (!make_rule.empty()) make_rule += " ";
|
||||
std::string directory =
|
||||
BaseGenerator::NamespaceDir(parser, path, *enum_def.defined_namespace);
|
||||
make_rule += directory + enum_def.name + file_extension;
|
||||
}
|
||||
|
||||
for (auto it = parser.structs_.vec.begin(); it != parser.structs_.vec.end();
|
||||
++it) {
|
||||
auto &struct_def = **it;
|
||||
if (!make_rule.empty()) make_rule += " ";
|
||||
std::string directory = BaseGenerator::NamespaceDir(
|
||||
parser, path, *struct_def.defined_namespace);
|
||||
make_rule += directory + struct_def.name + file_extension;
|
||||
}
|
||||
|
||||
make_rule += ": ";
|
||||
auto included_files = parser.GetIncludedFilesRecursive(file_name);
|
||||
for (auto it = included_files.begin(); it != included_files.end(); ++it) {
|
||||
make_rule += " " + *it;
|
||||
}
|
||||
return make_rule;
|
||||
}
|
||||
|
||||
std::string BinaryFileName(const Parser &parser, const std::string &path,
|
||||
const std::string &file_name) {
|
||||
auto ext = parser.file_extension_.length() ? parser.file_extension_ : "bin";
|
||||
return path + file_name + "." + ext;
|
||||
}
|
||||
|
||||
bool GenerateBinary(const Parser &parser, const std::string &path,
|
||||
const std::string &file_name) {
|
||||
if (parser.opts.use_flexbuffers) {
|
||||
auto data_vec = parser.flex_builder_.GetBuffer();
|
||||
auto data_ptr = reinterpret_cast<char *>(data(data_vec));
|
||||
return !parser.flex_builder_.GetSize() ||
|
||||
flatbuffers::SaveFile(
|
||||
BinaryFileName(parser, path, file_name).c_str(), data_ptr,
|
||||
parser.flex_builder_.GetSize(), true);
|
||||
}
|
||||
return !parser.builder_.GetSize() ||
|
||||
flatbuffers::SaveFile(
|
||||
BinaryFileName(parser, path, file_name).c_str(),
|
||||
reinterpret_cast<char *>(parser.builder_.GetBufferPointer()),
|
||||
parser.builder_.GetSize(), true);
|
||||
}
|
||||
|
||||
std::string BinaryMakeRule(const Parser &parser, const std::string &path,
|
||||
const std::string &file_name) {
|
||||
if (!parser.builder_.GetSize()) return "";
|
||||
std::string filebase =
|
||||
flatbuffers::StripPath(flatbuffers::StripExtension(file_name));
|
||||
std::string make_rule =
|
||||
BinaryFileName(parser, path, filebase) + ": " + file_name;
|
||||
auto included_files =
|
||||
parser.GetIncludedFilesRecursive(parser.root_struct_def_->file);
|
||||
for (auto it = included_files.begin(); it != included_files.end(); ++it) {
|
||||
make_rule += " " + *it;
|
||||
}
|
||||
return make_rule;
|
||||
}
|
||||
|
||||
} // namespace flatbuffers
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
|
||||
@@ -42,7 +42,7 @@ void FlatCompiler::LoadBinarySchema(flatbuffers::Parser &parser,
|
||||
const std::string &filename,
|
||||
const std::string &contents) {
|
||||
if (!parser.Deserialize(reinterpret_cast<const uint8_t *>(contents.c_str()),
|
||||
contents.size())) {
|
||||
contents.size())) {
|
||||
Error("failed to load binary schema: " + filename, false, false);
|
||||
}
|
||||
}
|
||||
@@ -402,7 +402,8 @@ int FlatCompiler::Compile(int argc, const char **argv) {
|
||||
"\" matches the schema, use --raw-binary to read this file"
|
||||
" anyway.");
|
||||
} else if (!flatbuffers::BufferHasIdentifier(
|
||||
contents.c_str(), parser->file_identifier_.c_str(), opts.size_prefixed)) {
|
||||
contents.c_str(), parser->file_identifier_.c_str(),
|
||||
opts.size_prefixed)) {
|
||||
Error("binary \"" + filename +
|
||||
"\" does not have expected file_identifier \"" +
|
||||
parser->file_identifier_ +
|
||||
@@ -435,8 +436,7 @@ int FlatCompiler::Compile(int argc, const char **argv) {
|
||||
}
|
||||
} else {
|
||||
ParseFile(*parser.get(), filename, contents, include_directories);
|
||||
if (!opts.use_flexbuffers && !is_schema &&
|
||||
!parser->builder_.GetSize()) {
|
||||
if (!is_schema && !parser->builder_.GetSize()) {
|
||||
// If a file doesn't end in .fbs, it must be json/binary. Ensure we
|
||||
// didn't just parse a schema with a different extension.
|
||||
Error("input file is neither json nor a .fbs (schema) file: " +
|
||||
@@ -470,11 +470,16 @@ int FlatCompiler::Compile(int argc, const char **argv) {
|
||||
params_.generators[i].lang_name + " for " + filebase);
|
||||
}
|
||||
} else {
|
||||
std::string make_rule = params_.generators[i].make_rule(
|
||||
*parser.get(), output_path, filename);
|
||||
if (!make_rule.empty())
|
||||
printf("%s\n",
|
||||
flatbuffers::WordWrap(make_rule, 80, " ", " \\").c_str());
|
||||
if (params_.generators[i].make_rule == nullptr) {
|
||||
Error(std::string("Cannot generate make rule for ") +
|
||||
params_.generators[i].lang_name);
|
||||
} else {
|
||||
std::string make_rule = params_.generators[i].make_rule(
|
||||
*parser.get(), output_path, filename);
|
||||
if (!make_rule.empty())
|
||||
printf("%s\n",
|
||||
flatbuffers::WordWrap(make_rule, 80, " ", " \\").c_str());
|
||||
}
|
||||
}
|
||||
if (grpc_enabled) {
|
||||
if (params_.generators[i].generateGRPC != nullptr) {
|
||||
|
||||
@@ -54,48 +54,47 @@ int main(int argc, const char *argv[]) {
|
||||
"Generate C++ headers for tables/structs", flatbuffers::CPPMakeRule },
|
||||
{ flatbuffers::GenerateGo, "-g", "--go", "Go", true,
|
||||
flatbuffers::GenerateGoGRPC, flatbuffers::IDLOptions::kGo,
|
||||
"Generate Go files for tables/structs", flatbuffers::GeneralMakeRule },
|
||||
{ flatbuffers::GenerateGeneral, "-j", "--java", "Java", true,
|
||||
"Generate Go files for tables/structs", nullptr },
|
||||
{ flatbuffers::GenerateJava, "-j", "--java", "Java", true,
|
||||
flatbuffers::GenerateJavaGRPC, flatbuffers::IDLOptions::kJava,
|
||||
"Generate Java classes for tables/structs",
|
||||
flatbuffers::GeneralMakeRule },
|
||||
flatbuffers::JavaCSharpMakeRule },
|
||||
{ flatbuffers::GenerateJSTS, "-s", "--js", "JavaScript", true, nullptr,
|
||||
flatbuffers::IDLOptions::kJs,
|
||||
"Generate JavaScript code for tables/structs", flatbuffers::JSTSMakeRule },
|
||||
"Generate JavaScript code for tables/structs",
|
||||
flatbuffers::JSTSMakeRule },
|
||||
{ flatbuffers::GenerateDart, "-d", "--dart", "Dart", true, nullptr,
|
||||
flatbuffers::IDLOptions::kDart,
|
||||
"Generate Dart classes for tables/structs", flatbuffers::DartMakeRule },
|
||||
{ flatbuffers::GenerateJSTS, "-T", "--ts", "TypeScript", true, nullptr,
|
||||
flatbuffers::IDLOptions::kTs,
|
||||
"Generate TypeScript code for tables/structs", flatbuffers::JSTSMakeRule },
|
||||
{ flatbuffers::GenerateGeneral, "-n", "--csharp", "C#", true, nullptr,
|
||||
"Generate TypeScript code for tables/structs",
|
||||
flatbuffers::JSTSMakeRule },
|
||||
{ flatbuffers::GenerateCSharp, "-n", "--csharp", "C#", true, nullptr,
|
||||
flatbuffers::IDLOptions::kCSharp,
|
||||
"Generate C# classes for tables/structs", flatbuffers::GeneralMakeRule },
|
||||
{ flatbuffers::GeneratePython, "-p", "--python", "Python", true, nullptr,
|
||||
flatbuffers::IDLOptions::kPython,
|
||||
"Generate Python files for tables/structs",
|
||||
flatbuffers::GeneralMakeRule },
|
||||
{ flatbuffers::GenerateLobster, nullptr, "--lobster", "Lobster", true, nullptr,
|
||||
flatbuffers::IDLOptions::kLobster,
|
||||
"Generate Lobster files for tables/structs",
|
||||
flatbuffers::GeneralMakeRule },
|
||||
"Generate C# classes for tables/structs",
|
||||
flatbuffers::JavaCSharpMakeRule },
|
||||
{ flatbuffers::GeneratePython, "-p", "--python", "Python", true,
|
||||
flatbuffers::GeneratePythonGRPC, flatbuffers::IDLOptions::kPython,
|
||||
"Generate Python files for tables/structs", nullptr },
|
||||
{ flatbuffers::GenerateLobster, nullptr, "--lobster", "Lobster", true,
|
||||
nullptr, flatbuffers::IDLOptions::kLobster,
|
||||
"Generate Lobster files for tables/structs", nullptr },
|
||||
{ flatbuffers::GenerateLua, "-l", "--lua", "Lua", true, nullptr,
|
||||
flatbuffers::IDLOptions::kLua,
|
||||
"Generate Lua files for tables/structs",
|
||||
flatbuffers::GeneralMakeRule },
|
||||
flatbuffers::IDLOptions::kLua, "Generate Lua files for tables/structs",
|
||||
nullptr },
|
||||
{ flatbuffers::GenerateRust, "-r", "--rust", "Rust", true, nullptr,
|
||||
flatbuffers::IDLOptions::kRust,
|
||||
"Generate Rust files for tables/structs",
|
||||
flatbuffers::IDLOptions::kRust, "Generate Rust files for tables/structs",
|
||||
flatbuffers::RustMakeRule },
|
||||
{ flatbuffers::GeneratePhp, nullptr, "--php", "PHP", true, nullptr,
|
||||
flatbuffers::IDLOptions::kPhp, "Generate PHP files for tables/structs",
|
||||
flatbuffers::GeneralMakeRule },
|
||||
nullptr },
|
||||
{ flatbuffers::GenerateKotlin, nullptr, "--kotlin", "Kotlin", true, nullptr,
|
||||
flatbuffers::IDLOptions::kKotlin, "Generate Kotlin classes for tables/structs",
|
||||
flatbuffers::GeneralMakeRule },
|
||||
flatbuffers::IDLOptions::kKotlin,
|
||||
"Generate Kotlin classes for tables/structs", nullptr },
|
||||
{ flatbuffers::GenerateJsonSchema, nullptr, "--jsonschema", "JsonSchema",
|
||||
true, nullptr, flatbuffers::IDLOptions::kJsonSchema,
|
||||
"Generate Json schema", flatbuffers::GeneralMakeRule },
|
||||
"Generate Json schema", nullptr },
|
||||
};
|
||||
|
||||
flatbuffers::FlatCompiler::InitParams params;
|
||||
|
||||
@@ -15,9 +15,11 @@
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
|
||||
#include "flatbuffers/hash.h"
|
||||
|
||||
enum OutputFormat { kDecimal, kHexadecimal, kHexadecimal0x };
|
||||
@@ -35,7 +37,7 @@ int main(int argc, char *argv[]) {
|
||||
}
|
||||
printf(" 32 bit:\n");
|
||||
size = sizeof(flatbuffers::kHashFunctions32) /
|
||||
sizeof(flatbuffers::kHashFunctions32[0]);
|
||||
sizeof(flatbuffers::kHashFunctions32[0]);
|
||||
for (size_t i = 0; i < size; ++i) {
|
||||
printf(" * %s\n", flatbuffers::kHashFunctions32[i].name);
|
||||
}
|
||||
|
||||
@@ -16,13 +16,13 @@
|
||||
|
||||
// independent from idl_parser, since this code is not needed for most clients
|
||||
|
||||
#include <unordered_set>
|
||||
|
||||
#include "flatbuffers/code_generators.h"
|
||||
#include "flatbuffers/flatbuffers.h"
|
||||
#include "flatbuffers/idl.h"
|
||||
#include "flatbuffers/util.h"
|
||||
|
||||
#include <unordered_set>
|
||||
|
||||
namespace flatbuffers {
|
||||
|
||||
// Pedantic warning free version of toupper().
|
||||
@@ -208,9 +208,7 @@ class CppGenerator : public BaseGenerator {
|
||||
for (std::size_t i = 0; i < parser_.opts.cpp_includes.size(); ++i) {
|
||||
code_ += "#include \"" + parser_.opts.cpp_includes[i] + "\"";
|
||||
}
|
||||
if (!parser_.opts.cpp_includes.empty()) {
|
||||
code_ += "";
|
||||
}
|
||||
if (!parser_.opts.cpp_includes.empty()) { code_ += ""; }
|
||||
}
|
||||
|
||||
std::string EscapeKeyword(const std::string &name) const {
|
||||
@@ -547,11 +545,10 @@ class CppGenerator : public BaseGenerator {
|
||||
std::string GenTypeBasic(const Type &type, bool user_facing_type) const {
|
||||
// clang-format off
|
||||
static const char *const ctypename[] = {
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, \
|
||||
RTYPE, KTYPE) \
|
||||
#CTYPE,
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \
|
||||
#CTYPE,
|
||||
FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)
|
||||
#undef FLATBUFFERS_TD
|
||||
#undef FLATBUFFERS_TD
|
||||
};
|
||||
// clang-format on
|
||||
if (user_facing_type) {
|
||||
@@ -577,7 +574,9 @@ class CppGenerator : public BaseGenerator {
|
||||
}
|
||||
case BASE_TYPE_UNION:
|
||||
// fall through
|
||||
default: { return "void"; }
|
||||
default: {
|
||||
return "void";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -696,7 +695,9 @@ class CppGenerator : public BaseGenerator {
|
||||
case BASE_TYPE_UNION: {
|
||||
return type.enum_def->name + "Union";
|
||||
}
|
||||
default: { return GenTypeBasic(type, true); }
|
||||
default: {
|
||||
return GenTypeBasic(type, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1163,7 +1164,8 @@ class CppGenerator : public BaseGenerator {
|
||||
code_ += " void Set(T&& val) {";
|
||||
code_ += " using RT = typename std::remove_reference<T>::type;";
|
||||
code_ += " Reset();";
|
||||
code_ += " type = {{NAME}}Traits<typename RT::TableType>::enum_value;";
|
||||
code_ +=
|
||||
" type = {{NAME}}Traits<typename RT::TableType>::enum_value;";
|
||||
code_ += " if (type != {{NONE}}) {";
|
||||
code_ += " value = new RT(std::forward<T>(val));";
|
||||
code_ += " }";
|
||||
@@ -1276,7 +1278,8 @@ class CppGenerator : public BaseGenerator {
|
||||
" auto ptr = reinterpret_cast<const {{TYPE}} *>(obj);";
|
||||
if (ev.union_type.base_type == BASE_TYPE_STRUCT) {
|
||||
if (ev.union_type.struct_def->fixed) {
|
||||
code_ += " return verifier.Verify<{{TYPE}}>(static_cast<const "
|
||||
code_ +=
|
||||
" return verifier.Verify<{{TYPE}}>(static_cast<const "
|
||||
"uint8_t *>(obj), 0);";
|
||||
} else {
|
||||
code_ += getptr;
|
||||
@@ -1295,7 +1298,7 @@ class CppGenerator : public BaseGenerator {
|
||||
code_ += " }";
|
||||
}
|
||||
}
|
||||
code_ += " default: return true;"; // unknown values are OK.
|
||||
code_ += " default: return true;"; // unknown values are OK.
|
||||
code_ += " }";
|
||||
code_ += "}";
|
||||
code_ += "";
|
||||
@@ -1763,7 +1766,9 @@ class CppGenerator : public BaseGenerator {
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: { break; }
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1925,7 +1930,8 @@ class CppGenerator : public BaseGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
if (parser_.opts.mutable_buffer) {
|
||||
if (parser_.opts.mutable_buffer &&
|
||||
!(is_scalar && IsUnion(field.value.type))) {
|
||||
if (is_scalar) {
|
||||
const auto type = GenTypeWire(field.value.type, "", false);
|
||||
code_.SetValue("SET_FN", "SetField<" + type + ">");
|
||||
@@ -2901,8 +2907,8 @@ class CppGenerator : public BaseGenerator {
|
||||
} else if (IsArray(field.value.type)) {
|
||||
auto underlying = GenTypeGet(field.value.type, "", "", "", false);
|
||||
code_ += " flatbuffers::Array<" + mut_field_type + ", " +
|
||||
NumToString(field.value.type.fixed_length) +
|
||||
"> *" + "mutable_{{FIELD_NAME}}() {";
|
||||
NumToString(field.value.type.fixed_length) + "> *" +
|
||||
"mutable_{{FIELD_NAME}}() {";
|
||||
code_ += " return reinterpret_cast<flatbuffers::Array<" +
|
||||
mut_field_type + ", " +
|
||||
NumToString(field.value.type.fixed_length) +
|
||||
|
||||
1181
src/idl_gen_csharp.cpp
Normal file
1181
src/idl_gen_csharp.cpp
Normal file
File diff suppressed because it is too large
Load Diff
@@ -71,9 +71,7 @@ class DartGenerator : public BaseGenerator {
|
||||
"// ignore_for_file: unused_import, unused_field, "
|
||||
"unused_local_variable\n\n";
|
||||
|
||||
if (!kv->first.empty()) {
|
||||
code += "library " + kv->first + ";\n\n";
|
||||
}
|
||||
if (!kv->first.empty()) { code += "library " + kv->first + ";\n\n"; }
|
||||
|
||||
code += "import 'dart:typed_data' show Uint8List;\n";
|
||||
code += "import 'package:flat_buffers/flat_buffers.dart' as " + _kFb +
|
||||
@@ -87,16 +85,20 @@ class DartGenerator : public BaseGenerator {
|
||||
++kv2) {
|
||||
if (kv2->first != kv->first) {
|
||||
code += "import '" +
|
||||
GeneratedFileName("./", file_name_ + (!kv2->first.empty() ? "_" + kv2->first : "")) +
|
||||
GeneratedFileName(
|
||||
"./", file_name_ +
|
||||
(!kv2->first.empty() ? "_" + kv2->first : "")) +
|
||||
"' as " + ImportAliasName(kv2->first) + ";\n";
|
||||
}
|
||||
}
|
||||
code += "\n";
|
||||
code += kv->second;
|
||||
|
||||
if (!SaveFile(
|
||||
GeneratedFileName(path_, file_name_ + (!kv->first.empty() ? "_" + kv->first : "")).c_str(),
|
||||
code, false)) {
|
||||
if (!SaveFile(GeneratedFileName(
|
||||
path_, file_name_ +
|
||||
(!kv->first.empty() ? "_" + kv->first : ""))
|
||||
.c_str(),
|
||||
code, false)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -117,9 +119,7 @@ class DartGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
static std::string BuildNamespaceName(const Namespace &ns) {
|
||||
if (ns.components.empty()) {
|
||||
return "";
|
||||
}
|
||||
if (ns.components.empty()) { return ""; }
|
||||
std::stringstream sstream;
|
||||
std::copy(ns.components.begin(), ns.components.end() - 1,
|
||||
std::ostream_iterator<std::string>(sstream, "."));
|
||||
@@ -139,7 +139,8 @@ class DartGenerator : public BaseGenerator {
|
||||
return ret;
|
||||
}
|
||||
|
||||
void GenIncludeDependencies(std::string* code, const std::string& the_namespace) {
|
||||
void GenIncludeDependencies(std::string *code,
|
||||
const std::string &the_namespace) {
|
||||
for (auto it = parser_.included_files_.begin();
|
||||
it != parser_.included_files_.end(); ++it) {
|
||||
if (it->second.empty()) continue;
|
||||
@@ -147,7 +148,11 @@ class DartGenerator : public BaseGenerator {
|
||||
auto noext = flatbuffers::StripExtension(it->second);
|
||||
auto basename = flatbuffers::StripPath(noext);
|
||||
|
||||
*code += "import '" + GeneratedFileName("", basename + (the_namespace == "" ? "" : "_" + the_namespace)) + "';\n";
|
||||
*code +=
|
||||
"import '" +
|
||||
GeneratedFileName(
|
||||
"", basename + (the_namespace == "" ? "" : "_" + the_namespace)) +
|
||||
"';\n";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -798,7 +803,8 @@ class DartGenerator : public BaseGenerator {
|
||||
}
|
||||
code += "\n : null;\n";
|
||||
} else if (field.value.type.base_type == BASE_TYPE_STRING) {
|
||||
code += " = fbBuilder.writeString(_" + MakeCamel(field.name, false) + ");\n";
|
||||
code += " = fbBuilder.writeString(_" + MakeCamel(field.name, false) +
|
||||
");\n";
|
||||
} else {
|
||||
code += " = _" + MakeCamel(field.name, false) +
|
||||
"?.getOrCreateOffset(fbBuilder);\n";
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -43,7 +43,7 @@ static std::string GeneratedFileName(const std::string &path,
|
||||
namespace go {
|
||||
|
||||
// see https://golang.org/ref/spec#Keywords
|
||||
static const char * const g_golang_keywords[] = {
|
||||
static const char *const g_golang_keywords[] = {
|
||||
"break", "default", "func", "interface", "select", "case", "defer",
|
||||
"go", "map", "struct", "chan", "else", "goto", "package",
|
||||
"switch", "const", "fallthrough", "if", "range", "type", "continue",
|
||||
@@ -75,15 +75,23 @@ class GoGenerator : public BaseGenerator {
|
||||
|
||||
bool generate() {
|
||||
std::string one_file_code;
|
||||
bool needs_imports = false;
|
||||
for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();
|
||||
++it) {
|
||||
tracked_imported_namespaces_.clear();
|
||||
needs_imports = false;
|
||||
std::string enumcode;
|
||||
GenEnum(**it, &enumcode);
|
||||
if ((*it)->is_union && parser_.opts.generate_object_based_api) {
|
||||
GenNativeUnion(**it, &enumcode);
|
||||
GenNativeUnionPack(**it, &enumcode);
|
||||
GenNativeUnionUnPack(**it, &enumcode);
|
||||
needs_imports = true;
|
||||
}
|
||||
if (parser_.opts.one_file) {
|
||||
one_file_code += enumcode;
|
||||
} else {
|
||||
if (!SaveType(**it, enumcode, false, true)) return false;
|
||||
if (!SaveType(**it, enumcode, needs_imports, true)) return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,7 +151,8 @@ class GoGenerator : public BaseGenerator {
|
||||
|
||||
// Construct the name of the type for this enum.
|
||||
std::string GetEnumTypeName(const EnumDef &enum_def) {
|
||||
return WrapInNameSpaceAndTrack(enum_def.defined_namespace, GoIdentity(enum_def.name));
|
||||
return WrapInNameSpaceAndTrack(enum_def.defined_namespace,
|
||||
GoIdentity(enum_def.name));
|
||||
}
|
||||
|
||||
// Create a type for the enum values.
|
||||
@@ -214,7 +223,7 @@ class GoGenerator : public BaseGenerator {
|
||||
code += "\tif s, ok := EnumNames" + enum_def.name + "[v]; ok {\n";
|
||||
code += "\t\treturn s\n";
|
||||
code += "\t}\n";
|
||||
code += "\treturn \""+ enum_def.name;
|
||||
code += "\treturn \"" + enum_def.name;
|
||||
code += "(\" + strconv.FormatInt(int64(v), 10) + \")\"\n";
|
||||
code += "}\n\n";
|
||||
}
|
||||
@@ -317,23 +326,21 @@ class GoGenerator : public BaseGenerator {
|
||||
|
||||
// Get the value of a struct's scalar.
|
||||
void GetScalarFieldOfStruct(const StructDef &struct_def,
|
||||
const FieldDef &field,
|
||||
std::string *code_ptr) {
|
||||
const FieldDef &field, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
std::string getter = GenGetter(field.value.type);
|
||||
GenReceiver(struct_def, code_ptr);
|
||||
code += " " + MakeCamel(field.name);
|
||||
code += "() " + TypeName(field) + " {\n";
|
||||
code += "\treturn " + CastToEnum(
|
||||
field.value.type,
|
||||
getter + "(rcv._tab.Pos + flatbuffers.UOffsetT(" +
|
||||
NumToString(field.value.offset) + "))");
|
||||
code += "\treturn " +
|
||||
CastToEnum(field.value.type,
|
||||
getter + "(rcv._tab.Pos + flatbuffers.UOffsetT(" +
|
||||
NumToString(field.value.offset) + "))");
|
||||
code += "\n}\n";
|
||||
}
|
||||
|
||||
// Get the value of a table's scalar.
|
||||
void GetScalarFieldOfTable(const StructDef &struct_def,
|
||||
const FieldDef &field,
|
||||
void GetScalarFieldOfTable(const StructDef &struct_def, const FieldDef &field,
|
||||
std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
std::string getter = GenGetter(field.value.type);
|
||||
@@ -350,8 +357,7 @@ class GoGenerator : public BaseGenerator {
|
||||
// Get a struct by initializing an existing struct.
|
||||
// Specific to Struct.
|
||||
void GetStructFieldOfStruct(const StructDef &struct_def,
|
||||
const FieldDef &field,
|
||||
std::string *code_ptr) {
|
||||
const FieldDef &field, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
GenReceiver(struct_def, code_ptr);
|
||||
code += " " + MakeCamel(field.name);
|
||||
@@ -369,8 +375,7 @@ class GoGenerator : public BaseGenerator {
|
||||
|
||||
// Get a struct by initializing an existing struct.
|
||||
// Specific to Table.
|
||||
void GetStructFieldOfTable(const StructDef &struct_def,
|
||||
const FieldDef &field,
|
||||
void GetStructFieldOfTable(const StructDef &struct_def, const FieldDef &field,
|
||||
std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
GenReceiver(struct_def, code_ptr);
|
||||
@@ -392,8 +397,7 @@ class GoGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
// Get the value of a string.
|
||||
void GetStringField(const StructDef &struct_def,
|
||||
const FieldDef &field,
|
||||
void GetStringField(const StructDef &struct_def, const FieldDef &field,
|
||||
std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
GenReceiver(struct_def, code_ptr);
|
||||
@@ -420,8 +424,7 @@ class GoGenerator : public BaseGenerator {
|
||||
|
||||
// Get the value of a vector's struct member.
|
||||
void GetMemberOfVectorOfStruct(const StructDef &struct_def,
|
||||
const FieldDef &field,
|
||||
std::string *code_ptr) {
|
||||
const FieldDef &field, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
auto vectortype = field.value.type.VectorType();
|
||||
|
||||
@@ -453,10 +456,11 @@ class GoGenerator : public BaseGenerator {
|
||||
code += "(j int) " + TypeName(field) + " ";
|
||||
code += OffsetPrefix(field);
|
||||
code += "\t\ta := rcv._tab.Vector(o)\n";
|
||||
code += "\t\treturn " + CastToEnum(
|
||||
field.value.type,
|
||||
GenGetter(field.value.type) + "(a + flatbuffers.UOffsetT(j*" +
|
||||
NumToString(InlineSize(vectortype)) + "))");
|
||||
code += "\t\treturn " +
|
||||
CastToEnum(field.value.type,
|
||||
GenGetter(field.value.type) +
|
||||
"(a + flatbuffers.UOffsetT(j*" +
|
||||
NumToString(InlineSize(vectortype)) + "))");
|
||||
code += "\n\t}\n";
|
||||
if (vectortype.base_type == BASE_TYPE_STRING) {
|
||||
code += "\treturn nil\n";
|
||||
@@ -510,8 +514,8 @@ class GoGenerator : public BaseGenerator {
|
||||
|
||||
// Recursively generate struct construction statements and instert manual
|
||||
// padding.
|
||||
void StructBuilderBody(const StructDef &struct_def,
|
||||
const char *nameprefix, std::string *code_ptr) {
|
||||
void StructBuilderBody(const StructDef &struct_def, const char *nameprefix,
|
||||
std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
code += "\tbuilder.Prep(" + NumToString(struct_def.minalign) + ", ";
|
||||
code += NumToString(struct_def.bytesize) + ")\n";
|
||||
@@ -525,7 +529,9 @@ class GoGenerator : public BaseGenerator {
|
||||
(nameprefix + (field.name + "_")).c_str(), code_ptr);
|
||||
} else {
|
||||
code += "\tbuilder.Prepend" + GenMethod(field) + "(";
|
||||
code += CastToBaseType(field.value.type, nameprefix + GoIdentity(field.name)) + ")\n";
|
||||
code += CastToBaseType(field.value.type,
|
||||
nameprefix + GoIdentity(field.name)) +
|
||||
")\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -574,8 +580,8 @@ class GoGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
// Set the value of one of the members of a table's vector.
|
||||
void BuildVectorOfTable(const StructDef &struct_def,
|
||||
const FieldDef &field, std::string *code_ptr) {
|
||||
void BuildVectorOfTable(const StructDef &struct_def, const FieldDef &field,
|
||||
std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
code += "func " + struct_def.name + "Start";
|
||||
code += MakeCamel(field.name);
|
||||
@@ -604,8 +610,8 @@ class GoGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
// Generate a struct field getter, conditioned on its child type(s).
|
||||
void GenStructAccessor(const StructDef &struct_def,
|
||||
const FieldDef &field, std::string *code_ptr) {
|
||||
void GenStructAccessor(const StructDef &struct_def, const FieldDef &field,
|
||||
std::string *code_ptr) {
|
||||
GenComment(field.doc_comment, code_ptr, nullptr, "");
|
||||
if (IsScalar(field.value.type.base_type)) {
|
||||
if (struct_def.fixed) {
|
||||
@@ -622,7 +628,9 @@ class GoGenerator : public BaseGenerator {
|
||||
GetStructFieldOfTable(struct_def, field, code_ptr);
|
||||
}
|
||||
break;
|
||||
case BASE_TYPE_STRING: GetStringField(struct_def, field, code_ptr); break;
|
||||
case BASE_TYPE_STRING:
|
||||
GetStringField(struct_def, field, code_ptr);
|
||||
break;
|
||||
case BASE_TYPE_VECTOR: {
|
||||
auto vectortype = field.value.type.VectorType();
|
||||
if (vectortype.base_type == BASE_TYPE_STRUCT) {
|
||||
@@ -646,8 +654,7 @@ class GoGenerator : public BaseGenerator {
|
||||
|
||||
// Mutate the value of a struct's scalar.
|
||||
void MutateScalarFieldOfStruct(const StructDef &struct_def,
|
||||
const FieldDef &field,
|
||||
std::string *code_ptr) {
|
||||
const FieldDef &field, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
std::string type = MakeCamel(GenTypeBasic(field.value.type));
|
||||
std::string setter = "rcv._tab.Mutate" + type;
|
||||
@@ -661,8 +668,7 @@ class GoGenerator : public BaseGenerator {
|
||||
|
||||
// Mutate the value of a table's scalar.
|
||||
void MutateScalarFieldOfTable(const StructDef &struct_def,
|
||||
const FieldDef &field,
|
||||
std::string *code_ptr) {
|
||||
const FieldDef &field, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
std::string type = MakeCamel(GenTypeBasic(field.value.type));
|
||||
std::string setter = "rcv._tab.Mutate" + type + "Slot";
|
||||
@@ -739,6 +745,9 @@ class GoGenerator : public BaseGenerator {
|
||||
cur_name_space_ = struct_def.defined_namespace;
|
||||
|
||||
GenComment(struct_def.doc_comment, code_ptr, nullptr);
|
||||
if (parser_.opts.generate_object_based_api) {
|
||||
GenNativeStruct(struct_def, code_ptr);
|
||||
}
|
||||
BeginClass(struct_def, code_ptr);
|
||||
if (!struct_def.fixed) {
|
||||
// Generate a special accessor for the table that has been declared as
|
||||
@@ -771,6 +780,336 @@ class GoGenerator : public BaseGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
void GenNativeStruct(const StructDef &struct_def, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
|
||||
code += "type " + NativeName(struct_def) + " struct {\n";
|
||||
for (auto it = struct_def.fields.vec.begin();
|
||||
it != struct_def.fields.vec.end(); ++it) {
|
||||
const FieldDef &field = **it;
|
||||
if (field.deprecated) continue;
|
||||
if (IsScalar(field.value.type.base_type) &&
|
||||
field.value.type.enum_def != nullptr &&
|
||||
field.value.type.enum_def->is_union)
|
||||
continue;
|
||||
code += "\t" + MakeCamel(field.name) + " " +
|
||||
NativeType(field.value.type) + "\n";
|
||||
}
|
||||
code += "}\n\n";
|
||||
|
||||
if (!struct_def.fixed) {
|
||||
GenNativeTablePack(struct_def, code_ptr);
|
||||
GenNativeTableUnPack(struct_def, code_ptr);
|
||||
} else {
|
||||
GenNativeStructPack(struct_def, code_ptr);
|
||||
GenNativeStructUnPack(struct_def, code_ptr);
|
||||
}
|
||||
}
|
||||
|
||||
void GenNativeUnion(const EnumDef &enum_def, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
code += "type " + NativeName(enum_def) + " struct {\n";
|
||||
code += "\tType " + enum_def.name + "\n";
|
||||
code += "\tValue interface{}\n";
|
||||
code += "}\n\n";
|
||||
}
|
||||
|
||||
void GenNativeUnionPack(const EnumDef &enum_def, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
code += "func " + enum_def.name + "Pack(builder *flatbuffers.Builder, t *" +
|
||||
NativeName(enum_def) + ") flatbuffers.UOffsetT {\n";
|
||||
code += "\tif t == nil {\n\t\treturn 0\n\t}\n";
|
||||
|
||||
code += "\tswitch t.Type {\n";
|
||||
for (auto it2 = enum_def.Vals().begin(); it2 != enum_def.Vals().end();
|
||||
++it2) {
|
||||
const EnumVal &ev = **it2;
|
||||
if (ev.IsZero()) continue;
|
||||
code += "\tcase " + enum_def.name + ev.name + ":\n";
|
||||
code += "\t\treturn " +
|
||||
WrapInNameSpaceAndTrack(*ev.union_type.struct_def) +
|
||||
"Pack(builder, t.Value.(" + NativeType(ev.union_type) + "))\n";
|
||||
}
|
||||
code += "\t}\n";
|
||||
code += "\treturn 0\n";
|
||||
code += "}\n\n";
|
||||
}
|
||||
|
||||
void GenNativeUnionUnPack(const EnumDef &enum_def, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
|
||||
code += "func " + enum_def.name + "UnPack(t " + enum_def.name +
|
||||
", table flatbuffers.Table) *" + NativeName(enum_def) + " {\n";
|
||||
code += "\tswitch t {\n";
|
||||
|
||||
for (auto it2 = enum_def.Vals().begin(); it2 != enum_def.Vals().end();
|
||||
++it2) {
|
||||
const EnumVal &ev = **it2;
|
||||
if (ev.IsZero()) continue;
|
||||
code += "\tcase " + enum_def.name + ev.name + ":\n";
|
||||
code += "\t\tx := " + ev.union_type.struct_def->name + "{_tab: table}\n";
|
||||
|
||||
code += "\t\treturn &" +
|
||||
WrapInNameSpaceAndTrack(enum_def.defined_namespace,
|
||||
NativeName(enum_def)) +
|
||||
"{ Type: " + enum_def.name + ev.name + ", Value: x.UnPack() }\n";
|
||||
}
|
||||
code += "\t}\n";
|
||||
code += "\treturn nil\n";
|
||||
code += "}\n\n";
|
||||
}
|
||||
|
||||
void GenNativeTablePack(const StructDef &struct_def, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
|
||||
code += "func " + struct_def.name +
|
||||
"Pack(builder *flatbuffers.Builder, t *" + NativeName(struct_def) +
|
||||
") flatbuffers.UOffsetT {\n";
|
||||
code += "\tif t == nil { return 0 }\n";
|
||||
for (auto it = struct_def.fields.vec.begin();
|
||||
it != struct_def.fields.vec.end(); ++it) {
|
||||
const FieldDef &field = **it;
|
||||
if (field.deprecated) continue;
|
||||
if (IsScalar(field.value.type.base_type)) continue;
|
||||
|
||||
std::string offset = MakeCamel(field.name, false) + "Offset";
|
||||
|
||||
if (field.value.type.base_type == BASE_TYPE_STRING) {
|
||||
code += "\t" + offset + " := builder.CreateString(t." +
|
||||
MakeCamel(field.name) + ")\n";
|
||||
} else if (field.value.type.base_type == BASE_TYPE_VECTOR &&
|
||||
field.value.type.element == BASE_TYPE_UCHAR &&
|
||||
field.value.type.enum_def == nullptr) {
|
||||
code += "\t" + offset + " := flatbuffers.UOffsetT(0)\n";
|
||||
code += "\tif t." + MakeCamel(field.name) + " != nil {\n";
|
||||
code += "\t\t" + offset + " = builder.CreateByteString(t." +
|
||||
MakeCamel(field.name) + ")\n";
|
||||
code += "\t}\n";
|
||||
} else if (field.value.type.base_type == BASE_TYPE_VECTOR) {
|
||||
code += "\t" + offset + " := flatbuffers.UOffsetT(0)\n";
|
||||
code += "\tif t." + MakeCamel(field.name) + " != nil {\n";
|
||||
std::string length = MakeCamel(field.name, false) + "Length";
|
||||
std::string offsets = MakeCamel(field.name, false) + "Offsets";
|
||||
code += "\t\t" + length + " := len(t." + MakeCamel(field.name) + ")\n";
|
||||
if (field.value.type.element == BASE_TYPE_STRING) {
|
||||
code += "\t\t" + offsets + " := make([]flatbuffers.UOffsetT, " +
|
||||
length + ")\n";
|
||||
code += "\t\tfor j := 0; j < " + length + "; j++ {\n";
|
||||
code += "\t\t\t" + offsets + "[j] = builder.CreateString(t." +
|
||||
MakeCamel(field.name) + "[j])\n";
|
||||
code += "\t\t}\n";
|
||||
} else if (field.value.type.element == BASE_TYPE_STRUCT &&
|
||||
!field.value.type.struct_def->fixed) {
|
||||
code += "\t\t" + offsets + " := make([]flatbuffers.UOffsetT, " +
|
||||
length + ")\n";
|
||||
code += "\t\tfor j := 0; j < " + length + "; j++ {\n";
|
||||
code += "\t\t\t" + offsets + "[j] = " +
|
||||
WrapInNameSpaceAndTrack(*field.value.type.struct_def) +
|
||||
"Pack(builder, t." + MakeCamel(field.name) + "[j])\n";
|
||||
code += "\t\t}\n";
|
||||
}
|
||||
code += "\t\t" + struct_def.name + "Start" + MakeCamel(field.name) +
|
||||
"Vector(builder, " + length + ")\n";
|
||||
code += "\t\tfor j := " + length + " - 1; j >= 0; j-- {\n";
|
||||
if (IsScalar(field.value.type.element)) {
|
||||
code += "\t\t\tbuilder.Prepend" +
|
||||
MakeCamel(GenTypeBasic(field.value.type.VectorType())) + "(" +
|
||||
CastToBaseType(field.value.type.VectorType(),
|
||||
"t." + MakeCamel(field.name) + "[j]") +
|
||||
")\n";
|
||||
} else if (field.value.type.element == BASE_TYPE_STRUCT &&
|
||||
field.value.type.struct_def->fixed) {
|
||||
code += "\t\t\t" +
|
||||
WrapInNameSpaceAndTrack(*field.value.type.struct_def) +
|
||||
"Pack(builder, t." + MakeCamel(field.name) + "[j])\n";
|
||||
} else {
|
||||
code += "\t\t\tbuilder.PrependUOffsetT(" + offsets + "[j])\n";
|
||||
}
|
||||
code += "\t\t}\n";
|
||||
code += "\t\t" + offset + " = builder.EndVector(" + length + ")\n";
|
||||
code += "\t}\n";
|
||||
} else if (field.value.type.base_type == BASE_TYPE_STRUCT) {
|
||||
if (field.value.type.struct_def->fixed) continue;
|
||||
code += "\t" + offset +
|
||||
" := " + WrapInNameSpaceAndTrack(*field.value.type.struct_def) +
|
||||
"Pack(builder, t." + MakeCamel(field.name) + ")\n";
|
||||
} else if (field.value.type.base_type == BASE_TYPE_UNION) {
|
||||
code += "\t" + offset +
|
||||
" := " + WrapInNameSpaceAndTrack(*field.value.type.enum_def) +
|
||||
"Pack(builder, t." + MakeCamel(field.name) + ")\n";
|
||||
code += "\t\n";
|
||||
} else {
|
||||
FLATBUFFERS_ASSERT(0);
|
||||
}
|
||||
}
|
||||
code += "\t" + struct_def.name + "Start(builder)\n";
|
||||
for (auto it = struct_def.fields.vec.begin();
|
||||
it != struct_def.fields.vec.end(); ++it) {
|
||||
const FieldDef &field = **it;
|
||||
if (field.deprecated) continue;
|
||||
|
||||
std::string offset = MakeCamel(field.name, false) + "Offset";
|
||||
if (IsScalar(field.value.type.base_type)) {
|
||||
if (field.value.type.enum_def == nullptr ||
|
||||
!field.value.type.enum_def->is_union) {
|
||||
code += "\t" + struct_def.name + "Add" + MakeCamel(field.name) +
|
||||
"(builder, t." + MakeCamel(field.name) + ")\n";
|
||||
}
|
||||
} else {
|
||||
if (field.value.type.base_type == BASE_TYPE_STRUCT &&
|
||||
field.value.type.struct_def->fixed) {
|
||||
code += "\t" + offset + " := " +
|
||||
WrapInNameSpaceAndTrack(*field.value.type.struct_def) +
|
||||
"Pack(builder, t." + MakeCamel(field.name) + ")\n";
|
||||
} else if (field.value.type.enum_def != nullptr &&
|
||||
field.value.type.enum_def->is_union) {
|
||||
code += "\tif t." + MakeCamel(field.name) + " != nil {\n";
|
||||
code += "\t\t" + struct_def.name + "Add" +
|
||||
MakeCamel(field.name + UnionTypeFieldSuffix()) +
|
||||
"(builder, t." + MakeCamel(field.name) + ".Type)\n";
|
||||
code += "\t}\n";
|
||||
}
|
||||
code += "\t" + struct_def.name + "Add" + MakeCamel(field.name) +
|
||||
"(builder, " + offset + ")\n";
|
||||
}
|
||||
}
|
||||
code += "\treturn " + struct_def.name + "End(builder)\n";
|
||||
code += "}\n\n";
|
||||
}
|
||||
|
||||
void GenNativeTableUnPack(const StructDef &struct_def,
|
||||
std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
|
||||
code += "func (rcv *" + struct_def.name + ") UnPackTo(t *" +
|
||||
NativeName(struct_def) + ") {\n";
|
||||
for (auto it = struct_def.fields.vec.begin();
|
||||
it != struct_def.fields.vec.end(); ++it) {
|
||||
const FieldDef &field = **it;
|
||||
if (field.deprecated) continue;
|
||||
std::string field_name_camel = MakeCamel(field.name);
|
||||
std::string length = MakeCamel(field.name, false) + "Length";
|
||||
if (IsScalar(field.value.type.base_type)) {
|
||||
if (field.value.type.enum_def != nullptr &&
|
||||
field.value.type.enum_def->is_union)
|
||||
continue;
|
||||
code +=
|
||||
"\tt." + field_name_camel + " = rcv." + field_name_camel + "()\n";
|
||||
} else if (field.value.type.base_type == BASE_TYPE_STRING) {
|
||||
code += "\tt." + field_name_camel + " = string(rcv." +
|
||||
field_name_camel + "())\n";
|
||||
} else if (field.value.type.base_type == BASE_TYPE_VECTOR &&
|
||||
field.value.type.element == BASE_TYPE_UCHAR &&
|
||||
field.value.type.enum_def == nullptr) {
|
||||
code += "\tt." + field_name_camel + " = rcv." + field_name_camel +
|
||||
"Bytes()\n";
|
||||
} else if (field.value.type.base_type == BASE_TYPE_VECTOR) {
|
||||
code += "\t" + length + " := rcv." + field_name_camel + "Length()\n";
|
||||
code += "\tt." + field_name_camel + " = make(" +
|
||||
NativeType(field.value.type) + ", " + length + ")\n";
|
||||
code += "\tfor j := 0; j < " + length + "; j++ {\n";
|
||||
if (field.value.type.element == BASE_TYPE_STRUCT) {
|
||||
code += "\t\tx := " + field.value.type.struct_def->name + "{}\n";
|
||||
code += "\t\trcv." + field_name_camel + "(&x, j)\n";
|
||||
}
|
||||
code += "\t\tt." + field_name_camel + "[j] = ";
|
||||
if (IsScalar(field.value.type.element)) {
|
||||
code += "rcv." + field_name_camel + "(j)";
|
||||
} else if (field.value.type.element == BASE_TYPE_STRING) {
|
||||
code += "string(rcv." + field_name_camel + "(j))";
|
||||
} else if (field.value.type.element == BASE_TYPE_STRUCT) {
|
||||
code += "x.UnPack()";
|
||||
} else {
|
||||
// TODO(iceboy): Support vector of unions.
|
||||
FLATBUFFERS_ASSERT(0);
|
||||
}
|
||||
code += "\n";
|
||||
code += "\t}\n";
|
||||
} else if (field.value.type.base_type == BASE_TYPE_STRUCT) {
|
||||
code += "\tt." + field_name_camel + " = rcv." + field_name_camel +
|
||||
"(nil).UnPack()\n";
|
||||
} else if (field.value.type.base_type == BASE_TYPE_UNION) {
|
||||
const EnumDef &enum_def = *field.value.type.enum_def;
|
||||
std::string field_table = MakeCamel(field.name, false) + "Table";
|
||||
code += "\t" + field_table + " := flatbuffers.Table{}\n";
|
||||
code +=
|
||||
"\tif rcv." + MakeCamel(field.name) + "(&" + field_table + ") {\n";
|
||||
code += "\t\tt." + field_name_camel + " = " + enum_def.name +
|
||||
"UnPack(rcv." + MakeCamel(field.name + UnionTypeFieldSuffix()) +
|
||||
"(), " + field_table + ")\n";
|
||||
code += "\t}\n";
|
||||
} else {
|
||||
FLATBUFFERS_ASSERT(0);
|
||||
}
|
||||
}
|
||||
code += "}\n\n";
|
||||
|
||||
code += "func (rcv *" + struct_def.name + ") UnPack() *" +
|
||||
NativeName(struct_def) + " {\n";
|
||||
code += "\tif rcv == nil { return nil }\n";
|
||||
code += "\tt := &" + NativeName(struct_def) + "{}\n";
|
||||
code += "\trcv.UnPackTo(t)\n";
|
||||
code += "\treturn t\n";
|
||||
code += "}\n\n";
|
||||
}
|
||||
|
||||
void GenNativeStructPack(const StructDef &struct_def, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
|
||||
code += "func " + struct_def.name +
|
||||
"Pack(builder *flatbuffers.Builder, t *" + NativeName(struct_def) +
|
||||
") flatbuffers.UOffsetT {\n";
|
||||
code += "\tif t == nil { return 0 }\n";
|
||||
code += "\treturn Create" + struct_def.name + "(builder";
|
||||
StructPackArgs(struct_def, "", code_ptr);
|
||||
code += ")\n";
|
||||
code += "}\n";
|
||||
}
|
||||
|
||||
void StructPackArgs(const StructDef &struct_def, const char *nameprefix,
|
||||
std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
for (auto it = struct_def.fields.vec.begin();
|
||||
it != struct_def.fields.vec.end(); ++it) {
|
||||
const FieldDef &field = **it;
|
||||
if (field.value.type.base_type == BASE_TYPE_STRUCT) {
|
||||
StructPackArgs(*field.value.type.struct_def,
|
||||
(nameprefix + MakeCamel(field.name) + ".").c_str(),
|
||||
code_ptr);
|
||||
} else {
|
||||
code += std::string(", t.") + nameprefix + MakeCamel(field.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GenNativeStructUnPack(const StructDef &struct_def,
|
||||
std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
|
||||
code += "func (rcv *" + struct_def.name + ") UnPackTo(t *" +
|
||||
NativeName(struct_def) + ") {\n";
|
||||
for (auto it = struct_def.fields.vec.begin();
|
||||
it != struct_def.fields.vec.end(); ++it) {
|
||||
const FieldDef &field = **it;
|
||||
if (field.value.type.base_type == BASE_TYPE_STRUCT) {
|
||||
code += "\tt." + MakeCamel(field.name) + " = rcv." +
|
||||
MakeCamel(field.name) + "(nil).UnPack()\n";
|
||||
} else {
|
||||
code += "\tt." + MakeCamel(field.name) + " = rcv." +
|
||||
MakeCamel(field.name) + "()\n";
|
||||
}
|
||||
}
|
||||
code += "}\n\n";
|
||||
|
||||
code += "func (rcv *" + struct_def.name + ") UnPack() *" +
|
||||
NativeName(struct_def) + " {\n";
|
||||
code += "\tif rcv == nil { return nil }\n";
|
||||
code += "\tt := &" + NativeName(struct_def) + "{}\n";
|
||||
code += "\trcv.UnPackTo(t)\n";
|
||||
code += "\treturn t\n";
|
||||
code += "}\n\n";
|
||||
}
|
||||
|
||||
// Generate enum declarations.
|
||||
void GenEnum(const EnumDef &enum_def, std::string *code_ptr) {
|
||||
if (enum_def.generated) return;
|
||||
@@ -782,7 +1121,7 @@ class GoGenerator : public BaseGenerator {
|
||||
GenEnumType(enum_def, code_ptr);
|
||||
BeginEnum(code_ptr);
|
||||
for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {
|
||||
auto &ev = **it;
|
||||
const EnumVal &ev = **it;
|
||||
GenComment(ev.doc_comment, code_ptr, nullptr, "\t");
|
||||
EnumMember(enum_def, ev, max_name_length, code_ptr);
|
||||
}
|
||||
@@ -790,14 +1129,13 @@ class GoGenerator : public BaseGenerator {
|
||||
|
||||
BeginEnumNames(enum_def, code_ptr);
|
||||
for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {
|
||||
auto &ev = **it;
|
||||
const EnumVal &ev = **it;
|
||||
EnumNameMember(enum_def, ev, max_name_length, code_ptr);
|
||||
}
|
||||
EndEnumNames(code_ptr);
|
||||
|
||||
BeginEnumValues(enum_def, code_ptr);
|
||||
for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end();
|
||||
++it) {
|
||||
for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {
|
||||
auto &ev = **it;
|
||||
EnumValueMember(enum_def, ev, max_name_length, code_ptr);
|
||||
}
|
||||
@@ -824,15 +1162,14 @@ class GoGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
std::string GenTypeBasic(const Type &type) {
|
||||
static const char *ctypename[] = {
|
||||
// clang-format off
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \
|
||||
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, RTYPE, KTYPE) \
|
||||
static const char *ctypename[] = {
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, GTYPE, ...) \
|
||||
#GTYPE,
|
||||
FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)
|
||||
#undef FLATBUFFERS_TD
|
||||
// clang-format on
|
||||
};
|
||||
// clang-format on
|
||||
return ctypename[type.base_type];
|
||||
}
|
||||
|
||||
@@ -848,9 +1185,7 @@ class GoGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
std::string GenTypeGet(const Type &type) {
|
||||
if (type.enum_def != nullptr) {
|
||||
return GetEnumTypeName(*type.enum_def);
|
||||
}
|
||||
if (type.enum_def != nullptr) { return GetEnumTypeName(*type.enum_def); }
|
||||
return IsScalar(type.base_type) ? GenTypeBasic(type) : GenTypePointer(type);
|
||||
}
|
||||
|
||||
@@ -880,11 +1215,44 @@ class GoGenerator : public BaseGenerator {
|
||||
|
||||
std::string GenConstant(const FieldDef &field) {
|
||||
switch (field.value.type.base_type) {
|
||||
case BASE_TYPE_BOOL: return field.value.constant == "0" ? "false" : "true";;
|
||||
case BASE_TYPE_BOOL:
|
||||
return field.value.constant == "0" ? "false" : "true";
|
||||
default: return field.value.constant;
|
||||
}
|
||||
}
|
||||
|
||||
std::string NativeName(const StructDef &struct_def) {
|
||||
return parser_.opts.object_prefix + struct_def.name +
|
||||
parser_.opts.object_suffix;
|
||||
}
|
||||
|
||||
std::string NativeName(const EnumDef &enum_def) {
|
||||
return parser_.opts.object_prefix + enum_def.name +
|
||||
parser_.opts.object_suffix;
|
||||
}
|
||||
|
||||
std::string NativeType(const Type &type) {
|
||||
if (IsScalar(type.base_type)) {
|
||||
if (type.enum_def == nullptr) {
|
||||
return GenTypeBasic(type);
|
||||
} else {
|
||||
return GetEnumTypeName(*type.enum_def);
|
||||
}
|
||||
} else if (type.base_type == BASE_TYPE_STRING) {
|
||||
return "string";
|
||||
} else if (type.base_type == BASE_TYPE_VECTOR) {
|
||||
return "[]" + NativeType(type.VectorType());
|
||||
} else if (type.base_type == BASE_TYPE_STRUCT) {
|
||||
return "*" + WrapInNameSpaceAndTrack(type.struct_def->defined_namespace,
|
||||
NativeName(*type.struct_def));
|
||||
} else if (type.base_type == BASE_TYPE_UNION) {
|
||||
return "*" + WrapInNameSpaceAndTrack(type.enum_def->defined_namespace,
|
||||
NativeName(*type.enum_def));
|
||||
}
|
||||
FLATBUFFERS_ASSERT(0);
|
||||
return std::string();
|
||||
}
|
||||
|
||||
// Create a struct with a builder and the struct's arguments.
|
||||
void GenStructBuilder(const StructDef &struct_def, std::string *code_ptr) {
|
||||
BeginBuilderArgs(struct_def, code_ptr);
|
||||
@@ -898,13 +1266,12 @@ class GoGenerator : public BaseGenerator {
|
||||
void BeginFile(const std::string &name_space_name, const bool needs_imports,
|
||||
const bool is_enum, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
code = code + "// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\n";
|
||||
code = code +
|
||||
"// Code generated by the FlatBuffers compiler. DO NOT EDIT.\n\n";
|
||||
code += "package " + name_space_name + "\n\n";
|
||||
if (needs_imports) {
|
||||
code += "import (\n";
|
||||
if (is_enum) {
|
||||
code += "\t\"strconv\"\n\n";
|
||||
}
|
||||
if (is_enum) { code += "\t\"strconv\"\n\n"; }
|
||||
if (!parser_.opts.go_import.empty()) {
|
||||
code += "\tflatbuffers \"" + parser_.opts.go_import + "\"\n";
|
||||
} else {
|
||||
@@ -913,17 +1280,14 @@ class GoGenerator : public BaseGenerator {
|
||||
if (tracked_imported_namespaces_.size() > 0) {
|
||||
code += "\n";
|
||||
for (auto it = tracked_imported_namespaces_.begin();
|
||||
it != tracked_imported_namespaces_.end();
|
||||
++it) {
|
||||
code += "\t" + NamespaceImportName(*it) + " \"" + \
|
||||
NamespaceImportPath(*it) + "\"\n";
|
||||
it != tracked_imported_namespaces_.end(); ++it) {
|
||||
code += "\t" + NamespaceImportName(*it) + " \"" +
|
||||
NamespaceImportPath(*it) + "\"\n";
|
||||
}
|
||||
}
|
||||
code += ")\n\n";
|
||||
} else {
|
||||
if (is_enum) {
|
||||
code += "import \"strconv\"\n\n";
|
||||
}
|
||||
if (is_enum) { code += "import \"strconv\"\n\n"; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -991,8 +1355,7 @@ class GoGenerator : public BaseGenerator {
|
||||
|
||||
static size_t MaxNameLength(const EnumDef &enum_def) {
|
||||
size_t max = 0;
|
||||
for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end();
|
||||
++it) {
|
||||
for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {
|
||||
max = std::max((*it)->name.length(), max);
|
||||
}
|
||||
return max;
|
||||
|
||||
@@ -20,10 +20,11 @@
|
||||
#include "flatbuffers/flatbuffers.h"
|
||||
#include "flatbuffers/idl.h"
|
||||
#include "flatbuffers/util.h"
|
||||
|
||||
#include "src/compiler/cpp_generator.h"
|
||||
#include "src/compiler/go_generator.h"
|
||||
#include "src/compiler/java_generator.h"
|
||||
#include "src/compiler/python_generator.h"
|
||||
#include "src/compiler/python_private_generator.h"
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
# pragma warning(push)
|
||||
@@ -35,9 +36,7 @@ namespace flatbuffers {
|
||||
|
||||
class FlatBufMethod : public grpc_generator::Method {
|
||||
public:
|
||||
enum Streaming {
|
||||
kNone, kClient, kServer, kBiDi
|
||||
};
|
||||
enum Streaming { kNone, kClient, kServer, kBiDi };
|
||||
|
||||
FlatBufMethod(const RPCCall *method) : method_(method) {
|
||||
streaming_ = kNone;
|
||||
@@ -80,6 +79,10 @@ class FlatBufMethod : public grpc_generator::Method {
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string get_fb_builder() const {
|
||||
return "builder";
|
||||
}
|
||||
|
||||
std::string input_type_name() const { return GRPCType(*method_->request); }
|
||||
|
||||
std::string output_type_name() const { return GRPCType(*method_->response); }
|
||||
@@ -171,7 +174,7 @@ class FlatBufPrinter : public grpc_generator::Printer {
|
||||
|
||||
void Outdent() {
|
||||
indent_--;
|
||||
FLATBUFFERS_ASSERT(indent_ >= 0);
|
||||
FLATBUFFERS_ASSERT(indent_ >= 0);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -183,7 +186,7 @@ class FlatBufPrinter : public grpc_generator::Printer {
|
||||
class FlatBufFile : public grpc_generator::File {
|
||||
public:
|
||||
enum Language {
|
||||
kLanguageGo, kLanguageCpp, kLanguageJava
|
||||
kLanguageGo, kLanguageCpp, kLanguageJava, kLanguagePython
|
||||
};
|
||||
|
||||
FlatBufFile(const Parser &parser, const std::string &file_name,
|
||||
@@ -229,6 +232,9 @@ class FlatBufFile : public grpc_generator::File {
|
||||
case kLanguageJava: {
|
||||
return "import com.google.flatbuffers.grpc.FlatbuffersUtils;";
|
||||
}
|
||||
case kLanguagePython: {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
@@ -270,7 +276,8 @@ class GoGRPCGenerator : public flatbuffers::BaseGenerator {
|
||||
auto service = file.service(i);
|
||||
const Definition *def = parser_.services_.vec[i];
|
||||
p.package_name = LastNamespacePart(*(def->defined_namespace));
|
||||
p.service_prefix = def->defined_namespace->GetFullyQualifiedName(""); // file.package();
|
||||
p.service_prefix =
|
||||
def->defined_namespace->GetFullyQualifiedName(""); // file.package();
|
||||
std::string output =
|
||||
grpc_go_generator::GenerateServiceSource(&file, service.get(), &p);
|
||||
std::string filename =
|
||||
@@ -313,20 +320,20 @@ bool GenerateCppGRPC(const Parser &parser, const std::string &path,
|
||||
|
||||
std::string header_code =
|
||||
grpc_cpp_generator::GetHeaderPrologue(&fbfile, generator_parameters) +
|
||||
grpc_cpp_generator::GetHeaderIncludes(&fbfile, generator_parameters) +
|
||||
grpc_cpp_generator::GetHeaderServices(&fbfile, generator_parameters) +
|
||||
grpc_cpp_generator::GetHeaderEpilogue(&fbfile, generator_parameters);
|
||||
grpc_cpp_generator::GetHeaderIncludes(&fbfile, generator_parameters) +
|
||||
grpc_cpp_generator::GetHeaderServices(&fbfile, generator_parameters) +
|
||||
grpc_cpp_generator::GetHeaderEpilogue(&fbfile, generator_parameters);
|
||||
|
||||
std::string source_code =
|
||||
grpc_cpp_generator::GetSourcePrologue(&fbfile, generator_parameters) +
|
||||
grpc_cpp_generator::GetSourceIncludes(&fbfile, generator_parameters) +
|
||||
grpc_cpp_generator::GetSourceServices(&fbfile, generator_parameters) +
|
||||
grpc_cpp_generator::GetSourceEpilogue(&fbfile, generator_parameters);
|
||||
grpc_cpp_generator::GetSourceIncludes(&fbfile, generator_parameters) +
|
||||
grpc_cpp_generator::GetSourceServices(&fbfile, generator_parameters) +
|
||||
grpc_cpp_generator::GetSourceEpilogue(&fbfile, generator_parameters);
|
||||
|
||||
return flatbuffers::SaveFile((path + file_name + ".grpc.fb.h").c_str(),
|
||||
header_code, false) &&
|
||||
flatbuffers::SaveFile((path + file_name + ".grpc.fb.cc").c_str(),
|
||||
source_code, false);
|
||||
flatbuffers::SaveFile((path + file_name + ".grpc.fb.cc").c_str(),
|
||||
source_code, false);
|
||||
}
|
||||
|
||||
class JavaGRPCGenerator : public flatbuffers::BaseGenerator {
|
||||
@@ -364,6 +371,38 @@ bool GenerateJavaGRPC(const Parser &parser, const std::string &path,
|
||||
return JavaGRPCGenerator(parser, path, file_name).generate();
|
||||
}
|
||||
|
||||
bool GeneratePythonGRPC(const Parser &parser, const std::string & /*path*/,
|
||||
const std::string &file_name) {
|
||||
|
||||
int nservices = 0;
|
||||
for (auto it = parser.services_.vec.begin(); it != parser.services_.vec.end();
|
||||
++it) {
|
||||
if (!(*it)->generated) nservices++;
|
||||
}
|
||||
if (!nservices) return true;
|
||||
|
||||
grpc_python_generator::GeneratorConfiguration config;
|
||||
config.grpc_package_root = "grpc";
|
||||
config.beta_package_root = "grpc.beta";
|
||||
config.import_prefix = "";
|
||||
|
||||
FlatBufFile fbfile(parser, file_name, FlatBufFile::kLanguagePython);
|
||||
|
||||
grpc_python_generator::PrivateGenerator generator(config, &fbfile);
|
||||
|
||||
std::string code = generator.GetGrpcServices();
|
||||
std::string namespace_dir;
|
||||
auto &namespaces = parser.namespaces_.back()->components;
|
||||
for (auto it = namespaces.begin(); it != namespaces.end(); ++it) {
|
||||
if (it != namespaces.begin()) namespace_dir += kPathSeparator;
|
||||
namespace_dir += *it;
|
||||
}
|
||||
|
||||
std::string grpc_py_filename =
|
||||
namespace_dir + kPathSeparator + file_name + "_grpc_fb.py";
|
||||
return flatbuffers::SaveFile(grpc_py_filename.c_str(), code, false);
|
||||
}
|
||||
|
||||
} // namespace flatbuffers
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
|
||||
1237
src/idl_gen_java.cpp
Normal file
1237
src/idl_gen_java.cpp
Normal file
File diff suppressed because it is too large
Load Diff
@@ -127,9 +127,7 @@ class JsTsGenerator : public BaseGenerator {
|
||||
const auto &file = *it;
|
||||
const auto basename =
|
||||
flatbuffers::StripPath(flatbuffers::StripExtension(file));
|
||||
if (basename != file_name_) {
|
||||
code += GenPrefixedImport(file, basename);
|
||||
}
|
||||
if (basename != file_name_) { code += GenPrefixedImport(file, basename); }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -309,14 +307,12 @@ class JsTsGenerator : public BaseGenerator {
|
||||
result += " " + type_name;
|
||||
break;
|
||||
}
|
||||
default: { result += " {" + type_name + "}"; }
|
||||
}
|
||||
if (!arg_name.empty()) {
|
||||
result += " " + arg_name;
|
||||
}
|
||||
if (include_newline) {
|
||||
result += "\n";
|
||||
default: {
|
||||
result += " {" + type_name + "}";
|
||||
}
|
||||
}
|
||||
if (!arg_name.empty()) { result += " " + arg_name; }
|
||||
if (include_newline) { result += "\n"; }
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -605,7 +601,8 @@ class JsTsGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
void GenerateRootAccessor(StructDef &struct_def, std::string *code_ptr,
|
||||
std::string &code, std::string &object_name, bool size_prefixed) {
|
||||
std::string &code, std::string &object_name,
|
||||
bool size_prefixed) {
|
||||
if (!struct_def.fixed) {
|
||||
GenDocComment(code_ptr,
|
||||
GenTypeAnnotation(kParam, "flatbuffers.ByteBuffer", "bb") +
|
||||
@@ -613,11 +610,13 @@ class JsTsGenerator : public BaseGenerator {
|
||||
GenTypeAnnotation(kReturns, object_name, "", false));
|
||||
std::string sizePrefixed("SizePrefixed");
|
||||
if (lang_.language == IDLOptions::kTs) {
|
||||
code += "static get" + (size_prefixed ? sizePrefixed : "") + "Root" + Verbose(struct_def, "As");
|
||||
code += "static get" + (size_prefixed ? sizePrefixed : "") + "Root" +
|
||||
Verbose(struct_def, "As");
|
||||
code += "(bb:flatbuffers.ByteBuffer, obj?:" + object_name +
|
||||
"):" + object_name + " {\n";
|
||||
} else {
|
||||
code += object_name + ".get" + (size_prefixed ? sizePrefixed : "") + "Root" + Verbose(struct_def, "As");
|
||||
code += object_name + ".get" + (size_prefixed ? sizePrefixed : "") +
|
||||
"Root" + Verbose(struct_def, "As");
|
||||
code += " = function(bb, obj) {\n";
|
||||
}
|
||||
code += " return (obj || new " + object_name;
|
||||
@@ -627,21 +626,22 @@ class JsTsGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
void GenerateFinisher(StructDef &struct_def, std::string *code_ptr,
|
||||
std::string &code, std::string &object_name, bool size_prefixed) {
|
||||
std::string &code, std::string &object_name,
|
||||
bool size_prefixed) {
|
||||
if (parser_.root_struct_def_ == &struct_def) {
|
||||
std::string sizePrefixed("SizePrefixed");
|
||||
GenDocComment(
|
||||
code_ptr,
|
||||
GenTypeAnnotation(kParam, "flatbuffers.Builder", "builder") +
|
||||
GenTypeAnnotation(kParam, "flatbuffers.Offset", "offset",
|
||||
false));
|
||||
GenTypeAnnotation(kParam, "flatbuffers.Offset", "offset", false));
|
||||
|
||||
if (lang_.language == IDLOptions::kTs) {
|
||||
code += "static finish" + (size_prefixed ? sizePrefixed : "") + Verbose(struct_def) + "Buffer";
|
||||
code +=
|
||||
"(builder:flatbuffers.Builder, offset:flatbuffers.Offset) {\n";
|
||||
code += "static finish" + (size_prefixed ? sizePrefixed : "") +
|
||||
Verbose(struct_def) + "Buffer";
|
||||
code += "(builder:flatbuffers.Builder, offset:flatbuffers.Offset) {\n";
|
||||
} else {
|
||||
code += object_name + ".finish" + (size_prefixed ? sizePrefixed : "") + Verbose(struct_def) + "Buffer";
|
||||
code += object_name + ".finish" + (size_prefixed ? sizePrefixed : "") +
|
||||
Verbose(struct_def) + "Buffer";
|
||||
code += " = function(builder, offset) {\n";
|
||||
}
|
||||
|
||||
@@ -650,9 +650,7 @@ class JsTsGenerator : public BaseGenerator {
|
||||
code += ", '" + parser_.file_identifier_ + "'";
|
||||
}
|
||||
if (size_prefixed) {
|
||||
if (parser_.file_identifier_.empty()) {
|
||||
code += ", undefined";
|
||||
}
|
||||
if (parser_.file_identifier_.empty()) { code += ", undefined"; }
|
||||
code += ", true";
|
||||
}
|
||||
code += ");\n";
|
||||
@@ -682,7 +680,8 @@ class JsTsGenerator : public BaseGenerator {
|
||||
code += " {\n";
|
||||
if (lang_.language != IDLOptions::kTs) {
|
||||
code += " /**\n";
|
||||
code += " * " + GenTypeAnnotation(kType, "flatbuffers.ByteBuffer", "");
|
||||
code +=
|
||||
" * " + GenTypeAnnotation(kType, "flatbuffers.ByteBuffer", "");
|
||||
code += " */\n";
|
||||
}
|
||||
code += " bb: flatbuffers.ByteBuffer|null = null;\n";
|
||||
@@ -752,10 +751,9 @@ class JsTsGenerator : public BaseGenerator {
|
||||
// Generate the identifier check method
|
||||
if (!struct_def.fixed && parser_.root_struct_def_ == &struct_def &&
|
||||
!parser_.file_identifier_.empty()) {
|
||||
GenDocComment(
|
||||
code_ptr,
|
||||
GenTypeAnnotation(kParam, "flatbuffers.ByteBuffer", "bb") +
|
||||
GenTypeAnnotation(kReturns, "boolean", "", false));
|
||||
GenDocComment(code_ptr,
|
||||
GenTypeAnnotation(kParam, "flatbuffers.ByteBuffer", "bb") +
|
||||
GenTypeAnnotation(kReturns, "boolean", "", false));
|
||||
if (lang_.language == IDLOptions::kTs) {
|
||||
code +=
|
||||
"static bufferHasIdentifier(bb:flatbuffers.ByteBuffer):boolean "
|
||||
@@ -872,7 +870,8 @@ class JsTsGenerator : public BaseGenerator {
|
||||
code += ", " + GenBBAccess() + ") : null;\n";
|
||||
}
|
||||
|
||||
if (lang_.language == IDLOptions::kTs && !parser_.opts.generate_all) {
|
||||
if (lang_.language == IDLOptions::kTs &&
|
||||
!parser_.opts.generate_all) {
|
||||
imported_files.insert(field.value.type.struct_def->file);
|
||||
}
|
||||
|
||||
@@ -1015,7 +1014,8 @@ class JsTsGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
// Adds the mutable scalar value to the output
|
||||
if (IsScalar(field.value.type.base_type) && parser.opts.mutable_buffer) {
|
||||
if (IsScalar(field.value.type.base_type) && parser.opts.mutable_buffer &&
|
||||
!IsUnion(field.value.type)) {
|
||||
std::string annotations = GenTypeAnnotation(
|
||||
kParam, GenTypeName(field.value.type, true), "value");
|
||||
GenDocComment(
|
||||
@@ -1290,8 +1290,7 @@ class JsTsGenerator : public BaseGenerator {
|
||||
for (auto it = struct_def.fields.vec.begin();
|
||||
it != struct_def.fields.vec.end(); ++it) {
|
||||
const auto &field = **it;
|
||||
if (field.deprecated)
|
||||
continue;
|
||||
if (field.deprecated) continue;
|
||||
paramDoc +=
|
||||
GenTypeAnnotation(kParam, GetArgType(field), GetArgName(field));
|
||||
}
|
||||
@@ -1311,8 +1310,7 @@ class JsTsGenerator : public BaseGenerator {
|
||||
for (auto it = struct_def.fields.vec.begin();
|
||||
it != struct_def.fields.vec.end(); ++it) {
|
||||
const auto &field = **it;
|
||||
if (field.deprecated)
|
||||
continue;
|
||||
if (field.deprecated) continue;
|
||||
|
||||
if (lang_.language == IDLOptions::kTs) {
|
||||
code += ", " + GetArgName(field) + ":" + GetArgType(field);
|
||||
@@ -1336,8 +1334,7 @@ class JsTsGenerator : public BaseGenerator {
|
||||
for (auto it = struct_def.fields.vec.begin();
|
||||
it != struct_def.fields.vec.end(); ++it) {
|
||||
const auto &field = **it;
|
||||
if (field.deprecated)
|
||||
continue;
|
||||
if (field.deprecated) continue;
|
||||
|
||||
code += " " + methodPrefix + ".add" + MakeCamel(field.name) + "(";
|
||||
code += "builder, " + GetArgName(field) + ");\n";
|
||||
@@ -1346,14 +1343,11 @@ class JsTsGenerator : public BaseGenerator {
|
||||
code += " return " + methodPrefix + ".end" + Verbose(struct_def) +
|
||||
"(builder);\n";
|
||||
code += "}\n";
|
||||
if (lang_.language == IDLOptions::kJs)
|
||||
code += "\n";
|
||||
if (lang_.language == IDLOptions::kJs) code += "\n";
|
||||
}
|
||||
|
||||
if (lang_.language == IDLOptions::kTs) {
|
||||
if (!object_namespace.empty()) {
|
||||
code += "}\n";
|
||||
}
|
||||
if (!object_namespace.empty()) { code += "}\n"; }
|
||||
code += "}\n";
|
||||
}
|
||||
}
|
||||
@@ -1372,9 +1366,7 @@ class JsTsGenerator : public BaseGenerator {
|
||||
return argname;
|
||||
}
|
||||
|
||||
std::string Verbose(const StructDef &struct_def,
|
||||
const char* prefix = "")
|
||||
{
|
||||
std::string Verbose(const StructDef &struct_def, const char *prefix = "") {
|
||||
return parser_.opts.js_ts_short_names ? "" : prefix + struct_def.name;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include "flatbuffers/code_generators.h"
|
||||
#include "flatbuffers/idl.h"
|
||||
#include "flatbuffers/util.h"
|
||||
@@ -121,6 +122,7 @@ class JsonSchemaGenerator : public BaseGenerator {
|
||||
: BaseGenerator(base_generator) {}
|
||||
|
||||
bool generate() {
|
||||
if (parser_.root_struct_def_ == nullptr) { return false; }
|
||||
code_.Clear();
|
||||
code_ += "{";
|
||||
code_ += " \"$schema\": \"http://json-schema.org/draft-04/schema#\",";
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -27,14 +27,16 @@ namespace lobster {
|
||||
|
||||
class LobsterGenerator : public BaseGenerator {
|
||||
public:
|
||||
LobsterGenerator(const Parser &parser, const std::string &path,
|
||||
const std::string &file_name)
|
||||
LobsterGenerator(const Parser &parser, const std::string &path,
|
||||
const std::string &file_name)
|
||||
: BaseGenerator(parser, path, file_name, "" /* not used */, "_") {
|
||||
static const char * const keywords[] = {
|
||||
"nil", "true", "false", "return", "struct", "class", "import", "int",
|
||||
"float", "string", "any", "def", "is", "from", "program", "private",
|
||||
"coroutine", "resource", "enum", "typeof", "var", "let", "pakfile",
|
||||
"switch", "case", "default", "namespace", "not", "and", "or", "bool",
|
||||
static const char *const keywords[] = {
|
||||
"nil", "true", "false", "return", "struct", "class",
|
||||
"import", "int", "float", "string", "any", "def",
|
||||
"is", "from", "program", "private", "coroutine", "resource",
|
||||
"enum", "typeof", "var", "let", "pakfile", "switch",
|
||||
"case", "default", "namespace", "not", "and", "or",
|
||||
"bool",
|
||||
};
|
||||
keywords_.insert(std::begin(keywords), std::end(keywords));
|
||||
}
|
||||
@@ -66,7 +68,8 @@ class LobsterGenerator : public BaseGenerator {
|
||||
|
||||
std::string LobsterType(const Type &type) {
|
||||
if (IsFloat(type.base_type)) return "float";
|
||||
if (IsScalar(type.base_type) && type.enum_def) return NormalizedName(*type.enum_def);
|
||||
if (IsScalar(type.base_type) && type.enum_def)
|
||||
return NormalizedName(*type.enum_def);
|
||||
if (!IsScalar(type.base_type)) return "flatbuffers_offset";
|
||||
return "int";
|
||||
}
|
||||
@@ -74,27 +77,27 @@ class LobsterGenerator : public BaseGenerator {
|
||||
// Returns the method name for use with add/put calls.
|
||||
std::string GenMethod(const Type &type) {
|
||||
return IsScalar(type.base_type)
|
||||
? MakeCamel(GenTypeBasic(type))
|
||||
: (IsStruct(type) ? "Struct" : "UOffsetTRelative");
|
||||
? MakeCamel(GenTypeBasic(type))
|
||||
: (IsStruct(type) ? "Struct" : "UOffsetTRelative");
|
||||
}
|
||||
|
||||
// This uses Python names for now..
|
||||
std::string GenTypeBasic(const Type &type) {
|
||||
// clang-format off
|
||||
static const char *ctypename[] = {
|
||||
// clang-format off
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \
|
||||
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, RTYPE, KTYPE) \
|
||||
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, ...) \
|
||||
#PTYPE,
|
||||
FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)
|
||||
FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)
|
||||
#undef FLATBUFFERS_TD
|
||||
// clang-format on
|
||||
};
|
||||
// clang-format on
|
||||
return ctypename[type.base_type];
|
||||
}
|
||||
|
||||
// Generate a struct field, conditioned on its child type(s).
|
||||
void GenStructAccessor(const StructDef &struct_def,
|
||||
const FieldDef &field, std::string *code_ptr) {
|
||||
void GenStructAccessor(const StructDef &struct_def, const FieldDef &field,
|
||||
std::string *code_ptr) {
|
||||
GenComment(field.doc_comment, code_ptr, nullptr, " ");
|
||||
std::string &code = *code_ptr;
|
||||
auto offsets = NumToString(field.value.offset);
|
||||
@@ -102,13 +105,12 @@ class LobsterGenerator : public BaseGenerator {
|
||||
if (IsScalar(field.value.type.base_type)) {
|
||||
std::string acc;
|
||||
if (struct_def.fixed) {
|
||||
acc = "buf_.read_" + GenTypeName(field.value.type) +
|
||||
"_le(pos_ + " + offsets + ")";
|
||||
acc = "buf_.read_" + GenTypeName(field.value.type) + "_le(pos_ + " +
|
||||
offsets + ")";
|
||||
|
||||
} else {
|
||||
acc = "buf_.flatbuffers_field_" +
|
||||
GenTypeName(field.value.type) + "(pos_, " + offsets + ", " +
|
||||
field.value.constant + ")";
|
||||
acc = "buf_.flatbuffers_field_" + GenTypeName(field.value.type) +
|
||||
"(pos_, " + offsets + ", " + field.value.constant + ")";
|
||||
}
|
||||
if (field.value.type.enum_def)
|
||||
acc = NormalizedName(*field.value.type.enum_def) + "(" + acc + ")";
|
||||
@@ -130,7 +132,8 @@ class LobsterGenerator : public BaseGenerator {
|
||||
break;
|
||||
}
|
||||
case BASE_TYPE_STRING:
|
||||
code += def + "():\n return buf_.flatbuffers_field_string(pos_, " +
|
||||
code += def +
|
||||
"():\n return buf_.flatbuffers_field_string(pos_, " +
|
||||
offsets + ")\n";
|
||||
break;
|
||||
case BASE_TYPE_VECTOR: {
|
||||
@@ -171,19 +174,20 @@ class LobsterGenerator : public BaseGenerator {
|
||||
}
|
||||
if (field.value.type.base_type == BASE_TYPE_VECTOR) {
|
||||
code += def +
|
||||
"_length():\n return buf_.flatbuffers_field_vector_len(pos_, " +
|
||||
"_length():\n return "
|
||||
"buf_.flatbuffers_field_vector_len(pos_, " +
|
||||
offsets + ")\n";
|
||||
}
|
||||
}
|
||||
|
||||
// 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) {
|
||||
std::string &code = *code_ptr;
|
||||
code += "struct " + NormalizedName(struct_def) +
|
||||
"Builder:\n b_:flatbuffers_builder\n";
|
||||
code += " def start():\n b_.StartObject(" +
|
||||
NumToString(struct_def.fields.vec.size()) + ")\n return this\n";
|
||||
NumToString(struct_def.fields.vec.size()) +
|
||||
")\n return this\n";
|
||||
for (auto it = struct_def.fields.vec.begin();
|
||||
it != struct_def.fields.vec.end(); ++it) {
|
||||
auto &field = **it;
|
||||
@@ -209,8 +213,8 @@ class LobsterGenerator : public BaseGenerator {
|
||||
auto vector_type = field.value.type.VectorType();
|
||||
auto alignment = InlineAlignment(vector_type);
|
||||
auto elem_size = InlineSize(vector_type);
|
||||
code += NumToString(elem_size) + ", n_, " + NumToString(alignment) +
|
||||
")\n";
|
||||
code +=
|
||||
NumToString(elem_size) + ", n_, " + NumToString(alignment) + ")\n";
|
||||
if (vector_type.base_type != BASE_TYPE_STRUCT ||
|
||||
!vector_type.struct_def->fixed) {
|
||||
code += "def " + NormalizedName(struct_def) + "Create" +
|
||||
@@ -218,8 +222,7 @@ class LobsterGenerator : public BaseGenerator {
|
||||
"Vector(b_:flatbuffers_builder, v_:[" +
|
||||
LobsterType(vector_type) + "]):\n b_.StartVector(" +
|
||||
NumToString(elem_size) + ", v_.length, " +
|
||||
NumToString(alignment) +
|
||||
")\n reverse(v_) e_: b_.Prepend" +
|
||||
NumToString(alignment) + ")\n reverse(v_) e_: b_.Prepend" +
|
||||
GenMethod(vector_type) +
|
||||
"(e_)\n return b_.EndVector(v_.length)\n";
|
||||
}
|
||||
@@ -243,7 +246,7 @@ class LobsterGenerator : public BaseGenerator {
|
||||
GenComment(struct_def.doc_comment, code_ptr, nullptr, "");
|
||||
code += "class " + NormalizedName(struct_def) + " : flatbuffers_handle\n";
|
||||
for (auto it = struct_def.fields.vec.begin();
|
||||
it != struct_def.fields.vec.end(); ++it) {
|
||||
it != struct_def.fields.vec.end(); ++it) {
|
||||
auto &field = **it;
|
||||
if (field.deprecated) continue;
|
||||
GenStructAccessor(struct_def, field, code_ptr);
|
||||
@@ -252,8 +255,8 @@ class LobsterGenerator : public BaseGenerator {
|
||||
if (!struct_def.fixed) {
|
||||
// Generate a special accessor for the table that has been declared as
|
||||
// the root type.
|
||||
code += "def GetRootAs" + NormalizedName(struct_def) + "(buf:string): return " +
|
||||
NormalizedName(struct_def) +
|
||||
code += "def GetRootAs" + NormalizedName(struct_def) +
|
||||
"(buf:string): return " + NormalizedName(struct_def) +
|
||||
" { buf, buf.flatbuffers_indirect(0) }\n\n";
|
||||
}
|
||||
if (struct_def.fixed) {
|
||||
@@ -283,8 +286,8 @@ class LobsterGenerator : public BaseGenerator {
|
||||
|
||||
// Recursively generate arguments for a constructor, to deal with nested
|
||||
// structs.
|
||||
void StructBuilderArgs(const StructDef &struct_def,
|
||||
const char *nameprefix, std::string *code_ptr) {
|
||||
void StructBuilderArgs(const StructDef &struct_def, const char *nameprefix,
|
||||
std::string *code_ptr) {
|
||||
for (auto it = struct_def.fields.vec.begin();
|
||||
it != struct_def.fields.vec.end(); ++it) {
|
||||
auto &field = **it;
|
||||
@@ -293,7 +296,8 @@ class LobsterGenerator : public BaseGenerator {
|
||||
// don't clash, and to make it obvious these arguments are constructing
|
||||
// a nested struct, prefix the name with the field name.
|
||||
StructBuilderArgs(*field.value.type.struct_def,
|
||||
(nameprefix + (NormalizedName(field) + "_")).c_str(), code_ptr);
|
||||
(nameprefix + (NormalizedName(field) + "_")).c_str(),
|
||||
code_ptr);
|
||||
} else {
|
||||
std::string &code = *code_ptr;
|
||||
code += ", " + (nameprefix + NormalizedName(field)) + ":" +
|
||||
@@ -304,8 +308,8 @@ class LobsterGenerator : public BaseGenerator {
|
||||
|
||||
// Recursively generate struct construction statements and instert manual
|
||||
// padding.
|
||||
void StructBuilderBody(const StructDef &struct_def,
|
||||
const char *nameprefix, std::string *code_ptr) {
|
||||
void StructBuilderBody(const StructDef &struct_def, const char *nameprefix,
|
||||
std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
code += " b_.Prep(" + NumToString(struct_def.minalign) + ", " +
|
||||
NumToString(struct_def.bytesize) + ")\n";
|
||||
@@ -316,7 +320,8 @@ class LobsterGenerator : public BaseGenerator {
|
||||
code += " b_.Pad(" + NumToString(field.padding) + ")\n";
|
||||
if (IsStruct(field.value.type)) {
|
||||
StructBuilderBody(*field.value.type.struct_def,
|
||||
(nameprefix + (NormalizedName(field) + "_")).c_str(), code_ptr);
|
||||
(nameprefix + (NormalizedName(field) + "_")).c_str(),
|
||||
code_ptr);
|
||||
} else {
|
||||
code += " b_.Prepend" + GenMethod(field.value.type) + "(" +
|
||||
nameprefix + NormalizedName(field) + ")\n";
|
||||
@@ -325,11 +330,10 @@ class LobsterGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
// Create a struct with a builder and the struct's arguments.
|
||||
void GenStructBuilder(const StructDef &struct_def,
|
||||
std::string *code_ptr) {
|
||||
void GenStructBuilder(const StructDef &struct_def, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
code += "def Create" + NormalizedName(struct_def) +
|
||||
"(b_:flatbuffers_builder";
|
||||
code +=
|
||||
"def Create" + NormalizedName(struct_def) + "(b_:flatbuffers_builder";
|
||||
StructBuilderArgs(struct_def, "", code_ptr);
|
||||
code += "):\n";
|
||||
StructBuilderBody(struct_def, "", code_ptr);
|
||||
@@ -363,8 +367,8 @@ class LobsterGenerator : public BaseGenerator {
|
||||
auto &struct_def = **it;
|
||||
GenStruct(struct_def, &code);
|
||||
}
|
||||
return SaveFile((path_ + file_name_ + "_generated.lobster").c_str(),
|
||||
code, false);
|
||||
return SaveFile((path_ + file_name_ + "_generated.lobster").c_str(), code,
|
||||
false);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -375,7 +379,7 @@ class LobsterGenerator : public BaseGenerator {
|
||||
} // namespace lobster
|
||||
|
||||
bool GenerateLobster(const Parser &parser, const std::string &path,
|
||||
const std::string &file_name) {
|
||||
const std::string &file_name) {
|
||||
lobster::LobsterGenerator generator(parser, path, file_name);
|
||||
return generator.generate();
|
||||
}
|
||||
|
||||
1222
src/idl_gen_lua.cpp
1222
src/idl_gen_lua.cpp
File diff suppressed because it is too large
Load Diff
@@ -826,7 +826,8 @@ class PhpGenerator : public BaseGenerator {
|
||||
code += Indent + "private static $names = array(\n";
|
||||
for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {
|
||||
auto &ev = **it;
|
||||
code += Indent + Indent + enum_def.name + "::" + ev.name + "=>" + "\"" + ev.name + "\",\n";
|
||||
code += Indent + Indent + enum_def.name + "::" + ev.name + "=>" + "\"" +
|
||||
ev.name + "\",\n";
|
||||
}
|
||||
|
||||
code += Indent + ");\n\n";
|
||||
@@ -859,15 +860,15 @@ class PhpGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
static std::string GenTypeBasic(const Type &type) {
|
||||
static const char *ctypename[] = {
|
||||
// clang-format off
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \
|
||||
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, RTYPE, KTYPE) \
|
||||
#NTYPE,
|
||||
FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)
|
||||
#undef FLATBUFFERS_TD
|
||||
// clang-format on
|
||||
static const char *ctypename[] = {
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \
|
||||
CTYPE, JTYPE, GTYPE, NTYPE, ...) \
|
||||
#NTYPE,
|
||||
FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)
|
||||
#undef FLATBUFFERS_TD
|
||||
};
|
||||
// clang-format on
|
||||
return ctypename[type.base_type];
|
||||
}
|
||||
|
||||
|
||||
@@ -17,14 +17,13 @@
|
||||
// independent from idl_parser, since this code is not needed for most clients
|
||||
|
||||
#include <string>
|
||||
#include <unordered_set>
|
||||
|
||||
#include "flatbuffers/code_generators.h"
|
||||
#include "flatbuffers/flatbuffers.h"
|
||||
#include "flatbuffers/idl.h"
|
||||
#include "flatbuffers/util.h"
|
||||
|
||||
#include <unordered_set>
|
||||
|
||||
namespace flatbuffers {
|
||||
namespace python {
|
||||
|
||||
@@ -39,40 +38,12 @@ class PythonGenerator : public BaseGenerator {
|
||||
: BaseGenerator(parser, path, file_name, "" /* not used */,
|
||||
"" /* not used */),
|
||||
float_const_gen_("float('nan')", "float('inf')", "float('-inf')") {
|
||||
static const char * const keywords[] = {
|
||||
"False",
|
||||
"None",
|
||||
"True",
|
||||
"and",
|
||||
"as",
|
||||
"assert",
|
||||
"break",
|
||||
"class",
|
||||
"continue",
|
||||
"def",
|
||||
"del",
|
||||
"elif",
|
||||
"else",
|
||||
"except",
|
||||
"finally",
|
||||
"for",
|
||||
"from",
|
||||
"global",
|
||||
"if",
|
||||
"import",
|
||||
"in",
|
||||
"is",
|
||||
"lambda",
|
||||
"nonlocal",
|
||||
"not",
|
||||
"or",
|
||||
"pass",
|
||||
"raise",
|
||||
"return",
|
||||
"try",
|
||||
"while",
|
||||
"with",
|
||||
"yield"
|
||||
static const char *const keywords[] = {
|
||||
"False", "None", "True", "and", "as", "assert", "break",
|
||||
"class", "continue", "def", "del", "elif", "else", "except",
|
||||
"finally", "for", "from", "global", "if", "import", "in",
|
||||
"is", "lambda", "nonlocal", "not", "or", "pass", "raise",
|
||||
"return", "try", "while", "with", "yield"
|
||||
};
|
||||
keywords_.insert(std::begin(keywords), std::end(keywords));
|
||||
}
|
||||
@@ -81,9 +52,9 @@ class PythonGenerator : public BaseGenerator {
|
||||
// this is the prefix code for that.
|
||||
std::string OffsetPrefix(const FieldDef &field) {
|
||||
return "\n" + Indent + Indent +
|
||||
"o = flatbuffers.number_types.UOffsetTFlags.py_type" +
|
||||
"(self._tab.Offset(" + NumToString(field.value.offset) + "))\n" +
|
||||
Indent + Indent + "if o != 0:\n";
|
||||
"o = flatbuffers.number_types.UOffsetTFlags.py_type" +
|
||||
"(self._tab.Offset(" + NumToString(field.value.offset) + "))\n" +
|
||||
Indent + Indent + "if o != 0:\n";
|
||||
}
|
||||
|
||||
// Begin a class declaration.
|
||||
@@ -148,8 +119,7 @@ class PythonGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
// Initialize an existing object with other data, to avoid an allocation.
|
||||
void InitializeExisting(const StructDef &struct_def,
|
||||
std::string *code_ptr) {
|
||||
void InitializeExisting(const StructDef &struct_def, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
|
||||
GenReceiver(struct_def, code_ptr);
|
||||
@@ -172,8 +142,7 @@ class PythonGenerator : public BaseGenerator {
|
||||
|
||||
// Get the value of a struct's scalar.
|
||||
void GetScalarFieldOfStruct(const StructDef &struct_def,
|
||||
const FieldDef &field,
|
||||
std::string *code_ptr) {
|
||||
const FieldDef &field, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
std::string getter = GenGetter(field.value.type);
|
||||
GenReceiver(struct_def, code_ptr);
|
||||
@@ -184,8 +153,7 @@ class PythonGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
// Get the value of a table's scalar.
|
||||
void GetScalarFieldOfTable(const StructDef &struct_def,
|
||||
const FieldDef &field,
|
||||
void GetScalarFieldOfTable(const StructDef &struct_def, const FieldDef &field,
|
||||
std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
std::string getter = GenGetter(field.value.type);
|
||||
@@ -195,9 +163,7 @@ class PythonGenerator : public BaseGenerator {
|
||||
code += OffsetPrefix(field);
|
||||
getter += "o + self._tab.Pos)";
|
||||
auto is_bool = IsBool(field.value.type.base_type);
|
||||
if (is_bool) {
|
||||
getter = "bool(" + getter + ")";
|
||||
}
|
||||
if (is_bool) { getter = "bool(" + getter + ")"; }
|
||||
code += Indent + Indent + Indent + "return " + getter + "\n";
|
||||
std::string default_value;
|
||||
if (is_bool) {
|
||||
@@ -213,8 +179,7 @@ class PythonGenerator : public BaseGenerator {
|
||||
// Get a struct by initializing an existing struct.
|
||||
// Specific to Struct.
|
||||
void GetStructFieldOfStruct(const StructDef &struct_def,
|
||||
const FieldDef &field,
|
||||
std::string *code_ptr) {
|
||||
const FieldDef &field, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
GenReceiver(struct_def, code_ptr);
|
||||
code += MakeCamel(NormalizedName(field));
|
||||
@@ -250,8 +215,7 @@ class PythonGenerator : public BaseGenerator {
|
||||
|
||||
// Get a struct by initializing an existing struct.
|
||||
// Specific to Table.
|
||||
void GetStructFieldOfTable(const StructDef &struct_def,
|
||||
const FieldDef &field,
|
||||
void GetStructFieldOfTable(const StructDef &struct_def, const FieldDef &field,
|
||||
std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
GenReceiver(struct_def, code_ptr);
|
||||
@@ -296,7 +260,8 @@ class PythonGenerator : public BaseGenerator {
|
||||
// TODO(rw): this works and is not the good way to it:
|
||||
bool is_native_table = TypeName(field) == "*flatbuffers.Table";
|
||||
if (is_native_table) {
|
||||
code += Indent + Indent + Indent + "from flatbuffers.table import Table\n";
|
||||
code +=
|
||||
Indent + Indent + Indent + "from flatbuffers.table import Table\n";
|
||||
} else {
|
||||
code += Indent + Indent + Indent;
|
||||
code += "from ." + TypeName(field) + " import " + TypeName(field) + "\n";
|
||||
@@ -309,8 +274,7 @@ class PythonGenerator : public BaseGenerator {
|
||||
|
||||
// Get the value of a vector's struct member.
|
||||
void GetMemberOfVectorOfStruct(const StructDef &struct_def,
|
||||
const FieldDef &field,
|
||||
std::string *code_ptr) {
|
||||
const FieldDef &field, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
auto vectortype = field.value.type.VectorType();
|
||||
|
||||
@@ -388,8 +352,7 @@ class PythonGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
// Begin the creator function signature.
|
||||
void BeginBuilderArgs(const StructDef &struct_def,
|
||||
std::string *code_ptr) {
|
||||
void BeginBuilderArgs(const StructDef &struct_def, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
|
||||
code += "\n";
|
||||
@@ -399,10 +362,10 @@ class PythonGenerator : public BaseGenerator {
|
||||
|
||||
// Recursively generate arguments for a constructor, to deal with nested
|
||||
// structs.
|
||||
void StructBuilderArgs(const StructDef &struct_def,
|
||||
const char *nameprefix, std::string *code_ptr) {
|
||||
void StructBuilderArgs(const StructDef &struct_def, const char *nameprefix,
|
||||
std::string *code_ptr) {
|
||||
for (auto it = struct_def.fields.vec.begin();
|
||||
it != struct_def.fields.vec.end(); ++it) {
|
||||
it != struct_def.fields.vec.end(); ++it) {
|
||||
auto &field = **it;
|
||||
const auto &field_type = field.value.type;
|
||||
const auto &type =
|
||||
@@ -439,7 +402,7 @@ class PythonGenerator : public BaseGenerator {
|
||||
indent + " builder.Prep(" + NumToString(struct_def.minalign) + ", ";
|
||||
code += NumToString(struct_def.bytesize) + ")\n";
|
||||
for (auto it = struct_def.fields.vec.rbegin();
|
||||
it != struct_def.fields.vec.rend(); ++it) {
|
||||
it != struct_def.fields.vec.rend(); ++it) {
|
||||
auto &field = **it;
|
||||
const auto &field_type = field.value.type;
|
||||
const auto &type =
|
||||
@@ -484,8 +447,7 @@ class PythonGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
// Get the value of a table's starting offset.
|
||||
void GetStartOfTable(const StructDef &struct_def,
|
||||
std::string *code_ptr) {
|
||||
void GetStartOfTable(const StructDef &struct_def, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
code += "def " + NormalizedName(struct_def) + "Start";
|
||||
code += "(builder): ";
|
||||
@@ -495,11 +457,11 @@ class PythonGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
// Set the value of a table's field.
|
||||
void BuildFieldOfTable(const StructDef &struct_def,
|
||||
const FieldDef &field, const size_t offset,
|
||||
std::string *code_ptr) {
|
||||
void BuildFieldOfTable(const StructDef &struct_def, const FieldDef &field,
|
||||
const size_t offset, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
code += "def " + NormalizedName(struct_def) + "Add" + MakeCamel(NormalizedName(field));
|
||||
code += "def " + NormalizedName(struct_def) + "Add" +
|
||||
MakeCamel(NormalizedName(field));
|
||||
code += "(builder, ";
|
||||
code += MakeCamel(NormalizedName(field), false);
|
||||
code += "): ";
|
||||
@@ -521,8 +483,8 @@ class PythonGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
// Set the value of one of the members of a table's vector.
|
||||
void BuildVectorOfTable(const StructDef &struct_def,
|
||||
const FieldDef &field, std::string *code_ptr) {
|
||||
void BuildVectorOfTable(const StructDef &struct_def, const FieldDef &field,
|
||||
std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
code += "def " + NormalizedName(struct_def) + "Start";
|
||||
code += MakeCamel(NormalizedName(field));
|
||||
@@ -536,8 +498,7 @@ class PythonGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
// Get the offset of the end of a table.
|
||||
void GetEndOffsetOnTable(const StructDef &struct_def,
|
||||
std::string *code_ptr) {
|
||||
void GetEndOffsetOnTable(const StructDef &struct_def, std::string *code_ptr) {
|
||||
std::string &code = *code_ptr;
|
||||
code += "def " + NormalizedName(struct_def) + "End";
|
||||
code += "(builder): ";
|
||||
@@ -552,8 +513,8 @@ class PythonGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
// Generate a struct field, conditioned on its child type(s).
|
||||
void GenStructAccessor(const StructDef &struct_def,
|
||||
const FieldDef &field, std::string *code_ptr) {
|
||||
void GenStructAccessor(const StructDef &struct_def, const FieldDef &field,
|
||||
std::string *code_ptr) {
|
||||
GenComment(field.doc_comment, code_ptr, &def_comment, Indent.c_str());
|
||||
if (IsScalar(field.value.type.base_type)) {
|
||||
if (struct_def.fixed) {
|
||||
@@ -572,7 +533,9 @@ class PythonGenerator : public BaseGenerator {
|
||||
GetStructFieldOfTable(struct_def, field, code_ptr);
|
||||
}
|
||||
break;
|
||||
case BASE_TYPE_STRING: GetStringField(struct_def, field, code_ptr); break;
|
||||
case BASE_TYPE_STRING:
|
||||
GetStringField(struct_def, field, code_ptr);
|
||||
break;
|
||||
case BASE_TYPE_VECTOR: {
|
||||
auto vectortype = field.value.type.VectorType();
|
||||
if (vectortype.base_type == BASE_TYPE_STRUCT) {
|
||||
@@ -593,12 +556,11 @@ class PythonGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
// 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);
|
||||
|
||||
for (auto it = struct_def.fields.vec.begin();
|
||||
it != struct_def.fields.vec.end(); ++it) {
|
||||
it != struct_def.fields.vec.end(); ++it) {
|
||||
auto &field = **it;
|
||||
if (field.deprecated) continue;
|
||||
|
||||
@@ -635,7 +597,7 @@ class PythonGenerator : public BaseGenerator {
|
||||
code += "\", size_prefixed=size_prefixed)\n";
|
||||
code += "\n";
|
||||
}
|
||||
|
||||
|
||||
// Generate struct or table methods.
|
||||
void GenStruct(const StructDef &struct_def, std::string *code_ptr) {
|
||||
if (struct_def.generated) return;
|
||||
@@ -646,7 +608,7 @@ class PythonGenerator : public BaseGenerator {
|
||||
// Generate a special accessor for the table that has been declared as
|
||||
// the root type.
|
||||
NewRootTypeFromBuffer(struct_def, code_ptr);
|
||||
if (parser_.file_identifier_.length()){
|
||||
if (parser_.file_identifier_.length()) {
|
||||
// Generate a special function to test file_identifier
|
||||
GenHasFileIdentifier(struct_def, code_ptr);
|
||||
}
|
||||
@@ -655,7 +617,7 @@ class PythonGenerator : public BaseGenerator {
|
||||
// accessor object. This is to allow object reuse.
|
||||
InitializeExisting(struct_def, code_ptr);
|
||||
for (auto it = struct_def.fields.vec.begin();
|
||||
it != struct_def.fields.vec.end(); ++it) {
|
||||
it != struct_def.fields.vec.end(); ++it) {
|
||||
auto &field = **it;
|
||||
if (field.deprecated) continue;
|
||||
|
||||
@@ -693,7 +655,7 @@ class PythonGenerator : public BaseGenerator {
|
||||
case BASE_TYPE_VECTOR: return GenGetter(type.VectorType());
|
||||
default:
|
||||
return "self._tab.Get(flatbuffers.number_types." +
|
||||
MakeCamel(GenTypeGet(type)) + "Flags, ";
|
||||
MakeCamel(GenTypeGet(type)) + "Flags, ";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -705,15 +667,15 @@ class PythonGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
std::string GenTypeBasic(const Type &type) {
|
||||
static const char *ctypename[] = {
|
||||
// clang-format off
|
||||
static const char *ctypename[] = {
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \
|
||||
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, RTYPE, KTYPE) \
|
||||
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, ...) \
|
||||
#PTYPE,
|
||||
FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)
|
||||
#undef FLATBUFFERS_TD
|
||||
// clang-format on
|
||||
};
|
||||
// clang-format on
|
||||
return ctypename[IsArray(type) ? type.VectorType().base_type
|
||||
: type.base_type];
|
||||
}
|
||||
@@ -738,8 +700,7 @@ class PythonGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
// Create a struct with a builder and the struct's arguments.
|
||||
void GenStructBuilder(const StructDef &struct_def,
|
||||
std::string *code_ptr) {
|
||||
void GenStructBuilder(const StructDef &struct_def, std::string *code_ptr) {
|
||||
BeginBuilderArgs(struct_def, code_ptr);
|
||||
StructBuilderArgs(struct_def, "", code_ptr);
|
||||
EndBuilderArgs(code_ptr);
|
||||
@@ -807,6 +768,7 @@ class PythonGenerator : public BaseGenerator {
|
||||
NamespaceDir(*def.defined_namespace) + NormalizedName(def) + ".py";
|
||||
return SaveFile(filename.c_str(), code, false);
|
||||
}
|
||||
|
||||
private:
|
||||
std::unordered_set<std::string> keywords_;
|
||||
const SimpleFloatConstantGenerator float_const_gen_;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -142,8 +142,8 @@ bool Print<const void *>(const void *val, Type type, int indent,
|
||||
FLATBUFFERS_ASSERT(prev_val);
|
||||
auto union_type_byte = *prev_val; // Always a uint8_t.
|
||||
if (vector_index >= 0) {
|
||||
auto type_vec = reinterpret_cast<const Vector<uint8_t> *>(prev_val +
|
||||
ReadScalar<uoffset_t>(prev_val));
|
||||
auto type_vec = reinterpret_cast<const Vector<uint8_t> *>(
|
||||
prev_val + ReadScalar<uoffset_t>(prev_val));
|
||||
union_type_byte = type_vec->Get(static_cast<uoffset_t>(vector_index));
|
||||
}
|
||||
auto enum_val = type.enum_def->ReverseLookup(union_type_byte, true);
|
||||
@@ -167,8 +167,7 @@ bool Print<const void *>(const void *val, Type type, int indent,
|
||||
// Call PrintVector above specifically for each element type:
|
||||
// clang-format off
|
||||
switch (vec_type.base_type) {
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \
|
||||
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, RTYPE, KTYPE) \
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \
|
||||
case BASE_TYPE_ ## ENUM: \
|
||||
if (!PrintVector<CTYPE>( \
|
||||
*reinterpret_cast<const Vector<CTYPE> *>(val), \
|
||||
@@ -187,8 +186,7 @@ bool Print<const void *>(const void *val, Type type, int indent,
|
||||
// Call PrintArray above specifically for each element type:
|
||||
// clang-format off
|
||||
switch (vec_type.base_type) {
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \
|
||||
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, RTYPE, KTYPE) \
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \
|
||||
case BASE_TYPE_ ## ENUM: \
|
||||
if (!PrintArray<CTYPE>( \
|
||||
*reinterpret_cast<const Array<CTYPE, 0xFFFF> *>(val), \
|
||||
@@ -198,6 +196,7 @@ bool Print<const void *>(const void *val, Type type, int indent,
|
||||
} \
|
||||
break;
|
||||
FLATBUFFERS_GEN_TYPES_SCALAR(FLATBUFFERS_TD)
|
||||
// Arrays of scalars or structs are only possible.
|
||||
FLATBUFFERS_GEN_TYPES_POINTER(FLATBUFFERS_TD)
|
||||
#undef FLATBUFFERS_TD
|
||||
case BASE_TYPE_ARRAY: FLATBUFFERS_ASSERT(0);
|
||||
@@ -205,9 +204,7 @@ bool Print<const void *>(const void *val, Type type, int indent,
|
||||
// clang-format on
|
||||
return true;
|
||||
}
|
||||
default:
|
||||
FLATBUFFERS_ASSERT(0);
|
||||
return false;
|
||||
default: FLATBUFFERS_ASSERT(0); return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -287,20 +284,18 @@ static bool GenStruct(const StructDef &struct_def, const Table *table,
|
||||
text += ":";
|
||||
text += " ";
|
||||
switch (fd.value.type.base_type) {
|
||||
// clang-format off
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \
|
||||
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, RTYPE, KTYPE) \
|
||||
case BASE_TYPE_ ## ENUM: \
|
||||
if (!GenField<CTYPE>(fd, table, struct_def.fixed, \
|
||||
opts, indent + Indent(opts), _text)) { \
|
||||
return false; \
|
||||
} \
|
||||
break;
|
||||
// clang-format off
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \
|
||||
case BASE_TYPE_ ## ENUM: \
|
||||
if (!GenField<CTYPE>(fd, table, struct_def.fixed, \
|
||||
opts, indent + Indent(opts), _text)) { \
|
||||
return false; \
|
||||
} \
|
||||
break;
|
||||
FLATBUFFERS_GEN_TYPES_SCALAR(FLATBUFFERS_TD)
|
||||
#undef FLATBUFFERS_TD
|
||||
// Generate drop-thru case statements for all pointer types:
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \
|
||||
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, RTYPE, KTYPE) \
|
||||
#define FLATBUFFERS_TD(ENUM, ...) \
|
||||
case BASE_TYPE_ ## ENUM:
|
||||
FLATBUFFERS_GEN_TYPES_POINTER(FLATBUFFERS_TD)
|
||||
FLATBUFFERS_GEN_TYPE_ARRAY(FLATBUFFERS_TD)
|
||||
@@ -310,7 +305,7 @@ static bool GenStruct(const StructDef &struct_def, const Table *table,
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
// clang-format on
|
||||
// clang-format on
|
||||
}
|
||||
// Track prev val for use with union types.
|
||||
if (struct_def.fixed) {
|
||||
@@ -330,15 +325,11 @@ static bool GenStruct(const StructDef &struct_def, const Table *table,
|
||||
bool GenerateTextFromTable(const Parser &parser, const void *table,
|
||||
const std::string &table_name, std::string *_text) {
|
||||
auto struct_def = parser.LookupStruct(table_name);
|
||||
if (struct_def == nullptr) {
|
||||
return false;
|
||||
}
|
||||
if (struct_def == nullptr) { return false; }
|
||||
auto &text = *_text;
|
||||
text.reserve(1024); // Reduce amount of inevitable reallocs.
|
||||
auto root = static_cast<const Table *>(table);
|
||||
if (!GenStruct(*struct_def, root, 0, parser.opts, &text)) {
|
||||
return false;
|
||||
}
|
||||
if (!GenStruct(*struct_def, root, 0, parser.opts, &text)) { return false; }
|
||||
text += NewLine(parser.opts);
|
||||
return true;
|
||||
}
|
||||
@@ -348,9 +339,9 @@ bool GenerateText(const Parser &parser, const void *flatbuffer,
|
||||
std::string *_text) {
|
||||
std::string &text = *_text;
|
||||
FLATBUFFERS_ASSERT(parser.root_struct_def_); // call SetRootType()
|
||||
text.reserve(1024); // Reduce amount of inevitable reallocs.
|
||||
auto root = parser.opts.size_prefixed ?
|
||||
GetSizePrefixedRoot<Table>(flatbuffer) : GetRoot<Table>(flatbuffer);
|
||||
text.reserve(1024); // Reduce amount of inevitable reallocs.
|
||||
auto root = parser.opts.size_prefixed ? GetSizePrefixedRoot<Table>(flatbuffer)
|
||||
: GetRoot<Table>(flatbuffer);
|
||||
if (!GenStruct(*parser.root_struct_def_, root, 0, parser.opts, _text)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -15,12 +15,11 @@
|
||||
*/
|
||||
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <list>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
#include <cmath>
|
||||
|
||||
#include "flatbuffers/idl.h"
|
||||
#include "flatbuffers/util.h"
|
||||
|
||||
@@ -38,26 +37,22 @@ const char *FLATBUFFERS_VERSION() {
|
||||
|
||||
const double kPi = 3.14159265358979323846;
|
||||
|
||||
const char *const kTypeNames[] = {
|
||||
// clang-format off
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \
|
||||
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, RTYPE, KTYPE) \
|
||||
const char *const kTypeNames[] = {
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, ...) \
|
||||
IDLTYPE,
|
||||
FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)
|
||||
#undef FLATBUFFERS_TD
|
||||
// clang-format on
|
||||
nullptr
|
||||
};
|
||||
|
||||
const char kTypeSizes[] = {
|
||||
// clang-format off
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \
|
||||
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, RTYPE, KTYPE) \
|
||||
sizeof(CTYPE),
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \
|
||||
sizeof(CTYPE),
|
||||
FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)
|
||||
#undef FLATBUFFERS_TD
|
||||
// clang-format on
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
// The enums in the reflection schema should match the ones we use internally.
|
||||
// Compare the last element to check if these go out of sync.
|
||||
@@ -114,8 +109,8 @@ std::string MakeScreamingCamel(const std::string &in) {
|
||||
return s;
|
||||
}
|
||||
|
||||
void DeserializeDoc( std::vector<std::string> &doc,
|
||||
const Vector<Offset<String>> *documentation) {
|
||||
void DeserializeDoc(std::vector<std::string> &doc,
|
||||
const Vector<Offset<String>> *documentation) {
|
||||
if (documentation == nullptr) return;
|
||||
for (uoffset_t index = 0; index < documentation->size(); index++)
|
||||
doc.push_back(documentation->Get(index)->str());
|
||||
@@ -223,8 +218,7 @@ static std::string TokenToString(int t) {
|
||||
#define FLATBUFFERS_TOKEN(NAME, VALUE, STRING) STRING,
|
||||
FLATBUFFERS_GEN_TOKENS(FLATBUFFERS_TOKEN)
|
||||
#undef FLATBUFFERS_TOKEN
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \
|
||||
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, RTYPE, KTYPE) \
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, ...) \
|
||||
IDLTYPE,
|
||||
FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)
|
||||
#undef FLATBUFFERS_TD
|
||||
@@ -399,7 +393,8 @@ CheckedError Parser::Next() {
|
||||
"illegal Unicode sequence (unpaired high surrogate)");
|
||||
}
|
||||
// reset if non-printable
|
||||
attr_is_trivial_ascii_string_ &= check_ascii_range(*cursor_, ' ', '~');
|
||||
attr_is_trivial_ascii_string_ &=
|
||||
check_ascii_range(*cursor_, ' ', '~');
|
||||
|
||||
attribute_ += *cursor_++;
|
||||
}
|
||||
@@ -437,7 +432,7 @@ CheckedError Parser::Next() {
|
||||
cursor_ += 2;
|
||||
break;
|
||||
}
|
||||
FLATBUFFERS_FALLTHROUGH(); // else fall thru
|
||||
FLATBUFFERS_FALLTHROUGH(); // else fall thru
|
||||
default:
|
||||
const auto has_sign = (c == '+') || (c == '-');
|
||||
// '-'/'+' and following identifier - can be a predefined constant like:
|
||||
@@ -451,14 +446,15 @@ CheckedError Parser::Next() {
|
||||
return NoError();
|
||||
}
|
||||
|
||||
auto dot_lvl = (c == '.') ? 0 : 1; // dot_lvl==0 <=> exactly one '.' seen
|
||||
if (!dot_lvl && !is_digit(*cursor_)) return NoError(); // enum?
|
||||
auto dot_lvl =
|
||||
(c == '.') ? 0 : 1; // dot_lvl==0 <=> exactly one '.' seen
|
||||
if (!dot_lvl && !is_digit(*cursor_)) return NoError(); // enum?
|
||||
// Parser accepts hexadecimal-floating-literal (see C++ 5.13.4).
|
||||
if (is_digit(c) || has_sign || !dot_lvl) {
|
||||
const auto start = cursor_ - 1;
|
||||
auto start_digits = !is_digit(c) ? cursor_ : cursor_ - 1;
|
||||
if (!is_digit(c) && is_digit(*cursor_)){
|
||||
start_digits = cursor_; // see digit in cursor_ position
|
||||
if (!is_digit(c) && is_digit(*cursor_)) {
|
||||
start_digits = cursor_; // see digit in cursor_ position
|
||||
c = *cursor_++;
|
||||
}
|
||||
// hex-float can't begind with '.'
|
||||
@@ -501,7 +497,8 @@ CheckedError Parser::Next() {
|
||||
}
|
||||
std::string ch;
|
||||
ch = c;
|
||||
if (false == check_ascii_range(c, ' ', '~')) ch = "code: " + NumToString(c);
|
||||
if (false == check_ascii_range(c, ' ', '~'))
|
||||
ch = "code: " + NumToString(c);
|
||||
return Error("illegal character: " + ch);
|
||||
}
|
||||
}
|
||||
@@ -730,7 +727,7 @@ CheckedError Parser::ParseField(StructDef &struct_def) {
|
||||
if (!IsScalar(type.base_type) ||
|
||||
(struct_def.fixed && field->value.constant != "0"))
|
||||
return Error(
|
||||
"default values currently only supported for scalars in tables");
|
||||
"default values currently only supported for scalars in tables");
|
||||
}
|
||||
// Append .0 if the value has not it (skip hex and scientific floats).
|
||||
// This suffix needed for generated C++ code.
|
||||
@@ -738,7 +735,7 @@ CheckedError Parser::ParseField(StructDef &struct_def) {
|
||||
auto &text = field->value.constant;
|
||||
FLATBUFFERS_ASSERT(false == text.empty());
|
||||
auto s = text.c_str();
|
||||
while(*s == ' ') s++;
|
||||
while (*s == ' ') s++;
|
||||
if (*s == '-' || *s == '+') s++;
|
||||
// 1) A float constants (nan, inf, pi, etc) is a kind of identifier.
|
||||
// 2) A float number needn't ".0" at the end if it has exponent.
|
||||
@@ -774,7 +771,8 @@ CheckedError Parser::ParseField(StructDef &struct_def) {
|
||||
field->deprecated = field->attributes.Lookup("deprecated") != nullptr;
|
||||
auto hash_name = field->attributes.Lookup("hash");
|
||||
if (hash_name) {
|
||||
switch ((type.base_type == BASE_TYPE_VECTOR) ? type.element : type.base_type) {
|
||||
switch ((type.base_type == BASE_TYPE_VECTOR) ? type.element
|
||||
: type.base_type) {
|
||||
case BASE_TYPE_SHORT:
|
||||
case BASE_TYPE_USHORT: {
|
||||
if (FindHashFunction16(hash_name->constant.c_str()) == nullptr)
|
||||
@@ -798,7 +796,8 @@ CheckedError Parser::ParseField(StructDef &struct_def) {
|
||||
}
|
||||
default:
|
||||
return Error(
|
||||
"only short, ushort, int, uint, long and ulong data types support hashing.");
|
||||
"only short, ushort, int, uint, long and ulong data types support "
|
||||
"hashing.");
|
||||
}
|
||||
}
|
||||
auto cpp_type = field->attributes.Lookup("cpp_type");
|
||||
@@ -817,8 +816,7 @@ CheckedError Parser::ParseField(StructDef &struct_def) {
|
||||
if (field->deprecated && struct_def.fixed)
|
||||
return Error("can't deprecate fields in a struct");
|
||||
field->required = field->attributes.Lookup("required") != nullptr;
|
||||
if (field->required &&
|
||||
(struct_def.fixed || IsScalar(type.base_type)))
|
||||
if (field->required && (struct_def.fixed || IsScalar(type.base_type)))
|
||||
return Error("only non-scalar fields in tables may be 'required'");
|
||||
field->key = field->attributes.Lookup("key") != nullptr;
|
||||
if (field->key) {
|
||||
@@ -861,8 +859,7 @@ CheckedError Parser::ParseField(StructDef &struct_def) {
|
||||
if (field->attributes.Lookup("flexbuffer")) {
|
||||
field->flexbuffer = true;
|
||||
uses_flexbuffers_ = true;
|
||||
if (type.base_type != BASE_TYPE_VECTOR ||
|
||||
type.element != BASE_TYPE_UCHAR)
|
||||
if (type.base_type != BASE_TYPE_VECTOR || type.element != BASE_TYPE_UCHAR)
|
||||
return Error("flexbuffer attribute may only apply to a vector of ubyte");
|
||||
}
|
||||
|
||||
@@ -902,8 +899,7 @@ CheckedError Parser::ParseComma() {
|
||||
CheckedError Parser::ParseAnyValue(Value &val, FieldDef *field,
|
||||
size_t parent_fieldn,
|
||||
const StructDef *parent_struct_def,
|
||||
uoffset_t count,
|
||||
bool inside_vector) {
|
||||
uoffset_t count, bool inside_vector) {
|
||||
switch (val.type.base_type) {
|
||||
case BASE_TYPE_UNION: {
|
||||
FLATBUFFERS_ASSERT(field);
|
||||
@@ -921,8 +917,8 @@ CheckedError Parser::ParseAnyValue(Value &val, FieldDef *field,
|
||||
uoffset_t offset;
|
||||
ECHECK(atot(elem->first.constant.c_str(), *this, &offset));
|
||||
vector_of_union_types = reinterpret_cast<Vector<uint8_t> *>(
|
||||
builder_.GetCurrentBufferPointer() +
|
||||
builder_.GetSize() - offset);
|
||||
builder_.GetCurrentBufferPointer() + builder_.GetSize() -
|
||||
offset);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
@@ -964,8 +960,7 @@ CheckedError Parser::ParseAnyValue(Value &val, FieldDef *field,
|
||||
}
|
||||
}
|
||||
if (constant.empty() && !vector_of_union_types) {
|
||||
return Error("missing type field for this union value: " +
|
||||
field->name);
|
||||
return Error("missing type field for this union value: " + field->name);
|
||||
}
|
||||
uint8_t enum_idx;
|
||||
if (vector_of_union_types) {
|
||||
@@ -1040,10 +1035,9 @@ void Parser::SerializeStruct(FlatBufferBuilder &builder,
|
||||
builder.AddStructOffset(val.offset, builder.GetSize());
|
||||
}
|
||||
|
||||
template <typename F>
|
||||
template<typename F>
|
||||
CheckedError Parser::ParseTableDelimiters(size_t &fieldn,
|
||||
const StructDef *struct_def,
|
||||
F body) {
|
||||
const StructDef *struct_def, F body) {
|
||||
// We allow tables both as JSON object{ .. } with field names
|
||||
// or vector[..] with all fields in order
|
||||
char terminator = '}';
|
||||
@@ -1180,8 +1174,7 @@ CheckedError Parser::ParseTable(const StructDef &struct_def, std::string *value,
|
||||
size == SizeOf(field_value.type.base_type)) {
|
||||
switch (field_value.type.base_type) {
|
||||
// clang-format off
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \
|
||||
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, RTYPE, KTYPE) \
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \
|
||||
case BASE_TYPE_ ## ENUM: \
|
||||
builder_.Pad(field->padding); \
|
||||
if (struct_def.fixed) { \
|
||||
@@ -1195,10 +1188,9 @@ CheckedError Parser::ParseTable(const StructDef &struct_def, std::string *value,
|
||||
builder_.AddElement(field_value.offset, val, valdef); \
|
||||
} \
|
||||
break;
|
||||
FLATBUFFERS_GEN_TYPES_SCALAR(FLATBUFFERS_TD);
|
||||
FLATBUFFERS_GEN_TYPES_SCALAR(FLATBUFFERS_TD)
|
||||
#undef FLATBUFFERS_TD
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \
|
||||
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, RTYPE, KTYPE) \
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \
|
||||
case BASE_TYPE_ ## ENUM: \
|
||||
builder_.Pad(field->padding); \
|
||||
if (IsStruct(field->value.type)) { \
|
||||
@@ -1209,7 +1201,7 @@ CheckedError Parser::ParseTable(const StructDef &struct_def, std::string *value,
|
||||
builder_.AddOffset(field_value.offset, val); \
|
||||
} \
|
||||
break;
|
||||
FLATBUFFERS_GEN_TYPES_POINTER(FLATBUFFERS_TD);
|
||||
FLATBUFFERS_GEN_TYPES_POINTER(FLATBUFFERS_TD)
|
||||
#undef FLATBUFFERS_TD
|
||||
case BASE_TYPE_ARRAY:
|
||||
builder_.Pad(field->padding);
|
||||
@@ -1217,7 +1209,7 @@ CheckedError Parser::ParseTable(const StructDef &struct_def, std::string *value,
|
||||
reinterpret_cast<const uint8_t*>(field_value.constant.c_str()),
|
||||
InlineSize(field_value.type));
|
||||
break;
|
||||
// clang-format on
|
||||
// clang-format on
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1243,7 +1235,7 @@ CheckedError Parser::ParseTable(const StructDef &struct_def, std::string *value,
|
||||
return NoError();
|
||||
}
|
||||
|
||||
template <typename F>
|
||||
template<typename F>
|
||||
CheckedError Parser::ParseVectorDelimiters(uoffset_t &count, F body) {
|
||||
EXPECT('[');
|
||||
for (;;) {
|
||||
@@ -1259,12 +1251,10 @@ CheckedError Parser::ParseVectorDelimiters(uoffset_t &count, F body) {
|
||||
|
||||
static bool CompareType(const uint8_t *a, const uint8_t *b, BaseType ftype) {
|
||||
switch (ftype) {
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, GTYPE, NTYPE, \
|
||||
PTYPE, RTYPE, KTYPE) \
|
||||
case BASE_TYPE_ ## ENUM: \
|
||||
return ReadScalar<CTYPE>(a) < ReadScalar<CTYPE>(b);
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \
|
||||
case BASE_TYPE_##ENUM: return ReadScalar<CTYPE>(a) < ReadScalar<CTYPE>(b);
|
||||
FLATBUFFERS_GEN_TYPES_SCALAR(FLATBUFFERS_TD)
|
||||
#undef FLATBUFFERS_TD
|
||||
#undef FLATBUFFERS_TD
|
||||
case BASE_TYPE_STRING:
|
||||
// Indirect offset pointer to string pointer.
|
||||
a += ReadScalar<uoffset_t>(a);
|
||||
@@ -1278,21 +1268,21 @@ static bool CompareType(const uint8_t *a, const uint8_t *b, BaseType ftype) {
|
||||
// See below for why we need our own sort :(
|
||||
template<typename T, typename F, typename S>
|
||||
void SimpleQsort(T *begin, T *end, size_t width, F comparator, S swapper) {
|
||||
if (end - begin <= static_cast<ptrdiff_t>(width)) return;
|
||||
auto l = begin + width;
|
||||
auto r = end;
|
||||
while (l < r) {
|
||||
if (comparator(begin, l)) {
|
||||
r -= width;
|
||||
swapper(l, r);
|
||||
} else {
|
||||
l++;
|
||||
}
|
||||
if (end - begin <= static_cast<ptrdiff_t>(width)) return;
|
||||
auto l = begin + width;
|
||||
auto r = end;
|
||||
while (l < r) {
|
||||
if (comparator(begin, l)) {
|
||||
r -= width;
|
||||
swapper(l, r);
|
||||
} else {
|
||||
l++;
|
||||
}
|
||||
l -= width;
|
||||
swapper(begin, l);
|
||||
SimpleQsort(begin, l, width, comparator, swapper);
|
||||
SimpleQsort(r, end, width, comparator, swapper);
|
||||
}
|
||||
l -= width;
|
||||
swapper(begin, l);
|
||||
SimpleQsort(begin, l, width, comparator, swapper);
|
||||
SimpleQsort(r, end, width, comparator, swapper);
|
||||
}
|
||||
|
||||
CheckedError Parser::ParseVector(const Type &type, uoffset_t *ovalue,
|
||||
@@ -1316,8 +1306,7 @@ CheckedError Parser::ParseVector(const Type &type, uoffset_t *ovalue,
|
||||
auto &val = field_stack_.back().first;
|
||||
switch (val.type.base_type) {
|
||||
// clang-format off
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \
|
||||
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, RTYPE, KTYPE) \
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE,...) \
|
||||
case BASE_TYPE_ ## ENUM: \
|
||||
if (IsStruct(val.type)) SerializeStruct(*val.type.struct_def, val); \
|
||||
else { \
|
||||
@@ -1359,46 +1348,49 @@ CheckedError Parser::ParseVector(const Type &type, uoffset_t *ovalue,
|
||||
static BaseType ftype = key->value.type.base_type;
|
||||
|
||||
if (type.struct_def->fixed) {
|
||||
auto v = reinterpret_cast<VectorOfAny *>(
|
||||
builder_.GetCurrentBufferPointer());
|
||||
SimpleQsort<uint8_t>(v->Data(),
|
||||
v->Data() + v->size() * type.struct_def->bytesize,
|
||||
type.struct_def->bytesize,
|
||||
[](const uint8_t *a, const uint8_t *b) -> bool {
|
||||
return CompareType(a + offset, b + offset, ftype);
|
||||
}, [&](uint8_t *a, uint8_t *b) {
|
||||
// FIXME: faster?
|
||||
for (size_t i = 0; i < type.struct_def->bytesize; i++) {
|
||||
std::swap(a[i], b[i]);
|
||||
}
|
||||
});
|
||||
auto v =
|
||||
reinterpret_cast<VectorOfAny *>(builder_.GetCurrentBufferPointer());
|
||||
SimpleQsort<uint8_t>(
|
||||
v->Data(), v->Data() + v->size() * type.struct_def->bytesize,
|
||||
type.struct_def->bytesize,
|
||||
[](const uint8_t *a, const uint8_t *b) -> bool {
|
||||
return CompareType(a + offset, b + offset, ftype);
|
||||
},
|
||||
[&](uint8_t *a, uint8_t *b) {
|
||||
// FIXME: faster?
|
||||
for (size_t i = 0; i < type.struct_def->bytesize; i++) {
|
||||
std::swap(a[i], b[i]);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
auto v = reinterpret_cast<Vector<Offset<Table>> *>(
|
||||
builder_.GetCurrentBufferPointer());
|
||||
builder_.GetCurrentBufferPointer());
|
||||
// Here also can't use std::sort. We do have an iterator type for it,
|
||||
// but it is non-standard as it will dereference the offsets, and thus
|
||||
// can't be used to swap elements.
|
||||
SimpleQsort<Offset<Table>>(v->data(), v->data() + v->size(), 1,
|
||||
[](const Offset<Table> *_a, const Offset<Table> *_b) -> bool {
|
||||
// Indirect offset pointer to table pointer.
|
||||
auto a = reinterpret_cast<const uint8_t *>(_a) +
|
||||
ReadScalar<uoffset_t>(_a);
|
||||
auto b = reinterpret_cast<const uint8_t *>(_b) +
|
||||
ReadScalar<uoffset_t>(_b);
|
||||
// Fetch field address from table.
|
||||
a = reinterpret_cast<const Table *>(a)->GetAddressOf(offset);
|
||||
b = reinterpret_cast<const Table *>(b)->GetAddressOf(offset);
|
||||
return CompareType(a, b, ftype);
|
||||
}, [&](Offset<Table> *a, Offset<Table> *b) {
|
||||
// These are serialized offsets, so are relative where they are
|
||||
// stored in memory, so compute the distance between these pointers:
|
||||
ptrdiff_t diff = (b - a) * sizeof(Offset<Table>);
|
||||
assert(diff >= 0); // Guaranteed by SimpleQsort.
|
||||
auto udiff = static_cast<uoffset_t>(diff);
|
||||
a->o = EndianScalar(ReadScalar<uoffset_t>(a) - udiff);
|
||||
b->o = EndianScalar(ReadScalar<uoffset_t>(b) + udiff);
|
||||
std::swap(*a, *b);
|
||||
});
|
||||
SimpleQsort<Offset<Table>>(
|
||||
v->data(), v->data() + v->size(), 1,
|
||||
[](const Offset<Table> *_a, const Offset<Table> *_b) -> bool {
|
||||
// Indirect offset pointer to table pointer.
|
||||
auto a = reinterpret_cast<const uint8_t *>(_a) +
|
||||
ReadScalar<uoffset_t>(_a);
|
||||
auto b = reinterpret_cast<const uint8_t *>(_b) +
|
||||
ReadScalar<uoffset_t>(_b);
|
||||
// Fetch field address from table.
|
||||
a = reinterpret_cast<const Table *>(a)->GetAddressOf(offset);
|
||||
b = reinterpret_cast<const Table *>(b)->GetAddressOf(offset);
|
||||
return CompareType(a, b, ftype);
|
||||
},
|
||||
[&](Offset<Table> *a, Offset<Table> *b) {
|
||||
// These are serialized offsets, so are relative where they are
|
||||
// stored in memory, so compute the distance between these pointers:
|
||||
ptrdiff_t diff = (b - a) * sizeof(Offset<Table>);
|
||||
assert(diff >= 0); // Guaranteed by SimpleQsort.
|
||||
auto udiff = static_cast<uoffset_t>(diff);
|
||||
a->o = EndianScalar(ReadScalar<uoffset_t>(a) - udiff);
|
||||
b->o = EndianScalar(ReadScalar<uoffset_t>(b) + udiff);
|
||||
std::swap(*a, *b);
|
||||
});
|
||||
}
|
||||
}
|
||||
return NoError();
|
||||
@@ -1428,8 +1420,7 @@ CheckedError Parser::ParseArray(Value &array) {
|
||||
auto &val = *it;
|
||||
// clang-format off
|
||||
switch (val.type.base_type) {
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \
|
||||
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, RTYPE, KTYPE) \
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \
|
||||
case BASE_TYPE_ ## ENUM: \
|
||||
if (IsStruct(val.type)) { \
|
||||
SerializeStruct(builder, *val.type.struct_def, val); \
|
||||
@@ -1478,12 +1469,11 @@ CheckedError Parser::ParseNestedFlatbuffer(Value &val, FieldDef *field,
|
||||
nested_parser.enums_.dict.clear();
|
||||
nested_parser.enums_.vec.clear();
|
||||
|
||||
if (!ok) {
|
||||
ECHECK(Error(nested_parser.error_));
|
||||
}
|
||||
if (!ok) { ECHECK(Error(nested_parser.error_)); }
|
||||
// Force alignment for nested flatbuffer
|
||||
builder_.ForceVectorAlignment(nested_parser.builder_.GetSize(), sizeof(uint8_t),
|
||||
nested_parser.builder_.GetBufferMinAlignment());
|
||||
builder_.ForceVectorAlignment(
|
||||
nested_parser.builder_.GetSize(), sizeof(uint8_t),
|
||||
nested_parser.builder_.GetBufferMinAlignment());
|
||||
|
||||
auto off = builder_.CreateVector(nested_parser.builder_.GetBufferPointer(),
|
||||
nested_parser.builder_.GetSize());
|
||||
@@ -1499,7 +1489,7 @@ CheckedError Parser::ParseMetaData(SymbolTable<Value> *attributes) {
|
||||
auto name = attribute_;
|
||||
if (false == (Is(kTokenIdentifier) || Is(kTokenStringConstant)))
|
||||
return Error("attribute name must be either identifier or string: " +
|
||||
name);
|
||||
name);
|
||||
if (known_attributes_.find(name) == known_attributes_.end())
|
||||
return Error("user define attributes must be declared before use: " +
|
||||
name);
|
||||
@@ -1648,10 +1638,10 @@ template<typename T> inline void SingleValueRepack(Value &e, T val) {
|
||||
}
|
||||
#if defined(FLATBUFFERS_HAS_NEW_STRTOD) && (FLATBUFFERS_HAS_NEW_STRTOD > 0)
|
||||
// Normilaze defaults NaN to unsigned quiet-NaN(0).
|
||||
static inline void SingleValueRepack(Value& e, float val) {
|
||||
static inline void SingleValueRepack(Value &e, float val) {
|
||||
if (val != val) e.constant = "nan";
|
||||
}
|
||||
static inline void SingleValueRepack(Value& e, double val) {
|
||||
static inline void SingleValueRepack(Value &e, double val) {
|
||||
if (val != val) e.constant = "nan";
|
||||
}
|
||||
#endif
|
||||
@@ -1774,7 +1764,7 @@ CheckedError Parser::ParseSingleValue(const std::string *name, Value &e,
|
||||
"' to value of <" + std::string(kTypeNames[in_type]) + "> type.";
|
||||
return Error(msg);
|
||||
}
|
||||
const auto match_type = e.type.base_type; // may differ from in_type
|
||||
const auto match_type = e.type.base_type; // may differ from in_type
|
||||
// The check_now flag must be true when parse a fbs-schema.
|
||||
// This flag forces to check default scalar values or metadata of field.
|
||||
// For JSON parser the flag should be false.
|
||||
@@ -1782,14 +1772,13 @@ CheckedError Parser::ParseSingleValue(const std::string *name, Value &e,
|
||||
if (check_now && IsScalar(match_type)) {
|
||||
// clang-format off
|
||||
switch (match_type) {
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \
|
||||
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, RTYPE, KTYPE) \
|
||||
case BASE_TYPE_ ## ENUM: {\
|
||||
CTYPE val; \
|
||||
ECHECK(atot(e.constant.c_str(), *this, &val)); \
|
||||
SingleValueRepack(e, val); \
|
||||
break; }
|
||||
FLATBUFFERS_GEN_TYPES_SCALAR(FLATBUFFERS_TD);
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \
|
||||
case BASE_TYPE_ ## ENUM: {\
|
||||
CTYPE val; \
|
||||
ECHECK(atot(e.constant.c_str(), *this, &val)); \
|
||||
SingleValueRepack(e, val); \
|
||||
break; }
|
||||
FLATBUFFERS_GEN_TYPES_SCALAR(FLATBUFFERS_TD)
|
||||
#undef FLATBUFFERS_TD
|
||||
default: break;
|
||||
}
|
||||
@@ -2018,13 +2007,12 @@ struct EnumValBuilder {
|
||||
FLATBUFFERS_CHECKED_ERROR ValidateValue(int64_t *ev, bool next) {
|
||||
// clang-format off
|
||||
switch (enum_def.underlying_type.base_type) {
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, GTYPE, NTYPE, \
|
||||
PTYPE, RTYPE, KTYPE) \
|
||||
#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \
|
||||
case BASE_TYPE_##ENUM: { \
|
||||
if (!IsInteger(BASE_TYPE_##ENUM)) break; \
|
||||
return ValidateImpl<BASE_TYPE_##ENUM, CTYPE>(ev, next ? 1 : 0); \
|
||||
}
|
||||
FLATBUFFERS_GEN_TYPES_SCALAR(FLATBUFFERS_TD);
|
||||
FLATBUFFERS_GEN_TYPES_SCALAR(FLATBUFFERS_TD)
|
||||
#undef FLATBUFFERS_TD
|
||||
default: break;
|
||||
}
|
||||
@@ -2210,11 +2198,10 @@ CheckedError Parser::CheckClash(std::vector<FieldDef *> &fields,
|
||||
|
||||
bool Parser::SupportsAdvancedUnionFeatures() const {
|
||||
return opts.lang_to_generate != 0 &&
|
||||
(opts.lang_to_generate & ~(IDLOptions::kCpp | IDLOptions::kJs |
|
||||
IDLOptions::kTs | IDLOptions::kPhp |
|
||||
IDLOptions::kJava | IDLOptions::kCSharp |
|
||||
IDLOptions::kKotlin |
|
||||
IDLOptions::kBinary)) == 0;
|
||||
(opts.lang_to_generate &
|
||||
~(IDLOptions::kCpp | IDLOptions::kJs | IDLOptions::kTs |
|
||||
IDLOptions::kPhp | IDLOptions::kJava | IDLOptions::kCSharp |
|
||||
IDLOptions::kKotlin | IDLOptions::kBinary)) == 0;
|
||||
}
|
||||
|
||||
bool Parser::SupportsAdvancedArrayFeatures() const {
|
||||
@@ -2486,8 +2473,8 @@ CheckedError Parser::StartEnum(const std::string &enum_name, bool is_union,
|
||||
if (enums_.Add(current_namespace_->GetFullyQualifiedName(enum_name),
|
||||
&enum_def))
|
||||
return Error("enum already exists: " + enum_name);
|
||||
enum_def.underlying_type.base_type = is_union ? BASE_TYPE_UTYPE
|
||||
: BASE_TYPE_INT;
|
||||
enum_def.underlying_type.base_type =
|
||||
is_union ? BASE_TYPE_UTYPE : BASE_TYPE_INT;
|
||||
enum_def.underlying_type.enum_def = &enum_def;
|
||||
if (dest) *dest = &enum_def;
|
||||
return NoError();
|
||||
@@ -2623,8 +2610,8 @@ CheckedError Parser::ParseProtoFields(StructDef *struct_def, bool isextend,
|
||||
if (oneof_type.base_type != BASE_TYPE_STRUCT ||
|
||||
!oneof_type.struct_def || oneof_type.struct_def->fixed)
|
||||
return Error("oneof '" + name +
|
||||
"' cannot be mapped to a union because member '" +
|
||||
oneof_field.name + "' is not a table type.");
|
||||
"' cannot be mapped to a union because member '" +
|
||||
oneof_field.name + "' is not a table type.");
|
||||
EnumValBuilder evb(*this, *oneof_union);
|
||||
auto ev = evb.CreateEnumerator(oneof_type.struct_def->name);
|
||||
ev->union_type = oneof_type;
|
||||
@@ -2989,9 +2976,7 @@ CheckedError Parser::DoParse(const char *source, const char **include_paths,
|
||||
// entered into included_files_.
|
||||
// This is recursive, but only go as deep as the number of include
|
||||
// statements.
|
||||
if (source_filename) {
|
||||
included_files_.erase(source_filename);
|
||||
}
|
||||
if (source_filename) { included_files_.erase(source_filename); }
|
||||
return DoParse(source, include_paths, source_filename,
|
||||
include_filename);
|
||||
}
|
||||
@@ -3015,9 +3000,9 @@ CheckedError Parser::DoParse(const char *source, const char **include_paths,
|
||||
uoffset_t toff;
|
||||
ECHECK(ParseTable(*root_struct_def_, nullptr, &toff));
|
||||
if (opts.size_prefixed) {
|
||||
builder_.FinishSizePrefixed(Offset<Table>(toff), file_identifier_.length()
|
||||
? file_identifier_.c_str()
|
||||
: nullptr);
|
||||
builder_.FinishSizePrefixed(
|
||||
Offset<Table>(toff),
|
||||
file_identifier_.length() ? file_identifier_.c_str() : nullptr);
|
||||
} else {
|
||||
builder_.Finish(Offset<Table>(toff), file_identifier_.length()
|
||||
? file_identifier_.c_str()
|
||||
@@ -3038,8 +3023,7 @@ CheckedError Parser::DoParse(const char *source, const char **include_paths,
|
||||
if (opts.root_type.empty()) {
|
||||
if (!SetRootType(root_type.c_str()))
|
||||
return Error("unknown root type: " + root_type);
|
||||
if (root_struct_def_->fixed)
|
||||
return Error("root type must be a table");
|
||||
if (root_struct_def_->fixed) return Error("root type must be a table");
|
||||
}
|
||||
EXPECT(';');
|
||||
} else if (IsIdent("file_identifier")) {
|
||||
@@ -3144,10 +3128,9 @@ void Parser::Serialize() {
|
||||
auto fiid__ = builder_.CreateString(file_identifier_);
|
||||
auto fext__ = builder_.CreateString(file_extension_);
|
||||
auto serv__ = builder_.CreateVectorOfSortedTables(&service_offsets);
|
||||
auto schema_offset =
|
||||
reflection::CreateSchema(builder_, objs__, enum__, fiid__, fext__,
|
||||
(root_struct_def_ ? root_struct_def_->serialized_location : 0),
|
||||
serv__);
|
||||
auto schema_offset = reflection::CreateSchema(
|
||||
builder_, objs__, enum__, fiid__, fext__,
|
||||
(root_struct_def_ ? root_struct_def_->serialized_location : 0), serv__);
|
||||
if (opts.size_prefixed) {
|
||||
builder_.FinishSizePrefixed(schema_offset, reflection::SchemaIdentifier());
|
||||
} else {
|
||||
@@ -3193,22 +3176,20 @@ Offset<reflection::Object> StructDef::Serialize(FlatBufferBuilder *builder,
|
||||
auto flds__ = builder->CreateVectorOfSortedTables(&field_offsets);
|
||||
auto attr__ = SerializeAttributes(builder, parser);
|
||||
auto docs__ = parser.opts.binary_schema_comments
|
||||
? builder->CreateVectorOfStrings(doc_comment)
|
||||
: 0;
|
||||
? builder->CreateVectorOfStrings(doc_comment)
|
||||
: 0;
|
||||
return reflection::CreateObject(*builder, name__, flds__, fixed,
|
||||
static_cast<int>(minalign),
|
||||
static_cast<int>(bytesize),
|
||||
attr__, docs__);
|
||||
static_cast<int>(bytesize), attr__, docs__);
|
||||
}
|
||||
|
||||
bool StructDef::Deserialize(Parser &parser, const reflection::Object *object) {
|
||||
if (!DeserializeAttributes(parser, object->attributes()))
|
||||
return false;
|
||||
if (!DeserializeAttributes(parser, object->attributes())) return false;
|
||||
DeserializeDoc(doc_comment, object->documentation());
|
||||
name = parser.UnqualifiedName(object->name()->str());
|
||||
predecl = false;
|
||||
sortbysize = attributes.Lookup("original_order") == nullptr && !fixed;
|
||||
const auto& of = *(object->fields());
|
||||
const auto &of = *(object->fields());
|
||||
auto indexes = std::vector<uoffset_t>(of.size());
|
||||
for (uoffset_t i = 0; i < of.size(); i++) indexes[of.Get(i)->id()] = i;
|
||||
size_t tmp_struct_size = 0;
|
||||
@@ -3224,9 +3205,7 @@ bool StructDef::Deserialize(Parser &parser, const reflection::Object *object) {
|
||||
// Recompute padding since that's currently not serialized.
|
||||
auto size = InlineSize(field_def->value.type);
|
||||
auto next_field =
|
||||
i + 1 < indexes.size()
|
||||
? of.Get(indexes[i+1])
|
||||
: nullptr;
|
||||
i + 1 < indexes.size() ? of.Get(indexes[i + 1]) : nullptr;
|
||||
tmp_struct_size += size;
|
||||
field_def->padding =
|
||||
next_field ? (next_field->offset() - field_def->value.offset) - size
|
||||
@@ -3245,9 +3224,10 @@ Offset<reflection::Field> FieldDef::Serialize(FlatBufferBuilder *builder,
|
||||
auto type__ = value.type.Serialize(builder);
|
||||
auto attr__ = SerializeAttributes(builder, parser);
|
||||
auto docs__ = parser.opts.binary_schema_comments
|
||||
? builder->CreateVectorOfStrings(doc_comment)
|
||||
: 0;
|
||||
return reflection::CreateField(*builder, name__, type__, id, value.offset,
|
||||
? builder->CreateVectorOfStrings(doc_comment)
|
||||
: 0;
|
||||
return reflection::CreateField(
|
||||
*builder, name__, type__, id, value.offset,
|
||||
// Is uint64>max(int64) tested?
|
||||
IsInteger(value.type.base_type) ? StringToInt(value.constant.c_str()) : 0,
|
||||
// result may be platform-dependent if underlying is float (not double)
|
||||
@@ -3261,8 +3241,7 @@ Offset<reflection::Field> FieldDef::Serialize(FlatBufferBuilder *builder,
|
||||
bool FieldDef::Deserialize(Parser &parser, const reflection::Field *field) {
|
||||
name = field->name()->str();
|
||||
defined_namespace = parser.current_namespace_;
|
||||
if (!value.type.Deserialize(parser, field->type()))
|
||||
return false;
|
||||
if (!value.type.Deserialize(parser, field->type())) return false;
|
||||
value.offset = field->offset();
|
||||
if (IsInteger(value.type.base_type)) {
|
||||
value.constant = NumToString(field->default_integer());
|
||||
@@ -3276,8 +3255,7 @@ bool FieldDef::Deserialize(Parser &parser, const reflection::Field *field) {
|
||||
deprecated = field->deprecated();
|
||||
required = field->required();
|
||||
key = field->key();
|
||||
if (!DeserializeAttributes(parser, field->attributes()))
|
||||
return false;
|
||||
if (!DeserializeAttributes(parser, field->attributes())) return false;
|
||||
// TODO: this should probably be handled by a separate attribute
|
||||
if (attributes.Lookup("flexbuffer")) {
|
||||
flexbuffer = true;
|
||||
@@ -3301,18 +3279,16 @@ Offset<reflection::RPCCall> RPCCall::Serialize(FlatBufferBuilder *builder,
|
||||
auto name__ = builder->CreateString(name);
|
||||
auto attr__ = SerializeAttributes(builder, parser);
|
||||
auto docs__ = parser.opts.binary_schema_comments
|
||||
? builder->CreateVectorOfStrings(doc_comment)
|
||||
: 0;
|
||||
return reflection::CreateRPCCall(*builder, name__,
|
||||
request->serialized_location,
|
||||
response->serialized_location,
|
||||
attr__, docs__);
|
||||
? builder->CreateVectorOfStrings(doc_comment)
|
||||
: 0;
|
||||
return reflection::CreateRPCCall(
|
||||
*builder, name__, request->serialized_location,
|
||||
response->serialized_location, attr__, docs__);
|
||||
}
|
||||
|
||||
bool RPCCall::Deserialize(Parser &parser, const reflection::RPCCall *call) {
|
||||
name = call->name()->str();
|
||||
if (!DeserializeAttributes(parser, call->attributes()))
|
||||
return false;
|
||||
if (!DeserializeAttributes(parser, call->attributes())) return false;
|
||||
DeserializeDoc(doc_comment, call->documentation());
|
||||
request = parser.structs_.Lookup(call->request()->name()->str());
|
||||
response = parser.structs_.Lookup(call->response()->name()->str());
|
||||
@@ -3331,8 +3307,8 @@ Offset<reflection::Service> ServiceDef::Serialize(FlatBufferBuilder *builder,
|
||||
auto call__ = builder->CreateVector(servicecall_offsets);
|
||||
auto attr__ = SerializeAttributes(builder, parser);
|
||||
auto docs__ = parser.opts.binary_schema_comments
|
||||
? builder->CreateVectorOfStrings(doc_comment)
|
||||
: 0;
|
||||
? builder->CreateVectorOfStrings(doc_comment)
|
||||
: 0;
|
||||
return reflection::CreateService(*builder, name__, call__, attr__, docs__);
|
||||
}
|
||||
|
||||
@@ -3349,8 +3325,7 @@ bool ServiceDef::Deserialize(Parser &parser,
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!DeserializeAttributes(parser, service->attributes()))
|
||||
return false;
|
||||
if (!DeserializeAttributes(parser, service->attributes())) return false;
|
||||
DeserializeDoc(doc_comment, service->documentation());
|
||||
return true;
|
||||
}
|
||||
@@ -3367,8 +3342,8 @@ Offset<reflection::Enum> EnumDef::Serialize(FlatBufferBuilder *builder,
|
||||
auto type__ = underlying_type.Serialize(builder);
|
||||
auto attr__ = SerializeAttributes(builder, parser);
|
||||
auto docs__ = parser.opts.binary_schema_comments
|
||||
? builder->CreateVectorOfStrings(doc_comment)
|
||||
: 0;
|
||||
? builder->CreateVectorOfStrings(doc_comment)
|
||||
: 0;
|
||||
return reflection::CreateEnum(*builder, name__, vals__, is_union, type__,
|
||||
attr__, docs__);
|
||||
}
|
||||
@@ -3387,8 +3362,7 @@ bool EnumDef::Deserialize(Parser &parser, const reflection::Enum *_enum) {
|
||||
if (!underlying_type.Deserialize(parser, _enum->underlying_type())) {
|
||||
return false;
|
||||
}
|
||||
if (!DeserializeAttributes(parser, _enum->attributes()))
|
||||
return false;
|
||||
if (!DeserializeAttributes(parser, _enum->attributes())) return false;
|
||||
DeserializeDoc(doc_comment, _enum->documentation());
|
||||
return true;
|
||||
}
|
||||
@@ -3398,9 +3372,10 @@ Offset<reflection::EnumVal> EnumVal::Serialize(FlatBufferBuilder *builder,
|
||||
auto name__ = builder->CreateString(name);
|
||||
auto type__ = union_type.Serialize(builder);
|
||||
auto docs__ = parser.opts.binary_schema_comments
|
||||
? builder->CreateVectorOfStrings(doc_comment)
|
||||
: 0;
|
||||
return reflection::CreateEnumVal(*builder, name__, value,
|
||||
? builder->CreateVectorOfStrings(doc_comment)
|
||||
: 0;
|
||||
return reflection::CreateEnumVal(
|
||||
*builder, name__, value,
|
||||
union_type.struct_def ? union_type.struct_def->serialized_location : 0,
|
||||
type__, docs__);
|
||||
}
|
||||
@@ -3409,8 +3384,7 @@ bool EnumVal::Deserialize(const Parser &parser,
|
||||
const reflection::EnumVal *val) {
|
||||
name = val->name()->str();
|
||||
value = val->value();
|
||||
if (!union_type.Deserialize(parser, val->union_type()))
|
||||
return false;
|
||||
if (!union_type.Deserialize(parser, val->union_type())) return false;
|
||||
DeserializeDoc(doc_comment, val->documentation());
|
||||
return true;
|
||||
}
|
||||
@@ -3432,8 +3406,7 @@ bool Type::Deserialize(const Parser &parser, const reflection::Type *type) {
|
||||
bool is_series = type->base_type() == reflection::Vector ||
|
||||
type->base_type() == reflection::Array;
|
||||
if (type->base_type() == reflection::Obj ||
|
||||
(is_series &&
|
||||
type->element() == reflection::Obj)) {
|
||||
(is_series && type->element() == reflection::Obj)) {
|
||||
if (static_cast<size_t>(type->index()) < parser.structs_.vec.size()) {
|
||||
struct_def = parser.structs_.vec[type->index()];
|
||||
struct_def->refcount++;
|
||||
@@ -3474,8 +3447,7 @@ Definition::SerializeAttributes(FlatBufferBuilder *builder,
|
||||
|
||||
bool Definition::DeserializeAttributes(
|
||||
Parser &parser, const Vector<Offset<reflection::KeyValue>> *attrs) {
|
||||
if (attrs == nullptr)
|
||||
return true;
|
||||
if (attrs == nullptr) return true;
|
||||
for (uoffset_t i = 0; i < attrs->size(); ++i) {
|
||||
auto kv = attrs->Get(i);
|
||||
auto value = new Value();
|
||||
@@ -3495,7 +3467,7 @@ bool Definition::DeserializeAttributes(
|
||||
bool Parser::Deserialize(const uint8_t *buf, const size_t size) {
|
||||
flatbuffers::Verifier verifier(reinterpret_cast<const uint8_t *>(buf), size);
|
||||
bool size_prefixed = false;
|
||||
if(!reflection::SchemaBufferHasIdentifier(buf)) {
|
||||
if (!reflection::SchemaBufferHasIdentifier(buf)) {
|
||||
if (!flatbuffers::BufferHasIdentifier(buf, reflection::SchemaIdentifier(),
|
||||
true))
|
||||
return false;
|
||||
@@ -3504,9 +3476,7 @@ bool Parser::Deserialize(const uint8_t *buf, const size_t size) {
|
||||
}
|
||||
auto verify_fn = size_prefixed ? &reflection::VerifySizePrefixedSchemaBuffer
|
||||
: &reflection::VerifySchemaBuffer;
|
||||
if (!verify_fn(verifier)) {
|
||||
return false;
|
||||
}
|
||||
if (!verify_fn(verifier)) { return false; }
|
||||
auto schema = size_prefixed ? reflection::GetSizePrefixedSchema(buf)
|
||||
: reflection::GetSchema(buf);
|
||||
return Deserialize(schema);
|
||||
@@ -3555,7 +3525,7 @@ bool Parser::Deserialize(const reflection::Schema *schema) {
|
||||
auto struct_def = structs_.Lookup(qualified_name);
|
||||
struct_def->defined_namespace =
|
||||
GetNamespace(qualified_name, namespaces_, namespaces_index);
|
||||
if (!struct_def->Deserialize(*this, * it)) { return false; }
|
||||
if (!struct_def->Deserialize(*this, *it)) { return false; }
|
||||
if (schema->root_table() == *it) { root_struct_def_ = struct_def; }
|
||||
}
|
||||
for (auto it = schema->enums()->begin(); it != schema->enums()->end(); ++it) {
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
|
||||
#include "flatbuffers/reflection.h"
|
||||
|
||||
#include "flatbuffers/util.h"
|
||||
|
||||
// Helper functionality for reflection.
|
||||
@@ -431,8 +432,8 @@ Offset<const Table *> CopyTable(FlatBufferBuilder &fbb,
|
||||
break;
|
||||
}
|
||||
}
|
||||
FLATBUFFERS_FALLTHROUGH(); // fall thru
|
||||
default: { // Scalars and structs.
|
||||
FLATBUFFERS_FALLTHROUGH(); // fall thru
|
||||
default: { // Scalars and structs.
|
||||
auto element_size = GetTypeSize(element_base_type);
|
||||
if (elemobjectdef && elemobjectdef->is_struct())
|
||||
element_size = elemobjectdef->bytesize();
|
||||
@@ -466,7 +467,7 @@ Offset<const Table *> CopyTable(FlatBufferBuilder &fbb,
|
||||
break;
|
||||
}
|
||||
}
|
||||
FLATBUFFERS_FALLTHROUGH(); // fall thru
|
||||
FLATBUFFERS_FALLTHROUGH(); // fall thru
|
||||
case reflection::Union:
|
||||
case reflection::String:
|
||||
case reflection::Vector:
|
||||
@@ -495,9 +496,8 @@ bool VerifyStruct(flatbuffers::Verifier &v,
|
||||
auto offset = parent_table.GetOptionalFieldOffset(field_offset);
|
||||
if (required && !offset) { return false; }
|
||||
|
||||
return !offset ||
|
||||
v.Verify(reinterpret_cast<const uint8_t *>(&parent_table), offset,
|
||||
obj.bytesize());
|
||||
return !offset || v.Verify(reinterpret_cast<const uint8_t *>(&parent_table),
|
||||
offset, obj.bytesize());
|
||||
}
|
||||
|
||||
bool VerifyVectorOfStructs(flatbuffers::Verifier &v,
|
||||
@@ -535,9 +535,8 @@ bool VerifyUnion(flatbuffers::Verifier &v, const reflection::Schema &schema,
|
||||
}
|
||||
case reflection::String:
|
||||
return v.VerifyString(
|
||||
reinterpret_cast<const flatbuffers::String *>(elem));
|
||||
default:
|
||||
return false;
|
||||
reinterpret_cast<const flatbuffers::String *>(elem));
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -597,27 +596,24 @@ bool VerifyVector(flatbuffers::Verifier &v, const reflection::Schema &schema,
|
||||
}
|
||||
}
|
||||
case reflection::Union: {
|
||||
auto vec = flatbuffers::GetFieldV<flatbuffers::Offset<uint8_t>>(table,
|
||||
vec_field);
|
||||
auto vec = flatbuffers::GetFieldV<flatbuffers::Offset<uint8_t>>(
|
||||
table, vec_field);
|
||||
if (!v.VerifyVector(vec)) return false;
|
||||
if (!vec) return true;
|
||||
auto type_vec = table.GetPointer<Vector<uint8_t> *>
|
||||
(vec_field.offset() - sizeof(voffset_t));
|
||||
auto type_vec = table.GetPointer<Vector<uint8_t> *>(vec_field.offset() -
|
||||
sizeof(voffset_t));
|
||||
if (!v.VerifyVector(type_vec)) return false;
|
||||
for (uoffset_t j = 0; j < vec->size(); j++) {
|
||||
// get union type from the prev field
|
||||
auto utype = type_vec->Get(j);
|
||||
auto elem = vec->Get(j);
|
||||
if (!VerifyUnion(v, schema, utype, elem, vec_field))
|
||||
return false;
|
||||
if (!VerifyUnion(v, schema, utype, elem, vec_field)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
case reflection::Vector:
|
||||
case reflection::None:
|
||||
default:
|
||||
FLATBUFFERS_ASSERT(false);
|
||||
return false;
|
||||
default: FLATBUFFERS_ASSERT(false); return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -663,8 +659,7 @@ bool VerifyObject(flatbuffers::Verifier &v, const reflection::Schema &schema,
|
||||
}
|
||||
break;
|
||||
case reflection::Vector:
|
||||
if (!VerifyVector(v, schema, *table, *field_def))
|
||||
return false;
|
||||
if (!VerifyVector(v, schema, *table, *field_def)) return false;
|
||||
break;
|
||||
case reflection::Obj: {
|
||||
auto child_obj = schema.objects()->Get(field_def->type()->index());
|
||||
@@ -687,15 +682,11 @@ bool VerifyObject(flatbuffers::Verifier &v, const reflection::Schema &schema,
|
||||
voffset_t utype_offset = field_def->offset() - sizeof(voffset_t);
|
||||
auto utype = table->GetField<uint8_t>(utype_offset, 0);
|
||||
auto uval = reinterpret_cast<const uint8_t *>(
|
||||
flatbuffers::GetFieldT(*table, *field_def));
|
||||
if (!VerifyUnion(v, schema, utype, uval, *field_def)) {
|
||||
return false;
|
||||
}
|
||||
flatbuffers::GetFieldT(*table, *field_def));
|
||||
if (!VerifyUnion(v, schema, utype, uval, *field_def)) { return false; }
|
||||
break;
|
||||
}
|
||||
default:
|
||||
FLATBUFFERS_ASSERT(false);
|
||||
break;
|
||||
default: FLATBUFFERS_ASSERT(false); break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -242,9 +242,9 @@ bool SetGlobalTestLocale(const char *locale_name, std::string *_value) {
|
||||
}
|
||||
|
||||
bool ReadEnvironmentVariable(const char *var_name, std::string *_value) {
|
||||
#ifdef _MSC_VER
|
||||
__pragma(warning(disable : 4996)); // _CRT_SECURE_NO_WARNINGS
|
||||
#endif
|
||||
#ifdef _MSC_VER
|
||||
__pragma(warning(disable : 4996)); // _CRT_SECURE_NO_WARNINGS
|
||||
#endif
|
||||
auto env_str = std::getenv(var_name);
|
||||
if (!env_str) return false;
|
||||
if (_value) *_value = std::string(env_str);
|
||||
|
||||
Reference in New Issue
Block a user