Previously calling function assigned to variable was done with invalid context.
This patch changes context to correct.
Change-Id: Ifbc074c5eca747411c6613d8b3057fa969d763a4
ASSERT(parent);
current = this;
globalContext = this->parent->globalContext;
+ this->data->parent = parent->data;
+}
+
+EvaluationContext::EvaluationContext(std::shared_ptr<Data> data) : parent(current)
+{
+ current = this;
+ globalContext = this->parent->globalContext;
+ this->data->parent = data;
}
EvaluationContext::~EvaluationContext()
current = parent;
}
+std::shared_ptr<EvaluationContext::Data> EvaluationContext::getData() const
+{
+ return data;
+}
+
void EvaluationContext::initializeGlobalContext(ExecutorInterface &ei)
{
globalContext = std::make_shared<GlobalContext>(GlobalContext{ ei });
void EvaluationContext::setVariable(const std::string &ident, EvaluationValue val)
{
- variables[ident] = std::move(val);
+ data->variables[ident] = std::move(val);
}
EvaluationValue EvaluationContext::getVariable(const Optional<TokenLocation> &loc, const std::string &ident)
{
- EvaluationContext *self = this;
+ auto self = data;
while (self) {
auto it = self->variables.find(ident);
if (it != self->variables.end()) return it->second;
{
throw EvaluationFailure{} << "getVariableByName not implemeneted";
}
-
class EvaluationContext
{
struct GlobalContext;
+
public:
+ struct Data {
+ std::unordered_map<std::string, EvaluationValue> variables;
+ std::shared_ptr<Data> parent;
+ };
+
explicit EvaluationContext(ExecutorInterface &ei);
+ explicit EvaluationContext(std::shared_ptr<Data> data);
explicit EvaluationContext();
~EvaluationContext();
EvaluationContext &operator = (const EvaluationContext &) = delete;
EvaluationContext &operator = (EvaluationContext &&) = delete;
+ std::shared_ptr<Data> getData() const;
+
/**
* @brief Sets variable
*
private:
void initializeGlobalContext(ExecutorInterface &ei);
- std::unordered_map<std::string, EvaluationValue> variables;
+ std::shared_ptr<Data> data = std::make_shared<Data>();
EvaluationContext *parent = nullptr;
std::shared_ptr<GlobalContext> globalContext;
std::vector<const std::string *> batchPathStack;
void FunctionEvaluator::evaluateImpl() const
{
+ auto data = EvaluationContext::getCurrentEvaluationContext().getData();
EvaluationContext::getCurrentEvaluationContext().setVariable(functionName,
EvaluationValueFunction {[ = ](EvaluationValueFunction::Args args) -> EvaluationValue {
if (this->argNames.size() != args.size())
throw EvaluationFailure{} << "invalid number of arguments";
- EvaluationContext ctx;
+ EvaluationContext ctx(data);
for (auto i = 0u; i < args.size(); ++i)
{
ctx.setVariable(argNames[i], args[i]);
{ "a2" },
} };
+ int expected = 0;
+ exec.variables["sth"] = EvaluationValueFunction {
+ [&](int a1) -> EvaluationValue {
+ expected = a1;
+ return a1;
+ }, {
+ { "a1" },
+ } };
+
ASSERT_NO_THROW(
executeWithInfo(
"def myFunc() {\n"
"{\n"
" return 12\n"
"}\n", ec, false), ReturnValue);
+
+ ASSERT_NO_THROW(
+ executeWithInfo(
+ "def myFunc() {\n"
+ " def myFunc3(a) {\n"
+ " sth(a)\n"
+ " }\n"
+ " def myFunc2(a) {\n"
+ " myFunc3(a)\n"
+ " }\n"
+ " return myFunc2\n"
+ "}\n"
+ "tmp = myFunc()\n"
+ "tmp(13)\n", ec)
+ );
+ ASSERT_EQ(expected, 13);
}
int main(int argc, char *argv[])
return 1;
}
}
-