diff options
author | Michi Henning <michi@zeroc.com> | 2009-07-08 09:12:06 +1000 |
---|---|---|
committer | Michi Henning <michi@zeroc.com> | 2009-07-08 09:12:06 +1000 |
commit | f9438d27225a833bb0ad858541578b2722395bcf (patch) | |
tree | 4cfdf8db3ccd3b82e02b84cae543239bc00eb747 /cpp/src | |
parent | Bug 3502: More cleanup for new javadoc syntax. (diff) | |
parent | 3930 - Slice class inheritance mapped to virtual inheritance in C++ (diff) | |
download | ice-f9438d27225a833bb0ad858541578b2722395bcf.tar.bz2 ice-f9438d27225a833bb0ad858541578b2722395bcf.tar.xz ice-f9438d27225a833bb0ad858541578b2722395bcf.zip |
Merge branch 'master' of cvs.zeroc.com:/home/git/ice
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/slice2cpp/Gen.cpp | 28 | ||||
-rw-r--r-- | cpp/src/slice2cpp/Gen.h | 2 |
2 files changed, 22 insertions, 8 deletions
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp index 5d3ebdfb481..0eff3cf3e09 100644 --- a/cpp/src/slice2cpp/Gen.cpp +++ b/cpp/src/slice2cpp/Gen.cpp @@ -3292,6 +3292,7 @@ Slice::Gen::ObjectVisitor::visitClassDefStart(const ClassDefPtr& p) DataMemberList dataMembers = p->dataMembers(); DataMemberList allDataMembers = p->allDataMembers(); + H << sp << nl << "class " << _dllExport << name << " : "; H.useCurrentPosAsIndent(); if(bases.empty()) @@ -3308,9 +3309,15 @@ Slice::Gen::ObjectVisitor::visitClassDefStart(const ClassDefPtr& p) else { ClassList::const_iterator q = bases.begin(); + bool virtualInheritance = p->hasMetaData("cpp:virtual") || p->isInterface(); while(q != bases.end()) { - H << "virtual public " << fixKwd((*q)->scoped()); + if(virtualInheritance || (*q)->isInterface()) + { + H << "virtual "; + } + + H << "public " << fixKwd((*q)->scoped()); if(++q != bases.end()) { H << ',' << nl; @@ -4510,7 +4517,7 @@ Slice::Gen::ObjectVisitor::emitGCClearCode(const TypePtr& p, const string& prefi } bool -Slice::Gen::ObjectVisitor::emitVirtualBaseInitializers(const ClassDefPtr& p) +Slice::Gen::ObjectVisitor::emitVirtualBaseInitializers(const ClassDefPtr& p, bool virtualInheritance) { DataMemberList allDataMembers = p->allDataMembers(); if(allDataMembers.empty()) @@ -4518,12 +4525,15 @@ Slice::Gen::ObjectVisitor::emitVirtualBaseInitializers(const ClassDefPtr& p) return false; } - ClassList bases = p->bases(); - if(!bases.empty() && !bases.front()->isInterface()) + if(virtualInheritance) { - if(emitVirtualBaseInitializers(bases.front())) + ClassList bases = p->bases(); + if(!bases.empty() && !bases.front()->isInterface()) { - C << ','; + if(emitVirtualBaseInitializers(bases.front(), virtualInheritance)) + { + C << ','; + } } } @@ -4581,7 +4591,7 @@ Slice::Gen::ObjectVisitor::emitOneShotConstructor(const ClassDefPtr& p) ClassDefPtr base; if(!bases.empty() && !bases.front()->isInterface()) { - if(emitVirtualBaseInitializers(bases.front())) + if(emitVirtualBaseInitializers(bases.front(), p->hasMetaData("cpp:virtual"))) { if(!dataMembers.empty()) { @@ -6026,6 +6036,10 @@ Slice::Gen::MetaDataVisitor::validate(const SyntaxTreeBasePtr& cont, const Strin { continue; } + if(ClassDefPtr::dynamicCast(cont) && ss.find("virtual") == 0) + { + continue; + } emitWarning(file, line, "ignoring invalid metadata `" + s + "'"); } _history.insert(s); diff --git a/cpp/src/slice2cpp/Gen.h b/cpp/src/slice2cpp/Gen.h index 9f15d3fd6d9..cca39fcdbc3 100644 --- a/cpp/src/slice2cpp/Gen.h +++ b/cpp/src/slice2cpp/Gen.h @@ -258,7 +258,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 emitVirtualBaseInitializers(const ClassDefPtr&, bool virtualInheritance); void emitOneShotConstructor(const ClassDefPtr&); void emitUpcall(const ClassDefPtr&, const std::string&); |