diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2006-01-27 18:02:48 +0000 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2006-01-27 18:02:48 +0000 |
commit | 2185e2445a2f3779bd5a59c103a10239bd64989b (patch) | |
tree | bfebd0bfe19709aea0554127d4d7dcccd86547b0 /cpp | |
parent | Added debugging info (bug 394) (diff) | |
download | ice-2185e2445a2f3779bd5a59c103a10239bd64989b.tar.bz2 ice-2185e2445a2f3779bd5a59c103a10239bd64989b.tar.xz ice-2185e2445a2f3779bd5a59c103a10239bd64989b.zip |
More change for alternate C++ sequence mappings
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/include/Slice/CPlusPlusUtil.h | 16 | ||||
-rw-r--r-- | cpp/src/Slice/CPlusPlusUtil.cpp | 291 | ||||
-rw-r--r-- | cpp/src/slice2cpp/Gen.cpp | 86 | ||||
-rw-r--r-- | cpp/src/slice2cppe/Gen.cpp | 214 | ||||
-rw-r--r-- | cpp/src/slice2cppe/Gen.h | 4 |
5 files changed, 376 insertions, 235 deletions
diff --git a/cpp/include/Slice/CPlusPlusUtil.h b/cpp/include/Slice/CPlusPlusUtil.h index e4f33fced2c..b2eda46edb6 100644 --- a/cpp/include/Slice/CPlusPlusUtil.h +++ b/cpp/include/Slice/CPlusPlusUtil.h @@ -28,21 +28,21 @@ SLICE_API void printVersionCheck(::IceUtil::Output&); SLICE_API void printDllExportStuff(::IceUtil::Output&, const std::string&); SLICE_API std::string typeToString(const TypePtr&, const StringList& = StringList()); -SLICE_API std::string returnTypeToString(const TypePtr&); +SLICE_API std::string returnTypeToString(const TypePtr&, const StringList& = StringList()); SLICE_API std::string inputTypeToString(const TypePtr&, const StringList& = StringList()); -SLICE_API std::string outputTypeToString(const TypePtr&); +SLICE_API std::string outputTypeToString(const TypePtr&, const StringList& = StringList()); SLICE_API std::string operationModeToString(Operation::Mode); SLICE_API std::string fixKwd(const std::string&); SLICE_API void writeMarshalUnmarshalCode(::IceUtil::Output&, const TypePtr&, const std::string&, bool, const std::string& = "", bool = true, const StringList& = StringList()); -SLICE_API void writeMarshalCode(::IceUtil::Output&, const std::list<std::pair<TypePtr, std::string> >&, - const TypePtr&); -SLICE_API void writeUnmarshalCode(::IceUtil::Output&, const std::list<std::pair<TypePtr, std::string> >&, - const TypePtr&); -SLICE_API void writeAllocateCode(::IceUtil::Output&, const std::list<std::pair<TypePtr, std::string> >&, - const TypePtr&); +SLICE_API void writeMarshalCode(::IceUtil::Output&, const ParamDeclList&, const TypePtr&, + const StringList& = StringList()); +SLICE_API void writeUnmarshalCode(::IceUtil::Output&, const ParamDeclList&, const TypePtr&, + const StringList& = StringList()); +SLICE_API void writeAllocateCode(::IceUtil::Output&, const ParamDeclList&, const TypePtr&, + const StringList& = StringList()); SLICE_API void writeStreamMarshalUnmarshalCode(::IceUtil::Output&, const TypePtr&, const std::string&, bool, const std::string& = ""); SLICE_API void writeStreamMarshalCode(::IceUtil::Output&, const std::list<std::pair<TypePtr, std::string> >&, diff --git a/cpp/src/Slice/CPlusPlusUtil.cpp b/cpp/src/Slice/CPlusPlusUtil.cpp index 0b437c0e5b1..044ede63821 100644 --- a/cpp/src/Slice/CPlusPlusUtil.cpp +++ b/cpp/src/Slice/CPlusPlusUtil.cpp @@ -159,11 +159,27 @@ Slice::typeToString(const TypePtr& type, const StringList& metaData) if(seq) { string seqType = findMetaData(metaData); - if(seqType == "array") + if(seqType.empty()) { - TypePtr seqType = seq->type(); - string s = typeToString(seqType); - return "::std::pair<const " + s + "*, const " + s + "*>"; + StringList l = seq->getMetaData(); + seqType = findMetaData(l); + } + if(!seqType.empty()) + { + TypePtr elemType = seq->type(); + string s = typeToString(elemType); + if(seqType == "array") + { + return "::std::pair<const " + s + "*, const " + s + "*>"; + } + else + { + return seqType + "<" + (s[0] == ':' ? " " : "") + s + ">"; + } + } + else + { + return fixKwd(seq->scoped()); } } @@ -183,14 +199,14 @@ Slice::typeToString(const TypePtr& type, const StringList& metaData) } string -Slice::returnTypeToString(const TypePtr& type) +Slice::returnTypeToString(const TypePtr& type, const StringList& metaData) { if(!type) { return "void"; } - return typeToString(type); + return typeToString(type, metaData); } string @@ -239,12 +255,28 @@ Slice::inputTypeToString(const TypePtr& type, const StringList& metaData) if(seq) { string seqType = findMetaData(metaData); - if(seqType == "array") - { - TypePtr seqType = seq->type(); - string s = typeToString(seqType); - return "const ::std::pair<const " + s + "*, const " + s + "*>&"; - } + if(seqType.empty()) + { + StringList l = seq->getMetaData(); + seqType = findMetaData(l); + } + if(!seqType.empty()) + { + TypePtr elemType = seq->type(); + string s = typeToString(elemType); + if(seqType == "array") + { + return "const ::std::pair<const " + s + "*, const " + s + "*>&"; + } + else + { + return "const " + seqType + "<" + (s[0] == ':' ? " " : "") + s + ">&"; + } + } + else + { + return "const " + fixKwd(seq->scoped()) + "&"; + } } ContainedPtr contained = ContainedPtr::dynamicCast(type); @@ -257,7 +289,7 @@ Slice::inputTypeToString(const TypePtr& type, const StringList& metaData) } string -Slice::outputTypeToString(const TypePtr& type) +Slice::outputTypeToString(const TypePtr& type, const StringList& metaData) { static const char* outputBuiltinTable[] = { @@ -292,6 +324,26 @@ Slice::outputTypeToString(const TypePtr& type) return fixKwd(proxy->_class()->scoped() + "Prx") + "&"; } + SequencePtr seq = SequencePtr::dynamicCast(type); + if(seq) + { + string seqType = findMetaData(metaData); + if(seqType.empty()) + { + StringList l = seq->getMetaData(); + seqType = findMetaData(l); + } + if(!seqType.empty() && seqType != "array") + { + TypePtr elemType = seq->type(); + string s = typeToString(elemType); + return seqType + "<" + (s[0] == ':' ? " " : "") + s + ">&"; + } + else + { + return fixKwd(seq->scoped()) + "&"; + } + } ContainedPtr contained = ContainedPtr::dynamicCast(type); if(contained) { @@ -495,48 +547,69 @@ Slice::writeMarshalUnmarshalCode(Output& out, const TypePtr& type, const string& if(seq) { string seqType = findMetaData(metaData); + if(seqType.empty()) + { + StringList l = seq->getMetaData(); + seqType = findMetaData(l); + } builtin = BuiltinPtr::dynamicCast(seq->type()); if(marshal) { string scope = fixKwd(seq->scope()); - if(!builtin || builtin->kind() == Builtin::KindObject || builtin->kind() == Builtin::KindObjectProxy) + if(seqType == "array") { - if(seqType == "array") + if(!builtin || builtin->kind() == Builtin::KindObject || builtin->kind() == Builtin::KindObjectProxy) { - out << nl << scope << "__" << func << (pointer ? "" : "&") << stream << ", " + out << nl << scope << "__" << func << (pointer ? "" : "&") << stream << ", " << fixedParam << ".first, " << fixedParam << ".second, " << scope - << "__U__" << fixKwd(seq->name()) << "());"; + << "__U__" << fixKwd(seq->name()) << "());"; } else { - out << nl << "if(" << fixedParam << ".size() == 0)"; - out << sb; - out << nl << stream << deref << "writeSize(0);"; - out << eb; - out << nl << "else"; - out << sb; - out << nl << scope << "__" << func << (pointer ? "" : "&") << stream << ", &" - << fixedParam << "[0], &" << fixedParam << "[0] + " << fixedParam << ".size(), " << scope - << "__U__" << fixKwd(seq->name()) << "());"; - out << eb; + out << nl << stream << deref << func << fixedParam << ".first, " << fixedParam << ".second);"; } + } - else if(builtin->kind() == Builtin::KindBool) + else if(!seqType.empty()) { - if(seqType == "array") + string typeStr = typeToString(type, metaData); + if(typeStr[0] == ':') + { + typeStr = " " + typeStr; + } + if(typeStr[typeStr.size() - 1] == '>') + { + typeStr += " "; + } + if(!builtin || builtin->kind() == Builtin::KindObject || builtin->kind() == Builtin::KindObjectProxy) { - out << nl << stream << deref << func << fixedParam << ".first, " << fixedParam << ".second);"; + out << nl << "::IceInternal::writeConstructedSequence<" << typeStr << ">(" << stream << ", " + << fixedParam << ");"; } else { - out << nl << stream << deref << func << fixedParam << ");"; + out << nl << "::IceInternal::writeBuiltinSequence<" << typeStr << ">(" << stream << ", " + << fixedParam << ");"; } } else { - if(seqType == "array") + if(!builtin || builtin->kind() == Builtin::KindObject || builtin->kind() == Builtin::KindObjectProxy) { - out << nl << stream << deref << func << fixedParam << ".first, " << fixedParam << ".second);"; + out << nl << "if(" << fixedParam << ".size() == 0)"; + out << sb; + out << nl << stream << deref << "writeSize(0);"; + out << eb; + out << nl << "else"; + out << sb; + out << nl << scope << "__" << func << (pointer ? "" : "&") << stream << ", &" + << fixedParam << "[0], &" << fixedParam << "[0] + " << fixedParam << ".size(), " << scope + << "__U__" << fixKwd(seq->name()) << "());"; + out << eb; + } + else if(builtin->kind() == Builtin::KindBool) + { + out << nl << stream << deref << func << fixedParam << ");"; } else { @@ -554,66 +627,100 @@ Slice::writeMarshalUnmarshalCode(Output& out, const TypePtr& type, const string& } else { - if(builtin && builtin->kind() != Builtin::KindObject && builtin->kind() != Builtin::KindObjectProxy) + string scope = fixKwd(seq->scope()); + if(seqType == "array") { - if(seqType == "array") + if(!builtin || builtin->kind() == Builtin::KindObject || builtin->kind() == Builtin::KindObjectProxy) { - if(builtin->kind() == Builtin::KindByte) - { - out << nl << stream << deref << func << fixedParam << ");"; - } - else if(builtin->kind() == Builtin::KindBool) + out << nl << typeToString(type) << " __" << fixedParam << ";"; + out << nl << scope << "__" << func << (pointer ? "" : "&") << stream << ", __" + << fixedParam << ", " << scope << "__U__" << fixKwd(seq->name()) << "());"; + } + else if(builtin->kind() == Builtin::KindByte) + { + out << nl << stream << deref << func << fixedParam << ");"; + } + else if(builtin->kind() == Builtin::KindBool) + { + out << nl << "::IceUtil::auto_array<bool> __" << fixedParam << ";"; + out << nl << stream << deref << func << fixedParam << ", __" << fixedParam << ");"; + } + else + { + out << nl << typeToString(type) << " __" << fixedParam << ";"; + out << nl << stream << deref << func << "__" << fixedParam << ");"; + } + + if(!builtin || (builtin->kind() != Builtin::KindByte && builtin->kind() != Builtin::KindBool)) + { + out << nl << fixedParam << ".first" << " = &__" << fixedParam << "[0];"; + out << nl << fixedParam << ".second" << " = " << fixedParam << ".first + " << "__" + << fixedParam << ".size();"; + } + } + else if(!seqType.empty()) + { + string typeStr = typeToString(type, metaData); + if(typeStr[0] == ':') + { + typeStr = " " + typeStr; + } + if(typeStr[typeStr.size() - 1] == '>') + { + typeStr += " "; + } + if(!builtin || builtin->kind() == Builtin::KindObject || builtin->kind() == Builtin::KindObjectProxy) + { + out << nl; + TypePtr elemType = seq->type(); + if(elemType->isVariableLength()) { - out << nl << "IceUtil::auto_array<bool> __" << fixedParam << ";"; - out << nl << stream << deref << func << fixedParam << ", __" << fixedParam << ");"; + out << "::IceInternal::readVariableSequence"; } else { - out << nl << typeToString(type) << " __" << fixedParam << ";"; - out << nl << stream << deref << func << "__" << fixedParam << ");"; + out << "::IceInternal::readFixedSequence"; } - } - else if(builtin->kind() == Builtin::KindByte) - { - StringList md; - md.push_back("cpp:array"); - string tmpParam = "__" + fixedParam; - string::size_type pos = tmpParam.find("[i]"); - if(pos != string::npos) - { - tmpParam = tmpParam.substr(0, pos); - } - out << nl << typeToString(type, md) << " " << tmpParam << ";"; - out << nl << stream << deref << func << tmpParam << ");"; - out << nl << "::std::vector< ::Ice::Byte>(" << tmpParam << ".first, " << tmpParam - << ".second).swap(" << fixedParam << ");"; + out << "<" << typeStr << ">(" << stream << ", " << fixedParam << ", " + << elemType->minWireSize() << ");"; + } + else if(builtin->kind() == Builtin::KindString) + { + out << nl << "::IceInternal::readStringSequence<" << typeStr << ">(" << stream << ", " + << fixedParam << ");"; } else { - out << nl << stream << deref << func << fixedParam << ");"; - } + out << nl << "::IceInternal::readBuiltinSequence<" << typeStr << ">(" << stream << ", " + << fixedParam << ");"; + } } else { - string scope = fixKwd(seq->scope()); - if(seqType == "array") - { - out << nl << typeToString(type) << " __" << fixedParam << ";"; - out << nl << scope << "__" << func << (pointer ? "" : "&") << stream << ", __" - << fixedParam << ", " << scope << "__U__" << fixKwd(seq->name()) << "());"; - } - else - { + if(!builtin || builtin->kind() == Builtin::KindObject || builtin->kind() == Builtin::KindObjectProxy) + { out << nl << scope << "__" << func << (pointer ? "" : "&") << stream << ", " << fixedParam << ", " << scope << "__U__" << fixKwd(seq->name()) << "());"; - } - } - if(seqType == "array" && - (!builtin || (builtin->kind() != Builtin::KindByte && builtin->kind() != Builtin::KindBool))) - { - out << nl << fixedParam << ".first" << " = &__" << fixedParam << "[0];"; - out << nl << fixedParam << ".second" << " = " << fixedParam << ".first + " << "__" - << fixedParam << ".size();"; + } + else if(builtin->kind() == Builtin::KindByte) + { + StringList md; + md.push_back("cpp:array"); + string tmpParam = "__" + fixedParam; + string::size_type pos = tmpParam.find("[i]"); + if(pos != string::npos) + { + tmpParam = tmpParam.substr(0, pos); + } + out << nl << typeToString(type, md) << " " << tmpParam << ";"; + out << nl << stream << deref << func << tmpParam << ");"; + out << nl << "::std::vector< ::Ice::Byte>(" << tmpParam << ".first, " << tmpParam + << ".second).swap(" << fixedParam << ");"; + } + else + { + out << nl << stream << deref << func << fixedParam << ");"; + } } } return; @@ -641,43 +748,41 @@ Slice::writeMarshalUnmarshalCode(Output& out, const TypePtr& type, const string& } void -Slice::writeMarshalCode(Output& out, const list<pair<TypePtr, string> >& params, const TypePtr& ret) +Slice::writeMarshalCode(Output& out, const ParamDeclList& params, const TypePtr& ret, const StringList& metaData) { - for(list<pair<TypePtr, string> >::const_iterator p = params.begin(); p != params.end(); ++p) + for(ParamDeclList::const_iterator p = params.begin(); p != params.end(); ++p) { - writeMarshalUnmarshalCode(out, p->first, p->second, true, "", true); + writeMarshalUnmarshalCode(out, (*p)->type(), fixKwd((*p)->name()), true, "", true, (*p)->getMetaData()); } if(ret) { - writeMarshalUnmarshalCode(out, ret, "__ret", true, "", true); + writeMarshalUnmarshalCode(out, ret, "__ret", true, "", true, metaData); } } void -Slice::writeUnmarshalCode(Output& out, const list<pair<TypePtr, string> >& params, const TypePtr& ret) +Slice::writeUnmarshalCode(Output& out, const ParamDeclList& params, const TypePtr& ret, const StringList& metaData) { - for(list<pair<TypePtr, string> >::const_iterator p = params.begin(); p != params.end(); ++p) + for(ParamDeclList::const_iterator p = params.begin(); p != params.end(); ++p) { - writeMarshalUnmarshalCode(out, p->first, p->second, false, "", true); + writeMarshalUnmarshalCode(out, (*p)->type(), fixKwd((*p)->name()), false, "", true, (*p)->getMetaData()); } if(ret) { - writeMarshalUnmarshalCode(out, ret, "__ret", false, "", true); + writeMarshalUnmarshalCode(out, ret, "__ret", false, "", true, metaData); } } void -Slice::writeAllocateCode(Output& out, const list<pair<TypePtr, string> >& params, const TypePtr& ret) +Slice::writeAllocateCode(Output& out, const ParamDeclList& params, const TypePtr& ret, const StringList& metaData) { - list<pair<TypePtr, string> > ps = params; - if(ret) + for(ParamDeclList::const_iterator p = params.begin(); p != params.end(); ++p) { - ps.push_back(make_pair(ret, string("__ret"))); + out << nl << typeToString((*p)->type(), (*p)->getMetaData()) << ' ' << fixKwd((*p)->name()) << ';'; } - - for(list<pair<TypePtr, string> >::const_iterator p = ps.begin(); p != ps.end(); ++p) + if(ret) { - out << nl << typeToString(p->first) << ' ' << fixKwd(p->second) << ';'; + out << nl << typeToString(ret, metaData) << " __ret;"; } } diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp index f8fa60402ed..486c2ae42dd 100644 --- a/cpp/src/slice2cpp/Gen.cpp +++ b/cpp/src/slice2cpp/Gen.cpp @@ -609,16 +609,19 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p) H << sp << nl << "virtual void __write(const ::Ice::OutputStreamPtr&) const;"; H << nl << "virtual void __read(const ::Ice::InputStreamPtr&, bool);"; - TypeStringList memberList; - for(q = dataMembers.begin(); q != dataMembers.end(); ++q) - { - memberList.push_back(make_pair((*q)->type(), (*q)->name())); - } + TypeStringList memberList; + for(q = dataMembers.begin(); q != dataMembers.end(); ++q) + { + memberList.push_back(make_pair((*q)->type(), (*q)->name())); + } C << sp << nl << "void" << nl << scoped.substr(2) << "::__write(::IceInternal::BasicStream* __os) const"; C << sb; C << nl << "__os->write(::std::string(\"" << p->scoped() << "\"));"; C << nl << "__os->startWriteSlice();"; - writeMarshalCode(C, memberList, 0); + for(q = dataMembers.begin(); q != dataMembers.end(); ++q) + { + writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), true, "", true); + } C << nl << "__os->endWriteSlice();"; if(base) { @@ -634,7 +637,10 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p) C << nl << "__is->read(myId);"; C << eb; C << nl << "__is->startReadSlice();"; - writeUnmarshalCode(C, memberList, 0); + for(q = dataMembers.begin(); q != dataMembers.end(); ++q) + { + writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), false, "", true); + } C << nl << "__is->endReadSlice();"; if(base) { @@ -852,24 +858,31 @@ Slice::Gen::TypesVisitor::visitStructEnd(const StructPtr& p) H << nl << _dllExport << "void __read(const ::Ice::InputStreamPtr&);"; } - TypeStringList memberList; - for(q = dataMembers.begin(); q != dataMembers.end(); ++q) - { - memberList.push_back(make_pair((*q)->type(), (*q)->name())); - } + TypeStringList memberList; + for(q = dataMembers.begin(); q != dataMembers.end(); ++q) + { + memberList.push_back(make_pair((*q)->type(), (*q)->name())); + } C << sp << nl << "void" << nl << scoped.substr(2) << "::__write(::IceInternal::BasicStream* __os) const"; C << sb; - writeMarshalCode(C, memberList, 0); + for(q = dataMembers.begin(); q != dataMembers.end(); ++q) + { + writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), true, "", true); + } C << eb; C << sp << nl << "void" << nl << scoped.substr(2) << "::__read(::IceInternal::BasicStream* __is)"; C << sb; - writeUnmarshalCode(C, memberList, 0); + for(q = dataMembers.begin(); q != dataMembers.end(); ++q) + { + writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), false, "", true); + } C << eb; if(_stream) { - C << sp << nl << "void" << nl << scoped.substr(2) << "::__write(const ::Ice::OutputStreamPtr& __outS) const"; + C << sp << nl << "void" << nl << scoped.substr(2) + << "::__write(const ::Ice::OutputStreamPtr& __outS) const"; C << sb; writeStreamMarshalCode(C, memberList, 0); C << eb; @@ -1880,8 +1893,8 @@ Slice::Gen::DelegateMVisitor::visitOperation(const OperationPtr& p) vector<string> params; vector<string> paramsDecl; - TypeStringList inParams; - TypeStringList outParams; + ParamDeclList inParams; + ParamDeclList outParams; ParamDeclList paramList = p->parameters(); for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q) { @@ -1891,12 +1904,12 @@ Slice::Gen::DelegateMVisitor::visitOperation(const OperationPtr& p) string typeString; if(isOutParam) { - outParams.push_back(make_pair(type, paramName)); + outParams.push_back(*q); typeString = outputTypeToString(type); } else { - inParams.push_back(make_pair(type, paramName)); + inParams.push_back(*q); typeString = inputTypeToString(type); } @@ -1986,7 +1999,7 @@ Slice::Gen::DelegateMVisitor::visitOperation(const OperationPtr& p) C << eb; C << eb; - writeAllocateCode(C, TypeStringList(), ret); + writeAllocateCode(C, ParamDeclList(), ret); writeUnmarshalCode(C, outParams, ret); if(p->returnsClasses()) { @@ -2698,7 +2711,8 @@ Slice::Gen::ObjectVisitor::visitClassDefEnd(const ClassDefPtr& p) TypeStringList memberList; DataMemberList dataMembers = p->dataMembers(); - for(DataMemberList::const_iterator q = dataMembers.begin(); q != dataMembers.end(); ++q) + DataMemberList::const_iterator q; + for(q = dataMembers.begin(); q != dataMembers.end(); ++q) { memberList.push_back(make_pair((*q)->type(), (*q)->name())); } @@ -2708,7 +2722,10 @@ Slice::Gen::ObjectVisitor::visitClassDefEnd(const ClassDefPtr& p) C << sb; C << nl << "__os->writeTypeId(ice_staticId());"; C << nl << "__os->startWriteSlice();"; - writeMarshalCode(C, memberList, 0); + for(q = dataMembers.begin(); q != dataMembers.end(); ++q) + { + writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), true, "", true); + } C << nl << "__os->endWriteSlice();"; emitUpcall(base, "::__write(__os);"); C << eb; @@ -2721,7 +2738,10 @@ Slice::Gen::ObjectVisitor::visitClassDefEnd(const ClassDefPtr& p) C << nl << "__is->readTypeId(myId);"; C << eb; C << nl << "__is->startReadSlice();"; - writeUnmarshalCode(C, memberList, 0); + for(q = dataMembers.begin(); q != dataMembers.end(); ++q) + { + writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), false, "", true); + } C << nl << "__is->endReadSlice();"; emitUpcall(base, "::__read(__is, true);"); C << eb; @@ -2941,8 +2961,8 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p) string paramsDeclAMD = "(const " + classScopedAMD + '_' + name + "Ptr& __cb, "; string argsAMD = "(__cb, "; - TypeStringList inParams; - TypeStringList outParams; + ParamDeclList inParams; + ParamDeclList outParams; ParamDeclList paramList = p->parameters(); for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q) { @@ -2952,12 +2972,12 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p) string typeString; if(isOutParam) { - outParams.push_back(make_pair(type, paramName)); + outParams.push_back(*q); typeString = outputTypeToString(type); } else { - inParams.push_back(make_pair(type, paramName)); + inParams.push_back(*q); typeString = inputTypeToString((*q)->type()); } @@ -4116,8 +4136,8 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p) args.push_back("__ret"); } - TypeStringList inParams; - TypeStringList outParams; + ParamDeclList inParams; + ParamDeclList outParams; ParamDeclList paramList = p->parameters(); for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q) { @@ -4131,14 +4151,14 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p) paramsDecl.push_back(typeString + ' ' + paramName); args.push_back(paramName); - outParams.push_back(make_pair(type, paramName)); + outParams.push_back(*q); } else { paramsInvoke.push_back(typeString); paramsDeclInvoke.push_back(typeString + ' ' + paramName); - inParams.push_back(make_pair(type, paramName)); + inParams.push_back(*q); } } @@ -4359,7 +4379,7 @@ Slice::Gen::AsyncImplVisitor::visitOperation(const OperationPtr& p) args += "__ret"; } - TypeStringList outParams; + ParamDeclList outParams; ParamDeclList paramList = p->parameters(); for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q) { @@ -4382,7 +4402,7 @@ Slice::Gen::AsyncImplVisitor::visitOperation(const OperationPtr& p) paramsDecl += paramName; args += paramName; - outParams.push_back(make_pair(type, paramName)); + outParams.push_back(*q); } } diff --git a/cpp/src/slice2cppe/Gen.cpp b/cpp/src/slice2cppe/Gen.cpp index ddc010cd38c..69a8279a9fe 100644 --- a/cpp/src/slice2cppe/Gen.cpp +++ b/cpp/src/slice2cppe/Gen.cpp @@ -389,7 +389,7 @@ Slice::Gen::TypesVisitor::visitExceptionStart(const ExceptionPtr& p) for(q = allDataMembers.begin(); q != allDataMembers.end(); ++q) { string paramName = fixKwd((*q)->name()); - string typeName = inputTypeToString((*q)->type()); + string typeName = inputTypeToString((*q)->type(), (*q)->getMetaData()); allTypes.push_back(typeName); allParamDecls.push_back(typeName + " __ice_" + paramName); } @@ -567,17 +567,14 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p) H << sp << nl << "virtual void __write(::IceInternal::BasicStream*) const;"; H << nl << "virtual void __read(::IceInternal::BasicStream*, bool);"; - - TypeStringList memberList; - for(q = dataMembers.begin(); q != dataMembers.end(); ++q) - { - memberList.push_back(make_pair((*q)->type(), (*q)->name())); - } C << sp << nl << "void" << nl << scoped.substr(2) << "::__write(::IceInternal::BasicStream* __os) const"; C << sb; C << nl << "__os->write(::std::string(\"" << p->scoped() << "\"));"; C << nl << "__os->startWriteSlice();"; - writeMarshalCode(C, memberList, 0); + for(q = dataMembers.begin(); q != dataMembers.end(); ++q) + { + writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), true, "", true, (*q)->getMetaData()); + } C << nl << "__os->endWriteSlice();"; if(base) { @@ -593,7 +590,10 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p) C << nl << "__is->read(myId);"; C << eb; C << nl << "__is->startReadSlice();"; - writeUnmarshalCode(C, memberList, 0); + for(q = dataMembers.begin(); q != dataMembers.end(); ++q) + { + writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), false, "", true, (*q)->getMetaData()); + } C << nl << "__is->endReadSlice();"; if(base) { @@ -741,19 +741,20 @@ Slice::Gen::TypesVisitor::visitStructEnd(const StructPtr& p) H << sp << nl << _dllExport << "void __write(::IceInternal::BasicStream*) const;"; H << nl << _dllExport << "void __read(::IceInternal::BasicStream*);"; - TypeStringList memberList; + C << sp << nl << "void" << nl << scoped.substr(2) << "::__write(::IceInternal::BasicStream* __os) const"; + C << sb; for(q = dataMembers.begin(); q != dataMembers.end(); ++q) { - memberList.push_back(make_pair((*q)->type(), (*q)->name())); + writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), true, "", true, (*q)->getMetaData()); } - C << sp << nl << "void" << nl << scoped.substr(2) << "::__write(::IceInternal::BasicStream* __os) const"; - C << sb; - writeMarshalCode(C, memberList, 0); C << eb; C << sp << nl << "void" << nl << scoped.substr(2) << "::__read(::IceInternal::BasicStream* __is)"; C << sb; - writeUnmarshalCode(C, memberList, 0); + for(q = dataMembers.begin(); q != dataMembers.end(); ++q) + { + writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), false, "", true, (*q)->getMetaData()); + } C << eb; } @@ -764,7 +765,7 @@ void Slice::Gen::TypesVisitor::visitDataMember(const DataMemberPtr& p) { string name = fixKwd(p->name()); - string s = typeToString(p->type()); + string s = typeToString(p->type(), p->getMetaData()); H << nl << s << ' ' << name << ';'; } @@ -774,6 +775,13 @@ Slice::Gen::TypesVisitor::visitSequence(const SequencePtr& p) string name = fixKwd(p->name()); TypePtr type = p->type(); string s = typeToString(type); + StringList metaData = p->getMetaData(); + string seqType = findMetaData(metaData); + if(!seqType.empty()) + { + return; + } + H << sp << nl << "typedef ::std::vector<" << (s[0] == ':' ? " " : "") << s << "> " << name << ';'; BuiltinPtr builtin = BuiltinPtr::dynamicCast(type); @@ -1264,7 +1272,7 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p) string scope = fixKwd(p->scope()); TypePtr ret = p->returnType(); - string retS = returnTypeToString(ret); + string retS = returnTypeToString(ret, p->getMetaData()); vector<string> params; vector<string> paramsDecl; @@ -1283,7 +1291,7 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p) string typeString; if((*q)->isOutParam()) { - typeString = outputTypeToString((*q)->type()); + typeString = outputTypeToString((*q)->type(), metaData); } else { @@ -1291,7 +1299,7 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p) } #else string typeString = (*q)->isOutParam() ? - outputTypeToString((*q)->type()) : inputTypeToString((*q)->type(), metaData); + outputTypeToString((*q)->type(), metaData) : inputTypeToString((*q)->type(), metaData); #endif params.push_back(typeString); @@ -1467,13 +1475,13 @@ Slice::Gen::DelegateVisitor::visitOperation(const OperationPtr& p) string scoped = fixKwd(p->scoped()); TypePtr ret = p->returnType(); - string retS = returnTypeToString(ret); + string retS = returnTypeToString(ret, p->getMetaData()); vector<string> params; vector<string> paramsDecl; ParamDeclList inParams; - TypeStringList outParams; + ParamDeclList outParams; ParamDeclList paramList = p->parameters(); for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q) { @@ -1485,8 +1493,8 @@ Slice::Gen::DelegateVisitor::visitOperation(const OperationPtr& p) string typeString; if(isOutParam) { - outParams.push_back(make_pair(type, paramName)); - typeString = outputTypeToString(type); + outParams.push_back(*q); + typeString = outputTypeToString(type, metaData); } else { @@ -1512,12 +1520,7 @@ Slice::Gen::DelegateVisitor::visitOperation(const OperationPtr& p) C << nl << "try"; C << sb; C << nl << "::IceInternal::BasicStream* __os = __out.os();"; - ParamDeclList::const_iterator pli; - for(pli = inParams.begin(); pli != inParams.end(); ++pli) - { - writeMarshalUnmarshalCode(C, (*pli)->type(), fixKwd((*pli)->name()), true, "", true, - (*pli)->getMetaData()); - } + writeMarshalCode(C, inParams, 0); C << eb; C << nl << "catch(const ::Ice::LocalException& __ex)"; C << sb; @@ -1581,8 +1584,8 @@ Slice::Gen::DelegateVisitor::visitOperation(const OperationPtr& p) C << eb; C << eb; - writeAllocateCode(C, TypeStringList(), ret); - writeUnmarshalCode(C, outParams, ret); + writeAllocateCode(C, ParamDeclList(), ret, p->getMetaData()); + writeUnmarshalCode(C, outParams, ret, p->getMetaData()); if(ret) { C << nl << "return __ret;"; @@ -2159,7 +2162,7 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p) string scope = fixKwd(p->scope()); TypePtr ret = p->returnType(); - string retS = returnTypeToString(ret); + string retS = returnTypeToString(ret, p->getMetaData()); string params = "("; string paramsDecl = "("; @@ -2170,7 +2173,7 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p) ParamDeclList inParams; - TypeStringList outParams; + ParamDeclList outParams; ParamDeclList paramList = p->parameters(); for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q) { @@ -2182,8 +2185,8 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p) string typeString; if(isOutParam) { - outParams.push_back(make_pair(type, paramName)); - typeString = outputTypeToString(type); + outParams.push_back(*q); + typeString = outputTypeToString(type, metaData); } else { @@ -2268,16 +2271,8 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p) C << nl << "::IceInternal::BasicStream* __os = __in.os();"; } - ParamDeclList::const_iterator pli; - for(pli = inParams.begin(); pli != inParams.end(); ++pli) - { - C << nl << typeToString((*pli)->type(), (*pli)->getMetaData()) << ' ' << fixKwd((*pli)->name()) << ';'; - } - for(pli = inParams.begin(); pli != inParams.end(); ++pli) - { - writeMarshalUnmarshalCode(C, (*pli)->type(), fixKwd((*pli)->name()), false, "", true, - (*pli)->getMetaData()); - } + writeAllocateCode(C, inParams, 0); + writeUnmarshalCode(C, inParams, 0); writeAllocateCode(C, outParams, 0); if(!throws.empty()) { @@ -2290,7 +2285,7 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p) C << retS << " __ret = "; } C << fixKwd(name) << args << ';'; - writeMarshalCode(C, outParams, ret); + writeMarshalCode(C, outParams, ret, p->getMetaData()); if(!throws.empty()) { C << eb; @@ -2313,7 +2308,7 @@ void Slice::Gen::ObjectVisitor::visitDataMember(const DataMemberPtr& p) { string name = fixKwd(p->name()); - string s = typeToString(p->type()); + string s = typeToString(p->type(), p->getMetaData()); H << nl << s << ' ' << name << ';'; } @@ -2586,7 +2581,7 @@ Slice::Gen::ImplVisitor::writeDecl(Output& out, const string& name, const TypePt } void -Slice::Gen::ImplVisitor::writeReturn(Output& out, const TypePtr& type) +Slice::Gen::ImplVisitor::writeReturn(Output& out, const TypePtr& type, const StringList& metaData) { BuiltinPtr builtin = BuiltinPtr::dynamicCast(type); if(builtin) @@ -2660,7 +2655,7 @@ Slice::Gen::ImplVisitor::writeReturn(Output& out, const TypePtr& type) SequencePtr seq = SequencePtr::dynamicCast(type); if(seq) { - out << nl << "return " << fixKwd(seq->scoped()) << "();"; + out << nl << "return " << typeToString(seq, metaData) << "();"; } else { @@ -2748,7 +2743,7 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p) string opName = op->name(); TypePtr ret = op->returnType(); - string retS = returnTypeToString(ret); + string retS = returnTypeToString(ret, op->getMetaData()); H << sp << nl << "virtual " << retS << ' ' << fixKwd(opName) << '('; H.useCurrentPosAsIndent(); @@ -2769,7 +2764,7 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p) string typeString; if((*q)->isOutParam()) { - typeString = outputTypeToString((*q)->type()); + typeString = outputTypeToString((*q)->type(), metaData); } else { @@ -2777,7 +2772,7 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p) } #else string typeString = (*q)->isOutParam() ? - outputTypeToString((*q)->type()) : inputTypeToString((*q)->type(), metaData); + outputTypeToString((*q)->type(), metaData) : inputTypeToString((*q)->type(), metaData); #endif H << typeString; } @@ -2813,7 +2808,7 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p) string typeString; if((*q)->isOutParam()) { - typeString = outputTypeToString((*q)->type()); + typeString = outputTypeToString((*q)->type(), metaData); } else { @@ -2821,7 +2816,7 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p) } #else string typeString = (*q)->isOutParam() ? - outputTypeToString((*q)->type()) : inputTypeToString((*q)->type(), metaData); + outputTypeToString((*q)->type(), metaData) : inputTypeToString((*q)->type(), metaData); #endif C << typeString << ' ' << fixKwd((*q)->name()); } @@ -2840,7 +2835,7 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p) if(ret) { - writeReturn(C, ret); + writeReturn(C, ret, op->getMetaData()); } C << eb; @@ -2854,7 +2849,28 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p) bool Slice::Gen::MetaDataVisitor::visitModuleStart(const ModulePtr& p) { - validate(p); + // + // Validate global metadata. + // + DefinitionContextPtr dc = p->definitionContext(); + assert(dc); + StringList globalMetaData = dc->getMetaData(); + string file = dc->filename(); + static const string prefix = "cpp:"; + for(StringList::const_iterator q = globalMetaData.begin(); q != globalMetaData.end(); ++q) + { + string s = *q; + if(_history.count(s) == 0) + { + if(s.find(prefix) == 0) + { + cout << file << ": warning: ignoring invalid global metadata `" << s << "'" << endl; + } + _history.insert(s); + } + } + + validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line()); return true; } @@ -2866,13 +2882,13 @@ Slice::Gen::MetaDataVisitor::visitModuleEnd(const ModulePtr&) void Slice::Gen::MetaDataVisitor::visitClassDecl(const ClassDeclPtr& p) { - validate(p); + validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line()); } bool Slice::Gen::MetaDataVisitor::visitClassDefStart(const ClassDefPtr& p) { - validate(p); + validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line()); return true; } @@ -2884,7 +2900,7 @@ Slice::Gen::MetaDataVisitor::visitClassDefEnd(const ClassDefPtr&) bool Slice::Gen::MetaDataVisitor::visitExceptionStart(const ExceptionPtr& p) { - validate(p); + validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line()); return true; } @@ -2896,7 +2912,7 @@ Slice::Gen::MetaDataVisitor::visitExceptionEnd(const ExceptionPtr&) bool Slice::Gen::MetaDataVisitor::visitStructStart(const StructPtr& p) { - validate(p); + validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line()); return true; } @@ -2908,72 +2924,78 @@ Slice::Gen::MetaDataVisitor::visitStructEnd(const StructPtr&) void Slice::Gen::MetaDataVisitor::visitOperation(const OperationPtr& p) { - validate(p); + StringList metaData = p->getMetaData(); + TypePtr returnType = p->returnType(); + if(!metaData.empty()) + { + if(!returnType) + { + for(StringList::const_iterator q = metaData.begin(); q != metaData.end(); ++q) + { + if(q->find("cpp:type:", 0) == 0) + { + cout << p->definitionContext()->filename() << ":" << p->line() + << ": warning: invalid metadata for operation" << endl; + break; + } + } + } + else + { + validate(returnType, metaData, p->definitionContext()->filename(), p->line()); + } + } + + ParamDeclList params = p->parameters(); + for(ParamDeclList::iterator q = params.begin(); q != params.end(); ++q) + { + validate((*q)->type(), (*q)->getMetaData(), p->definitionContext()->filename(), (*q)->line()); + } } void Slice::Gen::MetaDataVisitor::visitParamDecl(const ParamDeclPtr& p) { - validate(p); + validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line()); } void Slice::Gen::MetaDataVisitor::visitDataMember(const DataMemberPtr& p) { - validate(p); + validate(p->type(), p->getMetaData(), p->definitionContext()->filename(), p->line()); } void Slice::Gen::MetaDataVisitor::visitSequence(const SequencePtr& p) { - validate(p); + validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line()); } void Slice::Gen::MetaDataVisitor::visitDictionary(const DictionaryPtr& p) { - validate(p); + validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line()); } void Slice::Gen::MetaDataVisitor::visitEnum(const EnumPtr& p) { - validate(p); + validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line()); } void Slice::Gen::MetaDataVisitor::visitConst(const ConstPtr& p) { - validate(p); + validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line()); } void -Slice::Gen::MetaDataVisitor::validate(const ContainedPtr& cont) +Slice::Gen::MetaDataVisitor::validate(const SyntaxTreeBasePtr& cont, const StringList& metaData, + const string& file, const string& line) { - DefinitionContextPtr dc = cont->definitionContext(); - assert(dc); - StringList globalMetaData = dc->getMetaData(); - string file = dc->filename(); - - StringList localMetaData = cont->getMetaData(); - StringList::const_iterator p; static const string prefix = "cpp:"; - - for(p = globalMetaData.begin(); p != globalMetaData.end(); ++p) - { - string s = *p; - if(_history.count(s) == 0) - { - if(s.find(prefix) == 0) - { - cout << file << ": warning: ignoring invalid global metadata `" << s << "'" << endl; - } - _history.insert(s); - } - } - - for(p = localMetaData.begin(); p != localMetaData.end(); ++p) + for(StringList::const_iterator p = metaData.begin(); p != metaData.end(); ++p) { string s = *p; if(_history.count(s) == 0) @@ -2982,19 +3004,13 @@ Slice::Gen::MetaDataVisitor::validate(const ContainedPtr& cont) { if(SequencePtr::dynamicCast(cont)) { - if(s.substr(prefix.size()) == "collection") - { - continue; - } - } - if(StructPtr::dynamicCast(cont)) - { - if(s.substr(prefix.size()) == "class") + string ss = s.substr(prefix.size()); + if(ss.find("type:") == 0) { continue; } } - cout << file << ": warning: ignoring invalid metadata `" << s << "'" << endl; + cout << file << ":" << line << ": warning: ignoring invalid metadata `" << s << "'" << endl; } _history.insert(s); } diff --git a/cpp/src/slice2cppe/Gen.h b/cpp/src/slice2cppe/Gen.h index f1fe0778070..0fb3c5b1d94 100644 --- a/cpp/src/slice2cppe/Gen.h +++ b/cpp/src/slice2cppe/Gen.h @@ -262,7 +262,7 @@ private: // // Generate code to return a dummy value // - void writeReturn(::IceUtil::Output&, const TypePtr&); + void writeReturn(::IceUtil::Output&, const TypePtr&, const StringList&); }; class MetaDataVisitor : public ParserVisitor @@ -288,7 +288,7 @@ private: private: - void validate(const ContainedPtr&); + void validate(const SyntaxTreeBasePtr&, const StringList&, const std::string&, const std::string&); StringSet _history; }; |