From 7086b44d3ab5b8d034ba594942501f395d636ffc Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 24 Mar 2014 09:10:37 +0100 Subject: [PATCH] Fix variable scoping. Refs #5846 --- lib/config/aexpression.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/config/aexpression.cpp b/lib/config/aexpression.cpp index 5e8add22c..8abb64990 100644 --- a/lib/config/aexpression.cpp +++ b/lib/config/aexpression.cpp @@ -152,10 +152,16 @@ Value AExpression::OpLiteral(const AExpression *expr, const Dictionary::Ptr& loc Value AExpression::OpVariable(const AExpression *expr, const Dictionary::Ptr& locals) { - if (locals && locals->Contains(expr->m_Operand1)) - return locals->Get(expr->m_Operand1); - else - return ScriptVariable::Get(expr->m_Operand1); + Dictionary::Ptr scope = locals; + + while (scope) { + if (scope->Contains(expr->m_Operand1)) + return scope->Get(expr->m_Operand1); + + scope = scope->Get("__parent"); + } + + return ScriptVariable::Get(expr->m_Operand1); } Value AExpression::OpNegate(const AExpression *expr, const Dictionary::Ptr& locals) @@ -306,12 +312,16 @@ Value AExpression::OpDict(const AExpression *expr, const Dictionary::Ptr& locals bool in_place = expr->m_Operand2; Dictionary::Ptr result = make_shared(); + result->Set("__parent", locals); + if (arr) { BOOST_FOREACH(const AExpression::Ptr& aexpr, arr) { aexpr->Evaluate(in_place ? locals : result); } } + result->Remove("__parent"); + return result; }