summaryrefslogtreecommitdiff
path: root/cpp/src/slice2java/Gen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/slice2java/Gen.cpp')
-rw-r--r--cpp/src/slice2java/Gen.cpp376
1 files changed, 334 insertions, 42 deletions
diff --git a/cpp/src/slice2java/Gen.cpp b/cpp/src/slice2java/Gen.cpp
index 76571189c42..aef63acacb8 100644
--- a/cpp/src/slice2java/Gen.cpp
+++ b/cpp/src/slice2java/Gen.cpp
@@ -354,7 +354,7 @@ Slice::JavaVisitor::writeHashCode(Output& out, const TypePtr& type, const string
<< "++)";
out << sb;
ostringstream elem;
- elem << name << "[__i" << iter << ']';
+ elem << name << "[__i" << iter << ']' << ends;
iter++;
writeHashCode(out, seq->type(), elem.str(), iter);
out << eb;
@@ -491,6 +491,10 @@ Slice::JavaVisitor::writeDispatch(Output& out, const ClassDefPtr& p)
string typeS = typeToString(q->first, TypeModeIn, scope);
out << nl << typeS << ' ' << fixKwd(q->second) << ';';
writeMarshalUnmarshalCode(out, scope, q->first, fixKwd(q->second), false, iter);
+ if(op->sendsClasses())
+ {
+ out << nl << "__is.readPendingObjects();";
+ }
}
//
@@ -538,6 +542,10 @@ Slice::JavaVisitor::writeDispatch(Output& out, const ClassDefPtr& p)
{
writeMarshalUnmarshalCode(out, scope, ret, "__ret", true, iter);
}
+ if(op->returnsClasses())
+ {
+ out << nl << "__os.writePendingObjects();";
+ }
out << nl << "return IceInternal.DispatchStatus.DispatchOK;";
//
@@ -589,6 +597,10 @@ Slice::JavaVisitor::writeDispatch(Output& out, const ClassDefPtr& p)
string typeS = typeToString(q->first, TypeModeIn, scope);
out << nl << typeS << ' ' << fixKwd(q->second) << ';';
writeMarshalUnmarshalCode(out, scope, q->first, fixKwd(q->second), false, iter);
+ if(op->sendsClasses())
+ {
+ out << nl << "__is.readPendingObjects();";
+ }
}
//
@@ -1262,24 +1274,97 @@ Slice::Gen::TypesVisitor::visitClassDefStart(const ClassDefPtr& p)
out << sp << nl << "public void" << nl << "__write(IceInternal.BasicStream __os)";
out << sb;
+ out << nl << "__os.writeTypeId(ice_staticId());";
+ out << nl << "__os.startWriteSlice();";
iter = 0;
for(d = members.begin(); d != members.end(); ++d)
{
list<string> metaData = (*d)->getMetaData();
writeMarshalUnmarshalCode(out, scope, (*d)->type(), fixKwd((*d)->name()), true, iter, false, metaData);
}
+ out << nl << "__os.endWriteSlice();";
out << nl << "super.__write(__os);";
out << eb;
- out << sp << nl << "public void" << nl << "__read(IceInternal.BasicStream __is)";
+ DataMemberList allClassMembers = p->allClassDataMembers();
+ if(allClassMembers.size() != 0)
+ {
+ out << sp << nl << "private class Patcher implements Ice.Patcher";
+ out << sb;
+ if(allClassMembers.size() > 1)
+ {
+ out << sp << nl << "Patcher(int member)";
+ out << sb;
+ out << nl << "__member = member;";
+ out << eb;
+ }
+
+ out << sp << nl << "public void" << nl << "patch(Ice.Object v)";
+ out << sb;
+ if(allClassMembers.size() > 1)
+ {
+ out << nl << "switch(__member)";
+ out << sb;
+ }
+ int memberCount = 0;
+ for(d = allClassMembers.begin(); d != allClassMembers.end(); ++d)
+ {
+ if(allClassMembers.size() > 1)
+ {
+ out.dec();
+ out << nl << "case " << memberCount << ":";
+ out.inc();
+ }
+ string memberName = fixKwd((*d)->name());
+ string memberScope = fixKwd((*d)->scope());
+ string memberType = typeToString((*d)->type(), TypeModeMember, memberScope);
+ out << nl << memberName << " = (" << memberType << ")v;";
+ if(allClassMembers.size() > 1)
+ {
+ out << nl << "break;";
+ }
+ memberCount++;
+ }
+ if(allClassMembers.size() > 1)
+ {
+ out << eb;
+ }
+ out << eb;
+ if(allClassMembers.size() > 1)
+ {
+ out << nl << nl << "private int __member;";
+ }
+ out << eb;
+ }
+
+ out << sp << nl << "public void" << nl << "__read(IceInternal.BasicStream __is, boolean __rid)";
out << sb;
+ out << nl << "if(__rid)";
+ out << sb;
+ out << nl << "String myId = __is.readTypeId();";
+ out << eb;
+ out << nl << "__is.startReadSlice();";
iter = 0;
+ DataMemberList classMembers = p->classDataMembers();
+ int classMemberCount = allClassMembers.size() - classMembers.size();
for(d = members.begin(); d != members.end(); ++d)
{
list<string> metaData = (*d)->getMetaData();
- writeMarshalUnmarshalCode(out, scope, (*d)->type(), fixKwd((*d)->name()), false, iter, false, metaData);
+ ostringstream patchParams;
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast((*d)->type());
+ if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast((*d)->type()))
+ {
+ if(classMembers.size() > 1 || allClassMembers.size() > 1)
+ {
+ patchParams << classMemberCount++;
+ }
+ }
+ patchParams << ends;
+ writeMarshalUnmarshalCode(out, scope, (*d)->type(), fixKwd((*d)->name()), false, iter, false, metaData,
+ patchParams.str());
}
- out << nl << "super.__read(__is);";
+ out << nl << "__is.endReadSlice();";
+ out << nl << "super.__read(__is, true);";
out << eb;
out << sp << nl << "public void" << nl << "__marshal(Ice.Stream __os)";
@@ -1368,36 +1453,6 @@ Slice::Gen::TypesVisitor::visitExceptionStart(const ExceptionPtr& p)
out << nl << "return \"" << scoped.substr(2) << "\";";
out << eb;
- if(!p->isLocal())
- {
- ExceptionList allBases = p->allBases();
- StringList exceptionIds;
- transform(allBases.begin(), allBases.end(),
- back_inserter(exceptionIds),
- ::IceUtil::constMemFun(&Contained::scoped));
- exceptionIds.push_front(scoped);
- exceptionIds.push_back("::Ice::UserException");
-
- StringList::const_iterator q;
-
- out << sp << nl << "private static final String[] __exceptionIds =";
- out << sb;
- q = exceptionIds.begin();
- while(q != exceptionIds.end())
- {
- out << nl << '"' << *q << '"';
- if(++q != exceptionIds.end())
- {
- out << ',';
- }
- }
- out << eb << ';';
- out << sp << nl << "public String[]" << nl << "__getExceptionIds()";
- out << sb;
- out << nl << "return __exceptionIds;";
- out << eb;
- }
-
return true;
}
@@ -1434,6 +1489,56 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p)
}
out << eb;
+ DataMemberList allClassMembers = p->allClassDataMembers();
+ if(allClassMembers.size() != 0)
+ {
+ out << sp << nl << "private class Patcher implements Ice.Patcher";
+ out << sb;
+ if(allClassMembers.size() > 1)
+ {
+ out << sp << nl << "Patcher(int member)";
+ out << sb;
+ out << nl << "__member = member;";
+ out << eb;
+ }
+
+ out << sp << nl << "public void" << nl << "patch(Ice.Object v)";
+ out << sb;
+ if(allClassMembers.size() > 1)
+ {
+ out << nl << "switch(__member)";
+ out << sb;
+ }
+ int memberCount = 0;
+ for(d = allClassMembers.begin(); d != allClassMembers.end(); ++d)
+ {
+ if(allClassMembers.size() > 1)
+ {
+ out.dec();
+ out << nl << "case " << memberCount << ":";
+ out.inc();
+ }
+ string memberName = fixKwd((*d)->name());
+ string memberScope = fixKwd((*d)->scope());
+ string memberType = typeToString((*d)->type(), TypeModeMember, memberScope);
+ out << nl << memberName << " = (" << memberType << ")v;";
+ if(allClassMembers.size() > 1)
+ {
+ out << nl << "break;";
+ }
+ memberCount++;
+ }
+ if(allClassMembers.size() > 1)
+ {
+ out << eb;
+ }
+ out << eb;
+ if(allClassMembers.size() > 1)
+ {
+ out << nl << nl << "private int __member;";
+ }
+ out << eb;
+ }
out << sp << nl << "public void" << nl << "__read(IceInternal.BasicStream __is, boolean __rid)";
out << sb;
out << nl << "if(__rid)";
@@ -1442,10 +1547,23 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p)
out << eb;
out << nl << "__is.startReadSlice();";
iter = 0;
+ DataMemberList classMembers = p->classDataMembers();
+ int classMemberCount = allClassMembers.size() - classMembers.size();
for(d = members.begin(); d != members.end(); ++d)
{
+ ostringstream patchParams;
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast((*d)->type());
+ if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast((*d)->type()))
+ {
+ if(classMembers.size() > 1 || allClassMembers.size() > 1)
+ {
+ patchParams << classMemberCount++;
+ }
+ }
+ patchParams << ends;
list<string> metaData = (*d)->getMetaData();
- writeMarshalUnmarshalCode(out, scope, (*d)->type(), fixKwd((*d)->name()), false, iter, false, metaData);
+ writeMarshalUnmarshalCode(out, scope, (*d)->type(), fixKwd((*d)->name()), false, iter, false, metaData,
+ patchParams.str());
}
out << nl << "__is.endReadSlice();";
if(base)
@@ -1672,13 +1790,77 @@ Slice::Gen::TypesVisitor::visitStructEnd(const StructPtr& p)
}
out << eb;
+ DataMemberList classMembers = p->classDataMembers();
+
+ if(classMembers.size() != 0)
+ {
+ out << sp << nl << "private class Patcher implements Ice.Patcher";
+ out << sb;
+ if(classMembers.size() > 1)
+ {
+ out << sp << nl << "Patcher(int member)";
+ out << sb;
+ out << nl << "__member = member;";
+ out << eb;
+ }
+
+ out << sp << nl << "public void" << nl << "patch(Ice.Object v)";
+ out << sb;
+ if(classMembers.size() > 1)
+ {
+ out << nl << "switch(__member)";
+ out << sb;
+ }
+ int memberCount = 0;
+ for(d = classMembers.begin(); d != classMembers.end(); ++d)
+ {
+ if(classMembers.size() > 1)
+ {
+ out.dec();
+ out << nl << "case " << memberCount << ":";
+ out.inc();
+ }
+ string memberName = fixKwd((*d)->name());
+ string memberScope = fixKwd((*d)->scope());
+ string memberType = typeToString((*d)->type(), TypeModeMember, memberScope);
+ out << nl << memberName << " = (" << memberType << ")v;";
+ if(classMembers.size() > 1)
+ {
+ out << nl << "break;";
+ }
+ memberCount++;
+ }
+ if(classMembers.size() > 1)
+ {
+ out << eb;
+ }
+ out << eb;
+ if(classMembers.size() > 1)
+ {
+ out << nl << nl << "private int __member;";
+ }
+ out << eb;
+ }
+
out << sp << nl << "public void" << nl << "__read(IceInternal.BasicStream __is)";
out << sb;
iter = 0;
+ int classMemberCount = 0;
for(d = members.begin(); d != members.end(); ++d)
{
+ ostringstream patchParams;
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast((*d)->type());
+ if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast((*d)->type()))
+ {
+ if(classMembers.size() > 1)
+ {
+ patchParams << classMemberCount++;
+ }
+ }
+ patchParams << ends;
list<string> metaData = (*d)->getMetaData();
- writeMarshalUnmarshalCode(out, scope, (*d)->type(), fixKwd((*d)->name()), false, iter, false, metaData);
+ writeMarshalUnmarshalCode(out, scope, (*d)->type(), fixKwd((*d)->name()), false, iter, false, metaData,
+ patchParams.str());
}
out << eb;
@@ -2042,6 +2224,24 @@ Slice::Gen::HolderVisitor::writeHolder(const TypePtr& p)
out << sb;
out << nl << "this.value = value;";
out << eb;
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(p);
+ if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast(p))
+ {
+ out << sp << nl << "public class Patcher implements Ice.Patcher";
+ out << sb;
+ out << nl << "public void";
+ out << nl << "patch(Ice.Object v)";
+ out << sb;
+ out << nl << "value = (" << typeS << ")v;";
+ out << eb;
+ out << eb;
+
+ out << sp << nl << "public Patcher";
+ out << nl << "getPatcher()";
+ out << sb;
+ out << nl << "return new Patcher();";
+ out << eb;
+ }
out << sp << nl << "public " << typeS << " value;";
out << eb;
close();
@@ -2364,6 +2564,30 @@ Slice::Gen::HelperVisitor::visitSequence(const SequencePtr& p)
writeSequenceMarshalUnmarshalCode(out, scope, p, "__v", true, iter, false);
out << eb;
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(p->type());
+ if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast(p->type()))
+ {
+ //
+ // The sequence has class elements.
+ //
+ out << sp << nl << "private static class Patcher implements Ice.Patcher";
+ out << sb;
+ out << sp << nl << "Patcher(" << typeS << " values, int index)";
+ out << sb;
+ out << nl << "__values = values;";
+ out << nl << "__index = index;";
+ out << eb;
+
+ out << sp << nl << "public void" << nl << "patch(Ice.Object v)";
+ out << sb;
+ out << nl << "__values[__index] = (" << typeToString(p->type(), TypeModeIn, scope) << ")v;";
+ out << eb;
+
+ out << sp << nl << "private " << typeS << " __values;";
+ out << nl << "private int __index;";
+ out << eb;
+ }
+
out << sp << nl << "public static " << typeS << nl << "read(IceInternal.BasicStream __is)";
out << sb;
out << nl << typeS << " __v;";
@@ -2516,6 +2740,30 @@ Slice::Gen::HelperVisitor::visitDictionary(const DictionaryPtr& p)
out << eb;
out << eb;
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(value);
+ if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast(value))
+ {
+ //
+ // The dictionary uses class values.
+ //
+ out << sp << nl << "private static class Patcher implements Ice.Patcher";
+ out << sb;
+ out << sp << nl << "Patcher(java.util.Map m, " << keyS << " key)";
+ out << sb;
+ out << nl << "__m = m;";
+ out << nl << "__key = key;";
+ out << eb;
+
+ out << sp << nl << "public void" << nl << "patch(Ice.Object v)";
+ out << sb;
+ out << nl << "__m.put(__key, v);";
+ out << eb;
+
+ out << sp << nl << "private java.util.Map __m;";
+ out << nl << "private " << keyS << " __key;";
+ out << eb;
+ }
+
out << sp << nl << "public static java.util.Map" << nl << "read(IceInternal.BasicStream __is)";
out << sb;
out << nl << "int __sz = __is.readSize();";
@@ -2585,7 +2833,7 @@ Slice::Gen::HelperVisitor::visitDictionary(const DictionaryPtr& p)
}
case Builtin::KindObject:
{
- out << nl << "Ice.Object " << arg << " = __is.readObject(\"\", null);";
+ out << nl << "__is.readObject(new Patcher(__r, __key));";
break;
}
case Builtin::KindObjectProxy:
@@ -2607,12 +2855,16 @@ Slice::Gen::HelperVisitor::visitDictionary(const DictionaryPtr& p)
writeMarshalUnmarshalCode(out, scope, type, arg, false, iter, false);
}
}
- out << nl << "__r.put(__key, __value);";
+ if(!(builtin && builtin->kind() == Builtin::KindObject) && !ClassDeclPtr::dynamicCast(value))
+ {
+ out << nl << "__r.put(__key, __value);";
+ }
out << eb;
out << nl << "return __r;";
out << eb;
- out << nl << "public static void" << nl << "ice_marshal(String __name, Ice.Stream __os, java.util.Map __v)";
+ out << sp << nl << "public static void" << nl
+ << "ice_marshal(String __name, Ice.Stream __os, java.util.Map __v)";
out << sb;
out << nl << "if(__v == null)";
out << sb;
@@ -3117,6 +3369,10 @@ Slice::Gen::DelegateMVisitor::visitClassDefStart(const ClassDefPtr& p)
{
writeMarshalUnmarshalCode(out, scope, q->first, fixKwd(q->second), true, iter);
}
+ if(op->sendsClasses())
+ {
+ out << nl << "__os.writePendingObjects();";
+ }
out << nl << "if(!__out.invoke())";
out << sb;
if(!throws.empty())
@@ -3153,10 +3409,34 @@ Slice::Gen::DelegateMVisitor::visitClassDefStart(const ClassDefPtr& p)
}
if(ret)
{
- out << nl << retS << " __ret;";
- writeMarshalUnmarshalCode(out, scope, ret, "__ret", false, iter);
- out << nl << "return __ret;";
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(ret);
+ if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast(ret))
+ {
+ out << nl << retS << "Holder __ret = new " << retS << "Holder();";
+ out << nl << "__is.readObject(__ret.getPatcher());";
+ }
+ else
+ {
+ out << nl << retS << " __ret;";
+ writeMarshalUnmarshalCode(out, scope, ret, "__ret", false, iter);
+ }
}
+ if(op->returnsClasses())
+ {
+ out << nl << "__is.readPendingObjects();";
+ }
+ if(ret)
+ {
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(ret);
+ if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast(ret))
+ {
+ out << nl << "return __ret.value;";
+ }
+ else
+ {
+ out << nl << "return __ret;";
+ }
+ }
if(!outParams.empty() || ret)
{
out << eb;
@@ -3191,6 +3471,10 @@ Slice::Gen::DelegateMVisitor::visitClassDefStart(const ClassDefPtr& p)
{
writeMarshalUnmarshalCode(out, scope, q->first, fixKwd(q->second), true, iter);
}
+ if(op->sendsClasses())
+ {
+ out << nl << "__os.writePendingObjects();";
+ }
out << nl << "__cb.__invoke();";
out << eb;
}
@@ -3862,6 +4146,10 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
{
writeMarshalUnmarshalCode(out, classScope, ret, "__ret", false, iter);
}
+ if(p->returnsClasses())
+ {
+ out << nl << "__is.readPendingObjects();";
+ }
out << eb;
out << nl << "catch(Ice.LocalException __ex)";
out << sb;
@@ -3967,6 +4255,10 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
string retS = typeToString(ret, TypeModeIn, classScope);
writeMarshalUnmarshalCode(out, classScope, ret, "__ret", true, iter);
}
+ if(p->returnsClasses())
+ {
+ out << nl << "__os.writePendingObjects();";
+ }
out << eb;
out << nl << "catch(Ice.LocalException __ex)";
out << sb;