Allow to iterate over generators

This commit is contained in:
Alexander A. Klimov 2020-01-28 10:14:11 +01:00
parent cbd94e060d
commit c4ce4010d1

View File

@ -11,6 +11,7 @@
#include "base/debuginfo.hpp"
#include "base/array.hpp"
#include "base/dictionary.hpp"
#include "base/generator.hpp"
#include "base/namespace.hpp"
#include "base/function.hpp"
#include "base/scriptglobal.hpp"
@ -18,6 +19,7 @@
#include "base/convert.hpp"
#include "base/objectlock.hpp"
#include <map>
#include <utility>
#include <vector>
namespace icinga
@ -187,6 +189,18 @@ public:
ExpressionResult res = expression->Evaluate(frame);
CHECK_RESULT_LOOP(res);
}
} else if (value.IsObjectType<Generator>()) {
if (!fvvar.IsEmpty())
BOOST_THROW_EXCEPTION(ScriptError("Cannot use dictionary iterator for generator.", debugInfo));
Generator::Ptr gen = value;
Value buf;
while (gen->GetNext(buf)) {
frame.Locals->Set(fkvar, std::move(buf));
ExpressionResult res = expression->Evaluate(frame);
CHECK_RESULT_LOOP(res);
}
} else if (value.IsObjectType<Dictionary>()) {
if (fvvar.IsEmpty())
BOOST_THROW_EXCEPTION(ScriptError("Cannot use array iterator for dictionary.", debugInfo));