diff --git a/src/json/parseinto.cpp b/src/json/parseinto.cpp index 00bb25c..e433cc3 100644 --- a/src/json/parseinto.cpp +++ b/src/json/parseinto.cpp @@ -68,18 +68,28 @@ void valueAssign(context *self, typename PVScalarT::value_type val) // structure at the top of the stack } else if(type==pvd::scalarArray) { - PVArrayT* arrfld(dynamic_cast(back.fld.get())); - if(!arrfld) - throw std::invalid_argument("wrong type for scalar array"); + pvd::PVScalarArray *fld(static_cast(back.fld.get())); - typename PVArrayT::const_svector carr; - arrfld->swap(carr); + pvd::shared_vector carr; + fld->getAs(carr); - typename PVArrayT::svector arr(pvd::thaw(carr)); + switch(carr.original_type()) + { +#define CASE_STRING +#define CASE_REAL_INT64 +#define CASE(BASETYPE, PVATYPE, DBFTYPE, PVACODE) case epics::pvData::pv##PVACODE: { \ + pvd::shared_vector arr(pvd::static_shared_vector_cast(carr)); \ + pvd::shared_vector tarr(pvd::thaw(arr)); \ + tarr.push_back(pvd::castUnsafe(val)); \ + carr = pvd::static_shared_vector_cast(pvd::freeze(tarr)); \ + } break; +#include +#undef CASE +#undef CASE_REAL_INT64 +#undef CASE_STRING + } - arr.push_back(val); - - arrfld->replace(pvd::freeze(arr)); + fld->putFrom(carr); // leave array field at top of stack