summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorMichi Henning <michi@zeroc.com>2009-07-08 09:12:06 +1000
committerMichi Henning <michi@zeroc.com>2009-07-08 09:12:06 +1000
commitf9438d27225a833bb0ad858541578b2722395bcf (patch)
tree4cfdf8db3ccd3b82e02b84cae543239bc00eb747 /cpp/src
parentBug 3502: More cleanup for new javadoc syntax. (diff)
parent3930 - Slice class inheritance mapped to virtual inheritance in C++ (diff)
downloadice-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.cpp28
-rw-r--r--cpp/src/slice2cpp/Gen.h2
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&);