summaryrefslogtreecommitdiff
path: root/cpp/src/slice2java/Gen.cpp
diff options
context:
space:
mode:
authorMichi Henning <michi@zeroc.com>2003-05-19 00:54:05 +0000
committerMichi Henning <michi@zeroc.com>2003-05-19 00:54:05 +0000
commitd48f77a15aa2184d048b664d8d0287bfc430e0f8 (patch)
treebd51fe2f8a8d97a0bd3fa78788e154a89450a7cd /cpp/src/slice2java/Gen.cpp
parentUse %x to display the date (diff)
downloadice-d48f77a15aa2184d048b664d8d0287bfc430e0f8.tar.bz2
ice-d48f77a15aa2184d048b664d8d0287bfc430e0f8.tar.xz
ice-d48f77a15aa2184d048b664d8d0287bfc430e0f8.zip
- Fixed a bug in the code generator for dictionaries with class values.
- Added more support for Java slicing. - Changed config/Make.rules: "make depend" was calling slice2cpp with ICECPPFLAGS, not SLICE2CPPFLAGS. This meant that "make depend" was invoking slice2cpp with options that were potentially different from those passed for normal compilation of slice files, which could lead to inconsistencies.
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;