Fix group assignments in the config parser.

Fixes #5090
This commit is contained in:
Gunnar Beutner 2013-11-17 20:50:56 +01:00
parent 05a4c090c2
commit d88268bd77
2 changed files with 37 additions and 3 deletions

View File

@ -35,6 +35,37 @@ Expression::Expression(const String& key, ExpressionOperator op,
ASSERT(op != OperatorExecute || value.IsObjectType<ExpressionList>()); ASSERT(op != OperatorExecute || value.IsObjectType<ExpressionList>());
} }
Value Expression::DeepClone(const Value& value)
{
if (value.IsObjectType<Array>()) {
Array::Ptr array = value;
Array::Ptr result = make_shared<Array>();
ObjectLock olock(array);
BOOST_FOREACH(const Value& item, array) {
result->Add(DeepClone(item));
}
return result;
} else if (value.IsObjectType<Dictionary>()) {
Dictionary::Ptr dict = value;
Dictionary::Ptr result = make_shared<Dictionary>();
ObjectLock olock(dict);
String key;
Value item;
BOOST_FOREACH(boost::tuples::tie(key, item), dict) {
result->Set(key, DeepClone(item));
}
return result;
}
return value;
}
void Expression::Execute(const Dictionary::Ptr& dictionary) const void Expression::Execute(const Dictionary::Ptr& dictionary) const
{ {
Value oldValue, newValue; Value oldValue, newValue;
@ -75,6 +106,8 @@ void Expression::Execute(const Dictionary::Ptr& dictionary) const
dict = make_shared<Dictionary>(); dict = make_shared<Dictionary>();
valueExprl->Execute(dict); valueExprl->Execute(dict);
newValue = dict; newValue = dict;
} else {
newValue = DeepClone(newValue);
} }
break; break;
@ -104,7 +137,7 @@ void Expression::Execute(const Dictionary::Ptr& dictionary) const
String key; String key;
Value value; Value value;
BOOST_FOREACH(boost::tie(key, value), valueDict) { BOOST_FOREACH(boost::tie(key, value), valueDict) {
dict->Set(key, value); dict->Set(key, DeepClone(value));
} }
newValue = dict; newValue = dict;
@ -112,11 +145,10 @@ void Expression::Execute(const Dictionary::Ptr& dictionary) const
if (!array) if (!array)
array = make_shared<Array>(); array = make_shared<Array>();
ObjectLock olock(valueArray); ObjectLock olock(valueArray);
BOOST_FOREACH(const Value& value, valueArray) { BOOST_FOREACH(const Value& value, valueArray) {
array->Add(value); array->Add(DeepClone(value));
} }
newValue = array; newValue = array;

View File

@ -73,6 +73,8 @@ private:
ExpressionOperator m_Operator; ExpressionOperator m_Operator;
Value m_Value; Value m_Value;
DebugInfo m_DebugInfo; DebugInfo m_DebugInfo;
static Value DeepClone(const Value& value);
}; };
} }