diff options
| -rw-r--r-- | td/generate/tl_writer_c.h | 4 | ||||
| -rw-r--r-- | td/generate/tl_writer_cpp.cpp | 25 | ||||
| -rw-r--r-- | td/generate/tl_writer_cpp.h | 4 | ||||
| -rw-r--r-- | td/generate/tl_writer_dotnet.h | 4 | ||||
| -rw-r--r-- | td/generate/tl_writer_h.cpp | 4 | ||||
| -rw-r--r-- | td/generate/tl_writer_h.h | 4 | ||||
| -rw-r--r-- | td/generate/tl_writer_hpp.cpp | 3 | ||||
| -rw-r--r-- | td/generate/tl_writer_hpp.h | 4 | ||||
| -rw-r--r-- | td/generate/tl_writer_java.cpp | 3 | ||||
| -rw-r--r-- | td/generate/tl_writer_java.h | 4 | ||||
| -rw-r--r-- | td/generate/tl_writer_jni_cpp.cpp | 3 | ||||
| -rw-r--r-- | td/generate/tl_writer_jni_cpp.h | 4 | ||||
| -rw-r--r-- | tdtl/td/tl/tl_generate.cpp | 4 | ||||
| -rw-r--r-- | tdtl/td/tl/tl_writer.h | 4 |
14 files changed, 45 insertions, 29 deletions
diff --git a/td/generate/tl_writer_c.h b/td/generate/tl_writer_c.h index 42efe6e35..4c288e610 100644 --- a/td/generate/tl_writer_c.h +++ b/td/generate/tl_writer_c.h @@ -1017,8 +1017,8 @@ class TlWriterCCommon final : public tl::TL_writer { int parser_type) const final { return ""; } - std::string gen_field_store(const tl::arg &a, std::vector<tl::var_description> &vars, bool flat, - int storer_type) const final { + std::string gen_field_store(const tl::arg &a, const std::vector<tl::arg> &args, + std::vector<tl::var_description> &vars, bool flat, int storer_type) const final { return ""; } std::string gen_type_fetch(const std::string &field_name, const tl::tl_tree_type *tree_type, diff --git a/td/generate/tl_writer_cpp.cpp b/td/generate/tl_writer_cpp.cpp index 36e9b7f44..aeaa39906 100644 --- a/td/generate/tl_writer_cpp.cpp +++ b/td/generate/tl_writer_cpp.cpp @@ -310,7 +310,10 @@ std::string TD_TL_writer_cpp::get_pretty_field_name(std::string field_name) cons auto equals_pos = field_name.find('='); if (equals_pos != std::string::npos && equals_pos + 3 < field_name.size()) { field_name = field_name.substr(equals_pos + 2); - if (field_name.back() == ')') { + auto bar_pos = field_name.find('|'); + if (bar_pos != std::string::npos && bar_pos >= 2 && field_name[bar_pos - 1] == ' ') { + field_name = field_name.substr(0, bar_pos - 1); + } else if (field_name.back() == ')') { field_name.pop_back(); } } @@ -433,7 +436,8 @@ std::string TD_TL_writer_cpp::gen_type_store(const std::string &field_name, cons } } -std::string TD_TL_writer_cpp::gen_field_store(const tl::arg &a, std::vector<tl::var_description> &vars, bool flat, +std::string TD_TL_writer_cpp::gen_field_store(const tl::arg &a, const std::vector<tl::arg> &args, + std::vector<tl::var_description> &vars, bool flat, int storer_type) const { std::string field_name = gen_field_name(a.name); std::string res = storer_type == 1 ? " " : " "; @@ -482,15 +486,13 @@ std::string TD_TL_writer_cpp::gen_field_store(const tl::arg &a, std::vector<tl:: } } } - } - if (a.exist_var_num >= 0) { res += "if (" + gen_var_name(vars[a.exist_var_num]) + " & " + int_to_string(1 << a.exist_var_bit) + ") { "; } if (flat) { // TODO - // return gen_field_store(const tl::arg &a, std::vector<tl::var_description> &vars, bool flat, int storer_type); + // return gen_field_store(const tl::arg &a, const std::vector<tl::arg> &args, std::vector<tl::var_description> &vars, bool flat, int storer_type); } if (a.var_num >= 0) { @@ -498,7 +500,18 @@ std::string TD_TL_writer_cpp::gen_field_store(const tl::arg &a, std::vector<tl:: assert(static_cast<const tl::tl_tree_type *>(a.type)->type->id == tl::ID_VAR_NUM); assert(a.var_num < static_cast<int>(vars.size())); if (!vars[a.var_num].is_stored) { - field_name = "(" + gen_var_name(vars[a.var_num]) + " = " + field_name + ")"; + field_name = "(" + gen_var_name(vars[a.var_num]) + " = " + field_name; + for (const tl::arg &other_arg : args) { + if (other_arg.exist_var_num != a.var_num || other_arg.type->get_type() != tl::NODE_TYPE_TYPE || + (other_arg.flags & tl::FLAG_OPT_VAR) != 0) { + continue; + } + const tl::tl_tree_type *tree_type = static_cast<tl::tl_tree_type *>(other_arg.type); + if (tree_type->type->name == "True") { + field_name += " | (" + gen_field_name(other_arg.name) + " << " + int_to_string(other_arg.exist_var_bit) + ")"; + } + } + field_name += ")"; vars[a.var_num].is_stored = true; } else { assert(false); // need to check value of stored var diff --git a/td/generate/tl_writer_cpp.h b/td/generate/tl_writer_cpp.h index 91e443c80..35ace0cbd 100644 --- a/td/generate/tl_writer_cpp.h +++ b/td/generate/tl_writer_cpp.h @@ -65,8 +65,8 @@ class TD_TL_writer_cpp : public TD_TL_writer { std::string gen_field_fetch(int field_num, const tl::arg &a, std::vector<tl::var_description> &vars, bool flat, int parser_type) const override; - std::string gen_field_store(const tl::arg &a, std::vector<tl::var_description> &vars, bool flat, - int storer_type) const override; + std::string gen_field_store(const tl::arg &a, const std::vector<tl::arg> &args, + std::vector<tl::var_description> &vars, bool flat, int storer_type) const override; std::string gen_type_fetch(const std::string &field_name, const tl::tl_tree_type *tree_type, const std::vector<tl::var_description> &vars, int parser_type) const override; std::string gen_type_store(const std::string &field_name, const tl::tl_tree_type *tree_type, diff --git a/td/generate/tl_writer_dotnet.h b/td/generate/tl_writer_dotnet.h index af95a9ea0..c12911b4d 100644 --- a/td/generate/tl_writer_dotnet.h +++ b/td/generate/tl_writer_dotnet.h @@ -464,8 +464,8 @@ class TlWriterDotNet final : public TL_writer { // ss << gen_field_name(a.name) << " = from_unmanaged(from->" << // gen_native_field_name(a.name) << ");\n"; return ss.str(); } - std::string gen_field_store(const arg &a, std::vector<var_description> &vars, bool flat, - int storer_type) const final { + std::string gen_field_store(const arg &a, const std::vector<tl::arg> &args, std::vector<var_description> &vars, + bool flat, int storer_type) const final { return ""; // std::stringstream ss; // ss << "to_unmanaged(" << gen_field_name(a.name) << ")"; diff --git a/td/generate/tl_writer_h.cpp b/td/generate/tl_writer_h.cpp index e7c98a709..3a6f8e98f 100644 --- a/td/generate/tl_writer_h.cpp +++ b/td/generate/tl_writer_h.cpp @@ -244,8 +244,8 @@ std::string TD_TL_writer_h::gen_field_fetch(int field_num, const tl::arg &a, std return ""; } -std::string TD_TL_writer_h::gen_field_store(const tl::arg &a, std::vector<tl::var_description> &vars, bool flat, - int storer_type) const { +std::string TD_TL_writer_h::gen_field_store(const tl::arg &a, const std::vector<tl::arg> &args, + std::vector<tl::var_description> &vars, bool flat, int storer_type) const { return ""; } diff --git a/td/generate/tl_writer_h.h b/td/generate/tl_writer_h.h index b0561745b..e9e39fc37 100644 --- a/td/generate/tl_writer_h.h +++ b/td/generate/tl_writer_h.h @@ -53,8 +53,8 @@ class TD_TL_writer_h : public TD_TL_writer { std::string gen_field_fetch(int field_num, const tl::arg &a, std::vector<tl::var_description> &vars, bool flat, int parser_type) const override; - std::string gen_field_store(const tl::arg &a, std::vector<tl::var_description> &vars, bool flat, - int storer_type) const override; + std::string gen_field_store(const tl::arg &a, const std::vector<tl::arg> &args, + std::vector<tl::var_description> &vars, bool flat, int storer_type) const override; std::string gen_type_fetch(const std::string &field_name, const tl::tl_tree_type *tree_type, const std::vector<tl::var_description> &vars, int parser_type) const override; std::string gen_type_store(const std::string &field_name, const tl::tl_tree_type *tree_type, diff --git a/td/generate/tl_writer_hpp.cpp b/td/generate/tl_writer_hpp.cpp index 24fc31517..28c6da2b7 100644 --- a/td/generate/tl_writer_hpp.cpp +++ b/td/generate/tl_writer_hpp.cpp @@ -96,7 +96,8 @@ std::string TD_TL_writer_hpp::gen_field_fetch(int field_num, const tl::arg &a, s return ""; } -std::string TD_TL_writer_hpp::gen_field_store(const tl::arg &a, std::vector<tl::var_description> &vars, bool flat, +std::string TD_TL_writer_hpp::gen_field_store(const tl::arg &a, const std::vector<tl::arg> &args, + std::vector<tl::var_description> &vars, bool flat, int storer_type) const { return ""; } diff --git a/td/generate/tl_writer_hpp.h b/td/generate/tl_writer_hpp.h index 30d78d516..26165ae1b 100644 --- a/td/generate/tl_writer_hpp.h +++ b/td/generate/tl_writer_hpp.h @@ -52,8 +52,8 @@ class TD_TL_writer_hpp final : public TD_TL_writer { std::string gen_field_fetch(int field_num, const tl::arg &a, std::vector<tl::var_description> &vars, bool flat, int parser_type) const final; - std::string gen_field_store(const tl::arg &a, std::vector<tl::var_description> &vars, bool flat, - int storer_type) const final; + std::string gen_field_store(const tl::arg &a, const std::vector<tl::arg> &args, + std::vector<tl::var_description> &vars, bool flat, int storer_type) const final; std::string gen_type_fetch(const std::string &field_name, const tl::tl_tree_type *tree_type, const std::vector<tl::var_description> &vars, int parser_type) const final; std::string gen_type_store(const std::string &field_name, const tl::tl_tree_type *tree_type, diff --git a/td/generate/tl_writer_java.cpp b/td/generate/tl_writer_java.cpp index c83184c9e..de997fddf 100644 --- a/td/generate/tl_writer_java.cpp +++ b/td/generate/tl_writer_java.cpp @@ -351,7 +351,8 @@ std::string TD_TL_writer_java::gen_field_fetch(int field_num, const tl::arg &a, return ""; } -std::string TD_TL_writer_java::gen_field_store(const tl::arg &a, std::vector<tl::var_description> &vars, bool flat, +std::string TD_TL_writer_java::gen_field_store(const tl::arg &a, const std::vector<tl::arg> &args, + std::vector<tl::var_description> &vars, bool flat, int storer_type) const { return ""; } diff --git a/td/generate/tl_writer_java.h b/td/generate/tl_writer_java.h index 26b3fced6..94a602d92 100644 --- a/td/generate/tl_writer_java.h +++ b/td/generate/tl_writer_java.h @@ -80,8 +80,8 @@ class TD_TL_writer_java final : public tl::TL_writer { std::string gen_constructor_id_store(std::int32_t id, int storer_type) const final; std::string gen_field_fetch(int field_num, const tl::arg &a, std::vector<tl::var_description> &vars, bool flat, int parser_type) const final; - std::string gen_field_store(const tl::arg &a, std::vector<tl::var_description> &vars, bool flat, - int storer_type) const final; + std::string gen_field_store(const tl::arg &a, const std::vector<tl::arg> &args, + std::vector<tl::var_description> &vars, bool flat, int storer_type) const final; std::string gen_type_fetch(const std::string &field_name, const tl::tl_tree_type *tree_type, const std::vector<tl::var_description> &vars, int parser_type) const final; std::string gen_type_store(const std::string &field_name, const tl::tl_tree_type *tree_type, diff --git a/td/generate/tl_writer_jni_cpp.cpp b/td/generate/tl_writer_jni_cpp.cpp index 520b8190d..fe5fc7127 100644 --- a/td/generate/tl_writer_jni_cpp.cpp +++ b/td/generate/tl_writer_jni_cpp.cpp @@ -349,7 +349,8 @@ std::string TD_TL_writer_jni_cpp::gen_type_store(const std::string &field_name, return res; } -std::string TD_TL_writer_jni_cpp::gen_field_store(const tl::arg &a, std::vector<tl::var_description> &vars, bool flat, +std::string TD_TL_writer_jni_cpp::gen_field_store(const tl::arg &a, const std::vector<tl::arg> &args, + std::vector<tl::var_description> &vars, bool flat, int storer_type) const { std::string field_name = gen_field_name(a.name); std::string shift = storer_type == 1 ? " " : " "; diff --git a/td/generate/tl_writer_jni_cpp.h b/td/generate/tl_writer_jni_cpp.h index a60a88a9e..3d7cb0d25 100644 --- a/td/generate/tl_writer_jni_cpp.h +++ b/td/generate/tl_writer_jni_cpp.h @@ -64,8 +64,8 @@ class TD_TL_writer_jni_cpp final : public TD_TL_writer_cpp { std::string gen_field_fetch(int field_num, const tl::arg &a, std::vector<tl::var_description> &vars, bool flat, int parser_type) const final; - std::string gen_field_store(const tl::arg &a, std::vector<tl::var_description> &vars, bool flat, - int storer_type) const final; + std::string gen_field_store(const tl::arg &a, const std::vector<tl::arg> &args, + std::vector<tl::var_description> &vars, bool flat, int storer_type) const final; std::string gen_type_fetch(const std::string &field_name, const tl::tl_tree_type *tree_type, const std::vector<tl::var_description> &vars, int parser_type) const final; std::string gen_type_store(const std::string &field_name, const tl::tl_tree_type *tree_type, diff --git a/tdtl/td/tl/tl_generate.cpp b/tdtl/td/tl/tl_generate.cpp index fc405f1e0..20113857e 100644 --- a/tdtl/td/tl/tl_generate.cpp +++ b/tdtl/td/tl/tl_generate.cpp @@ -178,7 +178,7 @@ static void write_function_store(tl_outputer &out, const std::string &storer_nam out.append(w.gen_store_function_begin(storer_name, class_name, 0, vars, storer_type)); out.append(w.gen_constructor_id_store(t->id, storer_type)); for (std::size_t i = 0; i < t->args.size(); i++) { - out.append(w.gen_field_store(t->args[i], vars, false, storer_type)); + out.append(w.gen_field_store(t->args[i], t->args, vars, false, storer_type)); } out.append(w.gen_store_function_end(vars, storer_type)); @@ -266,7 +266,7 @@ static void write_constructor_store(tl_outputer &out, const std::string &storer_ out.append(w.gen_uni(result_type, vars, false)); for (std::size_t i = 0; i < t->args.size(); i++) { // std::fprintf(stderr, "%s: %s\n", result_type->type->name.c_str(), t->name.c_str()); - out.append(w.gen_field_store(t->args[i], vars, is_flat, storer_type)); + out.append(w.gen_field_store(t->args[i], t->args, vars, is_flat, storer_type)); } out.append(w.gen_store_function_end(vars, storer_type)); diff --git a/tdtl/td/tl/tl_writer.h b/tdtl/td/tl/tl_writer.h index 18df08b6f..bc50b7707 100644 --- a/tdtl/td/tl/tl_writer.h +++ b/tdtl/td/tl/tl_writer.h @@ -112,8 +112,8 @@ class TL_writer { virtual std::string gen_constructor_id_store(std::int32_t id, int storer_type) const = 0; virtual std::string gen_field_fetch(int field_num, const arg &a, std::vector<var_description> &vars, bool flat, int parser_type) const = 0; - virtual std::string gen_field_store(const arg &a, std::vector<var_description> &vars, bool flat, - int storer_type) const = 0; + virtual std::string gen_field_store(const arg &a, const std::vector<arg> &args, std::vector<var_description> &vars, + bool flat, int storer_type) const = 0; virtual std::string gen_type_fetch(const std::string &field_name, const tl_tree_type *tree_type, const std::vector<var_description> &vars, int parser_type) const = 0; virtual std::string gen_type_store(const std::string &field_name, const tl_tree_type *tree_type, |
