diff options
Diffstat (limited to 'cpp/src/Slice/CsUtil.cpp')
-rwxr-xr-x | cpp/src/Slice/CsUtil.cpp | 46 |
1 files changed, 37 insertions, 9 deletions
diff --git a/cpp/src/Slice/CsUtil.cpp b/cpp/src/Slice/CsUtil.cpp index c5ef9a41d29..2e392648a50 100755 --- a/cpp/src/Slice/CsUtil.cpp +++ b/cpp/src/Slice/CsUtil.cpp @@ -1066,21 +1066,49 @@ Slice::CsGenerator::writeSequenceMarshalUnmarshalCode(Output& out, string call; if(isGeneric && !isList && !isStack) { - call = "e__.Current."; - call += streamingAPI ? "ice_write" : "write__"; - call += "(" + stream + ");"; + if(isValueType(type)) + { + call = "e__.Current"; + } + else + { + call = "(e__.Current == null ? new "; + call += typeS + "() : e__.Current)"; + } } else { - call = param; - if(isStack) + if(isValueType(type)) + { + call = param; + if(isStack) + { + call += "_tmp"; + } + } + else + { + call = "("; + call += param; + if(isStack) + { + call += "_tmp"; + } + call += " == null ? new " + typeS + "() : " + param; + if(isStack) + { + call += "_tmp"; + } + } + call += "[ix__]"; + if(!isValueType(type)) { - call += "_tmp"; + call += ")"; } - call += "[ix__]."; - call += streamingAPI ? "ice_write" : "write__"; - call += "(" + stream + ");"; } + call += "."; + call += streamingAPI ? "ice_write" : "write__"; + call += "(" + stream + ");"; out << nl << call; out << eb; out << eb; |