Browse Source

Several fixes from squirrel

mingodad 10 years ago
parent
commit
79a009d408

+ 158 - 150
SquiLu/include/sqconfig.h

@@ -1,150 +1,158 @@
-
-#ifdef _SQ64
-
-#ifdef _MSC_VER
-typedef __int64 SQInteger;
-typedef unsigned __int64 SQUnsignedInteger;
-typedef unsigned __int64 SQHash; /*should be the same size of a pointer*/
-#else
-typedef long long SQInteger;
-typedef unsigned long long SQUnsignedInteger;
-typedef unsigned long long SQHash; /*should be the same size of a pointer*/
-#endif
-typedef int SQInt32; 
-typedef unsigned int SQUnsignedInteger32;
-#else 
-typedef int SQInteger;
-typedef int SQInt32; /*must be 32 bits(also on 64bits processors)*/
-typedef unsigned int SQUnsignedInteger32; /*must be 32 bits(also on 64bits processors)*/
-typedef unsigned int SQUnsignedInteger;
-typedef unsigned int SQHash; /*should be the same size of a pointer*/
-#endif
-
-
-#ifdef SQUSEDOUBLE
-typedef double SQFloat;
-#else
-typedef float SQFloat;
-#endif
-
-#if defined(SQUSEDOUBLE) && !defined(_SQ64) || !defined(SQUSEDOUBLE) && defined(_SQ64)
-#ifdef _MSC_VER
-typedef __int64 SQRawObjectVal; //must be 64bits
-#else
-typedef long long SQRawObjectVal; //must be 64bits
-#endif
-#define SQ_OBJECT_RAWINIT() { _unVal.raw = 0; }
-#else
-typedef SQUnsignedInteger SQRawObjectVal; //is 32 bits on 32 bits builds and 64 bits otherwise
-#define SQ_OBJECT_RAWINIT()
-#endif
-
-#ifndef SQ_ALIGNMENT // SQ_ALIGNMENT shall be less than or equal to SQ_MALLOC alignments, and its value shall be power of 2.
-#if defined(SQUSEDOUBLE) || defined(_SQ64)
-#define SQ_ALIGNMENT 8
-#else
-#define SQ_ALIGNMENT 4
-#endif
-#endif
-
-typedef void* SQUserPointer;
-typedef SQUnsignedInteger SQBool;
-typedef SQInteger SQRESULT;
-
-#ifdef SQUNICODE
-#include <wchar.h>
-#include <wctype.h>
-
-
-typedef wchar_t SQChar;
-
-
-#define	scstrcmp	wcscmp
-#ifdef _MSC_VER
-#define scsprintf	_snwprintf
-#define scvfprintf	_vfwprintf
-#else
-#define scsprintf	snwprintf
-#define scvfprintf	vfwprintf
-#endif
-#define scstrlen	wcslen
-#define scstrtod	wcstod
-#ifdef _SQ64
-#define scstrtol	wcstoll
-#else
-#define scstrtol	wcstol
-#endif
-#define scstrtoul	wcstoul
-#define scvsprintf	vswprintf
-#define scstrstr	wcsstr
-#define scprintf	wprintf
-
-#ifdef _WIN32
-#define WCHAR_SIZE 2
-#define WCHAR_SHIFT_MUL 1
-#define MAX_CHAR 0xFFFF
-#else
-#define WCHAR_SIZE 4
-#define WCHAR_SHIFT_MUL 2
-#define MAX_CHAR 0xFFFFFFFF
-#endif
-
-#define _SC(a) L##a
-
-
-#define scisspace	iswspace
-#define scisdigit	iswdigit
-#define scisprint	iswprint
-#define scisxdigit	iswxdigit
-#define scisalpha	iswalpha
-#define sciscntrl	iswcntrl
-#define scisalnum	iswalnum
-
-
-#define sq_rsl(l) ((l)<<WCHAR_SHIFT_MUL)
-
-#else
-typedef char SQChar;
-#define _SC(a) a
-#define	scstrcmp	strcmp
-#ifdef _MSC_VER
-#define scsprintf	_snprintf
-#define scvfprintf	_vfprintf
-#else
-#define scsprintf	snprintf
-#define scvfprintf	vfprintf
-#endif
-#define scstrlen	strlen
-#define scstrtod	strtod
-#ifdef _SQ64
-#ifdef _MSC_VER
-#define scstrtol	_strtoi64
-#else
-#define scstrtol	strtoll
-#endif
-#else
-#define scstrtol	strtol
-#endif
-#define scstrtoul	strtoul
-#define scvsprintf	vsnprintf
-#define scstrstr	strstr
-#define scisspace	isspace
-#define scisdigit	isdigit
-#define scisprint	isprint
-#define scisxdigit	isxdigit
-#define sciscntrl	iscntrl
-#define scisalpha	isalpha
-#define scisalnum	isalnum
-#define scprintf	printf
-#define MAX_CHAR 0xFF
-
-#define sq_rsl(l) (l)
-
-#endif
-
-#ifdef _SQ64
-#define _PRINT_INT_PREC _SC("ll")
-#define _PRINT_INT_FMT _SC("%lld")
-#else
-#define _PRINT_INT_FMT _SC("%d")
-#endif
+
+#ifdef _SQ64
+
+#ifdef _MSC_VER
+typedef __int64 SQInteger;
+typedef unsigned __int64 SQUnsignedInteger;
+typedef unsigned __int64 SQHash; /*should be the same size of a pointer*/
+#else
+typedef long long SQInteger;
+typedef unsigned long long SQUnsignedInteger;
+typedef unsigned long long SQHash; /*should be the same size of a pointer*/
+#endif
+typedef int SQInt32;
+typedef unsigned int SQUnsignedInteger32;
+#else
+typedef int SQInteger;
+typedef int SQInt32; /*must be 32 bits(also on 64bits processors)*/
+typedef unsigned int SQUnsignedInteger32; /*must be 32 bits(also on 64bits processors)*/
+typedef unsigned int SQUnsignedInteger;
+typedef unsigned int SQHash; /*should be the same size of a pointer*/
+#endif
+
+
+#ifdef SQUSEDOUBLE
+typedef double SQFloat;
+#else
+typedef float SQFloat;
+#endif
+
+#if defined(SQUSEDOUBLE) && !defined(_SQ64) || !defined(SQUSEDOUBLE) && defined(_SQ64)
+#ifdef _MSC_VER
+typedef __int64 SQRawObjectVal; //must be 64bits
+#else
+typedef long long SQRawObjectVal; //must be 64bits
+#endif
+#define SQ_OBJECT_RAWINIT() { _unVal.raw = 0; }
+#else
+typedef SQUnsignedInteger SQRawObjectVal; //is 32 bits on 32 bits builds and 64 bits otherwise
+#define SQ_OBJECT_RAWINIT()
+#endif
+
+#ifndef SQ_ALIGNMENT // SQ_ALIGNMENT shall be less than or equal to SQ_MALLOC alignments, and its value shall be power of 2.
+#if defined(SQUSEDOUBLE) || defined(_SQ64)
+#define SQ_ALIGNMENT 8
+#else
+#define SQ_ALIGNMENT 4
+#endif
+#endif
+
+typedef void* SQUserPointer;
+typedef SQUnsignedInteger SQBool;
+typedef SQInteger SQRESULT;
+
+#ifdef SQUNICODE
+#include <wchar.h>
+#include <wctype.h>
+
+
+typedef wchar_t SQChar;
+typedef unsigned wchar_t SQUChar;
+
+
+#define scstrcmp    wcscmp
+#ifdef _WIN32
+#define scsprintf   _snwprintf
+#define scvfprintf	_vfwprintf
+#else
+#define scsprintf   swprintf
+#define scvfprintf	vfwprintf
+#endif
+#define scstrlen    wcslen
+#define scstrtod    wcstod
+#ifdef _SQ64
+#define scstrtol    wcstoll
+#else
+#define scstrtol    wcstol
+#endif
+#define scstrtoul   wcstoul
+#define scvsprintf  vswprintf
+#define scstrstr    wcsstr
+#define scstrchr wcschr
+#define scstrpbrk	wcspbrk
+#define scstrtok	wcstrtok
+#define scprintf    wprintf
+
+#ifdef _WIN32
+#define WCHAR_SIZE 2
+#define WCHAR_SHIFT_MUL 1
+#define MAX_CHAR 0xFFFF
+#else
+#define WCHAR_SIZE 4
+#define WCHAR_SHIFT_MUL 2
+#define MAX_CHAR 0xFFFFFFFF
+#endif
+
+#define _SC(a) L##a
+
+
+#define scisspace   iswspace
+#define scisdigit   iswdigit
+#define scisprint   iswprint
+#define scisxdigit  iswxdigit
+#define scisalpha   iswalpha
+#define sciscntrl   iswcntrl
+#define scisalnum   iswalnum
+
+
+#define sq_rsl(l) ((l)<<WCHAR_SHIFT_MUL)
+
+#else
+typedef char SQChar;
+typedef unsigned char SQUChar;
+#define _SC(a) a
+#define scstrcmp    strcmp
+#ifdef _MSC_VER
+#define scsprintf   _snprintf
+#define scvfprintf	_vfprintf
+#else
+#define scsprintf   snprintf
+#define scvfprintf	vfprintf
+#endif
+#define scstrlen    strlen
+#define scstrtod    strtod
+#ifdef _SQ64
+#ifdef _MSC_VER
+#define scstrtol    _strtoi64
+#else
+#define scstrtol    strtoll
+#endif
+#else
+#define scstrtol    strtol
+#endif
+#define scstrtoul   strtoul
+#define scvsprintf  vsnprintf
+#define scstrstr    strstr
+#define scstrpbrk	strpbrk
+#define scstrchr	strchr
+#define scstrtok	strtok
+#define scisspace   isspace
+#define scisdigit   isdigit
+#define scisprint   isprint
+#define scisxdigit  isxdigit
+#define sciscntrl   iscntrl
+#define scisalpha   isalpha
+#define scisalnum   isalnum
+#define scprintf    printf
+#define MAX_CHAR 0xFF
+
+#define sq_rsl(l) (l)
+
+#endif
+
+#ifdef _SQ64
+#define _PRINT_INT_PREC _SC("ll")
+#define _PRINT_INT_FMT _SC("%lld")
+#else
+#define _PRINT_INT_FMT _SC("%d")
+#endif

+ 1 - 95
SquiLu/include/squirrel.h

@@ -120,101 +120,7 @@ struct SQOuter;
 #define SQUNICODE
 #endif
 
-#ifdef SQUNICODE
-#if (defined(_MSC_VER) && _MSC_VER >= 1400) // 1400 = VS8
-
-#if !defined(_NATIVE_WCHAR_T_DEFINED) //this is if the compiler considers wchar_t as native type
-#define wchar_t unsigned short
-#endif
-
-#else
-typedef unsigned short wchar_t;
-#endif
-
-typedef wchar_t SQChar;
-typedef wchar_t USQChar;
-#define uchar(c)    ((unsigned short)(c))
-#define _SC(a) L##a
-#define scstrchr wcschr
-#ifdef _WIN32_WCE
-#define scsnprintf	_snwprintf
-#define scvfprintf	_vfwprintf
-#define scvsprintf	_vswprintf
-#define scvsnprintf	_vsnwprintf
-#else
-#define scsnprintf	wsnprintf
-#define scvfprintf	vfwprintf
-#define scvsprintf	vswprintf
-#define scvsnprintf	vswnprintf
-#endif
-#define	scstrcmp	wcscmp
-#define scsprintf	swprintf
-#define scstrlen	wcslen
-#define scstrtod	wcstod
-#ifdef _SQ64
-#define scstrtol	_wcstoi64
-#else
-#define scstrtol	wcstol
-#endif
-//#define scatoi		_wtoi
-#define scstrtoul	wcstoul
-#define scstrstr	wcsstr
-#define scstrpbrk	wcspbrk
-#define scisspace	iswspace
-#define scisdigit	iswdigit
-#define scisxdigit	iswxdigit
-#define scisalpha	iswalpha
-#define sciscntrl	iswcntrl
-#define scisalnum	iswalnum
-#define scprintf	wprintf
-#define MAX_CHAR	0xFFFF
-#define sq_rsl(l) ((l)<<WCHAR_SHIFT_MUL)
-#else
-typedef char SQChar;
-typedef unsigned char USQChar;
-#define uchar(c)    ((unsigned char)(c))
-#define _SC(a)	a
-#define scstrchr	strchr
-#define scsnprintf	snprintf
-#define	scstrcmp	strcmp
-#define scsprintf	sprintf
-#define scstrlen	strlen
-#define scstrtod	strtod
-#ifdef _SQ64
-#ifdef _MSC_VER
-#define scstrtol	_strtoi64
-#else
-#define scstrtol	strtoll
-#endif
-#else
-#define scstrtol	strtol
-#endif
-//#define scatoi		atoi
-#define scstrtoul	strtoul
-#define scfprintf	fprintf
-#define scvfprintf	vfprintf
-#define scvsprintf	vsprintf
-#define scvsnprintf	vsnprintf
-#define scstrstr	strstr
-#define scstrpbrk	strpbrk
-#define scstrtok	strtok
-#define scisspace	isspace
-#define scisdigit	isdigit
-#define scisxdigit	isxdigit
-#define sciscntrl	iscntrl
-#define scisalpha	isalpha
-#define scisalnum	isalnum
-#define scprintf	printf
-#define MAX_CHAR	0xFF
-#define sq_rsl(l) (l)
-#endif
-
-#ifdef _SQ64
-#define _PRINT_INT_PREC	_SC("ll")
-#define _PRINT_INT_FMT	_SC("%lld")
-#else
-#define _PRINT_INT_FMT	_SC("%d")
-#endif
+#include "sqconfig.h"
 
 #define SQUIRREL_VERSION	_SC("SquiLu based on Squirrel 3.0.4 stable and Lua 5.1.5")
 #define SQUIRREL_COPYRIGHT	_SC("Copyright (C) 2003-2012 Alberto Demichelis, Domingo Alvarez Duarte")

+ 7 - 8
SquiLu/sq/sq.c

@@ -58,6 +58,7 @@ void printfunc(HSQUIRRELVM v,const SQChar *s,...)
 	va_start(vl, s);
 	scvprintf(stdout, s, vl);
 	va_end(vl);
+	(void)v; /* UNUSED */
 }
 
 void errorfunc(HSQUIRRELVM v,const SQChar *s,...)
@@ -66,6 +67,7 @@ void errorfunc(HSQUIRRELVM v,const SQChar *s,...)
 	va_start(vl, s);
 	scvprintf(stderr, s, vl);
 	va_end(vl);
+	(void)v; /* UNUSED */
 }
 
 void PrintVersionInfos()
@@ -113,7 +115,7 @@ void loadDefaultScript(HSQUIRRELVM v, const char *script)
     fclose(fb);
 
     SQChar srcBoot[256];
-    scsnprintf(srcBoot, sizeof(srcBoot), _SC("dofile(\"%s\", false);"), script);
+    scsprintf(srcBoot, sizeof(srcBoot), _SC("dofile(\"%s\", false);"), script);
 
     if(SQ_SUCCEEDED(sq_compilebuffer(v,srcBoot, strlen(srcBoot), _SC("defaultScript"), SQTrue, SQTrue))) {
         int callargs = 1;
@@ -133,11 +135,9 @@ int getargs(HSQUIRRELVM v,int argc, char* argv[],SQInteger *retval)
 	int compiles_as_source_only = 0;
 #ifdef SQUNICODE
 	static SQChar temp[500];
-	//const SQChar *ret=NULL;
 #endif
 	const char * output = NULL;
 	const char * preload = NULL;
-	//int lineinfo=0;
 	*retval = 0;
 	if(argc>1)
 	{
@@ -334,7 +334,7 @@ void Interactive(HSQUIRRELVM v)
 		buffer[i] = _SC('\0');
 
 		if(buffer[0]==_SC('=')){
-			scsnprintf(sq_getscratchpad(v,MAXINPUT),MAXINPUT,_SC("return (%s)"),&buffer[1]);
+			scsprintf(sq_getscratchpad(v,MAXINPUT),MAXINPUT,_SC("return (%s)"),&buffer[1]);
 			memcpy(buffer,sq_getscratchpad(v,-1),(scstrlen(sq_getscratchpad(v,-1))+1)*sizeof(SQChar));
 			retval=1;
 		}
@@ -465,7 +465,6 @@ static char *chngChar (char *str, char oldChar, char newChar) {
 static SQInteger LoadFrozenScript(HSQUIRRELVM v, const SQChar* filename, int only_check)
 {
 #ifndef SQUILU_ALONE
-    SQInteger retval;
     // lots of debugging to make sure that everything is ok
     //printf("%s\n", filename);
     FILE *f = fopen(filename, "rb");
@@ -515,7 +514,7 @@ static SQInteger LoadFrozenScript(HSQUIRRELVM v, const SQChar* filename, int onl
 
     fclose(f);
     SQChar srcBoot[256];
-    SQInteger scr_len = scsnprintf(srcBoot, sizeof(srcBoot),
+    SQInteger scr_len = scsprintf(srcBoot, sizeof(srcBoot),
             _SC("local __fd=file(\"%s\", \"rb\");__fd.seek(%d, 'b');local __zsrc=__fd.read(%d);__fd.close();__zsrc=compilestring(zlib.inflate(__zsrc),\"zsrc\",false);__zsrc.acall2(this, vargv);"),
             filename, (int)(fileSize-END_TAG_LEN - script_len), (int)script_len);
 
@@ -601,7 +600,7 @@ int main(int argc, char* argv[])
 #ifndef SQUILU_ALONE
 	sqext_register_gumbo(v);
 	sqext_register_base64(v);
-	//sqext_register_Sq_Fpdf(v);
+	sqext_register_Sq_Fpdf(v);
 	sqext_register_SQLite3(v);
 	sqext_register_xjd1(v);
 	sqext_register_mix(v);
@@ -630,7 +629,7 @@ int main(int argc, char* argv[])
 
 	sqext_register_sq_slave_vm(v);
 	//sqext_register_ThreadObjects(v);
-	//sqext_register_dad_utils(v);
+	sqext_register_dad_utils(v);
 	//sqext_register_sys(v);
 
 #ifdef WITH_FULL_DAD_EXTRAS

+ 3 - 3
SquiLu/sqstdlib/sqstdblob.cpp

@@ -250,7 +250,7 @@ static SQRESULT _blob__typeof(HSQUIRRELVM v)
 	return 1;
 }
 
-static SQRESULT _blob_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT _blob_releasehook(SQUserPointer p, SQInteger /*size*/, HSQUIRRELVM /*v*/)
 {
 	SQBlob *self = (SQBlob*)p;
 	self->~SQBlob();
@@ -346,7 +346,7 @@ static SQRegFunction _blob_methods[] = {
 	_DECL_BLOB_FUNC(tostring,1,_SC("x")),
 	_DECL_BLOB_FUNC(setLen,2,_SC("xi")),
 	_DECL_BLOB_FUNC(clear,1,_SC("x")),
-	{0,0,0,0}
+	{NULL,(SQFUNCTION)0,0,NULL}
 };
 
 
@@ -404,7 +404,7 @@ static SQRegFunction bloblib_funcs[]={
 	_DECL_GLOBALBLOB_FUNC(swap2,2,_SC(".n")),
 	_DECL_GLOBALBLOB_FUNC(swap4,2,_SC(".n")),
 	_DECL_GLOBALBLOB_FUNC(swapfloat,2,_SC(".n")),
-	{0,0}
+	{NULL,(SQFUNCTION)0,0,NULL}
 };
 
 SQRESULT sqstd_getblob(HSQUIRRELVM v,SQInteger idx,SQUserPointer *ptr)

+ 3 - 3
SquiLu/sqstdlib/sqstdio.cpp

@@ -116,7 +116,7 @@ static SQRESULT _file__typeof(HSQUIRRELVM v)
 	return 1;
 }
 
-static SQRESULT _file_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT _file_releasehook(SQUserPointer p, SQInteger /*size*/, HSQUIRRELVM /*v*/)
 {
 	SQFile *self = (SQFile*)p;
 	self->~SQFile();
@@ -169,7 +169,7 @@ static SQRegFunction _file_methods[] = {
 	_DECL_FILE_FUNC(constructor,3,_SC("x")),
 	_DECL_FILE_FUNC(_typeof,1,_SC("x")),
 	_DECL_FILE_FUNC(close,1,_SC("x")),
-	{0,0,0,0},
+	{NULL,(SQFUNCTION)0,0,NULL}
 };
 
 
@@ -561,7 +561,7 @@ static SQRegFunction iolib_funcs[]={
 	_DECL_GLOBALIO_FUNC(dumpclosure,3,_SC(".sc")),
 	_DECL_GLOBALIO_FUNC(readfile,2,_SC(".s")),
 	_DECL_GLOBALIO_FUNC(writefile,3,_SC(".ss")),
-	{0,0}
+	{NULL,(SQFUNCTION)0,0,NULL}
 };
 
 SQRESULT sqstd_register_iolib(HSQUIRRELVM v)

+ 123 - 123
SquiLu/sqstdlib/sqstdmath.cpp

@@ -1,39 +1,39 @@
-/* see copyright notice in squirrel.h */
-#include <squirrel.h>
-#include <math.h>
-#include <stdlib.h>
-#include <sqstdmath.h>
-
-#define SINGLE_ARG_FUNC(_funcname) static SQRESULT math_##_funcname(HSQUIRRELVM v){ \
-	SQFloat f; \
-	sq_getfloat(v,2,&f); \
-	sq_pushfloat(v,(SQFloat)_funcname(f)); \
-	return 1; \
-}
-
-#define TWO_ARGS_FUNC(_funcname) static SQRESULT math_##_funcname(HSQUIRRELVM v){ \
-	SQFloat p1,p2; \
-	sq_getfloat(v,2,&p1); \
-	sq_getfloat(v,3,&p2); \
-	sq_pushfloat(v,(SQFloat)_funcname(p1,p2)); \
-	return 1; \
-}
-
-static SQRESULT math_srand(HSQUIRRELVM v)
-{
-	SQInteger i;
-	if(SQ_FAILED(sq_getinteger(v,2,&i)))
-		return sq_throwerror(v,_SC("invalid param"));
-	srand((unsigned int)i);
-	return 0;
-}
-
-static SQRESULT math_rand(HSQUIRRELVM v)
-{
-	sq_pushinteger(v,rand());
-	return 1;
-}
-
+/* see copyright notice in squirrel.h */
+#include <squirrel.h>
+#include <math.h>
+#include <stdlib.h>
+#include <sqstdmath.h>
+
+#define SINGLE_ARG_FUNC(_funcname) static SQRESULT math_##_funcname(HSQUIRRELVM v){ \
+	SQFloat f; \
+	sq_getfloat(v,2,&f); \
+	sq_pushfloat(v,(SQFloat)_funcname(f)); \
+	return 1; \
+}
+
+#define TWO_ARGS_FUNC(_funcname) static SQRESULT math_##_funcname(HSQUIRRELVM v){ \
+	SQFloat p1,p2; \
+	sq_getfloat(v,2,&p1); \
+	sq_getfloat(v,3,&p2); \
+	sq_pushfloat(v,(SQFloat)_funcname(p1,p2)); \
+	return 1; \
+}
+
+static SQRESULT math_srand(HSQUIRRELVM v)
+{
+	SQInteger i;
+	if(SQ_FAILED(sq_getinteger(v,2,&i)))
+		return sq_throwerror(v,_SC("invalid param"));
+	srand((unsigned int)i);
+	return 0;
+}
+
+static SQRESULT math_rand(HSQUIRRELVM v)
+{
+	sq_pushinteger(v,rand());
+	return 1;
+}
+
 static SQRESULT math_random(HSQUIRRELVM v) {
   SQ_FUNC_VARS(v);
   /* the `%' avoids the (rare) case of r==1, and is needed also because on
@@ -52,30 +52,30 @@ static SQRESULT math_random(HSQUIRRELVM v) {
   } else return sq_throwerror(v, _SC("wrong number of arguments"));
   return 1;
 }
-
-static SQRESULT math_abs(HSQUIRRELVM v)
-{
-	SQInteger n;
-	sq_getinteger(v,2,&n);
-	sq_pushinteger(v,(SQInteger)abs((int)n));
-	return 1;
-}
-
-SINGLE_ARG_FUNC(sqrt)
-SINGLE_ARG_FUNC(fabs)
-SINGLE_ARG_FUNC(sin)
-SINGLE_ARG_FUNC(cos)
-SINGLE_ARG_FUNC(asin)
-SINGLE_ARG_FUNC(acos)
-SINGLE_ARG_FUNC(log)
-SINGLE_ARG_FUNC(log10)
-SINGLE_ARG_FUNC(tan)
-SINGLE_ARG_FUNC(atan)
-TWO_ARGS_FUNC(atan2)
-TWO_ARGS_FUNC(pow)
-SINGLE_ARG_FUNC(floor)
-SINGLE_ARG_FUNC(ceil)
-SINGLE_ARG_FUNC(exp)
+
+static SQRESULT math_abs(HSQUIRRELVM v)
+{
+	SQInteger n;
+	sq_getinteger(v,2,&n);
+	sq_pushinteger(v,(SQInteger)abs((int)n));
+	return 1;
+}
+
+SINGLE_ARG_FUNC(sqrt)
+SINGLE_ARG_FUNC(fabs)
+SINGLE_ARG_FUNC(sin)
+SINGLE_ARG_FUNC(cos)
+SINGLE_ARG_FUNC(asin)
+SINGLE_ARG_FUNC(acos)
+SINGLE_ARG_FUNC(log)
+SINGLE_ARG_FUNC(log10)
+SINGLE_ARG_FUNC(tan)
+SINGLE_ARG_FUNC(atan)
+TWO_ARGS_FUNC(atan2)
+TWO_ARGS_FUNC(pow)
+SINGLE_ARG_FUNC(floor)
+SINGLE_ARG_FUNC(ceil)
+SINGLE_ARG_FUNC(exp)
 
 //DAD start
 #include <string.h>
@@ -103,8 +103,8 @@ static SQRESULT math_roundf (HSQUIRRELVM v) {
   if (x < 0)
     sq_pushfloat(v, ceil(dec_factor*x-0.5) / dec_factor);
   else
-    sq_pushfloat(v, floor(dec_factor*x+0.5) / dec_factor);
-
+    sq_pushfloat(v, floor(dec_factor*x+0.5) / dec_factor);
+
   return 1;
 }
 
@@ -197,7 +197,7 @@ static SQRESULT math_number_format(HSQUIRRELVM v) {
 	}
 
     int idec = dec; //on 64 bits there is a warning here about SQInteger/int
-	tmplen = scsnprintf(tmpbuf, sizeof(tmpbuf), _SC("%.*f"), idec, d);
+	tmplen = scsprintf(tmpbuf, sizeof(tmpbuf), _SC("%.*f"), idec, d);
 
 	resbuf[0] = _SC('\0');
 
@@ -298,65 +298,65 @@ static SQRESULT math_number_format(HSQUIRRELVM v) {
 	return 1;
 }
 
-//DAD end
-
-#define _DECL_FUNC(name,nparams,tycheck) {_SC(#name),math_##name,nparams,tycheck}
-static SQRegFunction mathlib_funcs[] = {
-	_DECL_FUNC(sqrt,2,_SC(".n")),
-	_DECL_FUNC(sin,2,_SC(".n")),
-	_DECL_FUNC(cos,2,_SC(".n")),
-	_DECL_FUNC(asin,2,_SC(".n")),
-	_DECL_FUNC(acos,2,_SC(".n")),
-	_DECL_FUNC(log,2,_SC(".n")),
-	_DECL_FUNC(log10,2,_SC(".n")),
-	_DECL_FUNC(tan,2,_SC(".n")),
-	_DECL_FUNC(atan,2,_SC(".n")),
-	_DECL_FUNC(atan2,3,_SC(".nn")),
-	_DECL_FUNC(pow,3,_SC(".nn")),
-	_DECL_FUNC(floor,2,_SC(".n")),
-	_DECL_FUNC(ceil,2,_SC(".n")),
-	_DECL_FUNC(exp,2,_SC(".n")),
-	_DECL_FUNC(srand,2,_SC(".n")),
-	_DECL_FUNC(rand,1,NULL),
-	_DECL_FUNC(random,-1,_SC(".ii")),
-	_DECL_FUNC(fabs,2,_SC(".n")),
-	_DECL_FUNC(abs,2,_SC(".n")),
-	_DECL_FUNC(roundf,-2,_SC(".ni")),
-	_DECL_FUNC(broundf,-2,_SC(".ni")),
-	_DECL_FUNC(number_format,-2,_SC(".niss")),
-	_DECL_FUNC(number_format_get_dec_point,1,_SC(".")),
-	_DECL_FUNC(number_format_set_dec_point,2,_SC(".s")),
-	_DECL_FUNC(number_format_get_thousand_sep,1,_SC(".")),
-	_DECL_FUNC(number_format_set_thousand_sep,2,_SC(".s")),
-	{0,0},
-};
-#undef _DECL_FUNC
-
-#ifndef M_PI
-#define M_PI (3.14159265358979323846)
-#endif
-
-SQRESULT sqstd_register_mathlib(HSQUIRRELVM v)
-{
+//DAD end
+
+#define _DECL_FUNC(name,nparams,tycheck) {_SC(#name),math_##name,nparams,tycheck}
+static SQRegFunction mathlib_funcs[] = {
+	_DECL_FUNC(sqrt,2,_SC(".n")),
+	_DECL_FUNC(sin,2,_SC(".n")),
+	_DECL_FUNC(cos,2,_SC(".n")),
+	_DECL_FUNC(asin,2,_SC(".n")),
+	_DECL_FUNC(acos,2,_SC(".n")),
+	_DECL_FUNC(log,2,_SC(".n")),
+	_DECL_FUNC(log10,2,_SC(".n")),
+	_DECL_FUNC(tan,2,_SC(".n")),
+	_DECL_FUNC(atan,2,_SC(".n")),
+	_DECL_FUNC(atan2,3,_SC(".nn")),
+	_DECL_FUNC(pow,3,_SC(".nn")),
+	_DECL_FUNC(floor,2,_SC(".n")),
+	_DECL_FUNC(ceil,2,_SC(".n")),
+	_DECL_FUNC(exp,2,_SC(".n")),
+	_DECL_FUNC(srand,2,_SC(".n")),
+	_DECL_FUNC(rand,1,NULL),
+	_DECL_FUNC(random,-1,_SC(".ii")),
+	_DECL_FUNC(fabs,2,_SC(".n")),
+	_DECL_FUNC(abs,2,_SC(".n")),
+	_DECL_FUNC(roundf,-2,_SC(".ni")),
+	_DECL_FUNC(broundf,-2,_SC(".ni")),
+	_DECL_FUNC(number_format,-2,_SC(".niss")),
+	_DECL_FUNC(number_format_get_dec_point,1,_SC(".")),
+	_DECL_FUNC(number_format_set_dec_point,2,_SC(".s")),
+	_DECL_FUNC(number_format_get_thousand_sep,1,_SC(".")),
+	_DECL_FUNC(number_format_set_thousand_sep,2,_SC(".s")),
+	{NULL,(SQFUNCTION)0,0,NULL}
+};
+#undef _DECL_FUNC
+
+#ifndef M_PI
+#define M_PI (3.14159265358979323846)
+#endif
+
+SQRESULT sqstd_register_mathlib(HSQUIRRELVM v)
+{
     sq_pushstring(v,_SC("math"),-1);
     sq_newtable(v);
-
-	SQInteger i=0;
-	while(mathlib_funcs[i].name!=0)	{
-		sq_pushstring(v,mathlib_funcs[i].name,-1);
-		sq_newclosure(v,mathlib_funcs[i].f,0);
-		sq_setparamscheck(v,mathlib_funcs[i].nparamscheck,mathlib_funcs[i].typemask);
-		sq_setnativeclosurename(v,-1,mathlib_funcs[i].name);
-		sq_newslot(v,-3,SQFalse);
-		i++;
-	}
-	sq_pushstring(v,_SC("RAND_MAX"),-1);
-	sq_pushinteger(v,RAND_MAX);
-	sq_newslot(v,-3,SQFalse);
-	sq_pushstring(v,_SC("PI"),-1);
-	sq_pushfloat(v,(SQFloat)M_PI);
-	sq_newslot(v,-3,SQFalse);
-
-	sq_newslot(v,-3,SQTrue); //insert math
-	return SQ_OK;
-}
+
+	SQInteger i=0;
+	while(mathlib_funcs[i].name!=0)	{
+		sq_pushstring(v,mathlib_funcs[i].name,-1);
+		sq_newclosure(v,mathlib_funcs[i].f,0);
+		sq_setparamscheck(v,mathlib_funcs[i].nparamscheck,mathlib_funcs[i].typemask);
+		sq_setnativeclosurename(v,-1,mathlib_funcs[i].name);
+		sq_newslot(v,-3,SQFalse);
+		i++;
+	}
+	sq_pushstring(v,_SC("RAND_MAX"),-1);
+	sq_pushinteger(v,RAND_MAX);
+	sq_newslot(v,-3,SQFalse);
+	sq_pushstring(v,_SC("PI"),-1);
+	sq_pushfloat(v,(SQFloat)M_PI);
+	sq_newslot(v,-3,SQFalse);
+
+	sq_newslot(v,-3,SQTrue); //insert math
+	return SQ_OK;
+}

+ 5 - 5
SquiLu/sqstdlib/sqstdrex.cpp

@@ -529,10 +529,10 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar
 		return NULL;
     case OP_MB:
         {
-            int cb = node->left; //char that opens a balanced expression
+            SQInteger cb = node->left; //char that opens a balanced expression
             if(*str != cb) return NULL; // string doesnt start with open char
-            int ce = node->right; //char that closes a balanced expression
-            int cont = 1;
+            SQInteger ce = node->right; //char that closes a balanced expression
+            SQInteger cont = 1;
             const SQChar *streol = exp->_eol;
             while (++str < streol) {
               if (*str == ce) {
@@ -556,7 +556,7 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar
 /* public api */
 SQRex *sqstd_rex_compile(const SQChar *pattern,const SQChar **error)
 {
-	SQRex *exp = (SQRex *)sq_malloc(sizeof(SQRex));
+	SQRex * volatile exp = (SQRex *)sq_malloc(sizeof(SQRex)); // "volatile" is needed for setjmp()
 	exp->_eol = exp->_bol = NULL;
 	exp->_p = pattern;
 	exp->_nallocated = (SQInteger)scstrlen(pattern) * sizeof(SQChar);
@@ -584,7 +584,7 @@ SQRex *sqstd_rex_compile(const SQChar *pattern,const SQChar **error)
 					scprintf(_SC("[%02d] %10s "),i,g_nnames[exp->_nodes[i].type-MAX_CHAR]);
 				else
 					scprintf(_SC("[%02d] %10c "),i,exp->_nodes[i].type);
-				scprintf(_SC("left %02d right %02d next %02d\n"),exp->_nodes[i].left,exp->_nodes[i].right,exp->_nodes[i].next);
+				scprintf(_SC("left %02d right %02d next %02d\n"), (SQInt32)exp->_nodes[i].left, (SQInt32)exp->_nodes[i].right, (SQInt32)exp->_nodes[i].next);
 			}
 			scprintf(_SC("\n"));
 		}

+ 1 - 1
SquiLu/sqstdlib/sqstdstream.cpp

@@ -371,7 +371,7 @@ static SQRegFunction _stream_methods[] = {
 	_DECL_STREAM_FUNC(eos,1,_SC("x")),
 	_DECL_STREAM_FUNC(flush,1,_SC("x")),
 	_DECL_STREAM_FUNC(_cloned,0,NULL),
-	{0,0}
+	{NULL,(SQFUNCTION)0,0,NULL}
 };
 
 void init_streamclass(HSQUIRRELVM v)

+ 84 - 13
SquiLu/sqstdlib/sqstdstring.cpp

@@ -99,9 +99,9 @@ SQRESULT sqstd_format(HSQUIRRELVM v,SQInteger nformatstringidx,SQInteger *outlen
 			if(n < 0) return -1;
 			SQInteger addlen = 0;
 			SQInteger valtype = 0;
-			const SQChar *ts;
-			SQInteger ti;
-			SQFloat tf;
+			const SQChar *ts = NULL;
+			SQInteger ti = 0;
+			SQFloat tf = 0.0;
 			SQInteger fc = format[n];
 			switch(fc) {
             case _SC('q'):
@@ -121,9 +121,9 @@ SQRESULT sqstd_format(HSQUIRRELVM v,SQInteger nformatstringidx,SQInteger *outlen
                         else if (*ts2 == _SC('"') || *ts2 == _SC('\\') || *ts2 == _SC('\n')  || *ts2 == _SC('\t')) {
                           ++addlen;
                         }
-                        else if (*ts2 == _SC('\0') || iscntrl(uchar(*ts2))) {
+                        else if (*ts2 == _SC('\0') || sciscntrl(SQUChar(*ts2))) {
                           SQChar buff[10];
-                          addlen += scsprintf(buff, _SC("\\x%x"), (int)uchar(*ts2))-1; //-1 because we already added the original char to the sum
+                          addlen += scsprintf(buff, sizeof(buff), _SC("\\x%x"), (int)SQUChar(*ts2))-1; //-1 because we already added the original char to the sum
                         }
                         ++ts2;
                       }
@@ -152,10 +152,10 @@ SQRESULT sqstd_format(HSQUIRRELVM v,SQInteger nformatstringidx,SQInteger *outlen
                             *ts2++ = _SC('\\');
                             *ts2++ = _SC('t');
                         }
-                        else if (*ts == _SC('\0') || iscntrl(uchar(*ts))) {
+                        else if (*ts == _SC('\0') || sciscntrl(SQUChar(*ts))) {
                           SQChar buff[10];
                           int iw;
-                          iw = scsprintf(buff, _SC("\\x%x"), (int)uchar(*ts));
+                          iw = scsprintf(buff, sizeof(buff), _SC("\\x%x"), (int)SQUChar(*ts));
                           for(int i=0; i< iw; ++i) *ts2++ = buff[i];
                         }
                         else
@@ -207,9 +207,9 @@ SQRESULT sqstd_format(HSQUIRRELVM v,SQInteger nformatstringidx,SQInteger *outlen
 			allocated += addlen + sizeof(SQChar);
 			dest = sq_getscratchpad(v,allocated);
 			switch(valtype) {
-			case _SC('s'): i += scsprintf(&dest[i],fmt,ts); break;
-			case _SC('i'): i += scsprintf(&dest[i],fmt,ti); break;
-			case _SC('f'): i += scsprintf(&dest[i],fmt,tf); break;
+            case 's': i += scsprintf(&dest[i],allocated,fmt,ts); break;
+            case 'i': i += scsprintf(&dest[i],allocated,fmt,ti); break;
+            case 'f': i += scsprintf(&dest[i],allocated,fmt,tf); break;
 			};
 			nparam ++;
 		}
@@ -245,11 +245,81 @@ static SQRESULT _string_printf(HSQUIRRELVM v)
 	return 0;
 }
 
+static SQInteger _string_escape(HSQUIRRELVM v)
+{
+    const SQChar *str;
+    SQChar *dest,*resstr;
+    SQInteger size;
+    sq_getstring(v,2,&str);
+    size = sq_getsize(v,2);
+    if(size == 0) {
+        sq_push(v,2);
+        return 1;
+    }
+#ifdef SQUNICODE
+#if WCHAR_SIZE == 2
+    const SQChar *escpat = _SC("\\x%04x");
+    const SQInteger maxescsize = 6;
+#else //WCHAR_SIZE == 4
+    const SQChar *escpat = _SC("\\x%08x");
+    const SQInteger maxescsize = 10;
+#endif
+#else
+    const SQChar *escpat = _SC("\\x%02x");
+    const SQInteger maxescsize = 4;
+#endif
+    SQInteger destcharsize = (size * maxescsize); //assumes every char could be escaped
+    resstr = dest = (SQChar *)sq_getscratchpad(v,destcharsize * sizeof(SQChar));
+    SQChar c;
+    SQChar escch;
+    SQInteger escaped = 0;
+    for(int n = 0; n < size; n++){
+        c = *str++;
+        escch = 0;
+        if(scisprint(c) || c == 0) {
+            switch(c) {
+            case '\a': escch = 'a'; break;
+            case '\b': escch = 'b'; break;
+            case '\t': escch = 't'; break;
+            case '\n': escch = 'n'; break;
+            case '\v': escch = 'v'; break;
+            case '\f': escch = 'f'; break;
+            case '\r': escch = 'r'; break;
+            case '\\': escch = '\\'; break;
+            case '\"': escch = '\"'; break;
+            case '\'': escch = '\''; break;
+            case 0: escch = '0'; break;
+            }
+            if(escch) {
+                *dest++ = '\\';
+                *dest++ = escch;
+                escaped++;
+            }
+            else {
+                *dest++ = c;
+            }
+        }
+        else {
+
+            dest += scsprintf(dest, destcharsize, escpat, c);
+            escaped++;
+        }
+    }
+
+    if(escaped) {
+        sq_pushstring(v,resstr,dest - resstr);
+    }
+    else {
+        sq_push(v,2); //nothing escaped
+    }
+    return 1;
+}
+
 #define SETUP_REX(v) \
 	SQRex *self = NULL; \
 	sq_getinstanceup(v,1,(SQUserPointer *)&self,0);
 
-static SQRESULT _rexobj_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT _rexobj_releasehook(SQUserPointer p, SQInteger /*size*/, HSQUIRRELVM /*v*/)
 {
 	SQRex *self = ((SQRex *)p);
 	sqstd_rex_free(self);
@@ -494,7 +564,7 @@ static SQRegFunction rexobj_funcs[]={
 	_DECL_REX_FUNC(getxcapture,4,_SC("xsna")),
 	_DECL_REX_FUNC(subexpcount,1,_SC("x")),
 	_DECL_REX_FUNC(_typeof,1,_SC("x")),
-	{0,0}
+	{NULL,(SQFUNCTION)0,0,NULL}
 };
 #undef _DECL_REX_FUNC
 
@@ -502,7 +572,8 @@ static SQRegFunction rexobj_funcs[]={
 static SQRegFunction stringlib_funcs[]={
 	_DECL_FUNC(printf,-2,_SC(".s")),
 	_DECL_FUNC(format,-2,_SC(".s")),
-	{0,0}
+    _DECL_FUNC(escape,2,_SC(".s")),
+	{NULL,(SQFUNCTION)0,0,NULL}
 };
 #undef _DECL_FUNC
 

+ 1 - 1
SquiLu/sqstdlib/sqstdsystem.cpp

@@ -630,7 +630,7 @@ static SQRegFunction systemlib_funcs[]={
 	_DECL_FUNC(signal_str2int,2,_SC(".s")),
 	_DECL_FUNC(signal_int2str,2,_SC(".i")),
 #endif
-	{0,0}
+	{NULL,(SQFUNCTION)0,0,NULL}
 };
 #undef _DECL_FUNC
 

+ 16 - 16
SquiLu/squirrel/sqbaselib.cpp

@@ -42,7 +42,7 @@ bool str2num(const SQChar *s,SQObjectPtr &res, SQInteger base=10)
 	return true;
 }
 
-static SQRESULT base_dummy(HSQUIRRELVM v)
+static SQRESULT base_dummy(HSQUIRRELVM /*v*/)
 {
 	return 0;
 }
@@ -391,10 +391,10 @@ static SQRESULT base_str_from_chars (HSQUIRRELVM v) {
   SQChar *data = sq_getscratchpad(v, n);
   for (i=2; i<=n; ++i) {
     SQ_GET_INTEGER(v, i, c);
-    if(uchar(c) != c){
+    if(SQUChar(c) != c){
         return sq_throwerror(v, _SC("invalid value for parameter %d"), i);
     }
-    data[i-2] = uchar(c);
+    data[i-2] = SQUChar(c);
   }
   sq_pushstring(v, data, n-1);
   return 1;
@@ -567,7 +567,7 @@ static SQRegFunction base_funcs[]={
 	{_SC("table_setdelegate"),bf_table_setdelegate,3, _SC(".t t|o")},
 	{_SC("table_getdelegate"),bf_table_getdelegate,2, _SC(".t")},
 	{_SC("table_getdelegate_squirrel"),bf_table_getdelegate_squirrel,1, _SC(".")},
-	{0,0}
+	{NULL,(SQFUNCTION)0,0,NULL}
 };
 
 void sq_base_register(HSQUIRRELVM v)
@@ -772,11 +772,11 @@ SQRegFunction SQSharedState::_table_default_delegate_squirrel_funcz[]={
 	{_SC("clear"),obj_clear,1, _SC(".")},
 	{_SC("setdelegate"),table_setdelegate,2, _SC(".t|o")},
 	{_SC("getdelegate"),table_getdelegate,1, _SC(".")},
-	{0,0}
+	{NULL,(SQFUNCTION)0,0,NULL}
 };
 
 SQRegFunction SQSharedState::_table_default_delegate_funcz[]={
-	{0,0}
+	{NULL,(SQFUNCTION)0,0,NULL}
 };
 
 //ARRAY DEFAULT DELEGATE///////////////////////////////////////
@@ -1066,7 +1066,7 @@ bool _hsort_sift_down(HSQUIRRELVM v,SQArray *arr, SQInteger root, SQInteger bott
 	return true;
 }
 
-bool _hsort(HSQUIRRELVM v,SQObjectPtr &arr, SQInteger l, SQInteger r,SQInteger func)
+bool _hsort(HSQUIRRELVM v,SQObjectPtr &arr, SQInteger /*l*/, SQInteger /*r*/,SQInteger func)
 {
 	SQArray *a = _array(arr);
 	SQInteger i;
@@ -1232,7 +1232,7 @@ SQRegFunction SQSharedState::_array_default_delegate_funcz[]={
 	{_SC("get"),container_rawget, -2, _SC("ai.")},
 	{_SC("set"),array_set, 3, _SC("ai.")},
 	{_SC("isempty"),array_empty, 1, _SC("a")},
-	{0,0}
+	{NULL,(SQFUNCTION)0,0,NULL}
 };
 
 //STRING DEFAULT DELEGATE//////////////////////////
@@ -2035,7 +2035,7 @@ SQRegFunction SQSharedState::_string_default_delegate_funcz[]={
 	{_SC("sl_like_cmp"),string_sl_like_cmp, -2, _SC("ssi")},
 	{_SC("sl_like_cmp_noaccents"),string_sl_like_cmp_noaccents, -2, _SC("ssi")},
 #endif
-	{0,0}
+	{NULL,(SQFUNCTION)0,0,NULL}
 };
 
 //NUMBER DEFAULT DELEGATE//////////////////////////
@@ -2051,7 +2051,7 @@ SQRegFunction SQSharedState::_number_default_delegate_funcz[]={
 	{_SC("tochar"),number_delegate_tochar,1, _SC("n|b")},
 	{_SC("weakref"),obj_delegate_weakref,1, NULL },
 	{_SC("getdelegate"),number_getdelegate,1, _SC(".")},
-	{0,0}
+	{NULL,(SQFUNCTION)0,0,NULL}
 };
 
 //CLOSURE DEFAULT DELEGATE//////////////////////////
@@ -2177,7 +2177,7 @@ SQRegFunction SQSharedState::_closure_default_delegate_funcz[]={
 	{_SC("getenv"),closure_getenv,1, _SC("c")},
 	{_SC("getinfos"),closure_getinfos,1, _SC("c")},
 	{_SC("getdelegate"),closure_getdelegate,1, _SC(".")},
-	{0,0}
+	{NULL,(SQFUNCTION)0,0,NULL}
 };
 
 //GENERATOR DEFAULT DELEGATE
@@ -2203,7 +2203,7 @@ SQRegFunction SQSharedState::_generator_default_delegate_funcz[]={
 	{_SC("weakref"),obj_delegate_weakref,1, NULL },
 	{_SC("tostring"),default_delegate_tostring,1, _SC(".")},
 	{_SC("getdelegate"),generator_getdelegate,1, _SC(".")},
-	{0,0}
+	{NULL,(SQFUNCTION)0,0,NULL}
 };
 
 //THREAD DEFAULT DELEGATE
@@ -2329,7 +2329,7 @@ SQRegFunction SQSharedState::_thread_default_delegate_funcz[] = {
 	{_SC("getstackinfos"),thread_getstackinfos,2, _SC("vn")},
 	{_SC("tostring"),default_delegate_tostring,1, _SC(".")},
 	{_SC("getdelegate"),thread_getdelegate,1, _SC(".")},
-	{0,0},
+	{NULL,(SQFUNCTION)0,0,NULL},
 };
 
 static SQRESULT class_getattributes(HSQUIRRELVM v)
@@ -2403,7 +2403,7 @@ SQRegFunction SQSharedState::_class_default_delegate_funcz[] = {
 	{_SC("newmember"),class_newmember,-3, _SC("y")},
 	{_SC("rawnewmember"),class_rawnewmember,-3, _SC("y")},
 	{_SC("getdelegate"),class_getdelegate,1, _SC(".")},
-	{0,0}
+	{NULL,(SQFUNCTION)0,0,NULL}
 };
 
 
@@ -2428,7 +2428,7 @@ SQRegFunction SQSharedState::_instance_default_delegate_funcz[] = {
 	{_SC("weakref"),obj_delegate_weakref,1, NULL },
 	{_SC("tostring"),default_delegate_tostring,1, _SC(".")},
 	{_SC("getdelegate"),instance_getdelegate,1, _SC(".")},
-	{0,0}
+	{NULL,(SQFUNCTION)0,0,NULL}
 };
 
 static SQRESULT weakref_ref(HSQUIRRELVM v)
@@ -2448,7 +2448,7 @@ SQRegFunction SQSharedState::_weakref_default_delegate_funcz[] = {
 	{_SC("weakref"),obj_delegate_weakref,1, NULL },
 	{_SC("tostring"),default_delegate_tostring,1, _SC(".")},
 	{_SC("getdelegate"),weakref_getdelegate,1, _SC(".")},
-	{0,0}
+	{NULL,(SQFUNCTION)0,0,NULL}
 };
 
 

+ 212 - 212
SquiLu/squirrel/sqclass.cpp

@@ -1,215 +1,215 @@
-/*
-	see copyright notice in squirrel.h
-*/
-#include "sqpcheader.h"
-#include "sqvm.h"
-#include "sqtable.h"
-#include "sqclass.h"
-#include "sqfuncproto.h"
-#include "sqclosure.h"
-
-
-
-SQClass::SQClass(SQSharedState *ss,SQClass *base)
-{
-	_base = base;
-	_typetag = 0;
+/*
+	see copyright notice in squirrel.h
+*/
+#include "sqpcheader.h"
+#include "sqvm.h"
+#include "sqtable.h"
+#include "sqclass.h"
+#include "sqfuncproto.h"
+#include "sqclosure.h"
+
+
+
+SQClass::SQClass(SQSharedState *ss,SQClass *base)
+{
+	_base = base;
+	_typetag = 0;
 	_hook = NULL;
-	_udsize = 0;
-	_locked = false;
-	_constructoridx = _destructoridx = -1;
-	if(_base) {
-		_constructoridx = _base->_constructoridx;
-		_destructoridx = _base->_destructoridx;
-		_udsize = _base->_udsize;
-		_defaultvalues.copy(base->_defaultvalues);
-		_methods.copy(base->_methods);
-		_COPY_VECTOR(_metamethods,base->_metamethods,MT_LAST);
-		__ObjAddRef(_base);
-	}
-	_members = base?base->_members->Clone() : SQTable::Create(ss,0);
-	__ObjAddRef(_members);
-
-	INIT_CHAIN();
-	ADD_TO_CHAIN(&_sharedstate->_gc_chain, this);
-}
-
-void SQClass::Finalize() {
-	_attributes.Null();
-	_NULL_SQOBJECT_VECTOR(_defaultvalues,_defaultvalues.size());
-	_methods.resize(0);
-	_NULL_SQOBJECT_VECTOR(_metamethods,MT_LAST);
-	__ObjRelease(_members);
-	if(_base) {
-		__ObjRelease(_base);
-	}
-}
-
-SQClass::~SQClass()
-{
-	REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this);
-	Finalize();
-}
-
-bool SQClass::NewSlot(SQSharedState *ss,const SQObjectPtr &key,const SQObjectPtr &val,bool bstatic)
-{
-	SQObjectPtr temp;
-	bool belongs_to_static_table = type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE || bstatic;
-	if(_locked && !belongs_to_static_table)
-		return false; //the class already has an instance so cannot be modified
-	if(_members->Get(key,temp) && _isfield(temp)) //overrides the default value
-	{
-		_defaultvalues[_member_idx(temp)].val = val;
-		return true;
-	}
-	if(belongs_to_static_table) {
-		SQInteger mmidx;
-		if((type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE) &&
-			(mmidx = ss->GetMetaMethodIdxByName(key)) != -1) {
-			_metamethods[mmidx] = val;
-		}
-		else {
-			SQObjectPtr theval = val;
-			if(_base && type(val) == OT_CLOSURE) {
-				theval = _closure(val)->Clone();
-				_closure(theval)->_base = _base;
-				__ObjAddRef(_base); //ref for the closure
-			}
-			if(type(temp) == OT_NULL) {
-				if(SQVM::IsEqual(ss->_constructoridx, key)) {
-					_constructoridx = (SQInteger)_methods.size();
+	_udsize = 0;
+	_locked = false;
+	_constructoridx = _destructoridx = -1;
+	if(_base) {
+		_constructoridx = _base->_constructoridx;
+		_destructoridx = _base->_destructoridx;
+		_udsize = _base->_udsize;
+		_defaultvalues.copy(base->_defaultvalues);
+		_methods.copy(base->_methods);
+		_COPY_VECTOR(_metamethods,base->_metamethods,MT_LAST);
+		__ObjAddRef(_base);
+	}
+	_members = base?base->_members->Clone() : SQTable::Create(ss,0);
+	__ObjAddRef(_members);
+
+	INIT_CHAIN();
+	ADD_TO_CHAIN(&_sharedstate->_gc_chain, this);
+}
+
+void SQClass::Finalize() {
+	_attributes.Null();
+	_NULL_SQOBJECT_VECTOR(_defaultvalues,_defaultvalues.size());
+	_methods.resize(0);
+	_NULL_SQOBJECT_VECTOR(_metamethods,MT_LAST);
+	__ObjRelease(_members);
+	if(_base) {
+		__ObjRelease(_base);
+	}
+}
+
+SQClass::~SQClass()
+{
+	REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this);
+	Finalize();
+}
+
+bool SQClass::NewSlot(SQSharedState *ss,const SQObjectPtr &key,const SQObjectPtr &val,bool bstatic)
+{
+	SQObjectPtr temp;
+	bool belongs_to_static_table = type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE || bstatic;
+	if(_locked && !belongs_to_static_table)
+		return false; //the class already has an instance so cannot be modified
+	if(_members->Get(key,temp) && _isfield(temp)) //overrides the default value
+	{
+		_defaultvalues[_member_idx(temp)].val = val;
+		return true;
+	}
+	if(belongs_to_static_table) {
+		SQInteger mmidx;
+		if((type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE) &&
+			(mmidx = ss->GetMetaMethodIdxByName(key)) != -1) {
+			_metamethods[mmidx] = val;
+		}
+		else {
+			SQObjectPtr theval = val;
+			if(_base && type(val) == OT_CLOSURE) {
+				theval = _closure(val)->Clone();
+				_closure(theval)->_base = _base;
+				__ObjAddRef(_base); //ref for the closure
+			}
+			if(type(temp) == OT_NULL) {
+				if(SQVM::IsEqual(ss->_constructoridx, key)) {
+					_constructoridx = (SQInteger)_methods.size();
 				}
-				else if(SQVM::IsEqual(ss->_destructoridx, key)) {
+				else if(SQVM::IsEqual(ss->_destructoridx, key)) {
 						_destructoridx = (SQInteger)_methods.size();
-				}
-				SQClassMember m;
-				m.val = theval;
-				_members->NewSlot(key,SQObjectPtr(_make_method_idx(_methods.size())));
-				_methods.push_back(m);
-			}
-			else {
-				_methods[_member_idx(temp)].val = theval;
-			}
-		}
-		return true;
-	}
-	SQClassMember m;
-	m.val = val;
-	_members->NewSlot(key,SQObjectPtr(_make_field_idx(_defaultvalues.size())));
-	_defaultvalues.push_back(m);
-	return true;
-}
-
-SQInstance *SQClass::CreateInstance()
-{
-	if(!_locked) Lock();
-	return SQInstance::Create(_opt_ss(this),this);
-}
-
-SQInteger SQClass::Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval)
-{
-	SQObjectPtr oval;
-	SQInteger idx = _members->Next(false,refpos,outkey,oval);
-	if(idx != -1) {
-		if(_ismethod(oval)) {
-			outval = _methods[_member_idx(oval)].val;
-		}
-		else {
-			SQObjectPtr &o = _defaultvalues[_member_idx(oval)].val;
-			outval = _realval(o);
-		}
-	}
-	return idx;
-}
-
-bool SQClass::SetAttributes(const SQObjectPtr &key,const SQObjectPtr &val)
-{
-	SQObjectPtr idx;
-	if(_members->Get(key,idx)) {
-		if(_isfield(idx))
-			_defaultvalues[_member_idx(idx)].attrs = val;
-		else
-			_methods[_member_idx(idx)].attrs = val;
-		return true;
-	}
-	return false;
-}
-
-bool SQClass::GetAttributes(const SQObjectPtr &key,SQObjectPtr &outval)
-{
-	SQObjectPtr idx;
-	if(_members->Get(key,idx)) {
-		outval = (_isfield(idx)?_defaultvalues[_member_idx(idx)].attrs:_methods[_member_idx(idx)].attrs);
-		return true;
-	}
-	return false;
-}
-
-///////////////////////////////////////////////////////////////////////
-void SQInstance::Init(SQSharedState *ss)
-{
-	_userpointer = NULL;
-	_hook = NULL;
-	__ObjAddRef(_class);
-	_delegate = _class->_members;
-	INIT_CHAIN();
-	ADD_TO_CHAIN(&_sharedstate->_gc_chain, this);
-}
-
-SQInstance::SQInstance(SQSharedState *ss, SQClass *c, SQInteger memsize)
-{
-	_memsize = memsize;
-	_class = c;
-	SQUnsignedInteger nvalues = _class->_defaultvalues.size();
-	for(SQUnsignedInteger n = 0; n < nvalues; n++) {
-		new (&_values[n]) SQObjectPtr(_class->_defaultvalues[n].val);
-	}
-	Init(ss);
-}
-
-SQInstance::SQInstance(SQSharedState *ss, SQInstance *i, SQInteger memsize)
-{
-	_memsize = memsize;
-	_class = i->_class;
-	SQUnsignedInteger nvalues = _class->_defaultvalues.size();
-	for(SQUnsignedInteger n = 0; n < nvalues; n++) {
-		new (&_values[n]) SQObjectPtr(i->_values[n]);
-	}
-	Init(ss);
-}
-
-void SQInstance::Finalize()
-{
-	SQUnsignedInteger nvalues = _class->_defaultvalues.size();
-	__ObjRelease(_class);
-	_NULL_SQOBJECT_VECTOR(_values,nvalues);
-	//for(SQUnsignedInteger i = 0; i < nvalues; i++) {
-//		_values[i].Null();
-//	}
-}
-
-SQInstance::~SQInstance()
-{
-	REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this);
-	if(_class){ Finalize(); } //if _class is null it was already finalized by the GC
-}
-
-bool SQInstance::GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res)
-{
-	if(type(_class->_metamethods[mm]) != OT_NULL) {
-		res = _class->_metamethods[mm];
-		return true;
-	}
-	return false;
-}
-
-bool SQInstance::InstanceOf(SQClass *trg)
-{
-	SQClass *parent = _class;
-	while(parent != NULL) {
-		if(parent == trg)
-			return true;
-		parent = parent->_base;
-	}
-	return false;
-}
+				}
+				SQClassMember m;
+				m.val = theval;
+				_members->NewSlot(key,SQObjectPtr(_make_method_idx(_methods.size())));
+				_methods.push_back(m);
+			}
+			else {
+				_methods[_member_idx(temp)].val = theval;
+			}
+		}
+		return true;
+	}
+	SQClassMember m;
+	m.val = val;
+	_members->NewSlot(key,SQObjectPtr(_make_field_idx(_defaultvalues.size())));
+	_defaultvalues.push_back(m);
+	return true;
+}
+
+SQInstance *SQClass::CreateInstance()
+{
+	if(!_locked) Lock();
+	return SQInstance::Create(_opt_ss(this),this);
+}
+
+SQInteger SQClass::Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval)
+{
+	SQObjectPtr oval;
+	SQInteger idx = _members->Next(false,refpos,outkey,oval);
+	if(idx != -1) {
+		if(_ismethod(oval)) {
+			outval = _methods[_member_idx(oval)].val;
+		}
+		else {
+			SQObjectPtr &o = _defaultvalues[_member_idx(oval)].val;
+			outval = _realval(o);
+		}
+	}
+	return idx;
+}
+
+bool SQClass::SetAttributes(const SQObjectPtr &key,const SQObjectPtr &val)
+{
+	SQObjectPtr idx;
+	if(_members->Get(key,idx)) {
+		if(_isfield(idx))
+			_defaultvalues[_member_idx(idx)].attrs = val;
+		else
+			_methods[_member_idx(idx)].attrs = val;
+		return true;
+	}
+	return false;
+}
+
+bool SQClass::GetAttributes(const SQObjectPtr &key,SQObjectPtr &outval)
+{
+	SQObjectPtr idx;
+	if(_members->Get(key,idx)) {
+		outval = (_isfield(idx)?_defaultvalues[_member_idx(idx)].attrs:_methods[_member_idx(idx)].attrs);
+		return true;
+	}
+	return false;
+}
+
+///////////////////////////////////////////////////////////////////////
+void SQInstance::Init(SQSharedState *ss)
+{
+	_userpointer = NULL;
+	_hook = NULL;
+	__ObjAddRef(_class);
+	_delegate = _class->_members;
+	INIT_CHAIN();
+	ADD_TO_CHAIN(&_sharedstate->_gc_chain, this);
+}
+
+SQInstance::SQInstance(SQSharedState *ss, SQClass *c, SQInteger memsize)
+{
+	_memsize = memsize;
+	_class = c;
+	SQUnsignedInteger nvalues = _class->_defaultvalues.size();
+	for(SQUnsignedInteger n = 0; n < nvalues; n++) {
+		new (&_values[n]) SQObjectPtr(_class->_defaultvalues[n].val);
+	}
+	Init(ss);
+}
+
+SQInstance::SQInstance(SQSharedState *ss, SQInstance *i, SQInteger memsize)
+{
+	_memsize = memsize;
+	_class = i->_class;
+	SQUnsignedInteger nvalues = _class->_defaultvalues.size();
+	for(SQUnsignedInteger n = 0; n < nvalues; n++) {
+		new (&_values[n]) SQObjectPtr(i->_values[n]);
+	}
+	Init(ss);
+}
+
+void SQInstance::Finalize()
+{
+	SQUnsignedInteger nvalues = _class->_defaultvalues.size();
+	__ObjRelease(_class);
+	_NULL_SQOBJECT_VECTOR(_values,nvalues);
+	//for(SQUnsignedInteger i = 0; i < nvalues; i++) {
+//		_values[i].Null();
+//	}
+}
+
+SQInstance::~SQInstance()
+{
+	REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this);
+	if(_class){ Finalize(); } //if _class is null it was already finalized by the GC
+}
+
+bool SQInstance::GetMetaMethod(SQVM */*v*/,SQMetaMethod mm,SQObjectPtr &res)
+{
+	if(type(_class->_metamethods[mm]) != OT_NULL) {
+		res = _class->_metamethods[mm];
+		return true;
+	}
+	return false;
+}
+
+bool SQInstance::InstanceOf(SQClass *trg)
+{
+	SQClass *parent = _class;
+	while(parent != NULL) {
+		if(parent == trg)
+			return true;
+		parent = parent->_base;
+	}
+	return false;
+}

+ 4 - 3
SquiLu/squirrel/sqcompiler.cpp

@@ -145,7 +145,7 @@ public:
 	{
 		va_list vl;
 		va_start(vl, s);
-		scvsnprintf(error_buf, sizeof(error_buf), s, vl);
+		scvsprintf(error_buf, sizeof(error_buf), s, vl);
 		va_end(vl);
 		_compilererror = error_buf;
 		longjmp(_errorjmp,1);
@@ -271,8 +271,8 @@ public:
 	}
 
 	void Lex()
-	{
-	    _token = _lex.Lex();
+    {
+        _token = _lex.Lex();
     }
 	SQObjectPtr GetTokenObject(SQInteger tok)
 	{
@@ -1331,6 +1331,7 @@ public:
 			SQInteger key = _fs->PopTarget();
 			SQInteger attrs = hasattrs ? _fs->PopTarget():-1;
 			assert((hasattrs && (attrs == key-1)) || !hasattrs);
+			(void)attrs; // UNUSED
 			unsigned char flags = (hasattrs?NEW_SLOT_ATTRIBUTES_FLAG:0)|(isstatic?NEW_SLOT_STATIC_FLAG:0);
 			SQInteger table = _fs->TopTarget(); //<<BECAUSE OF THIS NO COMMON EMIT FUNC IS POSSIBLE
 			if(isClass) {

+ 115 - 114
SquiLu/squirrel/sqdebug.cpp

@@ -1,117 +1,118 @@
-/*
-	see copyright notice in squirrel.h
-*/
-#include "sqpcheader.h"
-#include <stdarg.h>
-#include "sqvm.h"
-#include "sqfuncproto.h"
-#include "sqclosure.h"
-#include "sqstring.h"
-
-SQRESULT sq_getfunctioninfo(HSQUIRRELVM v,SQInteger level,SQFunctionInfo *fi)
-{
-	SQInteger cssize = v->_callsstacksize;
-	if (cssize > level) {
-		SQVM::CallInfo &ci = v->_callsstack[cssize-level-1];
-		if(sq_isclosure(ci._closure)) {
-			SQClosure *c = _closure(ci._closure);
-			SQFunctionProto *proto = c->_function;
-			fi->funcid = proto;
-			fi->name = type(proto->_name) == OT_STRING?_stringval(proto->_name):_SC("unknown");
+/*
+	see copyright notice in squirrel.h
+*/
+#include "sqpcheader.h"
+#include <stdarg.h>
+#include "sqvm.h"
+#include "sqfuncproto.h"
+#include "sqclosure.h"
+#include "sqstring.h"
+
+SQRESULT sq_getfunctioninfo(HSQUIRRELVM v,SQInteger level,SQFunctionInfo *fi)
+{
+	SQInteger cssize = v->_callsstacksize;
+	if (cssize > level) {
+		SQVM::CallInfo &ci = v->_callsstack[cssize-level-1];
+		if(sq_isclosure(ci._closure)) {
+			SQClosure *c = _closure(ci._closure);
+			SQFunctionProto *proto = c->_function;
+			fi->funcid = proto;
+			fi->name = type(proto->_name) == OT_STRING?_stringval(proto->_name):_SC("unknown");
 			fi->source = type(proto->_sourcename) == OT_STRING?_stringval(proto->_sourcename):_SC("unknown");
 			fi->line = proto->_lineinfos[0]._line;
-			return SQ_OK;
-		}
-	}
-	return sq_throwerror(v,_SC("the object is not a closure"));
-}
-
-SQRESULT sq_stackinfos(HSQUIRRELVM v, SQInteger level, SQStackInfos *si)
-{
-	SQInteger cssize = v->_callsstacksize;
-	if (cssize > level) {
-		memset(si, 0, sizeof(SQStackInfos));
-		SQVM::CallInfo &ci = v->_callsstack[cssize-level-1];
-		switch (type(ci._closure)) {
-		case OT_CLOSURE:{
-			SQFunctionProto *func = _closure(ci._closure)->_function;
-			if (type(func->_name) == OT_STRING)
-				si->funcname = _stringval(func->_name);
-			if (type(func->_sourcename) == OT_STRING)
-				si->source = _stringval(func->_sourcename);
-			si->line = func->GetLine(ci._ip);
-						}
-			break;
-		case OT_NATIVECLOSURE:
-			si->source = _SC("NATIVE");
-			si->funcname = _SC("unknown");
-			if(type(_nativeclosure(ci._closure)->_name) == OT_STRING)
-				si->funcname = _stringval(_nativeclosure(ci._closure)->_name);
-			si->line = -1;
-			break;
-		default: break; //shutup compiler
-		}
-		return SQ_OK;
-	}
-	return SQ_ERROR;
-}
-
-void SQVM::Raise_Error(const SQChar *s, ...)
-{
-	va_list vl;
-	va_start(vl, s);
-	scvsprintf(_sp(rsl((SQInteger)scstrlen(s)+(NUMBER_MAX_CHAR*2))), s, vl);
-	va_end(vl);
-	_lasterror = SQString::Create(_ss(this),_spval,-1);
-}
-
-void SQVM::Raise_Error(const SQObjectPtr &desc)
-{
+			return SQ_OK;
+		}
+	}
+	return sq_throwerror(v,_SC("the object is not a closure"));
+}
+
+SQRESULT sq_stackinfos(HSQUIRRELVM v, SQInteger level, SQStackInfos *si)
+{
+	SQInteger cssize = v->_callsstacksize;
+	if (cssize > level) {
+		memset(si, 0, sizeof(SQStackInfos));
+		SQVM::CallInfo &ci = v->_callsstack[cssize-level-1];
+		switch (type(ci._closure)) {
+		case OT_CLOSURE:{
+			SQFunctionProto *func = _closure(ci._closure)->_function;
+			if (type(func->_name) == OT_STRING)
+				si->funcname = _stringval(func->_name);
+			if (type(func->_sourcename) == OT_STRING)
+				si->source = _stringval(func->_sourcename);
+			si->line = func->GetLine(ci._ip);
+						}
+			break;
+		case OT_NATIVECLOSURE:
+			si->source = _SC("NATIVE");
+			si->funcname = _SC("unknown");
+			if(type(_nativeclosure(ci._closure)->_name) == OT_STRING)
+				si->funcname = _stringval(_nativeclosure(ci._closure)->_name);
+			si->line = -1;
+			break;
+		default: break; //shutup compiler
+		}
+		return SQ_OK;
+	}
+	return SQ_ERROR;
+}
+
+void SQVM::Raise_Error(const SQChar *s, ...)
+{
+    va_list vl;
+    va_start(vl, s);
+    SQInteger buffersize = (SQInteger)scstrlen(s)+(NUMBER_MAX_CHAR*2);
+    scvsprintf(_sp(sq_rsl(buffersize)),buffersize, s, vl);
+    va_end(vl);
+    _lasterror = SQString::Create(_ss(this),_spval,-1);
+}
+
+void SQVM::Raise_Error(const SQObjectPtr &desc)
+{
 	_lasterror = desc;
-}
-
-SQString *SQVM::PrintObjVal(const SQObjectPtr &o)
-{
-	switch(type(o)) {
-	case OT_STRING: return _string(o);
-	case OT_INTEGER:
-		scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _PRINT_INT_FMT, _integer(o));
-		return SQString::Create(_ss(this), _spval);
-		break;
-	case OT_FLOAT:
-		scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _SC("%.14g"), _float(o));
-		return SQString::Create(_ss(this), _spval);
-		break;
-	default:
-		return SQString::Create(_ss(this), GetTypeName(o));
-	}
-}
-
-void SQVM::Raise_IdxError(const SQObjectPtr &o)
-{
-	SQObjectPtr oval = PrintObjVal(o);
-	Raise_Error(_SC("the index '%.50s' does not exist"), _stringval(oval));
-}
-
-void SQVM::Raise_CompareError(const SQObject &o1, const SQObject &o2)
-{
-	SQObjectPtr oval1 = PrintObjVal(o1), oval2 = PrintObjVal(o2);
-	Raise_Error(_SC("comparison between '%.50s' and '%.50s'"), _stringval(oval1), _stringval(oval2));
-}
-
-
-void SQVM::Raise_ParamTypeError(SQInteger nparam,SQInteger typemask,SQInteger type)
-{
-	SQObjectPtr exptypes = SQString::Create(_ss(this), _SC(""), -1);
-	SQInteger found = 0;
-	for(SQInteger i=0; i<16; i++)
-	{
-		SQInteger mask = 0x00000001 << i;
-		if(typemask & (mask)) {
-			if(found>0) StringCat(exptypes,SQString::Create(_ss(this), _SC("|"), -1), exptypes);
-			found ++;
-			StringCat(exptypes,SQString::Create(_ss(this), IdType2Name((SQObjectType)mask), -1), exptypes);
-		}
-	}
-	Raise_Error(_SC("parameter %d has an invalid type '%s' ; expected: '%s'"), nparam, IdType2Name((SQObjectType)type), _stringval(exptypes));
-}
+}
+
+SQString *SQVM::PrintObjVal(const SQObjectPtr &o)
+{
+    switch(type(o)) {
+    case OT_STRING: return _string(o);
+    case OT_INTEGER:
+        scsprintf(_sp(sq_rsl(NUMBER_MAX_CHAR+1)),sq_rsl(NUMBER_MAX_CHAR), _PRINT_INT_FMT, _integer(o));
+        return SQString::Create(_ss(this), _spval);
+        break;
+    case OT_FLOAT:
+        scsprintf(_sp(sq_rsl(NUMBER_MAX_CHAR+1)), sq_rsl(NUMBER_MAX_CHAR), _SC("%.14g"), _float(o));
+        return SQString::Create(_ss(this), _spval);
+        break;
+    default:
+        return SQString::Create(_ss(this), GetTypeName(o));
+    }
+}
+
+void SQVM::Raise_IdxError(const SQObjectPtr &o)
+{
+	SQObjectPtr oval = PrintObjVal(o);
+	Raise_Error(_SC("the index '%.50s' does not exist"), _stringval(oval));
+}
+
+void SQVM::Raise_CompareError(const SQObject &o1, const SQObject &o2)
+{
+	SQObjectPtr oval1 = PrintObjVal(o1), oval2 = PrintObjVal(o2);
+	Raise_Error(_SC("comparison between '%.50s' and '%.50s'"), _stringval(oval1), _stringval(oval2));
+}
+
+
+void SQVM::Raise_ParamTypeError(SQInteger nparam,SQInteger typemask,SQInteger type)
+{
+	SQObjectPtr exptypes = SQString::Create(_ss(this), _SC(""), -1);
+	SQInteger found = 0;
+	for(SQInteger i=0; i<16; i++)
+	{
+		SQInteger mask = 0x00000001 << i;
+		if(typemask & (mask)) {
+			if(found>0) StringCat(exptypes,SQString::Create(_ss(this), _SC("|"), -1), exptypes);
+			found ++;
+			StringCat(exptypes,SQString::Create(_ss(this), IdType2Name((SQObjectType)mask), -1), exptypes);
+		}
+	}
+	Raise_Error(_SC("parameter %d has an invalid type '%s' ; expected: '%s'"), nparam, IdType2Name((SQObjectType)type), _stringval(exptypes));
+}

+ 86 - 16
SquiLu/squirrel/sqlexer.cpp

@@ -128,7 +128,7 @@ void SQLexer::Error(const SQChar *fmt, ...)
     static SQChar temp[256];
     va_list vl;
     va_start(vl, fmt);
-    scvsprintf(temp, fmt, vl);
+    scvsprintf(temp, sizeof(temp), fmt, vl);
     va_end(vl);
 	_errfunc(_errtarget,temp);
 }
@@ -381,6 +381,66 @@ SQInteger SQLexer::GetIDType(const SQChar *s,SQInteger len)
 	return TK_IDENTIFIER;
 }
 
+#ifdef SQUNICODE
+#if WCHAR_SIZE == 2
+SQInteger SQLexer::AddUTF16(SQUnsignedInteger ch)
+{
+    if (ch >= 0x10000)
+    {
+        SQUnsignedInteger code = (ch - 0x10000);
+        APPEND_CHAR((SQChar)(0xD800 | (code >> 10)));
+        APPEND_CHAR((SQChar)(0xDC00 | (code & 0x3FF)));
+        return 2;
+    }
+    else {
+        APPEND_CHAR((SQChar)ch);
+        return 1;
+    }
+}
+#endif
+#else
+SQInteger SQLexer::AddUTF8(SQUnsignedInteger ch)
+{
+    if (ch < 0x80) {
+        APPEND_CHAR((char)ch);
+        return 1;
+    }
+    if (ch < 0x800) {
+        APPEND_CHAR((SQChar)((ch >> 6) | 0xC0));
+        APPEND_CHAR((SQChar)((ch & 0x3F) | 0x80));
+        return 2;
+    }
+    if (ch < 0x10000) {
+        APPEND_CHAR((SQChar)((ch >> 12) | 0xE0));
+        APPEND_CHAR((SQChar)(((ch >> 6) & 0x3F) | 0x80));
+        APPEND_CHAR((SQChar)((ch & 0x3F) | 0x80));
+        return 3;
+    }
+    if (ch < 0x110000) {
+        APPEND_CHAR((SQChar)((ch >> 18) | 0xF0));
+        APPEND_CHAR((SQChar)(((ch >> 12) & 0x3F) | 0x80));
+        APPEND_CHAR((SQChar)(((ch >> 6) & 0x3F) | 0x80));
+        APPEND_CHAR((SQChar)((ch & 0x3F) | 0x80));
+        return 4;
+    }
+    return 0;
+}
+#endif
+
+SQInteger SQLexer::ProcessStringHexEscape(SQChar *dest, SQInteger maxdigits)
+{
+    NEXT();
+    if (!isxdigit(CUR_CHAR)) Error(_SC("hexadecimal number expected"));
+    SQInteger n = 0;
+    while (isxdigit(CUR_CHAR) && n < maxdigits) {
+        dest[n] = CUR_CHAR;
+        n++;
+        NEXT();
+    }
+    dest[n] = 0;
+    return n;
+}
+
 SQInteger SQLexer::ReadString(SQInteger ndelim,bool verbatim)
 {
 	INIT_TEMP_STRING();
@@ -429,7 +489,8 @@ SQInteger SQLexer::ReadString(SQInteger ndelim,bool verbatim)
 	}
 	for(;;) {
 		while(CUR_CHAR != ndelim) {
-			switch(CUR_CHAR) {
+            SQInteger x = CUR_CHAR;
+			switch(x) {
 			case SQUIRREL_EOB:
 				Error(_SC("unfinished string"));
 				return -1;
@@ -445,19 +506,29 @@ SQInteger SQLexer::ReadString(SQInteger ndelim,bool verbatim)
 				else {
 					NEXT();
 					switch(CUR_CHAR) {
-					case _SC('x'): NEXT(); {
-						if(!isxdigit(CUR_CHAR)) Error(_SC("hexadecimal number expected"));
-						const SQInteger maxdigits = 4;
-						SQChar temp[maxdigits+1];
-						SQInteger n = 0;
-						while(isxdigit(CUR_CHAR) && n < maxdigits) {
-							temp[n] = CUR_CHAR;
-							n++;
-							NEXT();
-						}
-						temp[n] = 0;
-						SQChar *sTemp;
-						APPEND_CHAR((SQChar)scstrtoul(temp,&sTemp,16));
+                    case _SC('x'):  {
+                        const SQInteger maxdigits = sizeof(SQChar) * 2;
+                        SQChar temp[maxdigits + 1];
+                        ProcessStringHexEscape(temp, maxdigits);
+                        SQChar *stemp;
+                        APPEND_CHAR((SQChar)scstrtoul(temp, &stemp, 16));
+                    }
+                    break;
+                    case _SC('U'):
+                    case _SC('u'):  {
+                        const SQInteger maxdigits = x == 'u' ? 4 : 8;
+                        SQChar temp[8 + 1];
+                        ProcessStringHexEscape(temp, maxdigits);
+                        SQChar *stemp;
+#ifdef SQUNICODE
+#if WCHAR_SIZE == 2
+                        AddUTF16(scstrtoul(temp, &stemp, 16));
+#else
+                        ADD_CHAR((SQChar)scstrtoul(temp, &stemp, 16));
+#endif
+#else
+                        AddUTF8(scstrtoul(temp, &stemp, 16));
+#endif
 					}
 				    break;
 					case _SC('t'): APPEND_CHAR(_SC('\t')); NEXT(); break;
@@ -471,7 +542,6 @@ SQInteger SQLexer::ReadString(SQInteger ndelim,bool verbatim)
 					case _SC('\\'): APPEND_CHAR(_SC('\\')); NEXT(); break;
 					case _SC('"'): APPEND_CHAR(_SC('"')); NEXT(); break;
 					case _SC('\''): APPEND_CHAR(_SC('\'')); NEXT(); break;
-					case _SC('u'): NEXT(); break; //unicode escape leave as is
 					default:
 						Error(_SC("unrecognised escaper char"));
 					break;

+ 8 - 0
SquiLu/squirrel/sqlexer.h

@@ -26,6 +26,14 @@ private:
 	void LexLineComment();
 	SQInteger ReadID();
 	void Next();
+#ifdef SQUNICODE
+#if WCHAR_SIZE == 2
+    SQInteger AddUTF16(SQUnsignedInteger ch);
+#endif
+#else
+    SQInteger AddUTF8(SQUnsignedInteger ch);
+#endif
+    SQInteger ProcessStringHexEscape(SQChar *dest, SQInteger maxdigits);
 	SQInteger _curtoken;
 	SQTable *_keywords;
 	SQBool _reached_eof;

+ 2 - 2
SquiLu/squirrel/sqmem.cpp

@@ -5,7 +5,7 @@
 #ifndef SQ_EXCLUDE_DEFAULT_MEMFUNCTIONS
 void *sq_vm_malloc(SQUnsignedInteger size){	return malloc(size); }
 
-void *sq_vm_realloc(void *p, SQUnsignedInteger oldsize, SQUnsignedInteger size){ return realloc(p, size); }
+void *sq_vm_realloc(void *p, SQUnsignedInteger /*oldsize*/, SQUnsignedInteger size){ return realloc(p, size); }
 
-void sq_vm_free(void *p, SQUnsignedInteger size){	free(p); }
+void sq_vm_free(void *p, SQUnsignedInteger /*size*/){	free(p); }
 #endif

+ 3 - 3
SquiLu/squirrel/sqobject.cpp

@@ -290,7 +290,7 @@ bool SafeWriteFmt(HSQUIRRELVM v,SQWRITEFUNC write,SQUserPointer up, const SQChar
         SQChar str[8192];
         va_list vl;
         va_start(vl, fmt);
-        SQInteger len = scvsnprintf(str, sizeof(str), fmt, vl);
+        SQInteger len = scvsprintf(str, sizeof(str), fmt, vl);
         va_end(vl);
         return SafeWrite(v, write, up, str, len);
     }
@@ -353,10 +353,10 @@ bool WriteObjectAsCode(HSQUIRRELVM v,SQUserPointer up,SQWRITEFUNC write,SQObject
         }
 		break;
 	case OT_INTEGER:
-        sz = scsnprintf(buf, sizeof(buf), _PRINT_INT_FMT, _integer(o));
+        sz = scsprintf(buf, sizeof(buf), _PRINT_INT_FMT, _integer(o));
 		_CHECK_IO(SafeWrite(v,write,up,buf,sz));break;
 	case OT_FLOAT:
-        sz = scsnprintf(buf, sizeof(buf), "%f", _float(o));
+        sz = scsprintf(buf, sizeof(buf), "%f", _float(o));
 		_CHECK_IO(SafeWrite(v,write,up,buf,sz));break;
 	case OT_NULL:{
             const SQChar str[] = _SC("null");

+ 71 - 71
SquiLu/squirrel/sqopcodes.h

@@ -1,40 +1,40 @@
-/*	see copyright notice in squirrel.h */
-#ifndef _SQOPCODES_H_
-#define _SQOPCODES_H_
-
-#define MAX_FUNC_STACKSIZE 0xFF
-#define MAX_LITERALS ((SQInteger)0x7FFFFFFF)
-
-enum BitWiseOP {
-	BW_AND = 0,
-	BW_OR = 2,
-	BW_XOR = 3,
-	BW_SHIFTL = 4,
-	BW_SHIFTR = 5,
-	BW_USHIFTR = 6
-};
-
-enum CmpOP {
-	CMP_G = 0,
-	CMP_GE = 2,
-	CMP_L = 3,
-	CMP_LE = 4,
-	CMP_3W = 5
-};
-
-enum NewObjectType {
-	NOT_TABLE = 0,
-	NOT_ARRAY = 1,
-	NOT_CLASS = 2
-};
-
-enum AppendArrayType {
-	AAT_STACK = 0,
-	AAT_LITERAL = 1,
-	AAT_INT = 2,
-	AAT_FLOAT = 3,
-	AAT_BOOL = 4
-};
+/*	see copyright notice in squirrel.h */
+#ifndef _SQOPCODES_H_
+#define _SQOPCODES_H_
+
+#define MAX_FUNC_STACKSIZE 0xFF
+#define MAX_LITERALS ((SQInteger)0x7FFFFFFF)
+
+enum BitWiseOP {
+	BW_AND = 0,
+	BW_OR = 2,
+	BW_XOR = 3,
+	BW_SHIFTL = 4,
+	BW_SHIFTR = 5,
+	BW_USHIFTR = 6
+};
+
+enum CmpOP {
+	CMP_G = 0,
+	CMP_GE = 2,
+	CMP_L = 3,
+	CMP_LE = 4,
+	CMP_3W = 5
+};
+
+enum NewObjectType {
+	NOT_TABLE = 0,
+	NOT_ARRAY = 1,
+	NOT_CLASS = 2
+};
+
+enum AppendArrayType {
+	AAT_STACK = 0,
+	AAT_LITERAL = 1,
+	AAT_INT = 2,
+	AAT_FLOAT = 3,
+	AAT_BOOL = 4
+};
 
 #define SQ_OP_CODE_LIST() \
 	ENUM_OP(_OP_LINE, 0x00)\
@@ -103,39 +103,39 @@ enum AppendArrayType {
 	ENUM_OP(_OP__LAST__, 0x3F)
 
 //#define ENUM_OP(a,b) a = b,
-//there is no point right now to manually number the opcodes
-#define ENUM_OP(a,b) a,
-enum SQOpcode
+//there is no point right now to manually number the opcodes
+#define ENUM_OP(a,b) a,
+enum SQOpcode
 {
-    SQ_OP_CODE_LIST()
+    SQ_OP_CODE_LIST()
 };
-#undef ENUM_OP
-
-struct SQInstructionDesc {
-	const SQChar *name;
-};
-
-struct SQInstruction
-{
-	SQInstruction(){};
-	SQInstruction(SQOpcode _op,SQInteger a0=0,SQInteger a1=0,SQInteger a2=0,SQInteger a3=0)
-	{	op = _op;
-		_arg0 = (unsigned char)a0;_arg1 = (SQInt32)a1;
-		_arg2 = (unsigned char)a2;_arg3 = (unsigned char)a3;
-	}
-
-
-	SQInt32 _arg1;
-	unsigned char op;
-	unsigned char _arg0;
-	unsigned char _arg2;
-	unsigned char _arg3;
-};
-
-#include "squtils.h"
-typedef sqvector<SQInstruction> SQInstructionVec;
-
-#define NEW_SLOT_ATTRIBUTES_FLAG	0x01
-#define NEW_SLOT_STATIC_FLAG		0x02
-
-#endif // _SQOPCODES_H_
+#undef ENUM_OP
+
+struct SQInstructionDesc {
+	const SQChar *name;
+};
+
+struct SQInstruction
+{
+	SQInstruction(){};
+	SQInstruction(SQOpcode _op,SQInteger a0=0,SQInteger a1=0,SQInteger a2=0,SQInteger a3=0)
+	{	op = (unsigned char)_op;
+		_arg0 = (unsigned char)a0;_arg1 = (SQInt32)a1;
+		_arg2 = (unsigned char)a2;_arg3 = (unsigned char)a3;
+	}
+
+
+	SQInt32 _arg1;
+	unsigned char op;
+	unsigned char _arg0;
+	unsigned char _arg2;
+	unsigned char _arg3;
+};
+
+#include "squtils.h"
+typedef sqvector<SQInstruction> SQInstructionVec;
+
+#define NEW_SLOT_ATTRIBUTES_FLAG	0x01
+#define NEW_SLOT_STATIC_FLAG		0x02
+
+#endif // _SQOPCODES_H_

+ 686 - 686
SquiLu/squirrel/sqstate.cpp

@@ -1,238 +1,238 @@
-/*
-	see copyright notice in squirrel.h
-*/
-#include "sqpcheader.h"
-#include "sqopcodes.h"
-#include "sqvm.h"
-#include "sqfuncproto.h"
-#include "sqclosure.h"
-#include "sqstring.h"
-#include "sqtable.h"
-#include "sqarray.h"
-#include "squserdata.h"
-#include "sqclass.h"
-
-//SQObjectPtr _null_;
-//SQObjectPtr _true_(true);
-//SQObjectPtr _false_(false);
-//SQObjectPtr _one_((SQInteger)1);
-//SQObjectPtr _minusone_((SQInteger)-1);
-
-SQSharedState::SQSharedState()
-{
-	_compilererrorhandler = NULL;
-	_printfunc = NULL;
-	_errorfunc = NULL;
-	_debuginfo = false;
-	_notifyallexceptions = false;
-	_already_in_CallDelayedReleaseHooks = false;
-#ifdef SQ_JIT_LLVM
-	//llvm::StructType::create(
-#endif
-}
-
-#define newsysstring(s) {	\
-	_systemstrings->push_back(SQString::Create(this,s));	\
-	}
-
-#define newmetamethod(s) {	\
-	_metamethods->push_back(SQString::Create(this,s));	\
-	_table(_metamethodsmap)->NewSlot(_metamethods->back(),(SQInteger)(_metamethods->size()-1)); \
-	}
-
-bool CompileTypemask(SQIntVec &res,const SQChar *typemask)
-{
-	SQInteger i = 0;
-
-	SQInteger mask = 0;
-	while(typemask[i] != 0) {
-
-		switch(typemask[i]){
-				case 'o': mask |= _RT_NULL; break;
-				case 'i': mask |= _RT_INTEGER; break;
-				case 'f': mask |= _RT_FLOAT; break;
-				case 'n': mask |= (_RT_FLOAT | _RT_INTEGER); break;
-				case 's': mask |= _RT_STRING; break;
-				case 't': mask |= _RT_TABLE; break;
-				case 'a': mask |= _RT_ARRAY; break;
-				case 'u': mask |= _RT_USERDATA; break;
-				case 'c': mask |= (_RT_CLOSURE | _RT_NATIVECLOSURE); break;
-				case 'b': mask |= _RT_BOOL; break;
-				case 'g': mask |= _RT_GENERATOR; break;
-				case 'p': mask |= _RT_USERPOINTER; break;
-				case 'v': mask |= _RT_THREAD; break;
-				case 'x': mask |= _RT_INSTANCE; break;
-				case 'y': mask |= _RT_CLASS; break;
-				case 'r': mask |= _RT_WEAKREF; break;
-				case '.': mask = -1; res.push_back(mask); i++; mask = 0; continue;
-				case ' ': i++; continue; //ignores spaces
-				default:
-					return false;
-		}
-		i++;
-		if(typemask[i] == '|') {
-			i++;
-			if(typemask[i] == 0)
-				return false;
-			continue;
-		}
-		res.push_back(mask);
-		mask = 0;
-
-	}
-	return true;
-}
-
-SQTable *CreateDefaultDelegate(SQSharedState *ss,SQRegFunction *funcz)
-{
-	SQInteger i=0;
-	SQTable *t=SQTable::Create(ss,0);
-	while(funcz[i].name!=0){
-		SQNativeClosure *nc = SQNativeClosure::Create(ss,funcz[i].f,0);
-		nc->_nparamscheck = funcz[i].nparamscheck;
-		nc->_name = SQString::Create(ss,funcz[i].name);
-		if(funcz[i].typemask && !CompileTypemask(nc->_typecheck,funcz[i].typemask))
-			return NULL;
-		t->NewSlot(SQString::Create(ss,funcz[i].name),nc);
-		i++;
-	}
-	return t;
-}
-
-void SQSharedState::Init()
-{
-	_scratchpad=NULL;
-	_scratchpadsize=0;
-#ifndef NO_GARBAGE_COLLECTOR
-	_gc_chain=NULL;
-#endif
-	_stringtable = (SQStringTable*)SQ_MALLOC(sizeof(SQStringTable));
-	new (_stringtable) SQStringTable(this);
-	sq_new(_metamethods,SQObjectPtrVec);
-	sq_new(_systemstrings,SQObjectPtrVec);
-	sq_new(_types,SQObjectPtrVec);
-	_metamethodsmap = SQTable::Create(this,MT_LAST-1);
-	//adding type strings to avoid memory trashing
-	//types names
-	newsysstring(_SC("null"));
-	newsysstring(_SC("table"));
-	newsysstring(_SC("array"));
-	newsysstring(_SC("closure"));
-	newsysstring(_SC("string"));
-	newsysstring(_SC("userdata"));
-	newsysstring(_SC("integer"));
-	newsysstring(_SC("float"));
-	newsysstring(_SC("userpointer"));
-	newsysstring(_SC("function"));
-	newsysstring(_SC("generator"));
-	newsysstring(_SC("thread"));
-	newsysstring(_SC("class"));
-	newsysstring(_SC("instance"));
-	newsysstring(_SC("bool"));
-	//meta methods
-	newmetamethod(MM_ADD);
-	newmetamethod(MM_SUB);
-	newmetamethod(MM_MUL);
-	newmetamethod(MM_DIV);
-	newmetamethod(MM_UNM);
-	newmetamethod(MM_MODULO);
-	newmetamethod(MM_SET);
-	newmetamethod(MM_GET);
-	newmetamethod(MM_TYPEOF);
-	newmetamethod(MM_NEXTI);
-	newmetamethod(MM_CMP);
-	newmetamethod(MM_CALL);
-	newmetamethod(MM_CLONED);
-	newmetamethod(MM_NEWSLOT);
-	newmetamethod(MM_DELSLOT);
-	newmetamethod(MM_TOSTRING);
-	newmetamethod(MM_NEWMEMBER);
-	newmetamethod(MM_INHERITED);
-
-	_constructoridx = SQString::Create(this,_SC("constructor"));
-	_destructoridx = SQString::Create(this,_SC("destructor"));
-	_registry = SQTable::Create(this,0);
-	_consts = SQTable::Create(this,0);
-	_table_default_delegate = CreateDefaultDelegate(this,_table_default_delegate_funcz);
-	_array_default_delegate = CreateDefaultDelegate(this,_array_default_delegate_funcz);
-	_string_default_delegate = CreateDefaultDelegate(this,_string_default_delegate_funcz);
-	_number_default_delegate = CreateDefaultDelegate(this,_number_default_delegate_funcz);
-	_closure_default_delegate = CreateDefaultDelegate(this,_closure_default_delegate_funcz);
-	_generator_default_delegate = CreateDefaultDelegate(this,_generator_default_delegate_funcz);
-	_thread_default_delegate = CreateDefaultDelegate(this,_thread_default_delegate_funcz);
-	_class_default_delegate = CreateDefaultDelegate(this,_class_default_delegate_funcz);
-	_instance_default_delegate = CreateDefaultDelegate(this,_instance_default_delegate_funcz);
-	_weakref_default_delegate = CreateDefaultDelegate(this,_weakref_default_delegate_funcz);
-
-}
-
-SQSharedState::~SQSharedState()
-{
-	_constructoridx.Null();
-	_destructoridx.Null();
-	_table(_registry)->Finalize();
-	_table(_consts)->Finalize();
-	_table(_metamethodsmap)->Finalize();
-	_registry.Null();
-	_consts.Null();
-	_metamethodsmap.Null();
-	while(!_systemstrings->empty()) {
-		_systemstrings->back().Null();
-		_systemstrings->pop_back();
-	}
-	_thread(_root_vm)->Finalize();
-	_root_vm.Null();
-	_table_default_delegate.Null();
-	_array_default_delegate.Null();
-	_string_default_delegate.Null();
-	_number_default_delegate.Null();
-	_closure_default_delegate.Null();
-	_generator_default_delegate.Null();
-	_thread_default_delegate.Null();
-	_class_default_delegate.Null();
-	_instance_default_delegate.Null();
-	_weakref_default_delegate.Null();
-	_refs_table.Finalize();
-#ifndef NO_GARBAGE_COLLECTOR
-	SQCollectable *t = _gc_chain;
-	SQCollectable *nx = NULL;
-	if(t) {
-		t->_uiRef++;
-		while(t) {
-			t->Finalize();
-			nx = t->_next;
-			if(nx) nx->_uiRef++;
-			if(--t->_uiRef == 0)
-				t->Release();
-			t = nx;
-		}
-	}
-	assert(_gc_chain==NULL); //just to proove a theory
-	while(_gc_chain){
-		_gc_chain->_uiRef++;
-		_gc_chain->Release();
-	}
-#endif
-
-	sq_delete(_types,SQObjectPtrVec);
-	sq_delete(_systemstrings,SQObjectPtrVec);
-	sq_delete(_metamethods,SQObjectPtrVec);
-	sq_delete(_stringtable,SQStringTable);
-	if(_scratchpad)SQ_FREE(_scratchpad,_scratchpadsize);
-}
-
-
-SQInteger SQSharedState::GetMetaMethodIdxByName(const SQObjectPtr &name)
-{
-	if(type(name) != OT_STRING)
-		return -1;
-	SQObjectPtr ret;
-	if(_table(_metamethodsmap)->Get(name,ret)) {
-		return _integer(ret);
-	}
-	return -1;
-}
-
+/*
+	see copyright notice in squirrel.h
+*/
+#include "sqpcheader.h"
+#include "sqopcodes.h"
+#include "sqvm.h"
+#include "sqfuncproto.h"
+#include "sqclosure.h"
+#include "sqstring.h"
+#include "sqtable.h"
+#include "sqarray.h"
+#include "squserdata.h"
+#include "sqclass.h"
+
+//SQObjectPtr _null_;
+//SQObjectPtr _true_(true);
+//SQObjectPtr _false_(false);
+//SQObjectPtr _one_((SQInteger)1);
+//SQObjectPtr _minusone_((SQInteger)-1);
+
+SQSharedState::SQSharedState()
+{
+	_compilererrorhandler = NULL;
+	_printfunc = NULL;
+	_errorfunc = NULL;
+	_debuginfo = false;
+	_notifyallexceptions = false;
+	_already_in_CallDelayedReleaseHooks = false;
+#ifdef SQ_JIT_LLVM
+	//llvm::StructType::create(
+#endif
+}
+
+#define newsysstring(s) {	\
+	_systemstrings->push_back(SQString::Create(this,s));	\
+	}
+
+#define newmetamethod(s) {	\
+	_metamethods->push_back(SQString::Create(this,s));	\
+	_table(_metamethodsmap)->NewSlot(_metamethods->back(),(SQInteger)(_metamethods->size()-1)); \
+	}
+
+bool CompileTypemask(SQIntVec &res,const SQChar *typemask)
+{
+	SQInteger i = 0;
+
+	SQInteger mask = 0;
+	while(typemask[i] != 0) {
+
+		switch(typemask[i]){
+				case 'o': mask |= _RT_NULL; break;
+				case 'i': mask |= _RT_INTEGER; break;
+				case 'f': mask |= _RT_FLOAT; break;
+				case 'n': mask |= (_RT_FLOAT | _RT_INTEGER); break;
+				case 's': mask |= _RT_STRING; break;
+				case 't': mask |= _RT_TABLE; break;
+				case 'a': mask |= _RT_ARRAY; break;
+				case 'u': mask |= _RT_USERDATA; break;
+				case 'c': mask |= (_RT_CLOSURE | _RT_NATIVECLOSURE); break;
+				case 'b': mask |= _RT_BOOL; break;
+				case 'g': mask |= _RT_GENERATOR; break;
+				case 'p': mask |= _RT_USERPOINTER; break;
+				case 'v': mask |= _RT_THREAD; break;
+				case 'x': mask |= _RT_INSTANCE; break;
+				case 'y': mask |= _RT_CLASS; break;
+				case 'r': mask |= _RT_WEAKREF; break;
+				case '.': mask = -1; res.push_back(mask); i++; mask = 0; continue;
+				case ' ': i++; continue; //ignores spaces
+				default:
+					return false;
+		}
+		i++;
+		if(typemask[i] == '|') {
+			i++;
+			if(typemask[i] == 0)
+				return false;
+			continue;
+		}
+		res.push_back(mask);
+		mask = 0;
+
+	}
+	return true;
+}
+
+SQTable *CreateDefaultDelegate(SQSharedState *ss,SQRegFunction *funcz)
+{
+	SQInteger i=0;
+	SQTable *t=SQTable::Create(ss,0);
+	while(funcz[i].name!=0){
+		SQNativeClosure *nc = SQNativeClosure::Create(ss,funcz[i].f,0);
+		nc->_nparamscheck = funcz[i].nparamscheck;
+		nc->_name = SQString::Create(ss,funcz[i].name);
+		if(funcz[i].typemask && !CompileTypemask(nc->_typecheck,funcz[i].typemask))
+			return NULL;
+		t->NewSlot(SQString::Create(ss,funcz[i].name),nc);
+		i++;
+	}
+	return t;
+}
+
+void SQSharedState::Init()
+{
+	_scratchpad=NULL;
+	_scratchpadsize=0;
+#ifndef NO_GARBAGE_COLLECTOR
+	_gc_chain=NULL;
+#endif
+	_stringtable = (SQStringTable*)SQ_MALLOC(sizeof(SQStringTable));
+	new (_stringtable) SQStringTable(this);
+	sq_new(_metamethods,SQObjectPtrVec);
+	sq_new(_systemstrings,SQObjectPtrVec);
+	sq_new(_types,SQObjectPtrVec);
+	_metamethodsmap = SQTable::Create(this,MT_LAST-1);
+	//adding type strings to avoid memory trashing
+	//types names
+	newsysstring(_SC("null"));
+	newsysstring(_SC("table"));
+	newsysstring(_SC("array"));
+	newsysstring(_SC("closure"));
+	newsysstring(_SC("string"));
+	newsysstring(_SC("userdata"));
+	newsysstring(_SC("integer"));
+	newsysstring(_SC("float"));
+	newsysstring(_SC("userpointer"));
+	newsysstring(_SC("function"));
+	newsysstring(_SC("generator"));
+	newsysstring(_SC("thread"));
+	newsysstring(_SC("class"));
+	newsysstring(_SC("instance"));
+	newsysstring(_SC("bool"));
+	//meta methods
+	newmetamethod(MM_ADD);
+	newmetamethod(MM_SUB);
+	newmetamethod(MM_MUL);
+	newmetamethod(MM_DIV);
+	newmetamethod(MM_UNM);
+	newmetamethod(MM_MODULO);
+	newmetamethod(MM_SET);
+	newmetamethod(MM_GET);
+	newmetamethod(MM_TYPEOF);
+	newmetamethod(MM_NEXTI);
+	newmetamethod(MM_CMP);
+	newmetamethod(MM_CALL);
+	newmetamethod(MM_CLONED);
+	newmetamethod(MM_NEWSLOT);
+	newmetamethod(MM_DELSLOT);
+	newmetamethod(MM_TOSTRING);
+	newmetamethod(MM_NEWMEMBER);
+	newmetamethod(MM_INHERITED);
+
+	_constructoridx = SQString::Create(this,_SC("constructor"));
+	_destructoridx = SQString::Create(this,_SC("destructor"));
+	_registry = SQTable::Create(this,0);
+	_consts = SQTable::Create(this,0);
+	_table_default_delegate = CreateDefaultDelegate(this,_table_default_delegate_funcz);
+	_array_default_delegate = CreateDefaultDelegate(this,_array_default_delegate_funcz);
+	_string_default_delegate = CreateDefaultDelegate(this,_string_default_delegate_funcz);
+	_number_default_delegate = CreateDefaultDelegate(this,_number_default_delegate_funcz);
+	_closure_default_delegate = CreateDefaultDelegate(this,_closure_default_delegate_funcz);
+	_generator_default_delegate = CreateDefaultDelegate(this,_generator_default_delegate_funcz);
+	_thread_default_delegate = CreateDefaultDelegate(this,_thread_default_delegate_funcz);
+	_class_default_delegate = CreateDefaultDelegate(this,_class_default_delegate_funcz);
+	_instance_default_delegate = CreateDefaultDelegate(this,_instance_default_delegate_funcz);
+	_weakref_default_delegate = CreateDefaultDelegate(this,_weakref_default_delegate_funcz);
+
+}
+
+SQSharedState::~SQSharedState()
+{
+	_constructoridx.Null();
+	_destructoridx.Null();
+	_table(_registry)->Finalize();
+	_table(_consts)->Finalize();
+	_table(_metamethodsmap)->Finalize();
+	_registry.Null();
+	_consts.Null();
+	_metamethodsmap.Null();
+	while(!_systemstrings->empty()) {
+		_systemstrings->back().Null();
+		_systemstrings->pop_back();
+	}
+	_thread(_root_vm)->Finalize();
+	_root_vm.Null();
+	_table_default_delegate.Null();
+	_array_default_delegate.Null();
+	_string_default_delegate.Null();
+	_number_default_delegate.Null();
+	_closure_default_delegate.Null();
+	_generator_default_delegate.Null();
+	_thread_default_delegate.Null();
+	_class_default_delegate.Null();
+	_instance_default_delegate.Null();
+	_weakref_default_delegate.Null();
+	_refs_table.Finalize();
+#ifndef NO_GARBAGE_COLLECTOR
+	SQCollectable *t = _gc_chain;
+	SQCollectable *nx = NULL;
+	if(t) {
+		t->_uiRef++;
+		while(t) {
+			t->Finalize();
+			nx = t->_next;
+			if(nx) nx->_uiRef++;
+			if(--t->_uiRef == 0)
+				t->Release();
+			t = nx;
+		}
+	}
+	assert(_gc_chain==NULL); //just to proove a theory
+	while(_gc_chain){
+		_gc_chain->_uiRef++;
+		_gc_chain->Release();
+	}
+#endif
+
+	sq_delete(_types,SQObjectPtrVec);
+	sq_delete(_systemstrings,SQObjectPtrVec);
+	sq_delete(_metamethods,SQObjectPtrVec);
+	sq_delete(_stringtable,SQStringTable);
+	if(_scratchpad)SQ_FREE(_scratchpad,_scratchpadsize);
+}
+
+
+SQInteger SQSharedState::GetMetaMethodIdxByName(const SQObjectPtr &name)
+{
+	if(type(name) != OT_STRING)
+		return -1;
+	SQObjectPtr ret;
+	if(_table(_metamethodsmap)->Get(name,ret)) {
+		return _integer(ret);
+	}
+	return -1;
+}
+
 void SQSharedState::AddDelayedReleaseHook(SQRELEASEHOOK hook, SQUserPointer ptr, SQInteger size)
 {
     SQDelayedReleseHook dh;
@@ -260,462 +260,462 @@ void SQSharedState::CallDelayedReleaseHooks(SQVM *vm, int count)
         _already_in_CallDelayedReleaseHooks = false;
     }
 }
-
-#ifndef NO_GARBAGE_COLLECTOR
-
-void SQSharedState::MarkObject(SQObjectPtr &o,SQCollectable **chain)
-{
-	switch(type(o)){
-	case OT_TABLE:_table(o)->Mark(chain);break;
-	case OT_ARRAY:_array(o)->Mark(chain);break;
-	case OT_USERDATA:_userdata(o)->Mark(chain);break;
-	case OT_CLOSURE:_closure(o)->Mark(chain);break;
-	case OT_NATIVECLOSURE:_nativeclosure(o)->Mark(chain);break;
-	case OT_GENERATOR:_generator(o)->Mark(chain);break;
-	case OT_THREAD:_thread(o)->Mark(chain);break;
-	case OT_CLASS:_class(o)->Mark(chain);break;
-	case OT_INSTANCE:_instance(o)->Mark(chain);break;
-	case OT_OUTER:_outer(o)->Mark(chain);break;
-	case OT_FUNCPROTO:_funcproto(o)->Mark(chain);break;
-	default: break; //shutup compiler
-	}
-}
-
-
-void SQSharedState::RunMark(SQVM *vm,SQCollectable **tchain)
-{
-	SQVM *vms = _thread(_root_vm);
-
-	vms->Mark(tchain);
-
-	_refs_table.Mark(tchain);
-	MarkObject(_registry,tchain);
-	MarkObject(_consts,tchain);
-	MarkObject(_metamethodsmap,tchain);
-	MarkObject(_table_default_delegate,tchain);
-	MarkObject(_array_default_delegate,tchain);
-	MarkObject(_string_default_delegate,tchain);
-	MarkObject(_number_default_delegate,tchain);
-	MarkObject(_generator_default_delegate,tchain);
-	MarkObject(_thread_default_delegate,tchain);
-	MarkObject(_closure_default_delegate,tchain);
-	MarkObject(_class_default_delegate,tchain);
-	MarkObject(_instance_default_delegate,tchain);
-	MarkObject(_weakref_default_delegate,tchain);
-
-}
-
-SQInteger SQSharedState::ResurrectUnreachable(SQVM *vm)
-{
-	SQInteger n=0;
-	SQCollectable *tchain=NULL;
-
-	RunMark(vm,&tchain);
-
-	SQCollectable *resurrected = _gc_chain;
-	SQCollectable *t = resurrected;
-	//SQCollectable *nx = NULL;
-
-	_gc_chain = tchain;
-
-	SQArray *ret = NULL;
-	if(resurrected) {
-		ret = SQArray::Create(this,0);
-		SQCollectable *rlast = NULL;
-		while(t) {
-			rlast = t;
-			SQObjectType type = t->GetType();
-			if(type != OT_FUNCPROTO && type != OT_OUTER) {
-				SQObject sqo;
-				sqo._type = type;
-				sqo._unVal.pRefCounted = t;
-				ret->Append(sqo);
-			}
-			t = t->_next;
-			n++;
-		}
-
-		assert(rlast->_next == NULL);
-		rlast->_next = _gc_chain;
-		if(_gc_chain)
-		{
-			_gc_chain->_prev = rlast;
-		}
-		_gc_chain = resurrected;
-	}
-
-	t = _gc_chain;
-	while(t) {
-		t->UnMark();
-		t = t->_next;
-	}
-
-	if(ret) {
-		SQObjectPtr temp = ret;
-		vm->Push(temp);
-	}
-	else {
-		vm->PushNull();
-	}
-	return n;
-}
-
-SQInteger SQSharedState::CollectGarbage(SQVM *vm)
-{
-	SQInteger n = 0;
-	SQCollectable *tchain = NULL;
-
-	RunMark(vm,&tchain);
-
-	SQCollectable *t = _gc_chain;
-	SQCollectable *nx = NULL;
-	if(t) {
-		t->_uiRef++;
-		while(t) {
-			t->Finalize();
-			nx = t->_next;
-			if(nx) nx->_uiRef++;
-			if(--t->_uiRef == 0)
-				t->Release();
-			t = nx;
-			n++;
-		}
-	}
-
-	t = tchain;
-	while(t) {
-		t->UnMark();
-		t = t->_next;
-	}
-	_gc_chain = tchain;
-
-	return n;
-}
-#endif
-
-#ifndef NO_GARBAGE_COLLECTOR
-void SQCollectable::AddToChain(SQCollectable **chain,SQCollectable *c)
-{
-    c->_prev = NULL;
-	c->_next = *chain;
-	if(*chain) (*chain)->_prev = c;
-	*chain = c;
-}
-
-void SQCollectable::RemoveFromChain(SQCollectable **chain,SQCollectable *c)
-{
-	if(c->_prev) c->_prev->_next = c->_next;
-	else *chain = c->_next;
-	if(c->_next)
-		c->_next->_prev = c->_prev;
-	c->_next = NULL;
-	c->_prev = NULL;
-}
-#endif
-
-SQChar* SQSharedState::GetScratchPad(SQInteger size)
-{
-	SQInteger newsize;
-	if(size>0) {
-		if(_scratchpadsize < size) {
-			newsize = size + (size>>1);
-			_scratchpad = (SQChar *)SQ_REALLOC(_scratchpad,_scratchpadsize,newsize);
-			_scratchpadsize = newsize;
-
-		}else if(_scratchpadsize >= (size<<5)) {
-			newsize = _scratchpadsize >> 1;
-			_scratchpad = (SQChar *)SQ_REALLOC(_scratchpad,_scratchpadsize,newsize);
-			_scratchpadsize = newsize;
-		}
-	}
-	return _scratchpad;
-}
-
-RefTable::RefTable()
-{
-	AllocNodes(4);
-}
-
-void RefTable::Finalize()
-{
-	RefNode *nodes = _nodes;
-	for(SQUnsignedInteger n = 0; n < _numofslots; n++) {
-		nodes->obj.Null();
-		nodes++;
-	}
-}
-
-RefTable::~RefTable()
-{
-	SQ_FREE(_buckets,(_numofslots * sizeof(RefNode *)) + (_numofslots * sizeof(RefNode)));
-}
-
-#ifndef NO_GARBAGE_COLLECTOR
-void RefTable::Mark(SQCollectable **chain)
-{
-	RefNode *nodes = (RefNode *)_nodes;
-	for(SQUnsignedInteger n = 0; n < _numofslots; n++) {
-		if(type(nodes->obj) != OT_NULL) {
-			SQSharedState::MarkObject(nodes->obj,chain);
-		}
-		nodes++;
-	}
-}
-#endif
-
-void RefTable::AddRef(SQObject &obj)
-{
-	SQHash mainpos;
-	RefNode *prev;
-	RefNode *ref = Get(obj,mainpos,&prev,true);
-	ref->refs++;
-}
-
-SQUnsignedInteger RefTable::GetRefCount(SQObject &obj)
-{
-     SQHash mainpos;
-     RefNode *prev;
-     RefNode *ref = Get(obj,mainpos,&prev,true);
-     return ref->refs;
-}
-
-
-SQBool RefTable::Release(SQObject &obj)
-{
-	SQHash mainpos;
-	RefNode *prev;
-	RefNode *ref = Get(obj,mainpos,&prev,false);
-	if(ref) {
-		if(--ref->refs == 0) {
-			SQObjectPtr o = ref->obj;
-			if(prev) {
-				prev->next = ref->next;
-			}
-			else {
-				_buckets[mainpos] = ref->next;
-			}
-			ref->next = _freelist;
-			_freelist = ref;
-			_slotused--;
-			ref->obj.Null();
-			//<<FIXME>>test for shrink?
-			return SQTrue;
-		}
-	}
-	else {
-		assert(0);
-	}
-	return SQFalse;
-}
-
-void RefTable::Resize(SQUnsignedInteger size)
-{
-	RefNode **oldbucks = _buckets;
-	RefNode *t = _nodes;
-	SQUnsignedInteger oldnumofslots = _numofslots;
-	AllocNodes(size);
-	//rehash
-	SQUnsignedInteger nfound = 0;
-	for(SQUnsignedInteger n = 0; n < oldnumofslots; n++) {
-		if(type(t->obj) != OT_NULL) {
-			//add back;
-			assert(t->refs != 0);
-			RefNode *nn = Add(::HashObj(t->obj)&(_numofslots-1),t->obj);
-			nn->refs = t->refs;
-			t->obj.Null();
-			nfound++;
-		}
-		t++;
-	}
-	assert(nfound == oldnumofslots);
-	SQ_FREE(oldbucks,(oldnumofslots * sizeof(RefNode *)) + (oldnumofslots * sizeof(RefNode)));
-}
-
-RefTable::RefNode *RefTable::Add(SQHash mainpos,SQObject &obj)
-{
-	RefNode *t = _buckets[mainpos];
-	RefNode *newnode = _freelist;
-	newnode->obj = obj;
-	_buckets[mainpos] = newnode;
-	_freelist = _freelist->next;
-	newnode->next = t;
-	assert(newnode->refs == 0);
-	_slotused++;
-	return newnode;
-}
-
-RefTable::RefNode *RefTable::Get(SQObject &obj,SQHash &mainpos,RefNode **prev,bool add)
-{
-	RefNode *ref;
-	mainpos = ::HashObj(obj)&(_numofslots-1);
-	*prev = NULL;
-	for (ref = _buckets[mainpos]; ref; ) {
-		if(_rawval(ref->obj) == _rawval(obj) && type(ref->obj) == type(obj))
-			break;
-		*prev = ref;
-		ref = ref->next;
-	}
-	if(ref == NULL && add) {
-		if(_numofslots == _slotused) {
-			assert(_freelist == 0);
-			Resize(_numofslots*2);
-			mainpos = ::HashObj(obj)&(_numofslots-1);
-		}
-		ref = Add(mainpos,obj);
-	}
-	return ref;
-}
-
-void RefTable::AllocNodes(SQUnsignedInteger size)
-{
-	RefNode **bucks;
-	RefNode *nodes;
-	bucks = (RefNode **)SQ_MALLOC((size * sizeof(RefNode *)) + (size * sizeof(RefNode)));
-	nodes = (RefNode *)&bucks[size];
-	RefNode *temp = nodes;
-	SQUnsignedInteger n;
-	for(n = 0; n < size - 1; n++) {
-		bucks[n] = NULL;
-		temp->refs = 0;
-		new (&temp->obj) SQObjectPtr;
-		temp->next = temp+1;
-		temp++;
-	}
-	bucks[n] = NULL;
-	temp->refs = 0;
-	new (&temp->obj) SQObjectPtr;
-	temp->next = NULL;
-	_freelist = nodes;
-	_nodes = nodes;
-	_buckets = bucks;
-	_slotused = 0;
-	_numofslots = size;
-}
-//////////////////////////////////////////////////////////////////////////
-//SQStringTable
-/*
-* The following code is based on Lua 4.0 (Copyright 1994-2002 Tecgraf, PUC-Rio.)
-* http://www.lua.org/copyright.html#4
-* http://www.lua.org/source/4.0.1/src_lstring.c.html
-*/
-
-SQStringTable::SQStringTable(SQSharedState *ss)
-{
-	_sharedstate = ss;
-	AllocNodes(4);
-	_slotused = 0;
-}
-
-SQStringTable::~SQStringTable()
-{
-	SQ_FREE(_strings,sizeof(SQString*)*_numofslots);
-	_strings = NULL;
-}
-
-void SQStringTable::AllocNodes(SQInteger size)
-{
-	_numofslots = size;
-	_strings = (SQString**)SQ_MALLOC(sizeof(SQString*)*_numofslots);
-	memset(_strings,0,sizeof(SQString*)*_numofslots);
-}
-
-SQString *SQStringTable::Contains(const SQChar *news, SQInteger &len, SQHash &newhash, SQHash &h)
-{
-	if(len<0)
-		len = (SQInteger)scstrlen(news);
-	newhash = ::_hashstr(news,len);
-	h = newhash&(_numofslots-1);
-	SQString *s;
-	SQInteger calculated_len = rsl(len);
-	for (s = _strings[h]; s; s = s->_next){
-		if(s->_len == len && (!memcmp(news,s->_val,calculated_len)))
-			return s; //found
-	}
-	return 0;
-}
-
-SQString *SQStringTable::Add(const SQChar *news,SQInteger len)
-{
-	SQHash newhash, h;
+
+#ifndef NO_GARBAGE_COLLECTOR
+
+void SQSharedState::MarkObject(SQObjectPtr &o,SQCollectable **chain)
+{
+	switch(type(o)){
+	case OT_TABLE:_table(o)->Mark(chain);break;
+	case OT_ARRAY:_array(o)->Mark(chain);break;
+	case OT_USERDATA:_userdata(o)->Mark(chain);break;
+	case OT_CLOSURE:_closure(o)->Mark(chain);break;
+	case OT_NATIVECLOSURE:_nativeclosure(o)->Mark(chain);break;
+	case OT_GENERATOR:_generator(o)->Mark(chain);break;
+	case OT_THREAD:_thread(o)->Mark(chain);break;
+	case OT_CLASS:_class(o)->Mark(chain);break;
+	case OT_INSTANCE:_instance(o)->Mark(chain);break;
+	case OT_OUTER:_outer(o)->Mark(chain);break;
+	case OT_FUNCPROTO:_funcproto(o)->Mark(chain);break;
+	default: break; //shutup compiler
+	}
+}
+
+
+void SQSharedState::RunMark(SQVM */*vm*/,SQCollectable **tchain)
+{
+	SQVM *vms = _thread(_root_vm);
+
+	vms->Mark(tchain);
+
+	_refs_table.Mark(tchain);
+	MarkObject(_registry,tchain);
+	MarkObject(_consts,tchain);
+	MarkObject(_metamethodsmap,tchain);
+	MarkObject(_table_default_delegate,tchain);
+	MarkObject(_array_default_delegate,tchain);
+	MarkObject(_string_default_delegate,tchain);
+	MarkObject(_number_default_delegate,tchain);
+	MarkObject(_generator_default_delegate,tchain);
+	MarkObject(_thread_default_delegate,tchain);
+	MarkObject(_closure_default_delegate,tchain);
+	MarkObject(_class_default_delegate,tchain);
+	MarkObject(_instance_default_delegate,tchain);
+	MarkObject(_weakref_default_delegate,tchain);
+
+}
+
+SQInteger SQSharedState::ResurrectUnreachable(SQVM *vm)
+{
+	SQInteger n=0;
+	SQCollectable *tchain=NULL;
+
+	RunMark(vm,&tchain);
+
+	SQCollectable *resurrected = _gc_chain;
+	SQCollectable *t = resurrected;
+	//SQCollectable *nx = NULL;
+
+	_gc_chain = tchain;
+
+	SQArray *ret = NULL;
+	if(resurrected) {
+		ret = SQArray::Create(this,0);
+		SQCollectable *rlast = NULL;
+		while(t) {
+			rlast = t;
+			SQObjectType type = t->GetType();
+			if(type != OT_FUNCPROTO && type != OT_OUTER) {
+				SQObject sqo;
+				sqo._type = type;
+				sqo._unVal.pRefCounted = t;
+				ret->Append(sqo);
+			}
+			t = t->_next;
+			n++;
+		}
+
+		assert(rlast->_next == NULL);
+		rlast->_next = _gc_chain;
+		if(_gc_chain)
+		{
+			_gc_chain->_prev = rlast;
+		}
+		_gc_chain = resurrected;
+	}
+
+	t = _gc_chain;
+	while(t) {
+		t->UnMark();
+		t = t->_next;
+	}
+
+	if(ret) {
+		SQObjectPtr temp = ret;
+		vm->Push(temp);
+	}
+	else {
+		vm->PushNull();
+	}
+	return n;
+}
+
+SQInteger SQSharedState::CollectGarbage(SQVM *vm)
+{
+	SQInteger n = 0;
+	SQCollectable *tchain = NULL;
+
+	RunMark(vm,&tchain);
+
+	SQCollectable *t = _gc_chain;
+	SQCollectable *nx = NULL;
+	if(t) {
+		t->_uiRef++;
+		while(t) {
+			t->Finalize();
+			nx = t->_next;
+			if(nx) nx->_uiRef++;
+			if(--t->_uiRef == 0)
+				t->Release();
+			t = nx;
+			n++;
+		}
+	}
+
+	t = tchain;
+	while(t) {
+		t->UnMark();
+		t = t->_next;
+	}
+	_gc_chain = tchain;
+
+	return n;
+}
+#endif
+
+#ifndef NO_GARBAGE_COLLECTOR
+void SQCollectable::AddToChain(SQCollectable **chain,SQCollectable *c)
+{
+    c->_prev = NULL;
+	c->_next = *chain;
+	if(*chain) (*chain)->_prev = c;
+	*chain = c;
+}
+
+void SQCollectable::RemoveFromChain(SQCollectable **chain,SQCollectable *c)
+{
+	if(c->_prev) c->_prev->_next = c->_next;
+	else *chain = c->_next;
+	if(c->_next)
+		c->_next->_prev = c->_prev;
+	c->_next = NULL;
+	c->_prev = NULL;
+}
+#endif
+
+SQChar* SQSharedState::GetScratchPad(SQInteger size)
+{
+	SQInteger newsize;
+	if(size>0) {
+		if(_scratchpadsize < size) {
+			newsize = size + (size>>1);
+			_scratchpad = (SQChar *)SQ_REALLOC(_scratchpad,_scratchpadsize,newsize);
+			_scratchpadsize = newsize;
+
+		}else if(_scratchpadsize >= (size<<5)) {
+			newsize = _scratchpadsize >> 1;
+			_scratchpad = (SQChar *)SQ_REALLOC(_scratchpad,_scratchpadsize,newsize);
+			_scratchpadsize = newsize;
+		}
+	}
+	return _scratchpad;
+}
+
+RefTable::RefTable()
+{
+	AllocNodes(4);
+}
+
+void RefTable::Finalize()
+{
+	RefNode *nodes = _nodes;
+	for(SQUnsignedInteger n = 0; n < _numofslots; n++) {
+		nodes->obj.Null();
+		nodes++;
+	}
+}
+
+RefTable::~RefTable()
+{
+	SQ_FREE(_buckets,(_numofslots * sizeof(RefNode *)) + (_numofslots * sizeof(RefNode)));
+}
+
+#ifndef NO_GARBAGE_COLLECTOR
+void RefTable::Mark(SQCollectable **chain)
+{
+	RefNode *nodes = (RefNode *)_nodes;
+	for(SQUnsignedInteger n = 0; n < _numofslots; n++) {
+		if(type(nodes->obj) != OT_NULL) {
+			SQSharedState::MarkObject(nodes->obj,chain);
+		}
+		nodes++;
+	}
+}
+#endif
+
+void RefTable::AddRef(SQObject &obj)
+{
+	SQHash mainpos;
+	RefNode *prev;
+	RefNode *ref = Get(obj,mainpos,&prev,true);
+	ref->refs++;
+}
+
+SQUnsignedInteger RefTable::GetRefCount(SQObject &obj)
+{
+     SQHash mainpos;
+     RefNode *prev;
+     RefNode *ref = Get(obj,mainpos,&prev,true);
+     return ref->refs;
+}
+
+
+SQBool RefTable::Release(SQObject &obj)
+{
+	SQHash mainpos;
+	RefNode *prev;
+	RefNode *ref = Get(obj,mainpos,&prev,false);
+	if(ref) {
+		if(--ref->refs == 0) {
+			SQObjectPtr o = ref->obj;
+			if(prev) {
+				prev->next = ref->next;
+			}
+			else {
+				_buckets[mainpos] = ref->next;
+			}
+			ref->next = _freelist;
+			_freelist = ref;
+			_slotused--;
+			ref->obj.Null();
+			//<<FIXME>>test for shrink?
+			return SQTrue;
+		}
+	}
+	else {
+		assert(0);
+	}
+	return SQFalse;
+}
+
+void RefTable::Resize(SQUnsignedInteger size)
+{
+	RefNode **oldbucks = _buckets;
+	RefNode *t = _nodes;
+	SQUnsignedInteger oldnumofslots = _numofslots;
+	AllocNodes(size);
+	//rehash
+	SQUnsignedInteger nfound = 0;
+	for(SQUnsignedInteger n = 0; n < oldnumofslots; n++) {
+		if(type(t->obj) != OT_NULL) {
+			//add back;
+			assert(t->refs != 0);
+			RefNode *nn = Add(::HashObj(t->obj)&(_numofslots-1),t->obj);
+			nn->refs = t->refs;
+			t->obj.Null();
+			nfound++;
+		}
+		t++;
+	}
+	assert(nfound == oldnumofslots);
+	SQ_FREE(oldbucks,(oldnumofslots * sizeof(RefNode *)) + (oldnumofslots * sizeof(RefNode)));
+}
+
+RefTable::RefNode *RefTable::Add(SQHash mainpos,SQObject &obj)
+{
+	RefNode *t = _buckets[mainpos];
+	RefNode *newnode = _freelist;
+	newnode->obj = obj;
+	_buckets[mainpos] = newnode;
+	_freelist = _freelist->next;
+	newnode->next = t;
+	assert(newnode->refs == 0);
+	_slotused++;
+	return newnode;
+}
+
+RefTable::RefNode *RefTable::Get(SQObject &obj,SQHash &mainpos,RefNode **prev,bool add)
+{
+	RefNode *ref;
+	mainpos = ::HashObj(obj)&(_numofslots-1);
+	*prev = NULL;
+	for (ref = _buckets[mainpos]; ref; ) {
+		if(_rawval(ref->obj) == _rawval(obj) && type(ref->obj) == type(obj))
+			break;
+		*prev = ref;
+		ref = ref->next;
+	}
+	if(ref == NULL && add) {
+		if(_numofslots == _slotused) {
+			assert(_freelist == 0);
+			Resize(_numofslots*2);
+			mainpos = ::HashObj(obj)&(_numofslots-1);
+		}
+		ref = Add(mainpos,obj);
+	}
+	return ref;
+}
+
+void RefTable::AllocNodes(SQUnsignedInteger size)
+{
+	RefNode **bucks;
+	RefNode *nodes;
+	bucks = (RefNode **)SQ_MALLOC((size * sizeof(RefNode *)) + (size * sizeof(RefNode)));
+	nodes = (RefNode *)&bucks[size];
+	RefNode *temp = nodes;
+	SQUnsignedInteger n;
+	for(n = 0; n < size - 1; n++) {
+		bucks[n] = NULL;
+		temp->refs = 0;
+		new (&temp->obj) SQObjectPtr;
+		temp->next = temp+1;
+		temp++;
+	}
+	bucks[n] = NULL;
+	temp->refs = 0;
+	new (&temp->obj) SQObjectPtr;
+	temp->next = NULL;
+	_freelist = nodes;
+	_nodes = nodes;
+	_buckets = bucks;
+	_slotused = 0;
+	_numofslots = size;
+}
+//////////////////////////////////////////////////////////////////////////
+//SQStringTable
+/*
+* The following code is based on Lua 4.0 (Copyright 1994-2002 Tecgraf, PUC-Rio.)
+* http://www.lua.org/copyright.html#4
+* http://www.lua.org/source/4.0.1/src_lstring.c.html
+*/
+
+SQStringTable::SQStringTable(SQSharedState *ss)
+{
+	_sharedstate = ss;
+	AllocNodes(4);
+	_slotused = 0;
+}
+
+SQStringTable::~SQStringTable()
+{
+	SQ_FREE(_strings,sizeof(SQString*)*_numofslots);
+	_strings = NULL;
+}
+
+void SQStringTable::AllocNodes(SQInteger size)
+{
+	_numofslots = size;
+	_strings = (SQString**)SQ_MALLOC(sizeof(SQString*)*_numofslots);
+	memset(_strings,0,sizeof(SQString*)*_numofslots);
+}
+
+SQString *SQStringTable::Contains(const SQChar *news, SQInteger &len, SQHash &newhash, SQHash &h)
+{
+	if(len<0)
+		len = (SQInteger)scstrlen(news);
+	newhash = ::_hashstr(news,len);
+	h = newhash&(_numofslots-1);
+	SQString *s;
+	SQInteger calculated_len = rsl(len);
+	for (s = _strings[h]; s; s = s->_next){
+		if(s->_len == len && (!memcmp(news,s->_val,calculated_len)))
+			return s; //found
+	}
+	return 0;
+}
+
+SQString *SQStringTable::Add(const SQChar *news,SQInteger len)
+{
+	SQHash newhash, h;
     SQString *t = Contains(news, len, newhash, h);
-    if(t) return t;
+    if(t) return t;
 	t = NewStrBuf(len);
-	memcpy(t->_val,news,rsl(len));
-	return Add(t, newhash, h);
-}
-
-SQString *SQStringTable::Add(SQString *strBuf)
-{
-	SQHash newhash, h;
+	memcpy(t->_val,news,rsl(len));
+	return Add(t, newhash, h);
+}
+
+SQString *SQStringTable::Add(SQString *strBuf)
+{
+	SQHash newhash, h;
     SQString *t = Contains(strBuf->_val, strBuf->_len, newhash, h);
     if(t) {
         SQ_FREE(strBuf,sizeof(SQString) + rsl(strBuf->_len));
         return t;
-    }
-    return Add(strBuf, newhash, h);
-}
-
-SQString *SQStringTable::Add(SQString *strBuf, SQHash newhash, SQHash h)
-{
+    }
+    return Add(strBuf, newhash, h);
+}
+
+SQString *SQStringTable::Add(SQString *strBuf, SQHash newhash, SQHash h)
+{
 	strBuf->_sharedstate = _sharedstate;
-	strBuf->_val[strBuf->_len] = _SC('\0');
-	strBuf->_hash = newhash;
-	strBuf->_next = _strings[h];
-	_strings[h] = strBuf;
-	_slotused++;
-	if (_slotused > _numofslots)  /* too crowded? */
-		Resize(_numofslots*2);
-	return strBuf;
-}
-
-SQString *SQStringTable::NewStrBuf(SQInteger len)
-{
-    SQInteger calculated_size = rsl(len)+sizeof(SQString);
+	strBuf->_val[strBuf->_len] = _SC('\0');
+	strBuf->_hash = newhash;
+	strBuf->_next = _strings[h];
+	_strings[h] = strBuf;
+	_slotused++;
+	if (_slotused > _numofslots)  /* too crowded? */
+		Resize(_numofslots*2);
+	return strBuf;
+}
+
+SQString *SQStringTable::NewStrBuf(SQInteger len)
+{
+    SQInteger calculated_size = rsl(len)+sizeof(SQString);
 	SQString *t = (SQString *)SQ_MALLOC(calculated_size);
-	memset(t, 0, calculated_size);
-	new (t) SQString;
-	t->_len = len;
-	return t;
-}
-
-void SQStringTable::Resize(SQInteger size)
-{
-	SQInteger oldsize=_numofslots;
-	SQString **oldtable=_strings;
-	AllocNodes(size);
-	for (SQInteger i=0; i<oldsize; i++){
-		SQString *p = oldtable[i];
-		while(p){
-			SQString *next = p->_next;
-			SQHash h = p->_hash&(_numofslots-1);
-			p->_next = _strings[h];
-			_strings[h] = p;
-			p = next;
-		}
-	}
-	SQ_FREE(oldtable,oldsize*sizeof(SQString*));
-}
-
-void SQStringTable::Remove(SQString *bs)
-{
-	SQString *s;
-	SQString *prev=NULL;
-	SQHash h = bs->_hash&(_numofslots - 1);
-
-	for (s = _strings[h]; s; ){
-		if(s == bs){
-			if(prev)
-				prev->_next = s->_next;
-			else
-				_strings[h] = s->_next;
-			_slotused--;
-			SQInteger slen = s->_len;
-			s->~SQString();
-			SQ_FREE(s,sizeof(SQString) + rsl(slen));
-			return;
-		}
-		prev = s;
-		s = s->_next;
-	}
-	assert(0);//if this fail something is wrong
-}
+	memset(t, 0, calculated_size);
+	new (t) SQString;
+	t->_len = len;
+	return t;
+}
+
+void SQStringTable::Resize(SQInteger size)
+{
+	SQInteger oldsize=_numofslots;
+	SQString **oldtable=_strings;
+	AllocNodes(size);
+	for (SQInteger i=0; i<oldsize; i++){
+		SQString *p = oldtable[i];
+		while(p){
+			SQString *next = p->_next;
+			SQHash h = p->_hash&(_numofslots-1);
+			p->_next = _strings[h];
+			_strings[h] = p;
+			p = next;
+		}
+	}
+	SQ_FREE(oldtable,oldsize*sizeof(SQString*));
+}
+
+void SQStringTable::Remove(SQString *bs)
+{
+	SQString *s;
+	SQString *prev=NULL;
+	SQHash h = bs->_hash&(_numofslots - 1);
+
+	for (s = _strings[h]; s; ){
+		if(s == bs){
+			if(prev)
+				prev->_next = s->_next;
+			else
+				_strings[h] = s->_next;
+			_slotused--;
+			SQInteger slen = s->_len;
+			s->~SQString();
+			SQ_FREE(s,sizeof(SQString) + rsl(slen));
+			return;
+		}
+		prev = s;
+		s = s->_next;
+	}
+	assert(0);//if this fail something is wrong
+}

+ 11 - 10
SquiLu/squirrel/sqvm.cpp

@@ -328,13 +328,13 @@ bool SQVM::ToString(const SQObjectPtr &o,SQObjectPtr &res)
 		res = o;
 		return true;
 	case OT_FLOAT:
-		scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)),_SC("%g"),_float(o));
-		break;
-	case OT_INTEGER:
-		scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)),_PRINT_INT_FMT,_integer(o));
-		break;
-	case OT_BOOL:
-		scsprintf(_sp(rsl(6)),_integer(o)?_SC("true"):_SC("false"));
+        scsprintf(_sp(sq_rsl(NUMBER_MAX_CHAR+1)),sq_rsl(NUMBER_MAX_CHAR),_SC("%g"),_float(o));
+        break;
+    case OT_INTEGER:
+        scsprintf(_sp(sq_rsl(NUMBER_MAX_CHAR+1)),sq_rsl(NUMBER_MAX_CHAR),_PRINT_INT_FMT,_integer(o));
+        break;
+    case OT_BOOL:
+        scsprintf(_sp(sq_rsl(6)),sq_rsl(6),_integer(o)?_SC("true"):_SC("false"));
 		break;
 	case OT_TABLE:
 	case OT_USERDATA:
@@ -353,7 +353,8 @@ bool SQVM::ToString(const SQObjectPtr &o,SQObjectPtr &res)
 			}
 		}
 	default:
-		scsprintf(_sp(rsl(sizeof(void*)+20)),_SC("(%s : 0x%p)"),GetTypeName(o),(void*)_rawval(o));
+	    SQInteger size = (sizeof(void*)*2)+NUMBER_MAX_CHAR;
+        scsprintf(_sp(sq_rsl(size)),sq_rsl(size),_SC("(%s : 0x%p)"),GetTypeName(o),(void*)_rawval(o));
 	}
 	res = SQString::Create(_ss(this),_spval);
 	return true;
@@ -554,7 +555,7 @@ SQRESULT SQVM::Suspend()
 
 #define _FINISH(howmuchtojump) {jump = howmuchtojump; return true; }
 bool SQVM::FOREACH_OP(SQObjectPtr &o1,SQObjectPtr &o2,SQObjectPtr
-&o3,SQObjectPtr &o4,SQInteger arg_2,int exitpos,int &jump)
+&o3,SQObjectPtr &o4,SQInteger /*arg_2*/,int exitpos,int &jump)
 {
 	SQInteger nrefidx;
 	switch(type(o1)) {
@@ -1783,7 +1784,7 @@ SQInteger prevstackbase = _stackbase;
 	return true;
 }
 
-bool SQVM::CallMetaMethod(SQObjectPtr &closure,SQMetaMethod mm,SQInteger nparams,SQObjectPtr &outres)
+bool SQVM::CallMetaMethod(SQObjectPtr &closure,SQMetaMethod /*mm*/,SQInteger nparams,SQObjectPtr &outres)
 {
 	//SQObjectPtr closure;