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 | |
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')
-rw-r--r-- | cpp/demo/Ice/value/Value.ice | 2 | ||||
-rw-r--r-- | cpp/demo/book/freeze_filesystem/PersistentFilesystem.ice | 4 | ||||
-rw-r--r-- | cpp/src/slice2cpp/Gen.cpp | 28 | ||||
-rw-r--r-- | cpp/src/slice2cpp/Gen.h | 2 | ||||
-rw-r--r-- | cpp/test/Freeze/evictor/Test.ice | 6 | ||||
-rw-r--r-- | cpp/test/Ice/inheritance/Test.ice | 6 |
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); }; |