From dc4cda274c0a707c679b53882793eb5fc8fa8431 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Mon, 27 Jan 2025 23:58:52 +0100 Subject: [PATCH] =?UTF-8?q?Zwischenstand:=20ab=20hier=20m=C3=BC=C3=9Fte=20?= =?UTF-8?q?der=20Code=20zur=20Laufzeit=20testen,=20welcher=20Fall=20vorlie?= =?UTF-8?q?gt,=20um=20den=20richtigen=20Code=20zur=20Serialisierung/Deseri?= =?UTF-8?q?alisierung=20zu=20w=C3=A4hlen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/thrift/generate/t_delphi_generator.cc | 11 ++++++---- .../cpp/src/thrift/generate/t_generator.cc | 14 +++++-------- compiler/cpp/src/thrift/parse/t_struct.h | 14 ------------- compiler/cpp/src/thrift/parse/t_typedef.cc | 20 ++++++++++++++----- compiler/cpp/src/thrift/parse/t_typedef.h | 4 +++- 5 files changed, 30 insertions(+), 33 deletions(-) diff --git a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc index 03127f0bf46..352dcdca5ab 100644 --- a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc @@ -3076,10 +3076,13 @@ string t_delphi_generator::type_name(t_type* ttype, if (ttype->is_typedef()) { t_typedef* tdef = (t_typedef*)ttype; if (tdef->is_forward_typedef()) { // forward types according to THRIFT-2421 - t_type* resolved = tdef->get_type(generic); - if (resolved != nullptr) { - return type_name(resolved, b_cls, b_no_postfix, generic); - } else { + const mapped_type* resolved = tdef->get_generic_type(generic); + if (resolved->get_type() != nullptr) { + return type_name(resolved->get_type(), b_cls, b_no_postfix, generic); + } else if(resolved->is_generic_decl()) { + return std::string("<" + normalize_name(resolved->symbolic()) + ">"); + } + else { throw "Unresolved forward declaration: Used type never defined: " + tdef->get_symbolic(); } } else { diff --git a/compiler/cpp/src/thrift/generate/t_generator.cc b/compiler/cpp/src/thrift/generate/t_generator.cc index b4971153263..7a5dfa8af22 100644 --- a/compiler/cpp/src/thrift/generate/t_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_generator.cc @@ -50,17 +50,13 @@ void t_generator::generate_program() { vector::iterator o_iter; for (o_iter = objects.begin(); o_iter != objects.end(); ++o_iter) { - if ((*o_iter)->is_fully_specialized_type()) { - generate_forward_declaration(*o_iter); - } + generate_forward_declaration(*o_iter); } for (o_iter = objects.begin(); o_iter != objects.end(); ++o_iter) { - if ((*o_iter)->is_fully_specialized_type()) { - if ((*o_iter)->is_xception()) { - generate_xception(*o_iter); - } else { - generate_struct(*o_iter); - } + if ((*o_iter)->is_xception()) { + generate_xception(*o_iter); + } else { + generate_struct(*o_iter); } } diff --git a/compiler/cpp/src/thrift/parse/t_struct.h b/compiler/cpp/src/thrift/parse/t_struct.h index 5411909dab1..8b4c933a1fd 100644 --- a/compiler/cpp/src/thrift/parse/t_struct.h +++ b/compiler/cpp/src/thrift/parse/t_struct.h @@ -90,20 +90,6 @@ class t_struct : public t_type { return (tmpl_decl_type_ != nullptr) && (tmpl_decl_type_->size() > 0); } - bool is_fully_specialized_type() const { - if (is_generic_type()) { - members_type::const_iterator m_iter; - for (m_iter = members_.begin(); m_iter != members_.end(); ++m_iter) { - t_type* ftyp = (*m_iter)->get_type(); - if( (ftyp == nullptr) || (ftyp->get_true_type() == nullptr)) { - return false; - } - } - } - - return true; - } - virtual std::map* map_template_types() { // generic? if (tmpl_decl_type_ == nullptr) { diff --git a/compiler/cpp/src/thrift/parse/t_typedef.cc b/compiler/cpp/src/thrift/parse/t_typedef.cc index fce986df802..2b9dd497a97 100644 --- a/compiler/cpp/src/thrift/parse/t_typedef.cc +++ b/compiler/cpp/src/thrift/parse/t_typedef.cc @@ -26,22 +26,32 @@ t_type* t_typedef::get_type(std::map* generic) { } const t_type* t_typedef::get_type(std::map* generic) const { + const mapped_type* mapped = get_generic_type(generic); + if (mapped->get_type() != nullptr) { + return mapped->get_type(); + } + + printf("Type \"%s\" not defined\n", symbolic_.c_str()); + exit(1); +} + +const mapped_type* t_typedef::get_generic_type(std::map* generic) const { if (type_ != nullptr) { - return type_; + return new mapped_type(symbolic_, type_); } const t_type* type = get_program()->scope()->get_type(symbolic_); if ((type != nullptr) && (type != this)) { - return type; + return new mapped_type(symbolic_, type); } if (generic != nullptr) { std::map::const_iterator iter = generic->find(symbolic_); if ((iter != generic->end()) && (iter->second.get_type() != this)) { - return iter->second.get_type(); + return &iter->second; } } - printf("Type \"%s\" not defined\n", symbolic_.c_str()); - exit(1); + return new mapped_type(symbolic_, false); } + diff --git a/compiler/cpp/src/thrift/parse/t_typedef.h b/compiler/cpp/src/thrift/parse/t_typedef.h index f45cdb328ce..8831bec4609 100644 --- a/compiler/cpp/src/thrift/parse/t_typedef.h +++ b/compiler/cpp/src/thrift/parse/t_typedef.h @@ -58,8 +58,10 @@ class t_typedef : public t_type { ~t_typedef() override = default; t_type* get_type(std::map* generic = nullptr); - const t_type* get_type(std::map* generic = nullptr) const; + + const mapped_type* t_typedef::get_generic_type(std::map* generic) const; + const std::string get_symbolic() const {return symbolic_; }