summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpp/include/Slice/CPlusPlusUtil.h13
-rw-r--r--cpp/src/Slice/CPlusPlusUtil.cpp48
-rw-r--r--cpp/src/slice2cppe/Gen.cpp17
-rw-r--r--cpp/src/slice2cppe/Gen.h3
-rw-r--r--cppe/test/IceE/custom/Test.ice13
-rw-r--r--cppe/test/IceE/custom/TestI.cpp8
-rw-r--r--cppe/test/IceE/custom/TestI.h4
7 files changed, 71 insertions, 35 deletions
diff --git a/cpp/include/Slice/CPlusPlusUtil.h b/cpp/include/Slice/CPlusPlusUtil.h
index b2eda46edb6..ad13ac41c07 100644
--- a/cpp/include/Slice/CPlusPlusUtil.h
+++ b/cpp/include/Slice/CPlusPlusUtil.h
@@ -27,7 +27,7 @@ SLICE_API void printHeader(::IceUtil::Output&);
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 typeToString(const TypePtr&, const StringList& = StringList(), bool = true);
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&, const StringList& = StringList());
@@ -36,13 +36,14 @@ 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());
+ const std::string& = "", bool = true, const StringList& = StringList(),
+ bool = false);
SLICE_API void writeMarshalCode(::IceUtil::Output&, const ParamDeclList&, const TypePtr&,
- const StringList& = StringList());
+ const StringList& = StringList(), bool = false);
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());
+ const StringList& = StringList(), bool = false);
+SLICE_API void writeAllocateCode(::IceUtil::Output&, const ParamDeclList&, const TypePtr&,
+ const StringList& = StringList(), bool = false);
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 b7880b4ac46..0ede4f80e7a 100644
--- a/cpp/src/Slice/CPlusPlusUtil.cpp
+++ b/cpp/src/Slice/CPlusPlusUtil.cpp
@@ -120,7 +120,7 @@ Slice::printDllExportStuff(Output& out, const string& dllExport)
}
string
-Slice::typeToString(const TypePtr& type, const StringList& metaData)
+Slice::typeToString(const TypePtr& type, const StringList& metaData, bool allowArray)
{
static const char* builtinTable[] =
{
@@ -163,9 +163,16 @@ Slice::typeToString(const TypePtr& type, const StringList& metaData)
{
if(seqType == "array")
{
- TypePtr elemType = seq->type();
- string s = typeToString(elemType);
- return "::std::pair<const " + s + "*, const " + s + "*>";
+ if(allowArray)
+ {
+ TypePtr elemType = seq->type();
+ string s = typeToString(elemType);
+ return "::std::pair<const " + s + "*, const " + s + "*>";
+ }
+ else
+ {
+ return fixKwd(seq->scoped());
+ }
}
else
{
@@ -201,7 +208,7 @@ Slice::returnTypeToString(const TypePtr& type, const StringList& metaData)
return "void";
}
- return typeToString(type, metaData);
+ return typeToString(type, metaData, false);
}
string
@@ -454,7 +461,7 @@ Slice::fixKwd(const string& name)
void
Slice::writeMarshalUnmarshalCode(Output& out, const TypePtr& type, const string& param, bool marshal,
- const string& str, bool pointer, const StringList& metaData)
+ const string& str, bool pointer, const StringList& metaData, bool allowArray)
{
string fixedParam = fixKwd(param);
@@ -530,11 +537,15 @@ Slice::writeMarshalUnmarshalCode(Output& out, const TypePtr& type, const string&
if(seq)
{
string seqType = findMetaData(metaData);
- if(seqType.empty())
+ if(seqType.empty() || !allowArray && seqType == "array")
{
StringList l = seq->getMetaData();
seqType = findMetaData(l);
}
+ if(!allowArray && seqType == "array")
+ {
+ seqType = "";
+ }
builtin = BuiltinPtr::dynamicCast(seq->type());
if(marshal)
{
@@ -731,41 +742,46 @@ Slice::writeMarshalUnmarshalCode(Output& out, const TypePtr& type, const string&
}
void
-Slice::writeMarshalCode(Output& out, const ParamDeclList& params, const TypePtr& ret, const StringList& metaData)
+Slice::writeMarshalCode(Output& out, const ParamDeclList& params, const TypePtr& ret, const StringList& metaData,
+ bool allowArray)
{
for(ParamDeclList::const_iterator p = params.begin(); p != params.end(); ++p)
{
- writeMarshalUnmarshalCode(out, (*p)->type(), fixKwd((*p)->name()), true, "", true, (*p)->getMetaData());
+ writeMarshalUnmarshalCode(out, (*p)->type(), fixKwd((*p)->name()), true, "", true, (*p)->getMetaData(),
+ allowArray);
}
if(ret)
{
- writeMarshalUnmarshalCode(out, ret, "__ret", true, "", true, metaData);
+ writeMarshalUnmarshalCode(out, ret, "__ret", true, "", true, metaData, false);
}
}
void
-Slice::writeUnmarshalCode(Output& out, const ParamDeclList& params, const TypePtr& ret, const StringList& metaData)
+Slice::writeUnmarshalCode(Output& out, const ParamDeclList& params, const TypePtr& ret, const StringList& metaData,
+ bool allowArray)
{
for(ParamDeclList::const_iterator p = params.begin(); p != params.end(); ++p)
{
- writeMarshalUnmarshalCode(out, (*p)->type(), fixKwd((*p)->name()), false, "", true, (*p)->getMetaData());
+ writeMarshalUnmarshalCode(out, (*p)->type(), fixKwd((*p)->name()), false, "", true, (*p)->getMetaData(),
+ allowArray);
}
if(ret)
{
- writeMarshalUnmarshalCode(out, ret, "__ret", false, "", true, metaData);
+ writeMarshalUnmarshalCode(out, ret, "__ret", false, "", true, metaData, false);
}
}
void
-Slice::writeAllocateCode(Output& out, const ParamDeclList& params, const TypePtr& ret, const StringList& metaData)
+Slice::writeAllocateCode(Output& out, const ParamDeclList& params, const TypePtr& ret, const StringList& metaData,
+ bool allowArray)
{
for(ParamDeclList::const_iterator p = params.begin(); p != params.end(); ++p)
{
- out << nl << typeToString((*p)->type(), (*p)->getMetaData()) << ' ' << fixKwd((*p)->name()) << ';';
+ out << nl << typeToString((*p)->type(), (*p)->getMetaData(), allowArray) << ' ' << fixKwd((*p)->name()) << ';';
}
if(ret)
{
- out << nl << typeToString(ret, metaData) << " __ret;";
+ out << nl << typeToString(ret, metaData, allowArray) << " __ret;";
}
}
diff --git a/cpp/src/slice2cppe/Gen.cpp b/cpp/src/slice2cppe/Gen.cpp
index 761f3dce990..396e104e55d 100644
--- a/cpp/src/slice2cppe/Gen.cpp
+++ b/cpp/src/slice2cppe/Gen.cpp
@@ -1518,7 +1518,7 @@ Slice::Gen::DelegateVisitor::visitOperation(const OperationPtr& p)
C << nl << "try";
C << sb;
C << nl << "::IceInternal::BasicStream* __os = __out.os();";
- writeMarshalCode(C, inParams, 0);
+ writeMarshalCode(C, inParams, 0, StringList(), true);
C << eb;
C << nl << "catch(const ::Ice::LocalException& __ex)";
C << sb;
@@ -2269,8 +2269,8 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p)
C << nl << "::IceInternal::BasicStream* __os = __in.os();";
}
- writeAllocateCode(C, inParams, 0);
- writeUnmarshalCode(C, inParams, 0);
+ writeAllocateCode(C, inParams, 0, StringList(), true);
+ writeUnmarshalCode(C, inParams, 0, StringList(), true);
writeAllocateCode(C, outParams, 0);
if(!throws.empty())
{
@@ -2930,7 +2930,7 @@ Slice::Gen::MetaDataVisitor::visitOperation(const OperationPtr& p)
{
for(StringList::const_iterator q = metaData.begin(); q != metaData.end(); ++q)
{
- if(q->find("cpp:type:", 0) == 0)
+ if(q->find("cpp:type:", 0) == 0 || q->find("cpp:array", 0))
{
cout << p->definitionContext()->filename() << ":" << p->line()
<< ": warning: invalid metadata for operation" << endl;
@@ -2940,14 +2940,15 @@ Slice::Gen::MetaDataVisitor::visitOperation(const OperationPtr& p)
}
else
{
- validate(returnType, metaData, p->definitionContext()->filename(), p->line());
+ validate(returnType, metaData, p->definitionContext()->filename(), p->line(), false);
}
}
ParamDeclList params = p->parameters();
for(ParamDeclList::iterator q = params.begin(); q != params.end(); ++q)
{
- validate((*q)->type(), (*q)->getMetaData(), p->definitionContext()->filename(), (*q)->line());
+ validate((*q)->type(), (*q)->getMetaData(), p->definitionContext()->filename(), (*q)->line(),
+ !(*q)->isOutParam());
}
}
@@ -2989,7 +2990,7 @@ Slice::Gen::MetaDataVisitor::visitConst(const ConstPtr& p)
void
Slice::Gen::MetaDataVisitor::validate(const SyntaxTreeBasePtr& cont, const StringList& metaData,
- const string& file, const string& line)
+ const string& file, const string& line, bool allowArray)
{
static const string prefix = "cpp:";
@@ -3003,7 +3004,7 @@ Slice::Gen::MetaDataVisitor::validate(const SyntaxTreeBasePtr& cont, const Strin
if(SequencePtr::dynamicCast(cont))
{
string ss = s.substr(prefix.size());
- if(ss.find("type:") == 0)
+ if(ss.find("type:") == 0 || (allowArray && ss == "array"))
{
continue;
}
diff --git a/cpp/src/slice2cppe/Gen.h b/cpp/src/slice2cppe/Gen.h
index 0fb3c5b1d94..77a29656ed9 100644
--- a/cpp/src/slice2cppe/Gen.h
+++ b/cpp/src/slice2cppe/Gen.h
@@ -288,7 +288,8 @@ private:
private:
- void validate(const SyntaxTreeBasePtr&, const StringList&, const std::string&, const std::string&);
+ void validate(const SyntaxTreeBasePtr&, const StringList&, const std::string&, const std::string&,
+ bool = false);
StringSet _history;
};
diff --git a/cppe/test/IceE/custom/Test.ice b/cppe/test/IceE/custom/Test.ice
index 6eedad0bcc6..8fd90bd0000 100644
--- a/cppe/test/IceE/custom/Test.ice
+++ b/cppe/test/IceE/custom/Test.ice
@@ -17,10 +17,10 @@ sequence<bool> BoolSeq;
["cpp:type:std::list<bool>"] sequence<bool> BoolList;
sequence<byte> ByteSeq;
-["cpp:type:std::list< ::Ice::Byte>"]sequence<byte> ByteList;
+["cpp:type:std::list< ::Ice::Byte>"] sequence<byte> ByteList;
sequence<string> StringSeq;
-["cpp:type:std::list<std::string>"]sequence<string> StringList;
+["cpp:type:std::list<std::string>"] sequence<string> StringList;
struct Fixed
{
@@ -28,7 +28,7 @@ struct Fixed
};
sequence<Fixed> FixedSeq;
-["cpp:type:std::list< ::Test::Fixed>"]sequence<Fixed> FixedList;
+["cpp:type:std::list< ::Test::Fixed>"] sequence<Fixed> FixedList;
struct Variable
{
@@ -36,10 +36,15 @@ struct Variable
};
sequence<Variable> VariableSeq;
-["cpp:type:std::list< ::Test::Variable>"]sequence<Variable> VariableList;
+["cpp:type:std::list< ::Test::Variable>"] sequence<Variable> VariableList;
+
+
+["cpp:array"] sequence<byte> ByteArray;
class TestIntf
{
+ ["cpp:array"] ByteSeq opByteArray(["cpp:array"] ByteSeq inSeq, out ["cpp:array"] ByteSeq outSeq);
+
["cpp:type:std::deque<bool>"] BoolSeq
opBoolSeq(["cpp:type:std::deque<bool>"] BoolSeq inSeq, out ["cpp:type:std::deque<bool>"]BoolSeq outSeq);
diff --git a/cppe/test/IceE/custom/TestI.cpp b/cppe/test/IceE/custom/TestI.cpp
index bebcc187ce1..ec92cb4187f 100644
--- a/cppe/test/IceE/custom/TestI.cpp
+++ b/cppe/test/IceE/custom/TestI.cpp
@@ -19,6 +19,14 @@ TestIntfI::TestIntfI(const Ice::CommunicatorPtr& communicator)
{
}
+Test::ByteSeq
+TestIntfI::opByteArray(const std::pair<const Ice::Byte*, const Ice::Byte*>& inSeq,
+ Test::ByteSeq& outSeq,
+ const Ice::Current& current)
+{
+ return outSeq;
+}
+
std::deque<bool>
TestIntfI::opBoolSeq(const std::deque<bool>& inSeq,
std::deque<bool>& outSeq,
diff --git a/cppe/test/IceE/custom/TestI.h b/cppe/test/IceE/custom/TestI.h
index d10ba601716..72fdf2fbb07 100644
--- a/cppe/test/IceE/custom/TestI.h
+++ b/cppe/test/IceE/custom/TestI.h
@@ -18,6 +18,10 @@ public:
TestIntfI(const Ice::CommunicatorPtr&);
+ virtual Test::ByteSeq opByteArray(const std::pair<const Ice::Byte*, const Ice::Byte*>&,
+ Test::ByteSeq&,
+ const Ice::Current&);
+
virtual std::deque<bool> opBoolSeq(const std::deque<bool>&,
std::deque<bool>&,
const Ice::Current&);