diff options
author | Benoit Foucher <benoit@zeroc.com> | 2007-04-19 15:38:23 +0000 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2007-04-19 15:38:23 +0000 |
commit | 9771b5661fad7d81e9ad0772790999713804f57e (patch) | |
tree | 03ca7d84f3326f51ce9c52ee4841f36c99e74fcb /cpp/src/slice2java/Gen.cpp | |
parent | Updated WinCE readme (diff) | |
download | ice-9771b5661fad7d81e9ad0772790999713804f57e.tar.bz2 ice-9771b5661fad7d81e9ad0772790999713804f57e.tar.xz ice-9771b5661fad7d81e9ad0772790999713804f57e.zip |
Fixed bug 2123
Diffstat (limited to 'cpp/src/slice2java/Gen.cpp')
-rw-r--r-- | cpp/src/slice2java/Gen.cpp | 415 |
1 files changed, 209 insertions, 206 deletions
diff --git a/cpp/src/slice2java/Gen.cpp b/cpp/src/slice2java/Gen.cpp index 9a71285e426..b085720b591 100644 --- a/cpp/src/slice2java/Gen.cpp +++ b/cpp/src/slice2java/Gen.cpp @@ -372,7 +372,7 @@ Slice::JavaVisitor::writeHashCode(Output& out, const TypePtr& type, const string } void -Slice::JavaVisitor::writeDispatch(Output& out, const ClassDefPtr& p) +Slice::JavaVisitor::writeDispatchAndMarshalling(Output& out, const ClassDefPtr& p, bool stream) { string name = fixKwd(p->name()); string package = getPackage(p); @@ -945,6 +945,209 @@ Slice::JavaVisitor::writeDispatch(Output& out, const ClassDefPtr& p) out << eb; } } + + int iter; + DataMemberList members = p->dataMembers(); + DataMemberList::const_iterator d; + + 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) + { + StringList metaData = (*d)->getMetaData(); + writeMarshalUnmarshalCode(out, package, (*d)->type(), fixKwd((*d)->name()), true, iter, false, metaData); + } + out << nl << "__os.endWriteSlice();"; + out << nl << "super.__write(__os);"; + out << eb; + + DataMemberList allClassMembers = p->allClassDataMembers(); + if(allClassMembers.size() != 0) + { + out << sp << nl << "private class Patcher implements IceInternal.Patcher"; + if(stream) + { + out << ", Ice.ReadObjectCallback"; + } + 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; + out << nl << "try"; + 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(); + } + if(allClassMembers.size() > 1) + { + out << nl << "__typeId = \"" << (*d)->type()->typeId() << "\";"; + } + string memberName = fixKwd((*d)->name()); + string memberType = typeToString((*d)->type(), TypeModeMember, package); + out << nl << memberName << " = (" << memberType << ")v;"; + if(allClassMembers.size() > 1) + { + out << nl << "break;"; + } + memberCount++; + } + if(allClassMembers.size() > 1) + { + out << eb; + } + out << eb; + out << nl << "catch(ClassCastException ex)"; + out << sb; + out << nl << "Ice.UnexpectedObjectException _e = new Ice.UnexpectedObjectException();"; + out << nl << "_e.type = v.ice_id();"; + out << nl << "_e.expectedType = type();"; + out << nl << "throw _e;"; + out << eb; + out << eb; + + out << sp << nl << "public String" << nl << "type()"; + out << sb; + if(allClassMembers.size() > 1) + { + out << nl << "return __typeId;"; + } + else + { + out << nl << "return \"" << (*allClassMembers.begin())->type()->typeId() << "\";"; + } + out << eb; + + if(stream) + { + out << sp << nl << "public void" << nl << "invoke(Ice.Object v)"; + out << sb; + out << nl << "patch(v);"; + out << eb; + } + + if(allClassMembers.size() > 1) + { + out << sp << nl << "private int __member;"; + out << nl << "private String __typeId;"; + } + out << eb; + } + + out << sp << nl << "public void" << nl << "__read(IceInternal.BasicStream __is, boolean __rid)"; + out << sb; + out << nl << "if(__rid)"; + out << sb; + out << nl << "__is.readTypeId();"; + out << eb; + out << nl << "__is.startReadSlice();"; + iter = 0; + DataMemberList classMembers = p->classDataMembers(); + size_t classMemberCount = allClassMembers.size() - classMembers.size(); + for(d = members.begin(); d != members.end(); ++d) + { + StringList metaData = (*d)->getMetaData(); + 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 << "new Patcher(" << classMemberCount++ << ')'; + } + } + writeMarshalUnmarshalCode(out, package, (*d)->type(), fixKwd((*d)->name()), false, iter, false, metaData, + patchParams.str()); + } + out << nl << "__is.endReadSlice();"; + out << nl << "super.__read(__is, true);"; + out << eb; + + if(stream) + { + out << sp << nl << "public void" << nl << "__write(Ice.OutputStream __outS)"; + out << sb; + out << nl << "__outS.writeTypeId(ice_staticId());"; + out << nl << "__outS.startSlice();"; + iter = 0; + for(d = members.begin(); d != members.end(); ++d) + { + StringList metaData = (*d)->getMetaData(); + writeStreamMarshalUnmarshalCode(out, package, (*d)->type(), fixKwd((*d)->name()), true, iter, false, + metaData); + } + out << nl << "__outS.endSlice();"; + out << nl << "super.__write(__outS);"; + out << eb; + + out << sp << nl << "public void" << nl << "__read(Ice.InputStream __inS, boolean __rid)"; + out << sb; + out << nl << "if(__rid)"; + out << sb; + out << nl << "__inS.readTypeId();"; + out << eb; + out << nl << "__inS.startSlice();"; + iter = 0; + for(d = members.begin(); d != members.end(); ++d) + { + StringList metaData = (*d)->getMetaData(); + 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 << "new Patcher(" << classMemberCount++ << ')'; + } + } + writeStreamMarshalUnmarshalCode(out, package, (*d)->type(), fixKwd((*d)->name()), false, iter, false, + metaData, patchParams.str()); + } + out << nl << "__inS.endSlice();"; + out << nl << "super.__read(__inS, true);"; + out << eb; + } + else + { + // + // Emit placeholder functions to catch errors. + // + string scoped = p->scoped(); + out << sp << nl << "public void" << nl << "__write(Ice.OutputStream __outS)"; + out << sb; + out << nl << "Ice.MarshalException ex = new Ice.MarshalException();"; + out << nl << "ex.reason = \"type " << scoped.substr(2) << " was not generated with stream support\";"; + out << nl << "throw ex;"; + out << eb; + + out << sp << nl << "public void" << nl << "__read(Ice.InputStream __inS, boolean __rid)"; + out << sb; + out << nl << "Ice.MarshalException ex = new Ice.MarshalException();"; + out << nl << "ex.reason = \"type " << scoped.substr(2) << " was not generated with stream support\";"; + out << nl << "throw ex;"; + out << eb; + } + } Slice::Gen::Gen(const string& name, const string& base, const vector<string>& includePaths, const string& dir) : @@ -996,7 +1199,7 @@ Slice::Gen::generate(const UnitPtr& p, bool stream) DelegateDVisitor delegateDVisitor(_dir); p->visit(&delegateDVisitor, false); - DispatcherVisitor dispatcherVisitor(_dir); + DispatcherVisitor dispatcherVisitor(_dir, stream); p->visit(&dispatcherVisitor, false); AsyncVisitor asyncVisitor(_dir); @@ -1659,207 +1862,7 @@ Slice::Gen::TypesVisitor::visitClassDefStart(const ClassDefPtr& p) // if(!p->isInterface() && !p->isLocal()) { - writeDispatch(out, p); - - int iter; - - 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) - { - StringList metaData = (*d)->getMetaData(); - writeMarshalUnmarshalCode(out, package, (*d)->type(), fixKwd((*d)->name()), true, iter, false, metaData); - } - out << nl << "__os.endWriteSlice();"; - out << nl << "super.__write(__os);"; - out << eb; - - DataMemberList allClassMembers = p->allClassDataMembers(); - if(allClassMembers.size() != 0) - { - out << sp << nl << "private class Patcher implements IceInternal.Patcher"; - if(_stream) - { - out << ", Ice.ReadObjectCallback"; - } - 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; - out << nl << "try"; - 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(); - } - if(allClassMembers.size() > 1) - { - out << nl << "__typeId = \"" << (*d)->type()->typeId() << "\";"; - } - string memberName = fixKwd((*d)->name()); - string memberType = typeToString((*d)->type(), TypeModeMember, package); - out << nl << memberName << " = (" << memberType << ")v;"; - if(allClassMembers.size() > 1) - { - out << nl << "break;"; - } - memberCount++; - } - if(allClassMembers.size() > 1) - { - out << eb; - } - out << eb; - out << nl << "catch(ClassCastException ex)"; - out << sb; - out << nl << "Ice.UnexpectedObjectException _e = new Ice.UnexpectedObjectException();"; - out << nl << "_e.type = v.ice_id();"; - out << nl << "_e.expectedType = type();"; - out << nl << "throw _e;"; - out << eb; - out << eb; - - out << sp << nl << "public String" << nl << "type()"; - out << sb; - if(allClassMembers.size() > 1) - { - out << nl << "return __typeId;"; - } - else - { - out << nl << "return \"" << (*allClassMembers.begin())->type()->typeId() << "\";"; - } - out << eb; - - if(_stream) - { - out << sp << nl << "public void" << nl << "invoke(Ice.Object v)"; - out << sb; - out << nl << "patch(v);"; - out << eb; - } - - if(allClassMembers.size() > 1) - { - out << sp << nl << "private int __member;"; - out << nl << "private String __typeId;"; - } - out << eb; - } - - out << sp << nl << "public void" << nl << "__read(IceInternal.BasicStream __is, boolean __rid)"; - out << sb; - out << nl << "if(__rid)"; - out << sb; - out << nl << "__is.readTypeId();"; - out << eb; - out << nl << "__is.startReadSlice();"; - iter = 0; - DataMemberList classMembers = p->classDataMembers(); - size_t classMemberCount = allClassMembers.size() - classMembers.size(); - for(d = members.begin(); d != members.end(); ++d) - { - StringList metaData = (*d)->getMetaData(); - 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 << "new Patcher(" << classMemberCount++ << ')'; - } - } - writeMarshalUnmarshalCode(out, package, (*d)->type(), fixKwd((*d)->name()), false, iter, false, metaData, - patchParams.str()); - } - out << nl << "__is.endReadSlice();"; - out << nl << "super.__read(__is, true);"; - out << eb; - - if(_stream) - { - out << sp << nl << "public void" << nl << "__write(Ice.OutputStream __outS)"; - out << sb; - out << nl << "__outS.writeTypeId(ice_staticId());"; - out << nl << "__outS.startSlice();"; - iter = 0; - for(d = members.begin(); d != members.end(); ++d) - { - StringList metaData = (*d)->getMetaData(); - writeStreamMarshalUnmarshalCode(out, package, (*d)->type(), fixKwd((*d)->name()), true, iter, false, - metaData); - } - out << nl << "__outS.endSlice();"; - out << nl << "super.__write(__outS);"; - out << eb; - - out << sp << nl << "public void" << nl << "__read(Ice.InputStream __inS, boolean __rid)"; - out << sb; - out << nl << "if(__rid)"; - out << sb; - out << nl << "__inS.readTypeId();"; - out << eb; - out << nl << "__inS.startSlice();"; - iter = 0; - for(d = members.begin(); d != members.end(); ++d) - { - StringList metaData = (*d)->getMetaData(); - 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 << "new Patcher(" << classMemberCount++ << ')'; - } - } - writeStreamMarshalUnmarshalCode(out, package, (*d)->type(), fixKwd((*d)->name()), false, iter, false, - metaData, patchParams.str()); - } - out << nl << "__inS.endSlice();"; - out << nl << "super.__read(__inS, true);"; - out << eb; - } - else - { - // - // Emit placeholder functions to catch errors. - // - string scoped = p->scoped(); - out << sp << nl << "public void" << nl << "__write(Ice.OutputStream __outS)"; - out << sb; - out << nl << "Ice.MarshalException ex = new Ice.MarshalException();"; - out << nl << "ex.reason = \"type " << scoped.substr(2) << " was not generated with stream support\";"; - out << nl << "throw ex;"; - out << eb; - - out << sp << nl << "public void" << nl << "__read(Ice.InputStream __inS, boolean __rid)"; - out << sb; - out << nl << "Ice.MarshalException ex = new Ice.MarshalException();"; - out << nl << "ex.reason = \"type " << scoped.substr(2) << " was not generated with stream support\";"; - out << nl << "throw ex;"; - out << eb; - } + writeDispatchAndMarshalling(out, p, _stream); } return true; @@ -4332,8 +4335,8 @@ Slice::Gen::DelegateDVisitor::visitClassDefStart(const ClassDefPtr& p) return false; } -Slice::Gen::DispatcherVisitor::DispatcherVisitor(const string& dir) : - JavaVisitor(dir) +Slice::Gen::DispatcherVisitor::DispatcherVisitor(const string& dir, bool stream) : + JavaVisitor(dir), _stream(stream) { } @@ -4367,7 +4370,7 @@ Slice::Gen::DispatcherVisitor::visitClassDefStart(const ClassDefPtr& p) out << nl << "throw new java.lang.CloneNotSupportedException();"; out << eb; - writeDispatch(out, p); + writeDispatchAndMarshalling(out, p, _stream); out << eb; close(); |