src/squirrel_helper.hpp
branchnoai
changeset 10734 06f95974ac15
parent 10722 6ea1daff57aa
child 10992 4dd4f4327c3a
--- a/src/squirrel_helper.hpp	Tue May 27 08:16:43 2008 +0000
+++ b/src/squirrel_helper.hpp	Tue May 27 09:52:05 2008 +0000
@@ -14,8 +14,13 @@
  * The Squirrel convert routines
  */
 namespace SQConvert {
-	struct SQConvertedStrings : SmallVector<char *, 1> {
-		~SQConvertedStrings()
+	/**
+	 * Pointers assigned to this class will be free'd when this instance
+	 *  comes out of scope. Useful to make sure you can use strdup(),
+	 *  without leaking memory.
+	 */
+	struct SQAutoFreePointers : SmallVector<void *, 1> {
+		~SQAutoFreePointers()
 		{
 			for (uint i = 0; i < this->items; i++) free(this->data[i]);
 		}
@@ -78,17 +83,17 @@
 	/**
 	 * To get a param from squirrel, we call this function. It converts to the right format.
 	 */
-	template <typename T> static T GetParam(ForceType<T>, HSQUIRRELVM vm, int index, SQConvertedStrings *str);
+	template <typename T> static T GetParam(ForceType<T>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr);
 
-	template <> inline uint8       GetParam(ForceType<uint8>       , HSQUIRRELVM vm, int index, SQConvertedStrings *str) { SQInteger     tmp; sq_getinteger    (vm, index, &tmp); return tmp; }
-	template <> inline uint16      GetParam(ForceType<uint16>      , HSQUIRRELVM vm, int index, SQConvertedStrings *str) { SQInteger     tmp; sq_getinteger    (vm, index, &tmp); return tmp; }
-	template <> inline uint32      GetParam(ForceType<uint32>      , HSQUIRRELVM vm, int index, SQConvertedStrings *str) { SQInteger     tmp; sq_getinteger    (vm, index, &tmp); return tmp; }
-	template <> inline int8        GetParam(ForceType<int8>        , HSQUIRRELVM vm, int index, SQConvertedStrings *str) { SQInteger     tmp; sq_getinteger    (vm, index, &tmp); return tmp; }
-	template <> inline int16       GetParam(ForceType<int16>       , HSQUIRRELVM vm, int index, SQConvertedStrings *str) { SQInteger     tmp; sq_getinteger    (vm, index, &tmp); return tmp; }
-	template <> inline int32       GetParam(ForceType<int32>       , HSQUIRRELVM vm, int index, SQConvertedStrings *str) { SQInteger     tmp; sq_getinteger    (vm, index, &tmp); return tmp; }
-	template <> inline bool        GetParam(ForceType<bool>        , HSQUIRRELVM vm, int index, SQConvertedStrings *str) { SQBool        tmp; sq_getbool       (vm, index, &tmp); return tmp != 0; }
-	template <> inline const char *GetParam(ForceType<const char *>, HSQUIRRELVM vm, int index, SQConvertedStrings *str) { const SQChar *tmp; sq_getstring     (vm, index, &tmp); char *tmp_str = *str->Append() = strdup(FS2OTTD(tmp)); return tmp_str; }
-	template <> inline void       *GetParam(ForceType<void *>      , HSQUIRRELVM vm, int index, SQConvertedStrings *str) { SQUserPointer tmp; sq_getuserpointer(vm, index, &tmp); return tmp; }
+	template <> inline uint8       GetParam(ForceType<uint8>       , HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger     tmp; sq_getinteger    (vm, index, &tmp); return tmp; }
+	template <> inline uint16      GetParam(ForceType<uint16>      , HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger     tmp; sq_getinteger    (vm, index, &tmp); return tmp; }
+	template <> inline uint32      GetParam(ForceType<uint32>      , HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger     tmp; sq_getinteger    (vm, index, &tmp); return tmp; }
+	template <> inline int8        GetParam(ForceType<int8>        , HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger     tmp; sq_getinteger    (vm, index, &tmp); return tmp; }
+	template <> inline int16       GetParam(ForceType<int16>       , HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger     tmp; sq_getinteger    (vm, index, &tmp); return tmp; }
+	template <> inline int32       GetParam(ForceType<int32>       , HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger     tmp; sq_getinteger    (vm, index, &tmp); return tmp; }
+	template <> inline bool        GetParam(ForceType<bool>        , HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQBool        tmp; sq_getbool       (vm, index, &tmp); return tmp != 0; }
+	template <> inline const char *GetParam(ForceType<const char *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { const SQChar *tmp; sq_getstring     (vm, index, &tmp); char *tmp_str = strdup(FS2OTTD(tmp)); *ptr->Append() = (void *)tmp_str; return tmp_str; }
+	template <> inline void       *GetParam(ForceType<void *>      , HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer tmp; sq_getuserpointer(vm, index, &tmp); return tmp; }
 
 	/**
 	* Helper class to recognize the function type (retval type, args) and use the proper specialization
@@ -155,9 +160,9 @@
 	struct HelperT<Tretval (*)(Targ1), false> {
 		static int SQCall(void *instance, Tretval (*func)(Targ1), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			Tretval ret = (*func)(
-				GetParam(ForceType<Targ1>(), vm, 2,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr)
 			);
 			sq_pop(vm, 1);
 			return Return(vm, ret);
@@ -171,9 +176,9 @@
 	struct HelperT<Tretval (*)(Targ1), true> {
 		static int SQCall(void *instance, Tretval (*func)(Targ1), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			(*func)(
-				GetParam(ForceType<Targ1>(), vm, 2,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr)
 			);
 			sq_pop(vm, 1);
 			return 0;
@@ -187,9 +192,9 @@
 	struct HelperT<Tretval (Tcls::*)(Targ1), false> {
 		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(Targ1), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			Tretval ret = (instance->*func)(
-				GetParam(ForceType<Targ1>(), vm, 2,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr)
 			);
 			sq_pop(vm, 1);
 			return Return(vm, ret);
@@ -203,9 +208,9 @@
 	struct HelperT<Tretval (Tcls::*)(Targ1), true> {
 		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(Targ1), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			(instance->*func)(
-				GetParam(ForceType<Targ1>(), vm, 2,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr)
 			);
 			sq_pop(vm, 1);
 			return 0;
@@ -213,9 +218,9 @@
 
 		static Tcls *SQConstruct(Tcls *instance, Tretval (Tcls::*func)(Targ1), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			Tcls *inst = new Tcls(
-				GetParam(ForceType<Targ1>(), vm, 2,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr)
 			);
 
 			return inst;
@@ -229,10 +234,10 @@
 	struct HelperT<Tretval (*)(Targ1, Targ2), false> {
 		static int SQCall(void *instance, Tretval (*func)(Targ1, Targ2), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			Tretval ret = (*func)(
-				GetParam(ForceType<Targ1>(), vm, 2,&str),
-				GetParam(ForceType<Targ2>(), vm, 3,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
+				GetParam(ForceType<Targ2>(), vm, 3, &ptr)
 			);
 			sq_pop(vm, 2);
 			return Return(vm, ret);
@@ -246,10 +251,10 @@
 	struct HelperT<Tretval (*)(Targ1, Targ2), true> {
 		static int SQCall(void *instance, Tretval (*func)(Targ1, Targ2), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			(*func)(
-				GetParam(ForceType<Targ1>(), vm, 2,&str),
-				GetParam(ForceType<Targ2>(), vm, 3,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
+				GetParam(ForceType<Targ2>(), vm, 3, &ptr)
 			);
 			sq_pop(vm, 2);
 			return 0;
@@ -263,10 +268,10 @@
 	struct HelperT<Tretval (Tcls::*)(Targ1, Targ2), false> {
 		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			Tretval ret = (instance->*func)(
-				GetParam(ForceType<Targ1>(), vm, 2,&str),
-				GetParam(ForceType<Targ2>(), vm, 3,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
+				GetParam(ForceType<Targ2>(), vm, 3, &ptr)
 			);
 			sq_pop(vm, 2);
 			return Return(vm, ret);
@@ -280,10 +285,10 @@
 	struct HelperT<Tretval (Tcls::*)(Targ1, Targ2), true> {
 		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			(instance->*func)(
-				GetParam(ForceType<Targ1>(), vm, 2,&str),
-				GetParam(ForceType<Targ2>(), vm, 3,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
+				GetParam(ForceType<Targ2>(), vm, 3, &ptr)
 			);
 			sq_pop(vm, 2);
 			return 0;
@@ -291,10 +296,10 @@
 
 		static Tcls *SQConstruct(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			Tcls *inst = new Tcls(
-				GetParam(ForceType<Targ1>(), vm, 2,&str),
-				GetParam(ForceType<Targ2>(), vm, 3,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
+				GetParam(ForceType<Targ2>(), vm, 3, &ptr)
 			);
 
 			return inst;
@@ -308,11 +313,11 @@
 	struct HelperT<Tretval (*)(Targ1, Targ2, Targ3), false> {
 		static int SQCall(void *instance, Tretval (*func)(Targ1, Targ2, Targ3), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			Tretval ret = (*func)(
-				GetParam(ForceType<Targ1>(), vm, 2,&str),
-				GetParam(ForceType<Targ2>(), vm, 3,&str),
-				GetParam(ForceType<Targ3>(), vm, 4,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
+				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
+				GetParam(ForceType<Targ3>(), vm, 4, &ptr)
 			);
 			sq_pop(vm, 3);
 			return Return(vm, ret);
@@ -326,11 +331,11 @@
 	struct HelperT<Tretval (*)(Targ1, Targ2, Targ3), true> {
 		static int SQCall(void *instance, Tretval (*func)(Targ1, Targ2, Targ3), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			(*func)(
-				GetParam(ForceType<Targ1>(), vm, 2,&str),
-				GetParam(ForceType<Targ2>(), vm, 3,&str),
-				GetParam(ForceType<Targ3>(), vm, 4,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
+				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
+				GetParam(ForceType<Targ3>(), vm, 4, &ptr)
 			);
 			sq_pop(vm, 3);
 			return 0;
@@ -344,11 +349,11 @@
 	struct HelperT<Tretval (Tcls::*)(Targ1, Targ2, Targ3), false> {
 		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2, Targ3), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			Tretval ret = (instance->*func)(
-				GetParam(ForceType<Targ1>(), vm, 2,&str),
-				GetParam(ForceType<Targ2>(), vm, 3,&str),
-				GetParam(ForceType<Targ3>(), vm, 4,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
+				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
+				GetParam(ForceType<Targ3>(), vm, 4, &ptr)
 			);
 			sq_pop(vm, 3);
 			return Return(vm, ret);
@@ -362,11 +367,11 @@
 	struct HelperT<Tretval (Tcls::*)(Targ1, Targ2, Targ3), true> {
 		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2, Targ3), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			(instance->*func)(
-				GetParam(ForceType<Targ1>(), vm, 2,&str),
-				GetParam(ForceType<Targ2>(), vm, 3,&str),
-				GetParam(ForceType<Targ3>(), vm, 4,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
+				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
+				GetParam(ForceType<Targ3>(), vm, 4, &ptr)
 			);
 			sq_pop(vm, 3);
 			return 0;
@@ -374,11 +379,11 @@
 
 		static Tcls *SQConstruct(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2, Targ3), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			Tcls *inst = new Tcls(
-				GetParam(ForceType<Targ1>(), vm, 2,&str),
-				GetParam(ForceType<Targ2>(), vm, 3,&str),
-				GetParam(ForceType<Targ3>(), vm, 4,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
+				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
+				GetParam(ForceType<Targ3>(), vm, 4, &ptr)
 			);
 
 			return inst;
@@ -392,12 +397,12 @@
 	struct HelperT<Tretval (*)(Targ1, Targ2, Targ3, Targ4), false> {
 		static int SQCall(void *instance, Tretval (*func)(Targ1, Targ2, Targ3, Targ4), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			Tretval ret = (*func)(
-				GetParam(ForceType<Targ1>(), vm, 2,&str),
-				GetParam(ForceType<Targ2>(), vm, 3,&str),
-				GetParam(ForceType<Targ3>(), vm, 4,&str),
-				GetParam(ForceType<Targ4>(), vm, 5,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
+				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
+				GetParam(ForceType<Targ3>(), vm, 4, &ptr),
+				GetParam(ForceType<Targ4>(), vm, 5, &ptr)
 			);
 			sq_pop(vm, 4);
 			return Return(vm, ret);
@@ -411,12 +416,12 @@
 	struct HelperT<Tretval (*)(Targ1, Targ2, Targ3, Targ4), true> {
 		static int SQCall(void *instance, Tretval (*func)(Targ1, Targ2, Targ3, Targ4), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			(*func)(
-				GetParam(ForceType<Targ1>(), vm, 2,&str),
-				GetParam(ForceType<Targ2>(), vm, 3,&str),
-				GetParam(ForceType<Targ3>(), vm, 4,&str),
-				GetParam(ForceType<Targ4>(), vm, 5,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
+				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
+				GetParam(ForceType<Targ3>(), vm, 4, &ptr),
+				GetParam(ForceType<Targ4>(), vm, 5, &ptr)
 			);
 			sq_pop(vm, 4);
 			return 0;
@@ -430,12 +435,12 @@
 	struct HelperT<Tretval (Tcls::*)(Targ1, Targ2, Targ3, Targ4), false> {
 		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2, Targ3, Targ4), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			Tretval ret = (instance->*func)(
-				GetParam(ForceType<Targ1>(), vm, 2,&str),
-				GetParam(ForceType<Targ2>(), vm, 3,&str),
-				GetParam(ForceType<Targ3>(), vm, 4,&str),
-				GetParam(ForceType<Targ4>(), vm, 5,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
+				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
+				GetParam(ForceType<Targ3>(), vm, 4, &ptr),
+				GetParam(ForceType<Targ4>(), vm, 5, &ptr)
 			);
 			sq_pop(vm, 4);
 			return Return(vm, ret);
@@ -449,12 +454,12 @@
 	struct HelperT<Tretval (Tcls::*)(Targ1, Targ2, Targ3, Targ4), true> {
 		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2, Targ3, Targ4), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			(instance->*func)(
-				GetParam(ForceType<Targ1>(), vm, 2,&str),
-				GetParam(ForceType<Targ2>(), vm, 3,&str),
-				GetParam(ForceType<Targ3>(), vm, 4,&str),
-				GetParam(ForceType<Targ4>(), vm, 5,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
+				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
+				GetParam(ForceType<Targ3>(), vm, 4, &ptr),
+				GetParam(ForceType<Targ4>(), vm, 5, &ptr)
 			);
 			sq_pop(vm, 4);
 			return 0;
@@ -462,12 +467,12 @@
 
 		static Tcls *SQConstruct(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2, Targ3, Targ4), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			Tcls *inst = new Tcls(
-				GetParam(ForceType<Targ1>(), vm, 2,&str),
-				GetParam(ForceType<Targ2>(), vm, 3,&str),
-				GetParam(ForceType<Targ3>(), vm, 4,&str),
-				GetParam(ForceType<Targ4>(), vm, 5,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
+				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
+				GetParam(ForceType<Targ3>(), vm, 4, &ptr),
+				GetParam(ForceType<Targ4>(), vm, 5, &ptr)
 			);
 
 			return inst;
@@ -481,13 +486,13 @@
 	struct HelperT<Tretval (*)(Targ1, Targ2, Targ3, Targ4, Targ5), false> {
 		static int SQCall(void *instance, Tretval (*func)(Targ1, Targ2, Targ3, Targ4, Targ5), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			Tretval ret = (*func)(
-				GetParam(ForceType<Targ1>(), vm, 2,&str),
-				GetParam(ForceType<Targ2>(), vm, 3,&str),
-				GetParam(ForceType<Targ3>(), vm, 4,&str),
-				GetParam(ForceType<Targ4>(), vm, 5,&str),
-				GetParam(ForceType<Targ5>(), vm, 6,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
+				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
+				GetParam(ForceType<Targ3>(), vm, 4, &ptr),
+				GetParam(ForceType<Targ4>(), vm, 5, &ptr),
+				GetParam(ForceType<Targ5>(), vm, 6, &ptr)
 			);
 			sq_pop(vm, 5);
 			return Return(vm, ret);
@@ -501,13 +506,13 @@
 	struct HelperT<Tretval (*)(Targ1, Targ2, Targ3, Targ4, Targ5), true> {
 		static int SQCall(void *instance, Tretval (*func)(Targ1, Targ2, Targ3, Targ4, Targ5), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			(*func)(
-				GetParam(ForceType<Targ1>(), vm, 2,&str),
-				GetParam(ForceType<Targ2>(), vm, 3,&str),
-				GetParam(ForceType<Targ3>(), vm, 4,&str),
-				GetParam(ForceType<Targ4>(), vm, 5,&str),
-				GetParam(ForceType<Targ5>(), vm, 6,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
+				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
+				GetParam(ForceType<Targ3>(), vm, 4, &ptr),
+				GetParam(ForceType<Targ4>(), vm, 5, &ptr),
+				GetParam(ForceType<Targ5>(), vm, 6, &ptr)
 			);
 			sq_pop(vm, 5);
 			return 0;
@@ -521,13 +526,13 @@
 	struct HelperT<Tretval (Tcls::*)(Targ1, Targ2, Targ3, Targ4, Targ5), false> {
 		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2, Targ3, Targ4, Targ5), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			Tretval ret = (instance->*func)(
-				GetParam(ForceType<Targ1>(), vm, 2,&str),
-				GetParam(ForceType<Targ2>(), vm, 3,&str),
-				GetParam(ForceType<Targ3>(), vm, 4,&str),
-				GetParam(ForceType<Targ4>(), vm, 5,&str),
-				GetParam(ForceType<Targ5>(), vm, 6,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
+				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
+				GetParam(ForceType<Targ3>(), vm, 4, &ptr),
+				GetParam(ForceType<Targ4>(), vm, 5, &ptr),
+				GetParam(ForceType<Targ5>(), vm, 6, &ptr)
 			);
 			sq_pop(vm, 5);
 			return Return(vm, ret);
@@ -541,13 +546,13 @@
 	struct HelperT<Tretval (Tcls::*)(Targ1, Targ2, Targ3, Targ4, Targ5), true> {
 		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2, Targ3, Targ4, Targ5), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			(instance->*func)(
-				GetParam(ForceType<Targ1>(), vm, 2,&str),
-				GetParam(ForceType<Targ2>(), vm, 3,&str),
-				GetParam(ForceType<Targ3>(), vm, 4,&str),
-				GetParam(ForceType<Targ4>(), vm, 5,&str),
-				GetParam(ForceType<Targ5>(), vm, 6,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
+				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
+				GetParam(ForceType<Targ3>(), vm, 4, &ptr),
+				GetParam(ForceType<Targ4>(), vm, 5, &ptr),
+				GetParam(ForceType<Targ5>(), vm, 6, &ptr)
 			);
 			sq_pop(vm, 5);
 			return 0;
@@ -555,13 +560,13 @@
 
 		static Tcls *SQConstruct(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2, Targ3, Targ4, Targ5), HSQUIRRELVM vm)
 		{
-			SQConvertedStrings str;
+			SQAutoFreePointers ptr;
 			Tcls *inst = new Tcls(
-				GetParam(ForceType<Targ1>(), vm, 2,&str),
-				GetParam(ForceType<Targ2>(), vm, 3,&str),
-				GetParam(ForceType<Targ3>(), vm, 4,&str),
-				GetParam(ForceType<Targ4>(), vm, 5,&str),
-				GetParam(ForceType<Targ5>(), vm, 6,&str)
+				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
+				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
+				GetParam(ForceType<Targ3>(), vm, 4, &ptr),
+				GetParam(ForceType<Targ4>(), vm, 5, &ptr),
+				GetParam(ForceType<Targ5>(), vm, 6, &ptr)
 			);
 
 			return inst;