diff --git a/src/factory/Convert.cpp b/src/factory/Convert.cpp index 026ccfe..71ea96e 100644 --- a/src/factory/Convert.cpp +++ b/src/factory/Convert.cpp @@ -448,6 +448,8 @@ bool Convert::isCopyUnionCompatible( return *(from.get()) == *(to.get()); } +static PVDataCreatePtr pvDataCreate = getPVDataCreate(); + void Convert::copyUnion(PVUnionPtr const & from, PVUnionPtr const & to) { if(to->isImmutable()) { @@ -462,14 +464,27 @@ void Convert::copyUnion(PVUnionPtr const & from, PVUnionPtr const & to) PVFieldPtr fromValue = from->get(); if (from->getUnion()->isVariant()) { - to->set(from->get()); + if (fromValue.get() == 0) + to->set(PVField::shared_pointer()); + else + { + PVFieldPtr toValue = to->get(); + if (toValue.get() == 0 || *toValue->getField() != *fromValue->getField()) + { + toValue = pvDataCreate->createPVField(fromValue->getField()); + to->set(toValue); + } + copy(fromValue, toValue); + } } else { if (fromValue.get() == 0) to->select(PVUnion::UNDEFINED_INDEX); else - to->set(from->getSelectedIndex(),from->get()); + { + copy(fromValue, to->select(from->getSelectedIndex())); + } } } diff --git a/src/factory/PVStructureArray.cpp b/src/factory/PVStructureArray.cpp index 1536ad5..ffb5a37 100644 --- a/src/factory/PVStructureArray.cpp +++ b/src/factory/PVStructureArray.cpp @@ -179,7 +179,7 @@ void PVStructureArray::deserialize(ByteBuffer *pbuffer, data[i].reset(); } else { - if(data[i].get()==NULL) { + if(data[i].get()==NULL || !data[i].unique()) { data[i] = pvDataCreate->createPVStructure(structure); } data[i]->deserialize(pbuffer, pcontrol); diff --git a/src/factory/PVUnionArray.cpp b/src/factory/PVUnionArray.cpp index 0239ec1..ed516c6 100644 --- a/src/factory/PVUnionArray.cpp +++ b/src/factory/PVUnionArray.cpp @@ -178,7 +178,7 @@ void PVUnionArray::deserialize(ByteBuffer *pbuffer, data[i].reset(); } else { - if(data[i].get()==NULL) { + if(data[i].get()==NULL || !data[i].unique()) { data[i] = pvDataCreate->createPVUnion(punion); } data[i]->deserialize(pbuffer, pcontrol);