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);