Skip to content

Commit

Permalink
Zwischenstand: ab hier müßte der Code zur Laufzeit testen, welcher Fa…
Browse files Browse the repository at this point in the history
…ll vorliegt, um den richtigen Code zur Serialisierung/Deserialisierung zu wählen
  • Loading branch information
Jens-G committed Feb 5, 2025
1 parent d8e52c5 commit dc4cda2
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 33 deletions.
11 changes: 7 additions & 4 deletions compiler/cpp/src/thrift/generate/t_delphi_generator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
14 changes: 5 additions & 9 deletions compiler/cpp/src/thrift/generate/t_generator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -50,17 +50,13 @@ void t_generator::generate_program() {

vector<t_struct*>::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);
}
}

Expand Down
14 changes: 0 additions & 14 deletions compiler/cpp/src/thrift/parse/t_struct.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<std::string, mapped_type>* map_template_types() {
// generic?
if (tmpl_decl_type_ == nullptr) {
Expand Down
20 changes: 15 additions & 5 deletions compiler/cpp/src/thrift/parse/t_typedef.cc
Original file line number Diff line number Diff line change
Expand Up @@ -26,22 +26,32 @@ t_type* t_typedef::get_type(std::map<std::string, mapped_type>* generic) {
}

const t_type* t_typedef::get_type(std::map<std::string, mapped_type>* 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<std::string, mapped_type>* 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<std::string, mapped_type>::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);
}

4 changes: 3 additions & 1 deletion compiler/cpp/src/thrift/parse/t_typedef.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,10 @@ class t_typedef : public t_type {
~t_typedef() override = default;

t_type* get_type(std::map<std::string, mapped_type>* generic = nullptr);

const t_type* get_type(std::map<std::string, mapped_type>* generic = nullptr) const;

const mapped_type* t_typedef::get_generic_type(std::map<std::string, mapped_type>* generic) const;

const std::string get_symbolic() const {return symbolic_; }


Expand Down

0 comments on commit dc4cda2

Please sign in to comment.