Mercurial > hg > openttd
changeset 14779:7e7acca9c232 draft
(svn r19367) -Fix [FS#3665]: List valuator could cause invalid iterators.
author | frosch <frosch@openttd.org> |
---|---|
date | Sun, 07 Mar 2010 17:24:07 +0000 |
parents | 9b5bbac35346 |
children | f43f5b63ba6d |
files | src/ai/api/ai_abstractlist.cpp |
diffstat | 1 files changed, 5 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ai/api/ai_abstractlist.cpp +++ b/src/ai/api/ai_abstractlist.cpp @@ -784,13 +784,10 @@ /* Push the function to call */ sq_push(vm, 2); - /* Walk all items, and query the result */ - this->buckets.clear(); + for (AIAbstractListMap::iterator iter = this->items.begin(); iter != this->items.end(); iter++) { + /* Check for changing of items. */ + int previous_modification_count = this->modifications; - /* Check for changing of items. */ - int begin_modification_count = this->modifications; - - for (AIAbstractListMap::iterator iter = this->items.begin(); iter != this->items.end(); iter++) { /* Push the root table as instance object, this is what squirrel does for meta-functions. */ sq_pushroottable(vm); /* Push all arguments for the valuator function. */ @@ -828,7 +825,7 @@ } /* Was something changed? */ - if (begin_modification_count != this->modifications) { + if (previous_modification_count != this->modifications) { /* See below for explanation. The extra pop is the return value. */ sq_pop(vm, nparam + 4); @@ -836,8 +833,7 @@ return sq_throwerror(vm, _SC("modifying valuated list outside of valuator function")); } - (*iter).second = (int32)value; - this->buckets[(int32)value].insert((*iter).first); + this->SetValue((*iter).first, value); /* Pop the return value. */ sq_poptop(vm);