aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--td/generate/tl_writer_c.h4
-rw-r--r--td/generate/tl_writer_cpp.cpp25
-rw-r--r--td/generate/tl_writer_cpp.h4
-rw-r--r--td/generate/tl_writer_dotnet.h4
-rw-r--r--td/generate/tl_writer_h.cpp4
-rw-r--r--td/generate/tl_writer_h.h4
-rw-r--r--td/generate/tl_writer_hpp.cpp3
-rw-r--r--td/generate/tl_writer_hpp.h4
-rw-r--r--td/generate/tl_writer_java.cpp3
-rw-r--r--td/generate/tl_writer_java.h4
-rw-r--r--td/generate/tl_writer_jni_cpp.cpp3
-rw-r--r--td/generate/tl_writer_jni_cpp.h4
-rw-r--r--tdtl/td/tl/tl_generate.cpp4
-rw-r--r--tdtl/td/tl/tl_writer.h4
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,