(svn r13511) [NoAI] -Fix: add a reference to objects given in Valuate(), so they remain valid during their usage. This allows nameless functions (lambda functions) in Valuate() on long lists. noai
authortruebrain
Fri, 13 Jun 2008 19:57:25 +0000
branchnoai
changeset 10957 7a140b4cd91d
parent 10956 82aa600a9922
child 10958 65088d587094
(svn r13511) [NoAI] -Fix: add a reference to objects given in Valuate(), so they remain valid during their usage. This allows nameless functions (lambda functions) in Valuate() on long lists.
bin/ai/regression/regression.nut
bin/ai/regression/regression.txt
src/ai/api/ai_abstractlist.cpp
--- a/bin/ai/regression/regression.nut	Fri Jun 13 19:12:55 2008 +0000
+++ b/bin/ai/regression/regression.nut	Fri Jun 13 19:57:25 2008 +0000
@@ -521,6 +521,11 @@
 	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
 		print("    " + i + " => " + list.GetValue(i));
 	}
+	list.Valuate(function (a) { return a * 42; });
+	print("  Custom ListDump:");
+	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+		print("    " + i + " => " + list.GetValue(i));
+	}
 	list.Valuate(AIBase.RandItem);
 	print("  Randomize ListDump:");
 	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
--- a/bin/ai/regression/regression.txt	Fri Jun 13 19:12:55 2008 +0000
+++ b/bin/ai/regression/regression.txt	Fri Jun 13 19:57:25 2008 +0000
@@ -245,6 +245,108 @@
     1097 => 4764271
     1098 => 4768614
     1099 => 4772957
+  Custom ListDump:
+    1 => 42
+    2 => 84
+    1000 => 42000
+    1001 => 42042
+    1002 => 42084
+    1003 => 42126
+    1004 => 42168
+    1005 => 42210
+    1006 => 42252
+    1007 => 42294
+    1008 => 42336
+    1009 => 42378
+    1010 => 42420
+    1011 => 42462
+    1012 => 42504
+    1013 => 42546
+    1014 => 42588
+    1015 => 42630
+    1016 => 42672
+    1017 => 42714
+    1018 => 42756
+    1019 => 42798
+    1020 => 42840
+    1021 => 42882
+    1022 => 42924
+    1023 => 42966
+    1024 => 43008
+    1025 => 43050
+    1026 => 43092
+    1027 => 43134
+    1028 => 43176
+    1029 => 43218
+    1030 => 43260
+    1031 => 43302
+    1032 => 43344
+    1033 => 43386
+    1034 => 43428
+    1035 => 43470
+    1036 => 43512
+    1037 => 43554
+    1038 => 43596
+    1039 => 43638
+    1040 => 43680
+    1041 => 43722
+    1042 => 43764
+    1043 => 43806
+    1044 => 43848
+    1045 => 43890
+    1046 => 43932
+    1047 => 43974
+    1048 => 44016
+    1049 => 44058
+    1051 => 44142
+    1052 => 44184
+    1053 => 44226
+    1054 => 44268
+    1055 => 44310
+    1056 => 44352
+    1057 => 44394
+    1058 => 44436
+    1059 => 44478
+    1060 => 44520
+    1061 => 44562
+    1062 => 44604
+    1063 => 44646
+    1064 => 44688
+    1065 => 44730
+    1066 => 44772
+    1067 => 44814
+    1068 => 44856
+    1069 => 44898
+    1070 => 44940
+    1071 => 44982
+    1072 => 45024
+    1073 => 45066
+    1074 => 45108
+    1075 => 45150
+    1076 => 45192
+    1077 => 45234
+    1078 => 45276
+    1079 => 45318
+    1080 => 45360
+    1081 => 45402
+    1082 => 45444
+    1083 => 45486
+    1084 => 45528
+    1085 => 45570
+    1086 => 45612
+    1087 => 45654
+    1088 => 45696
+    1089 => 45738
+    1090 => 45780
+    1091 => 45822
+    1092 => 45864
+    1093 => 45906
+    1094 => 45948
+    1095 => 45990
+    1096 => 46032
+    1097 => 46074
+    1098 => 46116
+    1099 => 46158
   Randomize ListDump:
     1 => -1893761951
     2 => -1937566705
--- a/src/ai/api/ai_abstractlist.cpp	Fri Jun 13 19:12:55 2008 +0000
+++ b/src/ai/api/ai_abstractlist.cpp	Fri Jun 13 19:57:25 2008 +0000
@@ -556,10 +556,13 @@
 		return -1;
 	}
 
+	sq_addref(vm, &obj_func);
+
 	/* Read the params */
 	HSQOBJECT *obj_params = AllocaM(HSQOBJECT, nparam);
 	for (int i = 0; i < nparam; i++) {
 		sq_getstackobj(vm, i + 3, &obj_params[i]);
+		sq_addref(vm, &obj_params[i]);
 	}
 	/* Remove all unneeded stuff */
 	sq_pop(vm, nparam + 1);
@@ -595,6 +598,10 @@
 			} break;
 
 			default: {
+				sq_pop(vm, 3);
+				sq_release(vm, &obj_func);
+				for (int i = 0; i < nparam; i++) sq_release(vm, &obj_params[i]);
+
 				sq_throwerror(vm, _SC("return value of valuator is not valid (not integer/bool)"));
 				return -1;
 			}
@@ -602,9 +609,11 @@
 		/* Remove junk */
 		sq_pop(vm, 2);
 
-		(*iter).second = value;
-		this->buckets[value].insert((*iter).first);
+		(*iter).second = (int32)value;
+		this->buckets[(int32)value].insert((*iter).first);
 	}
 
+	sq_release(vm, &obj_func);
+	for (int i = 0; i < nparam; i++) sq_release(vm, &obj_params[i]);
 	return 0;
 }