Index: src/slice2cpp/Gen.cpp =================================================================== RCS file: /home/cvsroot/ice/src/slice2cpp/Gen.cpp,v retrieving revision 1.271.2.3 diff -c -r1.271.2.3 Gen.cpp *** src/slice2cpp/Gen.cpp 19 Jan 2006 02:04:15 -0000 1.271.2.3 --- src/slice2cpp/Gen.cpp 2 Mar 2006 01:16:16 -0000 *************** *** 2311,2317 **** vector params; vector allTypes; vector allParamDecls; - vector::const_iterator pi; DataMemberList::const_iterator q; for(q = dataMembers.begin(); q != dataMembers.end(); ++q) --- 2311,2316 ---- *************** *** 2321,2330 **** for(q = allDataMembers.begin(); q != allDataMembers.end(); ++q) { - string paramName = fixKwd((*q)->name()); string typeName = inputTypeToString((*q)->type()); allTypes.push_back(typeName); ! allParamDecls.push_back(typeName + " __ice_" + paramName); } if(!p->isInterface()) --- 2320,2328 ---- for(q = allDataMembers.begin(); q != allDataMembers.end(); ++q) { string typeName = inputTypeToString((*q)->type()); allTypes.push_back(typeName); ! allParamDecls.push_back(typeName + " __ice_" + (*q)->name()); } if(!p->isInterface()) *************** *** 2380,2425 **** * Strong guarantee */ ! if(!allParamDecls.empty()) ! { ! C << sp << nl << scoped.substr(2) << "::" << name << spar << allParamDecls << epar << " :"; ! C.inc(); ! if(base) ! { ! string upcall; ! if(!allParamDecls.empty() && base) ! { ! upcall = "("; ! DataMemberList baseDataMembers = bases.front()->allDataMembers(); ! for(q = baseDataMembers.begin(); q != baseDataMembers.end(); ++q) ! { ! if(q != baseDataMembers.begin()) ! { ! upcall += ", "; ! } ! upcall += fixKwd((*q)->name()); ! } ! upcall += ")"; ! } ! if(!params.empty()) ! { ! upcall += ","; ! } ! emitUpcall(base, upcall); ! } ! C << nl; ! for(pi = params.begin(); pi != params.end(); ++pi) ! { ! if(pi != params.begin()) ! { ! C << ',' << nl; ! } ! C << *pi << '(' << "__ice_" << *pi << ')'; ! } ! C.dec(); ! C << sb; ! C << eb; ! } /* * Strong guarantee --- 2378,2384 ---- * Strong guarantee */ ! emitOneShotConstructor(p); /* * Strong guarantee *************** *** 3373,3378 **** --- 3332,3426 ---- } } + bool + Slice::Gen::ObjectVisitor::emitVirtualBaseInitializers(const ClassDefPtr& p) + { + DataMemberList allDataMembers = p->allDataMembers(); + if(allDataMembers.empty()) + { + return false; + } + + ClassList bases = p->bases(); + if(!bases.empty() && !bases.front()->isInterface()) + { + if(emitVirtualBaseInitializers(bases.front())) + { + C << ','; + } + } + + string upcall = "("; + DataMemberList::const_iterator q; + for(q = allDataMembers.begin(); q != allDataMembers.end(); ++q) + { + if(q != allDataMembers.begin()) + { + upcall += ", "; + } + upcall += "__ice_" + (*q)->name(); + } + upcall += ")"; + + C << nl << fixKwd(p->name()) << upcall; + + return true; + } + + void + Slice::Gen::ObjectVisitor::emitOneShotConstructor(const ClassDefPtr& p) + { + DataMemberList allDataMembers = p->allDataMembers(); + DataMemberList::const_iterator q; + + vector allParamDecls; + + for(q = allDataMembers.begin(); q != allDataMembers.end(); ++q) + { + string typeName = inputTypeToString((*q)->type()); + allParamDecls.push_back(typeName + " __ice_" + (*q)->name()); + } + + if(!allDataMembers.empty()) + { + C << sp << nl << p->scoped().substr(2) << "::" << fixKwd(p->name()) << spar << allParamDecls << epar << " :"; + C.inc(); + + DataMemberList dataMembers = p->dataMembers(); + + ClassList bases = p->bases(); + ClassDefPtr base; + if(!bases.empty() && !bases.front()->isInterface()) + { + if(emitVirtualBaseInitializers(bases.front())) + { + if(!dataMembers.empty()) + { + C << ','; + } + } + } + + if(!dataMembers.empty()) + { + C << nl; + } + for(q = dataMembers.begin(); q != dataMembers.end(); ++q) + { + if(q != dataMembers.begin()) + { + C << ',' << nl; + } + string memberName = fixKwd((*q)->name()); + C << memberName << '(' << "__ice_" << memberName << ')'; + } + + C.dec(); + C << sb; + C << eb; + } + } + void Slice::Gen::ObjectVisitor::emitUpcall(const ClassDefPtr& base, const string& call) { Index: src/slice2cpp/Gen.h =================================================================== RCS file: /home/cvsroot/ice/src/slice2cpp/Gen.h,v retrieving revision 1.51 diff -c -r1.51 Gen.h *** src/slice2cpp/Gen.h 8 Sep 2005 03:36:43 -0000 1.51 --- src/slice2cpp/Gen.h 2 Mar 2006 01:16:16 -0000 *************** *** 236,241 **** --- 236,243 ---- 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&); + void emitOneShotConstructor(const ClassDefPtr&); void emitUpcall(const ClassDefPtr&, const std::string&); ::IceUtil::Output& H;