summaryrefslogtreecommitdiff
path: root/cpp
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
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')
-rw-r--r--cpp/demo/Ice/value/Value.ice2
-rw-r--r--cpp/demo/book/freeze_filesystem/PersistentFilesystem.ice4
-rw-r--r--cpp/src/slice2cpp/Gen.cpp28
-rw-r--r--cpp/src/slice2cpp/Gen.h2
-rw-r--r--cpp/test/Freeze/evictor/Test.ice6
-rw-r--r--cpp/test/Ice/inheritance/Test.ice6
6 files changed, 31 insertions, 17 deletions
diff --git a/cpp/demo/Ice/value/Value.ice b/cpp/demo/Ice/value/Value.ice
index fe8aefd3e22..209767852a5 100644
--- a/cpp/demo/Ice/value/Value.ice
+++ b/cpp/demo/Ice/value/Value.ice
@@ -24,7 +24,7 @@ class Printer
void printBackwards();
};
-class DerivedPrinter extends Printer
+["cpp:virtual"]class DerivedPrinter extends Printer
{
string derivedMessage;
void printUppercase();
diff --git a/cpp/demo/book/freeze_filesystem/PersistentFilesystem.ice b/cpp/demo/book/freeze_filesystem/PersistentFilesystem.ice
index fe0216eb4d2..b8e915644d6 100644
--- a/cpp/demo/book/freeze_filesystem/PersistentFilesystem.ice
+++ b/cpp/demo/book/freeze_filesystem/PersistentFilesystem.ice
@@ -19,14 +19,14 @@ module Filesystem
PersistentDirectory* parent;
};
- class PersistentFile extends PersistentNode implements File
+ ["cpp:virtual"]class PersistentFile extends PersistentNode implements File
{
Lines text;
};
dictionary<string, NodeDesc> NodeDict;
- class PersistentDirectory extends PersistentNode implements Directory
+ ["cpp:virtual"]class PersistentDirectory extends PersistentNode implements Directory
{
["freeze:write"]
void removeNode(string name);
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&);
diff --git a/cpp/test/Freeze/evictor/Test.ice b/cpp/test/Freeze/evictor/Test.ice
index 20c1ef5d544..9e58031d252 100644
--- a/cpp/test/Freeze/evictor/Test.ice
+++ b/cpp/test/Freeze/evictor/Test.ice
@@ -32,7 +32,7 @@ exception InsufficientFundsException
{
};
-class Account
+["cpp:virtual"]class Account
{
int getBalance();
["freeze:write"] void transfer(int amount, Account* toAccount) throws InsufficientFundsException;
@@ -56,7 +56,7 @@ class Account
sequence<Account*> AccountPrxSeq;
sequence<Ice::Identity> AccountIdSeq;
-["freeze:write"] class Servant
+["freeze:write", "cpp:virtual"] class Servant
{
["freeze:read", "cpp:const"] idempotent int getValue();
["amd", "freeze:read", "cpp:const"] idempotent int slowGetValue();
@@ -83,7 +83,7 @@ sequence<Ice::Identity> AccountIdSeq;
AccountIdSeq accounts;
};
-["freeze:write"] class Facet extends Servant
+["freeze:write", "cpp:virtual"] class Facet extends Servant
{
["freeze:read", "cpp:const"] idempotent string getData();
idempotent void setData(string data);
diff --git a/cpp/test/Ice/inheritance/Test.ice b/cpp/test/Ice/inheritance/Test.ice
index 116d652defd..d0bfe9f73a9 100644
--- a/cpp/test/Ice/inheritance/Test.ice
+++ b/cpp/test/Ice/inheritance/Test.ice
@@ -41,7 +41,7 @@ interface IB2 extends MA::IA
IB2* ib2op(IB2* p);
};
-class CB extends MA::CA
+["cpp:virtual"]class CB extends MA::CA
{
CB* cbop(CB* p);
};
@@ -56,12 +56,12 @@ interface IC extends MB::IB1, MB::IB2
IC* icop(IC* p);
};
-class CC extends MB::CB
+["cpp:virtual"]class CC extends MB::CB
{
CC* ccop(CC* p);
};
-class CD extends CC implements MB::IB1, MB::IB2
+["cpp:virtual"]class CD extends CC implements MB::IB1, MB::IB2
{
CD* cdop(CD* p);
};