Fix deadlock in VMOps::For

fixes #8236
This commit is contained in:
Gunnar Beutner 2015-01-16 08:40:19 +01:00
parent 1952d7c844
commit a1734e3051
1 changed files with 13 additions and 17 deletions

View File

@ -137,19 +137,8 @@ public:
Array::Ptr arr = value; Array::Ptr arr = value;
ObjectLock olock(arr); for (Array::SizeType i = 0; i < arr->GetLength(); i++) {
BOOST_FOREACH(const Value& value, arr) { frame.Locals->Set(fkvar, arr->Get(i));
frame.Locals->Set(fkvar, value);
expression->Evaluate(frame);
}
} else if (value.IsString()) {
if (!fvvar.IsEmpty())
BOOST_THROW_EXCEPTION(ScriptError("Cannot use dictionary iterator for string.", debugInfo));
String str = value;
BOOST_FOREACH(char ch, str) {
frame.Locals->Set(fkvar, String(1, ch));
expression->Evaluate(frame); expression->Evaluate(frame);
} }
} else if (value.IsObjectType<Dictionary>()) { } else if (value.IsObjectType<Dictionary>()) {
@ -157,11 +146,18 @@ public:
BOOST_THROW_EXCEPTION(ScriptError("Cannot use array iterator for dictionary.", debugInfo)); BOOST_THROW_EXCEPTION(ScriptError("Cannot use array iterator for dictionary.", debugInfo));
Dictionary::Ptr dict = value; Dictionary::Ptr dict = value;
std::vector<String> keys;
ObjectLock olock(dict); {
BOOST_FOREACH(const Dictionary::Pair& kv, dict) { ObjectLock olock(dict);
frame.Locals->Set(fkvar, kv.first); BOOST_FOREACH(const Dictionary::Pair& kv, dict) {
frame.Locals->Set(fvvar, kv.second); keys.push_back(kv.first);
}
}
BOOST_FOREACH(const String& key, keys) {
frame.Locals->Set(fkvar, key);
frame.Locals->Set(fvvar, dict->Get(key));
expression->Evaluate(frame); expression->Evaluate(frame);
} }
} else } else