diff options
author | Benoit Foucher <benoit@zeroc.com> | 2015-02-17 11:50:58 +0100 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2015-02-17 11:50:58 +0100 |
commit | 67e9afa30c73daa260343d4c3638610f4c70980a (patch) | |
tree | ca5ba63f90d97e18f51238f3818294e3a5e3d3a4 /cpp/src/slice2java | |
parent | IceLocatorDiscovery Makefile fix (diff) | |
download | ice-67e9afa30c73daa260343d4c3638610f4c70980a.tar.bz2 ice-67e9afa30c73daa260343d4c3638610f4c70980a.tar.xz ice-67e9afa30c73daa260343d4c3638610f4c70980a.zip |
Fixed ICE-6269: tolerate null values for structs and enums
Diffstat (limited to 'cpp/src/slice2java')
-rw-r--r-- | cpp/src/slice2java/Gen.cpp | 71 |
1 files changed, 69 insertions, 2 deletions
diff --git a/cpp/src/slice2java/Gen.cpp b/cpp/src/slice2java/Gen.cpp index f4443814e3f..50700977c11 100644 --- a/cpp/src/slice2java/Gen.cpp +++ b/cpp/src/slice2java/Gen.cpp @@ -4010,6 +4010,49 @@ Slice::Gen::TypesVisitor::visitStructEnd(const StructPtr& p) } out << eb; } + + out << sp << nl << "static public void" << nl << "__write(IceInternal.BasicStream __os, " << name << " __v)"; + out << sb; + out << nl << "if(__v == null)"; + out << sb; + out << nl << "__nullMarshalValue.__write(__os);"; + out << eb; + out << nl << "else"; + out << sb; + out << nl << "__v.__write(__os);"; + out << eb; + out << eb; + + out << sp << nl << "static public " << name << nl << "__readNew(IceInternal.BasicStream __is)"; + out << sb; + out << nl << name << " __v = new " << name << "();"; + out << nl << "__v.__read(__is);"; + out << nl << "return __v;"; + out << eb; + + if(_stream) + { + out << sp << nl << "static public void" << nl << "ice_write(Ice.OutputStream __outS, " << name << " __v)"; + out << sb; + out << nl << "if(__v == null)"; + out << sb; + out << nl << "__nullMarshalValue.ice_write(__outS);"; + out << eb; + out << nl << "else"; + out << sb; + out << nl << "__v.ice_write(__outS);"; + out << eb; + out << eb; + + out << sp << nl << "static public " << name << nl << "ice_readNew(Ice.InputStream __inS)"; + out << sb; + out << nl << name << " __v = new " << name << "();"; + out << nl << "__v.ice_read(__inS);"; + out << nl << "return __v;"; + out << eb; + } + + out << nl << nl << "private static final " << name << " __nullMarshalValue = new " << name << "();"; } out << sp << nl << "public static final long serialVersionUID = "; @@ -4383,6 +4426,19 @@ Slice::Gen::TypesVisitor::visitEnum(const EnumPtr& p) out << nl << "__os.writeEnum(value(), " << p->maxValue() << ");"; out << eb; + out << sp << nl << "public static void" << nl << "__write(IceInternal.BasicStream __os, " << name << " __v)"; + out << sb; + out << nl << "if(__v == null)"; + out << sb; + string firstEnum = fixKwd(enumerators.front()->name()); + out << nl << "__os.writeEnum(" << absolute << '.' << firstEnum << ".value(), " << p->maxValue() << ");"; + out << eb; + out << nl << "else"; + out << sb; + out << nl << "__os.writeEnum(__v.value(), " << p->maxValue() << ");"; + out << eb; + out << eb; + out << sp << nl << "public static " << name << nl << "__read(IceInternal.BasicStream __is)"; out << sb; out << nl << "int __v = __is.readEnum(" << p->maxValue() << ");"; @@ -4396,6 +4452,18 @@ Slice::Gen::TypesVisitor::visitEnum(const EnumPtr& p) out << nl << "__outS.writeEnum(value(), " << p->maxValue() << ");"; out << eb; + out << sp << nl << "public static void" << nl << "ice_write(Ice.OutputStream __outS, " << name << " __v)"; + out << sb; + out << nl << "if(__v == null)"; + out << sb; + out << nl << "__outS.writeEnum(" << absolute << '.' << firstEnum << ".value(), " << p->maxValue() << ");"; + out << eb; + out << nl << "else"; + out << sb; + out << nl << "__outS.writeEnum(__v.value(), " << p->maxValue() << ");"; + out << eb; + out << eb; + out << sp << nl << "public static " << name << nl << "ice_read(Ice.InputStream __inS)"; out << sb; out << nl << "int __v = __inS.readEnum(" << p->maxValue() << ");"; @@ -4752,7 +4820,7 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p) out << sb; if(op->returnsData()) { - out << nl << "IceInternal.OutgoingAsync __result = IceInternal.OutgoingAsync.check(__iresult, this, __" + out << nl << "IceInternal.OutgoingAsync __result = IceInternal.OutgoingAsync.check(__iresult, this, __" << op->name() << "_name);"; out << nl << "try"; out << sb; @@ -6744,4 +6812,3 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p) } } } - |