From 6ebfa6db6118300dbaa4c415e9ebe7a93bc34526 Mon Sep 17 00:00:00 2001 From: Owen Green Date: Fri, 11 Sep 2020 21:01:44 +0100 Subject: [PATCH] Avoid trying to read into objects before their constructor has run --- include/FluidSCWrapper.hpp | 90 +++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 46 deletions(-) diff --git a/include/FluidSCWrapper.hpp b/include/FluidSCWrapper.hpp index 069dfcc..96eac50 100644 --- a/include/FluidSCWrapper.hpp +++ b/include/FluidSCWrapper.hpp @@ -689,7 +689,7 @@ struct LifetimePolicy { FloatControlsIter controlsReader{unit->mInBuf + Wrapper::ControlOffset(unit),Wrapper::ControlSize(unit)}; auto params = typename Wrapper::ParamSetType{Client::getParameterDescriptors()}; - Wrapper::setParams(unit, params, controlsReader,true); + Wrapper::setParams(unit, params, controlsReader,true,false); Client client{params}; new (static_cast(unit)) Wrapper(std::move(controlsReader), std::move(client), std::move(params)); } @@ -726,7 +726,7 @@ struct LifetimePolicy std::cout << "ERROR: ID " << uid << "is already being used by the cache" << std::endl; return; } - Wrapper::setParams(unit, entry.params,controlsReader,true); + Wrapper::setParams(unit, entry.params,controlsReader,true,false); new (static_cast(unit)) Wrapper{std::move(controlsReader),std::move(client),std::move(params)}; static_cast(unit)->uid = uid; entry.leased = true; @@ -794,7 +794,7 @@ struct LifetimePolicy FloatControlsIter controlsReader{unit->mInBuf + Wrapper::ControlOffset(unit),Wrapper::ControlSize(unit)}; auto params = typename Client::ParamSetType{Client::getParameterDescriptors()}; - Wrapper::setParams(unit, params,controlsReader,true); + Wrapper::setParams(unit, params,controlsReader,true,false); auto& name = params.template get<0>(); @@ -1560,61 +1560,59 @@ public: } static auto& setParams(Unit* x, ParamSetType& p, - FloatControlsIter& inputs, bool constrain = false) + FloatControlsIter& inputs, bool constrain = false, bool initialized = true) { - //TODO: Regain this robustness if possible? - // We won't even try and set params if the arguments don't match - // if (inputs.size() == C::getParameterDescriptors().count()) - // { - FluidSCWrapper* w = static_cast(x); - bool verbose = w->mWorld->mVerbosity > 0; - p.template setParameterValuesRT(verbose ? &w->mReportage : nullptr , x, inputs); - if (constrain) p.constrainParameterValuesRT(verbose ? &w->mReportage : nullptr); - if(verbose) + bool verbose = x->mWorld->mVerbosity > 0; + + using Reportage = decltype(static_cast(x)->mReportage); + + Reportage* reportage = initialized ? &(static_cast(x)->mReportage) : new Reportage(); + + p.template setParameterValuesRT(verbose ? reportage: nullptr , x, inputs); + if (constrain) p.constrainParameterValuesRT(verbose ? reportage : nullptr); + if(verbose) + { + for(auto& r:*reportage) { - for(auto& r:w->mReportage) if(!r.ok()) - { - printResult(w->state(), r); - } + if(!r.ok()) printResult(&x->mParent->mNode, r); } -// p.template forEachParam(x,inputs, - - // } - // else - // { - // std::cout << "ERROR: " << getName() - // << ": parameter count mismatch. Perhaps your binary plugins " - // "and SC sources are different versions" - // << std::endl; - // } - + } + if(!initialized) delete reportage; return p; } static void printResult(SharedState& x, Result& r) { if (!x.get() || !x->mNodeAlive) return; - + FluidSCWrapper::printResult(x->mNode, r); + } + + static void printResult(Node* x, Result& r) + { switch (r.status()) { - case Result::Status::kWarning: { - if (x->mNode->mWorld->mVerbosity > 0) - std::cout << "WARNING: " << r.message().c_str() << '\n'; - break; - } - case Result::Status::kError: { - std::cout << "ERROR: " << r.message().c_str() << '\n'; - break; - } - case Result::Status::kCancelled: { - std::cout << "Task cancelled\n" << '\n'; - break; - } - default: { - } - } + case Result::Status::kWarning: + { + if (x->mWorld->mVerbosity > 0) + std::cout << "WARNING: " << r.message().c_str() << '\n'; + break; + } + case Result::Status::kError: + { + std::cout << "ERROR: " << r.message().c_str() << '\n'; + break; + } + case Result::Status::kCancelled: + { + std::cout << "Task cancelled\n" << '\n'; + break; + } + default: + { + } + } } - + auto& client() { return mState->client; } auto& params() { return mState->params; }