diff options
Diffstat (limited to 'cpp/src/slice2cpp')
-rw-r--r-- | cpp/src/slice2cpp/Gen.cpp | 23 | ||||
-rw-r--r-- | cpp/src/slice2cpp/Gen.h | 2 |
2 files changed, 15 insertions, 10 deletions
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp index d1effc81427..caf5ddcb89f 100644 --- a/cpp/src/slice2cpp/Gen.cpp +++ b/cpp/src/slice2cpp/Gen.cpp @@ -4762,7 +4762,7 @@ Slice::Gen::ObjectVisitor::emitGCClearCode(const TypePtr& p, const string& prefi } bool -Slice::Gen::ObjectVisitor::emitVirtualBaseInitializers(const ClassDefPtr& p, bool virtualInheritance) +Slice::Gen::ObjectVisitor::emitVirtualBaseInitializers(const ClassDefPtr& p, bool virtualInheritance, bool direct) { DataMemberList allDataMembers = p->allDataMembers(); if(allDataMembers.empty()) @@ -4770,18 +4770,23 @@ Slice::Gen::ObjectVisitor::emitVirtualBaseInitializers(const ClassDefPtr& p, boo return false; } - if(virtualInheritance) + ClassList bases = p->bases(); + if(!bases.empty() && !bases.front()->isInterface()) { - ClassList bases = p->bases(); - if(!bases.empty() && !bases.front()->isInterface()) + if(emitVirtualBaseInitializers(bases.front(), p->hasMetaData("cpp:virtual"), false)) { - if(emitVirtualBaseInitializers(bases.front(), virtualInheritance)) - { - H << ','; - } + H << ','; } } + // + // Do not call non direct base classes constructor if not using virtual inheritance. + // + if(!direct && !virtualInheritance) + { + return false; + } + string upcall = "("; for(DataMemberList::const_iterator q = allDataMembers.begin(); q != allDataMembers.end(); ++q) { @@ -4828,7 +4833,7 @@ Slice::Gen::ObjectVisitor::emitOneShotConstructor(const ClassDefPtr& p) ClassDefPtr base; if(!bases.empty() && !bases.front()->isInterface()) { - if(emitVirtualBaseInitializers(bases.front(), p->hasMetaData("cpp:virtual"))) + if(emitVirtualBaseInitializers(bases.front(), p->hasMetaData("cpp:virtual"), true)) { if(!dataMembers.empty()) { diff --git a/cpp/src/slice2cpp/Gen.h b/cpp/src/slice2cpp/Gen.h index cadd15695e5..00fa629a0e8 100644 --- a/cpp/src/slice2cpp/Gen.h +++ b/cpp/src/slice2cpp/Gen.h @@ -257,7 +257,7 @@ private: void emitGCFunctions(const ClassDefPtr&); void emitGCInsertCode(const TypePtr&, const std::string&, const std::string&, int); void emitGCClearCode(const TypePtr&, const std::string&, const std::string&, int); - bool emitVirtualBaseInitializers(const ClassDefPtr&, bool virtualInheritance); + bool emitVirtualBaseInitializers(const ClassDefPtr&, bool virtualInheritance, bool direct); void emitOneShotConstructor(const ClassDefPtr&); void emitUpcall(const ClassDefPtr&, const std::string&); |