Browse Source

Make delayed release hooks optional

mingodad 10 years ago
parent
commit
9096e0e040

+ 11 - 9
SquiLu-ext/dad_utils.cpp

@@ -117,6 +117,7 @@ static SQRESULT sq_osGridToLatLong(HSQUIRRELVM v)
     return 1;
 }
 
+#ifdef SQ_WITH_DELAYED_RELEASE_HOOKS
 typedef struct {
     HSQOBJECT func_to_call;
     HSQOBJECT param;
@@ -166,6 +167,14 @@ static SQRESULT gc_scope_alert_constructor(HSQUIRRELVM v)
     return 1;
 }
 
+#define _DECL_FUNC(name,nparams,tycheck) {_SC(#name),  gc_scope_alert_##name,nparams,tycheck}
+static SQRegFunction gc_scope_alert_methods[] =
+{
+	_DECL_FUNC(constructor,  -2, _SC("xc.")),
+	{0,0}
+};
+#endif // SQ_WITH_DELAYED_RELEASE_HOOKS
+
 static SQRESULT spectralnorm_A(HSQUIRRELVM v)
 {
 	SQ_FUNC_VARS_NO_TOP();
@@ -176,13 +185,6 @@ static SQRESULT spectralnorm_A(HSQUIRRELVM v)
     return 1;
 }
 
-#define _DECL_FUNC(name,nparams,tycheck) {_SC(#name),  gc_scope_alert_##name,nparams,tycheck}
-static SQRegFunction gc_scope_alert_methods[] =
-{
-	_DECL_FUNC(constructor,  -2, _SC("xc.")),
-	{0,0}
-};
-
 
 #ifdef __cplusplus
 extern "C" {
@@ -198,13 +200,13 @@ extern "C" {
 
     	sq_insertfunc(v, _SC("spectralnorm_A"), spectralnorm_A, 3, _SC(".ii"), true);
 
-
+#ifdef SQ_WITH_DELAYED_RELEASE_HOOKS
         sq_pushstring(v,gc_scope_alert_TAG,-1);
         sq_newclass(v,SQFalse);
         sq_settypetag(v,-1,(void*)gc_scope_alert_TAG);
         sq_insert_reg_funcs(v, gc_scope_alert_methods);
         sq_rawset(v,-3);
-
+#endif // SQ_WITH_DELAYED_RELEASE_HOOKS
         sq_rawset(v,-3);//insert dad_utils
         return 1;
     }

+ 2 - 2
SquiLu-ext/sq_decimal.cpp

@@ -16,7 +16,7 @@ static const SQChar sq_context_static[] = _SC("context");
 #define GET_Decimal_INSTANCE2(v, idx) SQ_GET_INSTANCE_VAR(v, idx, mpd_t, dec2, sq_decimal_TAG)
 
 
-static SQRESULT sq_DecimalCtx_release_hook(SQUserPointer p, SQInteger size, HSQUIRRELVM v) {
+static SQRESULT sq_DecimalCtx_release_hook(SQUserPointer p, SQInteger size, void */*ep*/) {
     mpd_context_t *ctx = (mpd_context_t *)p;
     if(ctx) sq_free(ctx, sizeof(mpd_context_t));
     return 0;
@@ -232,7 +232,7 @@ static SQRESULT sq_Decimal_set_from(HSQUIRRELVM v, SQInteger idx, mpd_context_t
     return SQ_OK;
 }
 
-static SQRESULT sq_Decimal_release_hook(SQUserPointer p, SQInteger size, HSQUIRRELVM v) {
+static SQRESULT sq_Decimal_release_hook(SQUserPointer p, SQInteger size, void */*ep*/) {
     mpd_t *dec = (mpd_t *)p;
     if(dec) mpd_del(dec);
     return 0;

+ 1 - 1
SquiLu-ext/sq_ffi.cpp

@@ -237,7 +237,7 @@ static SQInteger sq_func__call(HSQUIRRELVM v)
     int top = sq_gettop(v);
 //    printf("ffibuf %p top %d\n", ffibuf, top);
 
-    if (ffibuf->cif.nargs != (top - EXTRA_PARAMS))
+    if (ffibuf->cif.nargs != ((unsigned)(top - EXTRA_PARAMS)))
         return sq_throwerror(v, "Wrong number of args");
 
     SQInteger values[top - EXTRA_PARAMS];

+ 20 - 7
SquiLu-ext/sq_fltk.cpp

@@ -130,7 +130,7 @@ CREATE_TAG(Flu_Combo_Box);
 CREATE_TAG(Flu_Combo_List);
 CREATE_TAG(Flu_Combo_Tree);
 
-static SQRESULT _fl_widget_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT _fl_widget_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
 	Fl_Widget *self = ((Fl_Widget *)p);
     //printf("Releasing %p %p %s\n", self, (self ? self->parent() : NULL),(self && ((void*)self->label()) ? self->label() : "l?"));
@@ -2677,7 +2677,7 @@ static SQRegFunction fl_hold_browser_obj_funcs[]={
 #undef _DECL_FUNC
 
 
-static SQRESULT _Fl_Image_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT _Fl_Image_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
 	Fl_Image *self = ((Fl_Image *)p);
 	delete self;
@@ -2868,7 +2868,7 @@ static SQRegFunction fl_png_image_obj_funcs[]={
 };
 #undef _DECL_FUNC
 
-static SQRESULT _Fl_Text_Buffer_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT _Fl_Text_Buffer_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
 	Fl_Text_Buffer *self = ((Fl_Text_Buffer *)p);
 	delete self;
@@ -3485,7 +3485,7 @@ static SQRegFunction fl_paged_device_obj_funcs[]={
 
 #define SETUP_FL_PDF_FILE_DEVICE(v) SETUP_FL_KLASS(v, Fl_Pdf_File_Device)
 
-static SQRESULT _Fl_Pdf_File_Device_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT _Fl_Pdf_File_Device_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
 	Fl_Pdf_File_Device *self = ((Fl_Pdf_File_Device *)p);
 	delete self;
@@ -3570,7 +3570,7 @@ static SQRegFunction fl_postscript_file_device_obj_funcs[]={
 #undef _DECL_FUNC
 
 
-static SQRESULT _Fl_File_Chooser_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT _Fl_File_Chooser_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
 	Fl_File_Chooser *self = ((Fl_File_Chooser *)p);
 	delete self;
@@ -3599,7 +3599,7 @@ static SQRegFunction fl_file_chooser_obj_funcs[]={
 };
 #undef _DECL_FUNC
 
-static SQRESULT _Fl_Native_File_Chooser_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT _Fl_Native_File_Chooser_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
 	Fl_Native_File_Chooser *self = ((Fl_Native_File_Chooser *)p);
 	delete self;
@@ -3858,6 +3858,18 @@ static SQRESULT _fl_get_font_name(HSQUIRRELVM v)
     return 1;
 }
 
+static SQRESULT _fl_wait(HSQUIRRELVM v)
+{
+    if(sq_gettop(v) > 1)
+    {
+        SQFloat delay;
+        sq_getfloat(v, 2, &delay);
+        sq_pushinteger(v, Fl::wait(delay));
+    }
+    else sq_pushinteger(v, Fl::wait());
+    return 1;
+}
+
 static SQRESULT _fl_focus(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS(v);
@@ -3982,6 +3994,7 @@ static SQRESULT _fl_preferences_flush(HSQUIRRELVM v)
 static SQRegFunction fl_obj_funcs[]={
 	_DECL_FUNC(check,1,_SC("y"),SQTrue),
 	_DECL_FUNC(run,1,_SC("y"),SQTrue),
+	_DECL_FUNC(wait,-1,_SC("yf"),SQTrue),
 	_DECL_FUNC(event,1,_SC("y"),SQTrue),
 	_DECL_FUNC(event_alt,1,_SC("y"),SQTrue),
 	_DECL_FUNC(event_button,1,_SC("y"),SQTrue),
@@ -4382,7 +4395,7 @@ static SQRESULT _fl_globals_fl_preferences(HSQUIRRELVM v)
 
 static int fl_cursor_wait_count = 0;
 static const SQChar fl_cursor_wait_TAG[] = _SC("fl_cursor_wait");
-static SQRESULT fl_cursor_wait_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT fl_cursor_wait_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
 	if (--fl_cursor_wait_count == 0) fl_cursor(FL_CURSOR_DEFAULT);
 	return 0;

+ 15 - 15
SquiLu-ext/sq_fpdf.cpp

@@ -39,25 +39,25 @@ class Sq_Fpdf : public FPDF {
     };
 };
 
-static SQRESULT sq_glue_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT sq_glue_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
-	Sq_Fpdf *self = ((Sq_Fpdf *)p);
-	delete self;
-	return 1;
-}
+	Sq_Fpdf *self = ((Sq_Fpdf *)p);
+	delete self;
+	return 1;
+}
 
-static SQRESULT sq_glue_constructor(HSQUIRRELVM v)
+static SQRESULT sq_glue_constructor(HSQUIRRELVM v)
 {
     //SQ_FUNC_VARS_NO_TOP(v);
     HSQOBJECT self;
     sq_resetobject(&self);
     sq_getstackobj(v, 1, &self);
 
-	Sq_Fpdf *cptr = new Sq_Fpdf(v, self);
-    sq_setinstanceup(v, 1, cptr);
-    sq_setreleasehook(v,1, sq_glue_releasehook);
-	return 1;
-}
+	Sq_Fpdf *cptr = new Sq_Fpdf(v, self);
+    sq_setinstanceup(v, 1, cptr);
+    sq_setreleasehook(v,1, sq_glue_releasehook);
+	return 1;
+}
 
 SQ_OPT_STRING_STRLEN();
 
@@ -583,14 +583,14 @@ static SQRESULT sq_glue_Output(HSQUIRRELVM v){
 	if(_top_ > 1) {
         SQObjectType ptype = sq_gettype(v, 2);
         if(ptype == OT_INSTANCE){
-            if(SQ_FAILED(sq_getinstanceup(v,2,(SQUserPointer*)&blob,(SQUserPointer)SQBlob::SQBlob_TAG)))
-                return sq_throwerror(v,_SC("invalid type tag"));
-            if(!blob || !blob->IsValid())
+            if(SQ_FAILED(sq_getinstanceup(v,2,(SQUserPointer*)&blob,(SQUserPointer)SQBlob::SQBlob_TAG)))
+                return sq_throwerror(v,_SC("invalid type tag"));
+            if(!blob || !blob->IsValid())
                 return sq_throwerror(v,_SC("the blob is invalid"));
             std::string str = self->Output(0, 'S');
             blob->SetLen(str.size());
             memcpy(blob->GetBuf(), str.c_str(), str.size());
-            return 0;
+            return 0;
         }
 	}
 	SQ_OPT_STRING(v, 2, name, 0);

+ 13 - 13
SquiLu-ext/sq_fs.c

@@ -458,7 +458,7 @@ static void _dir_close_dir(dir_data *dir)
     dir->closed = 1;
 }
 
-static SQRESULT _dir_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT _dir_releasehook(SQUserPointer p, SQInteger size, void *ep)
 {
 	dir_data *dir = ((dir_data *)p);
 	_dir_close_dir(dir);
@@ -511,8 +511,8 @@ static SQRESULT _dir__nexti(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_dir_INSTANCE();
-	SQInteger idx;
-	if(sq_gettype(v,2) == OT_NULL) idx = 0;
+	SQInteger idx;
+	if(sq_gettype(v,2) == OT_NULL) idx = 0;
 	else
 	{
         if(!SQ_SUCCEEDED(sq_getinteger(v, 2, &idx)))
@@ -556,18 +556,18 @@ static SQRESULT _dir__nexti(HSQUIRRELVM v)
     sq_pushstring(v, fname, -1);
     if(sq_set(v, 1) != SQ_OK) return SQ_ERROR;
 
-	sq_pushinteger(v, idx);
-	return 1;
+	sq_pushinteger(v, idx);
+	return 1;
 }
 
-#define _DECL_DIR_FUNC(name,nparams,typecheck) {_SC(#name),_dir_##name,nparams,typecheck}
-static SQRegFunction _dir_methods[] = {
-	_DECL_DIR_FUNC(constructor,-1,_SC("xs")),
-	_DECL_DIR_FUNC(close,1,_SC("x")),
-	_DECL_DIR_FUNC(_nexti,2,_SC("x.")),
-	_DECL_DIR_FUNC(_get,2,_SC("xn")),
-	{0,0,0,0}
-};
+#define _DECL_DIR_FUNC(name,nparams,typecheck) {_SC(#name),_dir_##name,nparams,typecheck}
+static SQRegFunction _dir_methods[] = {
+	_DECL_DIR_FUNC(constructor,-1,_SC("xs")),
+	_DECL_DIR_FUNC(close,1,_SC("x")),
+	_DECL_DIR_FUNC(_nexti,2,_SC("x.")),
+	_DECL_DIR_FUNC(_get,2,_SC("xn")),
+	{0,0,0,0}
+};
 
 
 #ifdef _WIN32

+ 1 - 1
SquiLu-ext/sq_libclang.cpp

@@ -203,7 +203,7 @@ static void release_visitor_cb(MyLibClang *self)
     sq_resetobject(&self->visitor_cb);
 }
 
-static SQRESULT sq_libclang_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT sq_libclang_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
 	MyLibClang *self = ((MyLibClang *)p);
 	if (self)

+ 3 - 3
SquiLu-ext/sq_mongoose.cpp

@@ -83,7 +83,7 @@ static const SQChar sq_http_request_TAG[] = "HttpRequest";
     struct mg_connection *conn; \
     if((_rc_ = sq_getinstanceup(v,1,(SQUserPointer*)&conn,(void*)sq_http_request_TAG)) < 0) return _rc_;
 
-static SQRESULT sq_http_request_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT sq_http_request_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
 	return 1;
 }
@@ -164,7 +164,7 @@ sq_http_request_read(HSQUIRRELVM v)
         blob = new SQBlob(0, rlen);
     }
 
-    if (rlen > n) rlen = n;  /* cannot read more than asked */
+    if (((ssize_t)rlen) > n) rlen = n;  /* cannot read more than asked */
     char *p = sq_getscratchpad(v,rlen);
     do {
         //there is a bug in axtls that can return a number bigger than the actual bytes transfered
@@ -670,7 +670,7 @@ static void sq_mongoose_release_references(SQ_Mg_Context *self){
     SQ_MG_Callback_free(self->user_callback_exit);
 }
 
-static SQRESULT sq_mongoose_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT sq_mongoose_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
     SQ_Mg_Context *self = (SQ_Mg_Context *)p;
     if(self){

+ 3 - 3
SquiLu-ext/sq_mysql.cpp

@@ -251,7 +251,7 @@ static SQRESULT get_mysql_result_instance(HSQUIRRELVM v, SQInteger idx, MYSQL_RE
 
 #define GET_mysql_result_INSTANCE() GET_mysql_result_INSTANCE_AT(1)
 
-static SQRESULT sq_mysql_result_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT sq_mysql_result_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
 	MYSQL_RES *self = ((MYSQL_RES *)p);
 	if (self) dlmysql_free_result(self);
@@ -456,7 +456,7 @@ static SQRESULT get_mysql_statement_instance(HSQUIRRELVM v, SQInteger idx, MYSQL
 
 #define GET_mysql_statement_INSTANCE() GET_mysql_statement_INSTANCE_AT(1)
 
-static SQRESULT sq_mysql_statement_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT sq_mysql_statement_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
 	MYSQL_STMT *self = ((MYSQL_STMT *)p);
 	if (self) dlmysql_stmt_close(self);
@@ -615,7 +615,7 @@ static SQRegFunction sq_mysql_statement_methods[] =
 };
 #undef _DECL_FUNC
 
-static SQRESULT sq_mysql_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT sq_mysql_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
 	MYSQL *self = ((MYSQL *)p);
 	if (self) dlmysql_close(self);

+ 1 - 1
SquiLu-ext/sq_parsecsv.cpp

@@ -97,7 +97,7 @@ std::vector<std::string> CsvGetLine(std::istream& is,
 
 static const SQChar sq_parse_csv_TAG[] = _SC("ParseCSV");
 
-static SQRESULT sq_parse_csv_release_hook(SQUserPointer p, SQInteger size, HSQUIRRELVM v) {
+static SQRESULT sq_parse_csv_release_hook(SQUserPointer p, SQInteger size, void */*ep*/) {
     std::ifstream *self = (std::ifstream *)p;
     if(self) delete self;
     return 0;

+ 3 - 3
SquiLu-ext/sq_postgresql.cpp

@@ -340,7 +340,7 @@ static SQRESULT get_pgsql_result_instance(HSQUIRRELVM v, SQInteger idx, PGresult
 
 #define GET_pgsql_result_INSTANCE() GET_pgsql_result_INSTANCE_AT(1)
 
-static SQRESULT sq_pgsql_result_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT sq_pgsql_result_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
 	PGresult *self = ((PGresult *)p);
 	if (self) dlPQclear(self);
@@ -516,7 +516,7 @@ static SQRESULT get_pgsql_statement_instance(HSQUIRRELVM v, SQInteger idx, PgSql
 
 #define GET_pgsql_statement_INSTANCE() GET_pgsql_statement_INSTANCE_AT(1)
 
-static SQRESULT sq_pgsql_statement_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT sq_pgsql_statement_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
 	PgSqlStatement *self = ((PgSqlStatement *)p);
 	if (self){
@@ -779,7 +779,7 @@ static SQRegFunction sq_pgsql_statement_methods[] =
 };
 #undef _DECL_FUNC
 
-static SQRESULT sq_pgsql_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT sq_pgsql_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
 	PGconn *self = ((PGconn *)p);
 	if (self) dlPQfinish(self);

+ 1 - 1
SquiLu-ext/sq_rs232.c

@@ -61,7 +61,7 @@ static SQRESULT get_rs232_instance(HSQUIRRELVM v, SQInteger idx, struct rs232_po
 #define GET_sq_rs232_INSTANCE(v, idx) struct rs232_port_t *self=NULL; \
 	if((_rc_ = get_rs232_instance(v,idx,&self)) < 0) return _rc_;
 
-static SQRESULT sq_rs232_release_hook(SQUserPointer p, SQInteger size, HSQUIRRELVM v) {
+static SQRESULT sq_rs232_release_hook(SQUserPointer p, SQInteger size, void *ep) {
     struct rs232_port_t *self = (struct rs232_port_t *)p;
     if(self) rs232_end(self);
     return 0;

+ 1 - 1
SquiLu-ext/sq_slave_vm.cpp

@@ -119,7 +119,7 @@ static SQRESULT sq_slave_vm__tostring (HSQUIRRELVM v)
     return 1;
 }
 
-static SQRESULT sq_slave_vm_release_hook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT sq_slave_vm_release_hook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
     HSQUIRRELVM self = (HSQUIRRELVM)p;
     if(self) sq_close(self);

+ 3 - 3
SquiLu-ext/sq_socket.cpp

@@ -952,7 +952,7 @@ static SQRESULT tcp_meth_dirty(HSQUIRRELVM v)
 /*-------------------------------------------------------------------------*\
 * Creates a master tcp object
 \*-------------------------------------------------------------------------*/
-static SQRESULT tcp_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT tcp_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
 	p_tcp tcp = (p_tcp)p;
 	if(tcp) {
@@ -1386,7 +1386,7 @@ static SQRESULT udp_meth_setsockname(HSQUIRRELVM v) {
 /*-------------------------------------------------------------------------*\
 * Creates a master udp object
 \*-------------------------------------------------------------------------*/
-static SQRESULT udp_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT udp_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
 	p_udp udp = (p_udp)p;
 	if(udp) {
@@ -1472,7 +1472,7 @@ static const SQChar SQ_unix_TAG[] = _SC("sq_unix_socket");
 /*-------------------------------------------------------------------------*\
 * Creates a master unix object
 \*-------------------------------------------------------------------------*/
-static SQRESULT unix_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT unix_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
 	p_unix unix_sock = (p_unix)p;
 	if(unix_sock) {

+ 10 - 6
SquiLu-ext/sq_sqlite3.cpp

@@ -280,7 +280,7 @@ static SQRESULT sq_sqlite3_stmt_prepare_aux(HSQUIRRELVM v, sqlite3 *db, sqlite3_
     return SQ_OK;
 }
 
-static SQRESULT sq_sqlite3_stmt_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT sq_sqlite3_stmt_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
     sqlite3_stmt *stmt = ((sqlite3_stmt *)p);
     if(stmt) sqlite3_finalize(stmt);
@@ -1439,7 +1439,8 @@ static SQRESULT sq_sqlite3_close_release(HSQUIRRELVM v, sq_sqlite3_sdb *sdb)
         if (count) return sq_throwerror(v, _SC("closing database with %d statements not closed."), count);
         */
 
-        if(sqlite3_close_v2(db) == SQLITE_OK)
+        int close_rc = sqlite3_close_v2(db) == SQLITE_OK;
+        if(!v || (v && close_rc))
         {
             rc = SQ_OK;
 
@@ -1479,15 +1480,18 @@ static SQRESULT sq_sqlite3_close_release(HSQUIRRELVM v, sq_sqlite3_sdb *sdb)
 
             sq_free(sdb, sizeof(sq_sqlite3_sdb));
         }
-        else return sq_throwerror(v, sqlite3_errmsg(db));
+        else
+        {
+            if(v) return sq_throwerror(v, sqlite3_errmsg(db));
+        }
     }
     return rc;
 }
 
-static SQRESULT sq_sqlite3_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT sq_sqlite3_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
     sq_sqlite3_sdb *sdb = ((sq_sqlite3_sdb *)p);
-    sq_sqlite3_close_release(v, sdb);
+    sq_sqlite3_close_release(0, sdb);
     return 0;
 }
 
@@ -2186,7 +2190,7 @@ typedef struct
 
 static const SQChar sq_sqlite3_context_TAG[]  = _SC(":sqlite3:ctx");
 
-static SQRESULT sq_sqlite3_context_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT sq_sqlite3_context_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
     sq_sqlite3_context_st *ctx = ((sq_sqlite3_context_st *)p);
     /* 'free' all references */

+ 181 - 181
SquiLu-ext/sq_tinyxml2.cpp

@@ -3,8 +3,8 @@
 #include <string.h>
 SQ_OPT_STRING_STRLEN();
 
-#define XML_TAG(tag) SQXML_##tag##_TYPE_TAG
-#define CREATE_TAG(tag) static const SQChar* XML_TAG(tag) = #tag
+#define XML_TAG(tag) SQXML_##tag##_TYPE_TAG
+#define CREATE_TAG(tag) static const SQChar* XML_TAG(tag) = #tag
 
 static const SQChar sq_tinyxml2_TAG[] = _SC("TinyXml2");
 CREATE_TAG(XMLNode);
@@ -47,162 +47,162 @@ static SQRESULT sq_push_xml_class(HSQUIRRELVM v, const SQChar *klass_tag, void *
     return SQ_ERROR;
 }
 
-static SQRESULT sq_XMLNode_GetDocument(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_GetDocument(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     tinyxml2::XMLDocument *doc = node->GetDocument();
     return sq_push_xml_class(v, XML_TAG(XMLDocument), doc);
-}
+}
 
-static SQRESULT sq_XMLNode_ToElement(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_ToElement(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     tinyxml2::XMLElement *ptr = node->ToElement();
     return sq_push_xml_class(v, XML_TAG(XMLElement), ptr);
-}
+}
 
-static SQRESULT sq_XMLNode_ToText(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_ToText(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     tinyxml2::XMLText *ptr = node->ToText();
     return sq_push_xml_class(v, XML_TAG(XMLText), ptr);
-}
+}
 
-static SQRESULT sq_XMLNode_ToComment(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_ToComment(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     tinyxml2::XMLComment *ptr = node->ToComment();
     return sq_push_xml_class(v, XML_TAG(XMLComment), ptr);
-}
+}
 
-static SQRESULT sq_XMLNode_ToDocument(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_ToDocument(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     tinyxml2::XMLDocument *ptr = node->ToDocument();
     return sq_push_xml_class(v, XML_TAG(XMLDocument), ptr);
-}
+}
 
-static SQRESULT sq_XMLNode_ToDeclaration(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_ToDeclaration(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     tinyxml2::XMLDeclaration *ptr = node->ToDeclaration();
     return sq_push_xml_class(v, XML_TAG(XMLDeclaration), ptr);
-}
+}
 
-static SQRESULT sq_XMLNode_ToUnknown(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_ToUnknown(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     tinyxml2::XMLUnknown *ptr = node->ToUnknown();
     return sq_push_xml_class(v, XML_TAG(XMLUnknown), ptr);
-}
+}
 
-static SQRESULT sq_XMLNode_Parent(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_Parent(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     tinyxml2::XMLNode *ptr = node->Parent();
     return sq_push_xml_class(v, XML_TAG(XMLNode), ptr);
-}
+}
 
-static SQRESULT sq_XMLNode_FirstChild(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_FirstChild(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     tinyxml2::XMLNode *ptr = node->FirstChild();
     return sq_push_xml_class(v, XML_TAG(XMLNode), ptr);
-}
+}
 
-static SQRESULT sq_XMLNode_LastChild(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_LastChild(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     tinyxml2::XMLNode *ptr = node->LastChild();
     return sq_push_xml_class(v, XML_TAG(XMLNode), ptr);
-}
+}
 
-static SQRESULT sq_XMLNode_PreviousSibling(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_PreviousSibling(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     tinyxml2::XMLNode *ptr = node->PreviousSibling();
     return sq_push_xml_class(v, XML_TAG(XMLNode), ptr);
-}
+}
 
-static SQRESULT sq_XMLNode_NextSibling(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_NextSibling(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     tinyxml2::XMLNode *ptr = node->NextSibling();
     return sq_push_xml_class(v, XML_TAG(XMLNode), ptr);
-}
+}
 
-static SQRESULT sq_XMLNode_FirstChildElement(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_FirstChildElement(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     tinyxml2::XMLElement *ptr = node->FirstChildElement();
     return sq_push_xml_class(v, XML_TAG(XMLElement), ptr);
-}
+}
 
-static SQRESULT sq_XMLNode_LastChildElement(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_LastChildElement(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     tinyxml2::XMLElement *ptr = node->LastChildElement();
     return sq_push_xml_class(v, XML_TAG(XMLElement), ptr);
-}
+}
 
-static SQRESULT sq_XMLNode_PreviousSiblingElement(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_PreviousSiblingElement(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     tinyxml2::XMLElement *ptr = node->PreviousSiblingElement();
     return sq_push_xml_class(v, XML_TAG(XMLElement), ptr);
-}
+}
 
-static SQRESULT sq_XMLNode_NextSiblingElement(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_NextSiblingElement(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     tinyxml2::XMLElement *ptr = node->NextSiblingElement();
     return sq_push_xml_class(v, XML_TAG(XMLElement), ptr);
-}
+}
 
-static SQRESULT sq_XMLNode_InsertEndChild(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_InsertEndChild(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     GET_XMLNode_INSTANCE2(v, 2, addThis);
     node->InsertEndChild(addThis);
     return 1;
-}
+}
 
-static SQRESULT sq_XMLNode_LinkEndChild(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_LinkEndChild(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     GET_XMLNode_INSTANCE2(v, 2, addThis);
     node->LinkEndChild(addThis);
     return 1;
-}
+}
 
-static SQRESULT sq_XMLNode_InsertFirstChild(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_InsertFirstChild(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     GET_XMLNode_INSTANCE2(v, 2, addThis);
     node->InsertFirstChild(addThis);
     return 1;
-}
+}
 
-static SQRESULT sq_XMLNode_InsertAfterChild(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_InsertAfterChild(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
@@ -210,26 +210,26 @@ static SQRESULT sq_XMLNode_InsertAfterChild(HSQUIRRELVM v)
     GET_XMLNode_INSTANCE2(v, 3, addThis);
     node->InsertAfterChild(afterThis, addThis);
     return 1;
-}
+}
 
-static SQRESULT sq_XMLNode_DeleteChildren(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_DeleteChildren(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     node->DeleteChildren();
     return 0;
-}
+}
 
-static SQRESULT sq_XMLNode_DeleteChild(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_DeleteChild(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     GET_XMLNode_INSTANCE2(v, 2, child);
     node->DeleteChild(child);
     return 0;
-}
+}
 
-static SQRESULT sq_XMLNode_ShallowClone(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_ShallowClone(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS(v);
     GET_XMLNode_INSTANCE(v, 1);
@@ -241,18 +241,18 @@ static SQRESULT sq_XMLNode_ShallowClone(HSQUIRRELVM v)
     else clone = node->ShallowClone(0);
 
     return sq_push_xml_class(v, XML_TAG(XMLNode), clone);
-}
+}
 
-static SQRESULT sq_XMLNode_ShallowEqual(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_ShallowEqual(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     GET_XMLNode_INSTANCE2(v, 2, compare);
     sq_pushbool(v, node->ShallowEqual(compare));
     return 1;
-}
+}
 
-static SQRESULT sq_XMLNode_Value(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_Value(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS(v);
     GET_XMLNode_INSTANCE(v, 1);
@@ -267,16 +267,16 @@ static SQRESULT sq_XMLNode_Value(HSQUIRRELVM v)
         if(value) sq_pushstring(v, value, -1);
         else sq_pushnull(v);
     }
-	return 1;
-}
+	return 1;
+}
 
-static SQRESULT sq_XMLNode_NoChildren(HSQUIRRELVM v)
+static SQRESULT sq_XMLNode_NoChildren(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLNode_INSTANCE(v, 1);
     sq_pushbool(v, node->NoChildren());
-	return 1;
-}
+	return 1;
+}
 
 #define _DECL_FUNC(name,nparams,tycheck) {_SC(#name),sq_XMLNode_##name,nparams,tycheck}
 static SQRegFunction XMLNode_methods[] =
@@ -311,7 +311,7 @@ static SQRegFunction XMLNode_methods[] =
 };
 #undef _DECL_FUNC
 
-static SQRESULT sq_XMLText_CData(HSQUIRRELVM v)
+static SQRESULT sq_XMLText_CData(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS(v);
     GET_XMLText_INSTANCE(v, 1);
@@ -321,8 +321,8 @@ static SQRESULT sq_XMLText_CData(HSQUIRRELVM v)
         return 0;
     }
     else sq_pushbool(v, text->CData());
-	return 1;
-}
+	return 1;
+}
 
 #define _DECL_FUNC(name,nparams,tycheck) {_SC(#name),sq_XMLText_##name,nparams,tycheck}
 static SQRegFunction XMLText_methods[] =
@@ -332,30 +332,30 @@ static SQRegFunction XMLText_methods[] =
 };
 #undef _DECL_FUNC
 
-static SQRESULT sq_XMLAttribute_Name(HSQUIRRELVM v)
+static SQRESULT sq_XMLAttribute_Name(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLAttribute_INSTANCE(v, 1);
     sq_pushstring(v, attribute->Name(), -1);
-	return 1;
+	return 1;
 }
 
-static SQRESULT sq_XMLAttribute_Value(HSQUIRRELVM v)
+static SQRESULT sq_XMLAttribute_Value(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLAttribute_INSTANCE(v, 1);
     sq_pushstring(v, attribute->Value(), -1);
-	return 1;
+	return 1;
 }
 
-static SQRESULT sq_XMLAttribute_Next(HSQUIRRELVM v)
+static SQRESULT sq_XMLAttribute_Next(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLAttribute_INSTANCE(v, 1);
     const tinyxml2::XMLAttribute *next = attribute->Next();
     if(next) return sq_push_xml_class(v, XML_TAG(XMLAttribute), (void*)next);
     sq_pushnull(v);
-	return 1;
+	return 1;
 }
 
 #define _DECL_FUNC(name,nparams,tycheck) {_SC(#name),sq_XMLAttribute_##name,nparams,tycheck}
@@ -368,7 +368,7 @@ static SQRegFunction XMLAttribute_methods[] =
 };
 #undef _DECL_FUNC
 
-static SQRESULT sq_XMLElement_Name(HSQUIRRELVM v)
+static SQRESULT sq_XMLElement_Name(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS(v);
     GET_XMLElement_INSTANCE(v, 1);
@@ -378,10 +378,10 @@ static SQRESULT sq_XMLElement_Name(HSQUIRRELVM v)
         return 0;
     }
     else sq_pushstring(v, element->Name(), -1);
-	return 1;
-}
+	return 1;
+}
 
-static SQRESULT sq_XMLElement_Attribute(HSQUIRRELVM v)
+static SQRESULT sq_XMLElement_Attribute(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS(v);
     GET_XMLElement_INSTANCE(v, 1);
@@ -390,37 +390,37 @@ static SQRESULT sq_XMLElement_Attribute(HSQUIRRELVM v)
     const char* res = element->Attribute(name, value);
     if(res) sq_pushstring(v, res, -1);
     else sq_pushnull(v);
-	return 1;
-}
+	return 1;
+}
 
-static SQRESULT sq_XMLElement_SetAttribute(HSQUIRRELVM v)
+static SQRESULT sq_XMLElement_SetAttribute(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLElement_INSTANCE(v, 1);
     SQ_GET_STRING(v, 2, name);
     SQ_GET_STRING(v, 3, value);
     element->SetAttribute(name, value);
-	return 0;
-}
+	return 0;
+}
 
-static SQRESULT sq_XMLElement_DeleteAttribute(HSQUIRRELVM v)
+static SQRESULT sq_XMLElement_DeleteAttribute(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLElement_INSTANCE(v, 1);
     SQ_GET_STRING(v, 2, name);
     element->DeleteAttribute(name);
-	return 0;
-}
+	return 0;
+}
 
-static SQRESULT sq_XMLElement_FirstAttribute(HSQUIRRELVM v)
+static SQRESULT sq_XMLElement_FirstAttribute(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLElement_INSTANCE(v, 1);
     element->FirstAttribute();
-	return 0;
-}
+	return 0;
+}
 
-static SQRESULT sq_XMLElement_FindAttribute(HSQUIRRELVM v)
+static SQRESULT sq_XMLElement_FindAttribute(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLElement_INSTANCE(v, 1);
@@ -428,18 +428,18 @@ static SQRESULT sq_XMLElement_FindAttribute(HSQUIRRELVM v)
 	const tinyxml2::XMLAttribute *attr = ((const tinyxml2::XMLElement*)element)->FindAttribute(name);
     if(attr) return sq_push_xml_class(v, XML_TAG(XMLAttribute), (void*)attr);
     sq_pushnull(v);
-	return 1;
-}
+	return 1;
+}
 
-static SQRESULT sq_XMLElement_GetText(HSQUIRRELVM v)
+static SQRESULT sq_XMLElement_GetText(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLElement_INSTANCE(v, 1);
     const char *txt = element->GetText();
     if(txt) sq_pushstring(v, txt, -1);
     else sq_pushnull(v);
-	return 1;
-}
+	return 1;
+}
 
 #define _DECL_FUNC(name,nparams,tycheck) {_SC(#name),sq_XMLElement_##name,nparams,tycheck}
 static SQRegFunction XMLElement_methods[] =
@@ -456,7 +456,7 @@ static SQRegFunction XMLElement_methods[] =
 #undef _DECL_FUNC
 
 
-static SQRESULT sq_XMLDocument_release_hook(SQUserPointer p, SQInteger size, HSQUIRRELVM v) {
+static SQRESULT sq_XMLDocument_release_hook(SQUserPointer p, SQInteger size, void */*ep*/) {
     tinyxml2::XMLDocument *doc = (tinyxml2::XMLDocument *)p;
     if(doc) delete doc;
     return 0;
@@ -480,171 +480,171 @@ static SQRESULT sq_XMLDocument_constructor (HSQUIRRELVM v) {
     return sq_throwerror(v, _SC("invalid value for Whitespace"));
 }
 
-static SQRESULT sq_XMLDocument_Parse(HSQUIRRELVM v)
+static SQRESULT sq_XMLDocument_Parse(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS(v);
     GET_XMLDocument_INSTANCE(v, 1);
     SQ_GET_STRING(v, 2, xml);
     SQ_OPT_INTEGER(v, 3, nBytes, -1);
     sq_pushinteger(v, doc->Parse(xml, (size_t)nBytes));
-	return 1;
-}
+	return 1;
+}
 
-static SQRESULT sq_XMLDocument_LoadFile(HSQUIRRELVM v)
+static SQRESULT sq_XMLDocument_LoadFile(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLDocument_INSTANCE(v, 1);
     SQ_GET_STRING(v, 2, filename);
     sq_pushinteger(v, doc->LoadFile(filename));
-	return 1;
-}
+	return 1;
+}
 
-static SQRESULT sq_XMLDocument_SaveFile(HSQUIRRELVM v)
+static SQRESULT sq_XMLDocument_SaveFile(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS(v);
     GET_XMLDocument_INSTANCE(v, 1);
     SQ_GET_STRING(v, 2, filename);
     SQ_OPT_BOOL(v, 3, compact, SQFalse);
     sq_pushinteger(v, doc->SaveFile(filename, compact));
-	return 1;
-}
+	return 1;
+}
 
-static SQRESULT sq_XMLDocument_HasBOM(HSQUIRRELVM v)
+static SQRESULT sq_XMLDocument_HasBOM(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLDocument_INSTANCE(v, 1);
     sq_pushbool(v, doc->HasBOM());
-	return 1;
-}
+	return 1;
+}
 
-static SQRESULT sq_XMLDocument_SetBOM(HSQUIRRELVM v)
+static SQRESULT sq_XMLDocument_SetBOM(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLDocument_INSTANCE(v, 1);
     SQ_GET_BOOL(v, 2, useBOM);
     doc->SetBOM(useBOM);
-	return 0;
-}
+	return 0;
+}
 
-static SQRESULT sq_XMLDocument_RootElement(HSQUIRRELVM v)
+static SQRESULT sq_XMLDocument_RootElement(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLDocument_INSTANCE(v, 1);
     tinyxml2::XMLElement *ptr = doc->RootElement();
     return sq_push_xml_class(v, XML_TAG(XMLElement), ptr);
-}
+}
 
-static SQRESULT sq_XMLDocument_NewElement(HSQUIRRELVM v)
+static SQRESULT sq_XMLDocument_NewElement(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLDocument_INSTANCE(v, 1);
     SQ_GET_STRING(v, 2, name);
     tinyxml2::XMLElement *ptr = doc->NewElement(name);
     return sq_push_xml_class(v, XML_TAG(XMLElement), ptr);
-}
+}
 
-static SQRESULT sq_XMLDocument_NewComment(HSQUIRRELVM v)
+static SQRESULT sq_XMLDocument_NewComment(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLDocument_INSTANCE(v, 1);
     SQ_GET_STRING(v, 2, name);
     tinyxml2::XMLComment *ptr = doc->NewComment(name);
     return sq_push_xml_class(v, XML_TAG(XMLComment), ptr);
-}
+}
 
-static SQRESULT sq_XMLDocument_NewText(HSQUIRRELVM v)
+static SQRESULT sq_XMLDocument_NewText(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLDocument_INSTANCE(v, 1);
     SQ_GET_STRING(v, 2, name);
     tinyxml2::XMLText *ptr = doc->NewText(name);
     return sq_push_xml_class(v, XML_TAG(XMLText), ptr);
-}
+}
 
-static SQRESULT sq_XMLDocument_NewDeclaration(HSQUIRRELVM v)
+static SQRESULT sq_XMLDocument_NewDeclaration(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS(v);
     GET_XMLDocument_INSTANCE(v, 1);
     SQ_OPT_STRING(v, 2, name, NULL);
     tinyxml2::XMLDeclaration *ptr = doc->NewDeclaration(name);
     return sq_push_xml_class(v, XML_TAG(XMLDeclaration), ptr);
-}
+}
 
-static SQRESULT sq_XMLDocument_NewUnknown(HSQUIRRELVM v)
+static SQRESULT sq_XMLDocument_NewUnknown(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLDocument_INSTANCE(v, 1);
     SQ_GET_STRING(v, 2, name);
     tinyxml2::XMLUnknown *ptr = doc->NewUnknown(name);
     return sq_push_xml_class(v, XML_TAG(XMLUnknown), ptr);
-}
+}
 
-static SQRESULT sq_XMLDocument_DeleteNode(HSQUIRRELVM v)
+static SQRESULT sq_XMLDocument_DeleteNode(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLDocument_INSTANCE(v, 1);
     GET_XMLNode_INSTANCE(v, 2);
     doc->DeleteNode(node);
-	return 0;
-}
+	return 0;
+}
 
-static SQRESULT sq_XMLDocument_Error(HSQUIRRELVM v)
+static SQRESULT sq_XMLDocument_Error(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLDocument_INSTANCE(v, 1);
     sq_pushbool(v, doc->Error());
-	return 1;
-}
+	return 1;
+}
 
-static SQRESULT sq_XMLDocument_ErrorID(HSQUIRRELVM v)
+static SQRESULT sq_XMLDocument_ErrorID(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLDocument_INSTANCE(v, 1);
     sq_pushinteger(v, doc->ErrorID());
-	return 1;
-}
+	return 1;
+}
 
-static SQRESULT sq_XMLDocument_GetErrorStr1(HSQUIRRELVM v)
+static SQRESULT sq_XMLDocument_GetErrorStr1(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLDocument_INSTANCE(v, 1);
     sq_pushstring(v, doc->GetErrorStr1(), -1);
-	return 1;
-}
+	return 1;
+}
 
-static SQRESULT sq_XMLDocument_GetErrorStr2(HSQUIRRELVM v)
+static SQRESULT sq_XMLDocument_GetErrorStr2(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLDocument_INSTANCE(v, 1);
     sq_pushstring(v, doc->GetErrorStr2(), -1);
-	return 1;
-}
+	return 1;
+}
 
-static SQRESULT sq_XMLDocument_ProcessEntities(HSQUIRRELVM v)
+static SQRESULT sq_XMLDocument_ProcessEntities(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLDocument_INSTANCE(v, 1);
     sq_pushbool(v, doc->ProcessEntities());
-	return 1;
-}
+	return 1;
+}
 
-static SQRESULT sq_XMLDocument_WhitespaceMode(HSQUIRRELVM v)
+static SQRESULT sq_XMLDocument_WhitespaceMode(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLDocument_INSTANCE(v, 1);
     sq_pushinteger(v, doc->WhitespaceMode());
-	return 1;
-}
+	return 1;
+}
 
-static SQRESULT sq_XMLDocument_tostring(HSQUIRRELVM v)
+static SQRESULT sq_XMLDocument_tostring(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLDocument_INSTANCE(v, 1);
     tinyxml2::XMLPrinter printer;
     doc->Print( &printer );
     sq_pushstring(v, printer.CStr(), printer.CStrSize());
-	return 1;
-}
+	return 1;
+}
 
 #define _DECL_FUNC(name,nparams,tycheck) {_SC(#name),sq_XMLDocument_##name,nparams,tycheck}
 static SQRegFunction XMLDocument_methods[] =
@@ -673,7 +673,7 @@ static SQRegFunction XMLDocument_methods[] =
 };
 #undef _DECL_FUNC
 
-static SQRESULT sq_XMLPrinter_release_hook(SQUserPointer p, SQInteger size, HSQUIRRELVM v) {
+static SQRESULT sq_XMLPrinter_release_hook(SQUserPointer p, SQInteger size, void */*ep*/) {
     tinyxml2::XMLPrinter *printer = (tinyxml2::XMLPrinter *)p;
     if(printer) delete printer;
     return 0;
@@ -692,87 +692,87 @@ static SQRESULT sq_XMLPrinter_constructor (HSQUIRRELVM v) {
     return 1;
 }
 
-static SQRESULT sq_XMLPrinter_PushHeader(HSQUIRRELVM v)
+static SQRESULT sq_XMLPrinter_PushHeader(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLPrinter_INSTANCE(v, 1);
     SQ_GET_BOOL(v, 2, writeBOM);
     SQ_GET_BOOL(v, 3, writeDeclaration);
     printer->PushHeader(writeBOM, writeDeclaration);
-	return 0;
-}
+	return 0;
+}
 
-static SQRESULT sq_XMLPrinter_OpenElement(HSQUIRRELVM v)
+static SQRESULT sq_XMLPrinter_OpenElement(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLPrinter_INSTANCE(v, 1);
     SQ_GET_STRING(v, 2, name);
     printer->OpenElement(name);
-	return 0;
-}
+	return 0;
+}
 
-static SQRESULT sq_XMLPrinter_PushAttribute(HSQUIRRELVM v)
+static SQRESULT sq_XMLPrinter_PushAttribute(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLPrinter_INSTANCE(v, 1);
     SQ_GET_STRING(v, 2, name);
     SQ_GET_STRING(v, 3, value);
     printer->PushAttribute(name, value);
-	return 0;
-}
+	return 0;
+}
 
-static SQRESULT sq_XMLPrinter_CloseElement(HSQUIRRELVM v)
+static SQRESULT sq_XMLPrinter_CloseElement(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLPrinter_INSTANCE(v, 1);
     printer->CloseElement();
-	return 0;
-}
+	return 0;
+}
 
-static SQRESULT sq_XMLPrinter_PushText(HSQUIRRELVM v)
+static SQRESULT sq_XMLPrinter_PushText(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS(v);
     GET_XMLPrinter_INSTANCE(v, 1);
     SQ_GET_STRING(v, 2, text);
     SQ_OPT_BOOL(v, 3, cdata, false);
     printer->PushText(text, cdata);
-	return 0;
-}
+	return 0;
+}
 
-static SQRESULT sq_XMLPrinter_PushComment(HSQUIRRELVM v)
+static SQRESULT sq_XMLPrinter_PushComment(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLPrinter_INSTANCE(v, 1);
     SQ_GET_STRING(v, 2, comment);
     printer->PushComment(comment);
-	return 0;
-}
+	return 0;
+}
 
-static SQRESULT sq_XMLPrinter_PushDeclaration(HSQUIRRELVM v)
+static SQRESULT sq_XMLPrinter_PushDeclaration(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLPrinter_INSTANCE(v, 1);
     SQ_GET_STRING(v, 2, value);
     printer->PushDeclaration(value);
-	return 0;
-}
+	return 0;
+}
 
-static SQRESULT sq_XMLPrinter_PushUnknown(HSQUIRRELVM v)
+static SQRESULT sq_XMLPrinter_PushUnknown(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLPrinter_INSTANCE(v, 1);
     SQ_GET_STRING(v, 2, value);
     printer->PushUnknown(value);
-	return 0;
-}
+	return 0;
+}
 
-static SQRESULT sq_XMLPrinter_tostring(HSQUIRRELVM v)
+static SQRESULT sq_XMLPrinter_tostring(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_XMLPrinter_INSTANCE(v, 1);
     sq_pushstring(v, printer->CStr(), printer->CStrSize());
-	return 1;
-}
+	return 1;
+}
 
 #define _DECL_FUNC(name,nparams,tycheck) {_SC(#name),sq_XMLPrinter_##name,nparams,tycheck}
 static SQRegFunction XMLPrinter_methods[] =
@@ -795,24 +795,24 @@ static SQRESULT xml_pushnewclass(HSQUIRRELVM v, const SQChar *klass, const SQCha
                                  void *tag, SQRegFunction *obj_funcs, SQBool isStatic){
 	sq_pushstring(v, klass,-1);
 	if(parent){
-        sq_pushstring(v, parent,-1);
-        if (SQ_FAILED(sq_get(v, -3)))
-            return sq_throwerror(v, _SC("Missing base class."));
-	}
-	sq_newclass(v, parent ? SQTrue : SQFalse);
-	sq_settypetag(v,-1,tag);
-	if(obj_funcs) sq_insert_reg_funcs(v, obj_funcs);
+        sq_pushstring(v, parent,-1);
+        if (SQ_FAILED(sq_get(v, -3)))
+            return sq_throwerror(v, _SC("Missing base class."));
+	}
+	sq_newclass(v, parent ? SQTrue : SQFalse);
+	sq_settypetag(v,-1,tag);
+	if(obj_funcs) sq_insert_reg_funcs(v, obj_funcs);
 	sq_newslot(v,-3, isStatic);
-	return SQ_OK;
+	return SQ_OK;
 }
 #define PUSH_XML_CLASS0(klass)\
-    if(xml_pushnewclass(v, #klass, 0, (void*)XML_TAG(klass), klass##_methods, SQFalse) < 0) return SQ_ERROR;
+    if(xml_pushnewclass(v, #klass, 0, (void*)XML_TAG(klass), klass##_methods, SQFalse) < 0) return SQ_ERROR;
 
 #define PUSH_XML_CLASS(klass, parent)\
-    if(xml_pushnewclass(v, #klass, #parent, (void*)XML_TAG(klass), klass##_methods, SQFalse) < 0) return SQ_ERROR;
+    if(xml_pushnewclass(v, #klass, #parent, (void*)XML_TAG(klass), klass##_methods, SQFalse) < 0) return SQ_ERROR;
 
 #define PUSH_XML_CLASS2(klass, parent)\
-    if(xml_pushnewclass(v, #klass, #parent, (void*)XML_TAG(klass), 0, SQFalse) < 0) return SQ_ERROR;
+    if(xml_pushnewclass(v, #klass, #parent, (void*)XML_TAG(klass), 0, SQFalse) < 0) return SQ_ERROR;
 
 #ifdef __cplusplus
 extern "C" {
@@ -822,8 +822,8 @@ extern "C" {
 
 SQRESULT sqext_register_tinyxml2(HSQUIRRELVM v)
 {
-	sq_pushstring(v, sq_tinyxml2_TAG, -1);
-	sq_newtable(v);
+	sq_pushstring(v, sq_tinyxml2_TAG, -1);
+	sq_newtable(v);
 
     CONST_INT(XML_NO_ERROR);
     CONST_INT(XML_SUCCESS);
@@ -851,8 +851,8 @@ SQRESULT sqext_register_tinyxml2(HSQUIRRELVM v)
     CONST_INT(COLLAPSE_WHITESPACE);
 
     sq_pushstring(v,XML_TAG(XMLNode),-1);
-	sq_newclass(v,SQFalse);
-	sq_settypetag(v,-1,(void*)XML_TAG(XMLNode));
+	sq_newclass(v,SQFalse);
+	sq_settypetag(v,-1,(void*)XML_TAG(XMLNode));
     sq_insert_reg_funcs(v, XMLNode_methods);
     sq_newslot(v,-3,SQTrue);
 

+ 9 - 5
SquiLu-ext/sq_unql.cpp

@@ -45,7 +45,7 @@ static SQRESULT get_sqlite3_instance(HSQUIRRELVM v, SQInteger idx, sq_sqlite3_sd
 	if((_rc_ = get_xjd1_stmt_instance(v,1,&self)) < 0) return _rc_;
 
 
-static SQRESULT sq_xjd1_stmt_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT sq_xjd1_stmt_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
     xjd1_stmt *stmt = ((xjd1_stmt *)p);
     if(stmt) xjd1_stmt_delete(stmt);
@@ -132,19 +132,23 @@ static SQRESULT sq_xjd1_close_release(HSQUIRRELVM v, xjd1 *db)
     SQRESULT rc = SQ_ERROR;
     if(db)
     {
-        if(xjd1_close(db) == XJD1_OK)
+        int close_rc = xjd1_close(db) == XJD1_OK;
+        if(!v || (v && close_rc))
         {
             rc = SQ_OK;
         }
-        else return sq_throwerror(v, xjd1_errmsg(db));
+        else
+        {
+            if(v) return sq_throwerror(v, xjd1_errmsg(db));
+        }
     }
     return rc;
 }
 
-static SQRESULT sq_xjd1_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT sq_xjd1_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
     xjd1 *db = ((xjd1 *)p);
-    sq_xjd1_close_release(v, db);
+    sq_xjd1_close_release(0, db);
     return 0;
 }
 

+ 2 - 2
SquiLu-ext/sq_zlib.cpp

@@ -19,7 +19,7 @@ static const SQChar sq_minizip_unzip_TAG[] = _SC("sq_minizip_unzip_tag");
     if(!Var) return sq_throwerror(v, _SC("miniz_ziparchive already destroyed"));
 #define GET_minizip_unzip_INSTANCE() GET_minizip_unzip_INSTANCE_VAR_AT(1, self)
 
-static SQRESULT sq_minizip_unzip_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT sq_minizip_unzip_releasehook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
 	unzFile self = ((unzFile)p);
 	if(self) {
@@ -294,7 +294,7 @@ static SQRESULT sq_zlib_version(HSQUIRRELVM v)
 #ifdef __cplusplus
 extern "C" {
 #endif
-#define INT_CONST(v,num) 	sq_pushstring(v,_SC(#num),-1);sq_pushinteger(v,num);sq_newslot(v,-3,SQTrue);
+#define INT_CONST(v,num) 	sq_pushstring(v,_SC(#num),-1);sq_pushinteger(v,num);sq_newslot(v,-3,SQTrue);
 
 
     SQRESULT sqext_register_sq_zlib(HSQUIRRELVM v)

+ 4 - 0
SquiLu/include/squirrel.h

@@ -232,7 +232,11 @@ typedef struct SQVM* HSQUIRRELVM;
 typedef SQObject HSQOBJECT;
 typedef SQMemberHandle HSQMEMBERHANDLE;
 typedef SQRESULT (*SQFUNCTION)(HSQUIRRELVM);
+#ifdef SQ_WITH_DELAYED_RELEASE_HOOKS
 typedef SQRESULT (*SQRELEASEHOOK)(SQUserPointer ptr, SQInteger size, HSQUIRRELVM v);
+#else
+typedef SQRESULT (*SQRELEASEHOOK)(SQUserPointer ptr, SQInteger size, void *ep);
+#endif // SQ_WITH_DELAYED_RELEASE_HOOKS
 typedef void (*SQCOMPILERERROR)(HSQUIRRELVM,const SQChar * /*desc*/,const SQChar * /*source*/,SQInteger /*line*/,SQInteger /*column*/);
 typedef void (*SQPRINTFUNCTION)(HSQUIRRELVM,const SQChar * ,...);
 typedef void (*SQDEBUGHOOK)(HSQUIRRELVM /*v*/, SQInteger /*type*/, const SQChar * /*sourcename*/, SQInteger /*line*/, const SQChar * /*funcname*/);

+ 1 - 1
SquiLu/sqstdlib/sqstdblob.cpp

@@ -267,7 +267,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*/, void */*ep*/)
 {
 	SQBlob *self = (SQBlob*)p;
 	self->~SQBlob();

+ 1 - 1
SquiLu/sqstdlib/sqstdio.cpp

@@ -122,7 +122,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*/, void */*ep*/)
 {
 	SQFile *self = (SQFile*)p;
 	self->~SQFile();

+ 1 - 1
SquiLu/sqstdlib/sqstdstring.cpp

@@ -319,7 +319,7 @@ static SQInteger _string_escape(HSQUIRRELVM 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*/, void */*ep*/)
 {
 	SQRex *self = ((SQRex *)p);
 	sqstd_rex_free(self);

+ 1 - 1
SquiLu/sqstdlib/sqstdsystem.cpp

@@ -305,7 +305,7 @@ static SQRESULT _system_exit (HSQUIRRELVM v) {
 #include <unistd.h>
 #define SQ_TMPNAMBUFSIZE	32
 #define sq_tmpnam(b,e)	{ \
-	strcpy(b, "/tmp/lua_XXXXXX"); \
+	strcpy(b, "/tmp/sq_XXXXXX"); \
 	e = mkstemp(b); \
 	if (e != -1) close(e); \
 	e = (e == -1); }

+ 1 - 0
SquiLu/squilu.cbp

@@ -882,6 +882,7 @@
 			<Add option="-DSQLITE_ENABLE_COLUMN_METADATA=1" />
 			<Add option="-DSQLITE_ENABLE_EXTENSION_FUNCTIONS=1" />
 			<Add option="-DSQLITE_ENABLE_FTS4=1" />
+			<Add option="-DSQLITE_ENABLE_FTS5=1" />
 			<Add option="-DSQLITE_ENABLE_FTS3_PARENTHESIS=1" />
 			<Add option="-DSQLITE_ENABLE_UNLOCK_NOTIFY=1" />
 			<Add option="-DSQLITE_ENABLE_RTREE=1" />

+ 4 - 2
SquiLu/squirrel/sq_lexer.cpp

@@ -21,6 +21,7 @@ struct sq_lexer_st
     SQLexer *lex;
     HSQOBJECT source;
     SQStrBufState buf;
+    HSQUIRRELVM vm;
 };
 
 static const SQChar SQLEXER_Tag[]   = _SC("sq_SQLexer_ctx");
@@ -28,12 +29,12 @@ static const SQChar SQLEXER_Tag[]   = _SC("sq_SQLexer_ctx");
 	if(self == NULL) return sq_throwerror(v, _SC("SQLexer object already closed"));
 
 
-static SQRESULT SQLexer_release_hook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+static SQRESULT SQLexer_release_hook(SQUserPointer p, SQInteger size, void */*ep*/)
 {
 	sq_lexer_st *self = (sq_lexer_st*)p;
 	if(self && self->lex)
     {
-        sq_release(v, &self->source);
+        sq_release(self->vm, &self->source);
         self->lex->~SQLexer();
         sq_free(self->lex, sizeof(SQLexer));
         self->lex = NULL;
@@ -55,6 +56,7 @@ static SQRESULT sq_SQLexer_constructor(HSQUIRRELVM v){
     self->buf.buf = src;
     self->buf.ptr = 0;
     self->buf.size = src_size;
+    self->vm = v;
     self->lex->Init(v->_sharedstate, sq_strbuf_lexfeed, &self->buf, NULL, NULL);
 
     sq_setinstanceup(v, 1, self);

+ 5 - 1
SquiLu/squirrel/sqapi.cpp

@@ -1430,8 +1430,10 @@ SQRESULT sq_call(HSQUIRRELVM v,SQInteger params,SQBool retval,SQBool raiseerror)
 
 		if(!v->_suspended) {
 			v->Pop(params);//pop closure and args
+#ifdef SQ_WITH_DELAYED_RELEASE_HOOKS
 			//collect garbage right after function call if any
 			_ss(v)->CallDelayedReleaseHooks(v);
+#endif // SQ_WITH_DELAYED_RELEASE_HOOKS
 		}
 		if(retval){
 			v->Push(res); return SQ_OK;
@@ -1551,8 +1553,10 @@ SQRESULT sq_resurrectunreachable(HSQUIRRELVM v)
 
 SQInteger sq_collectgarbage(HSQUIRRELVM v)
 {
-#ifndef NO_GARBAGE_COLLECTOR
+#ifdef NO_GARBAGE_COLLECTOR
+#ifdef SQ_WITH_DELAYED_RELEASE_HOOKS
     _ss(v)->CallDelayedReleaseHooks(v);
+#endif // SQ_WITH_DELAYED_RELEASE_HOOKS
 	return _ss(v)->CollectGarbage(v);
 #else
 	return -1;

+ 4 - 0
SquiLu/squirrel/sqbaselib.cpp

@@ -66,6 +66,7 @@ static SQRESULT base_getrefcount(HSQUIRRELVM v)
     else sq_pushinteger(v, o._unVal.pRefCounted->_uiRef - 1);
 	return 1;
 }
+#ifdef SQ_WITH_DELAYED_RELEASE_HOOKS
 static SQRESULT base_check_delayed_release_hooks(HSQUIRRELVM v)
 {
 	SQ_FUNC_VARS(v);
@@ -82,6 +83,7 @@ static SQRESULT base_call_delayed_release_hooks(HSQUIRRELVM v)
     v->_sharedstate->CallDelayedReleaseHooks(v);
 	return 0;
 }
+#endif // SQ_WITH_DELAYED_RELEASE_HOOKS
 #endif
 
 static SQRESULT base_getroottable(HSQUIRRELVM v)
@@ -548,8 +550,10 @@ static SQRegFunction base_funcs[]={
 	{_SC("collectgarbage"),base_collectgarbage,0, NULL},
 	{_SC("resurrectunreachable"),base_resurectureachable,0, NULL},
 	{_SC("getrefcount"),base_getrefcount,2, _SC("..")},
+#ifdef SQ_WITH_DELAYED_RELEASE_HOOKS
 	{_SC("check_delayed_release_hooks"),base_check_delayed_release_hooks,-1, _SC(".b")},
 	{_SC("call_delayed_release_hooks"),base_call_delayed_release_hooks,1, NULL},
+#endif // SQ_WITH_DELAYED_RELEASE_HOOKS
 #endif
 	{_SC("str_from_chars"),base_str_from_chars,-1, _SC(".i")},
 	{_SC("try_tostring"),base_try_tostring,-2, _SC("..s")},

+ 176 - 176
SquiLu/squirrel/sqclass.h

@@ -1,206 +1,206 @@
-/*	see copyright notice in squirrel.h */
-#ifndef _SQCLASS_H_
-#define _SQCLASS_H_
-
-struct SQInstance;
-
-struct SQClassMember {
-	SQObjectPtr val;
-	SQObjectPtr attrs;
+/*	see copyright notice in squirrel.h */
+#ifndef _SQCLASS_H_
+#define _SQCLASS_H_
+
+struct SQInstance;
+
+struct SQClassMember {
+	SQObjectPtr val;
+	SQObjectPtr attrs;
     void Null() {
         val.Null();
         attrs.Null();
     }
-};
-
-typedef sqvector<SQClassMember> SQClassMemberVec;
-
-#define MEMBER_TYPE_METHOD 0x01000000
-#define MEMBER_TYPE_FIELD 0x02000000
-
-#define _ismethod(o) (_integer(o)&MEMBER_TYPE_METHOD)
-#define _isfield(o) (_integer(o)&MEMBER_TYPE_FIELD)
-#define _make_method_idx(i) ((SQInteger)(MEMBER_TYPE_METHOD|i))
-#define _make_field_idx(i) ((SQInteger)(MEMBER_TYPE_FIELD|i))
-#define _member_type(o) (_integer(o)&0xFF000000)
-#define _member_idx(o) (_integer(o)&0x00FFFFFF)
-
-struct SQClass : public CHAINABLE_OBJ
-{
-	SQClass(SQSharedState *ss,SQClass *base);
-public:
-	static SQClass* Create(SQSharedState *ss,SQClass *base) {
-		SQClass *newclass = (SQClass *)SQ_MALLOC(sizeof(SQClass));
-		new (newclass) SQClass(ss, base);
-		return newclass;
-	}
-	~SQClass();
-	bool NewSlot(SQSharedState *ss, const SQObjectPtr &key,const SQObjectPtr &val,bool bstatic);
+};
+
+typedef sqvector<SQClassMember> SQClassMemberVec;
+
+#define MEMBER_TYPE_METHOD 0x01000000
+#define MEMBER_TYPE_FIELD 0x02000000
+
+#define _ismethod(o) (_integer(o)&MEMBER_TYPE_METHOD)
+#define _isfield(o) (_integer(o)&MEMBER_TYPE_FIELD)
+#define _make_method_idx(i) ((SQInteger)(MEMBER_TYPE_METHOD|i))
+#define _make_field_idx(i) ((SQInteger)(MEMBER_TYPE_FIELD|i))
+#define _member_type(o) (_integer(o)&0xFF000000)
+#define _member_idx(o) (_integer(o)&0x00FFFFFF)
+
+struct SQClass : public CHAINABLE_OBJ
+{
+	SQClass(SQSharedState *ss,SQClass *base);
+public:
+	static SQClass* Create(SQSharedState *ss,SQClass *base) {
+		SQClass *newclass = (SQClass *)SQ_MALLOC(sizeof(SQClass));
+		new (newclass) SQClass(ss, base);
+		return newclass;
+	}
+	~SQClass();
+	bool NewSlot(SQSharedState *ss, const SQObjectPtr &key,const SQObjectPtr &val,bool bstatic);
 	bool Get(const SQObjectPtr &key,SQObjectPtr &val) {
 		if(_members->Get(key,val)) {
-			if(_isfield(val)) {
-				SQObjectPtr &o = _defaultvalues[_member_idx(val)].val;
-				val = _realval(o);
-			}
-			else {
-				val = _methods[_member_idx(val)].val;
-			}
-			return true;
-		}
-		return false;
-	}
-	bool Exists(const SQObjectPtr &key) {
-		return _members->Exists(key);
-	}
-	bool Set(const SQObjectPtr &key,const SQObjectPtr &val) {
-		SQObjectPtr idx;
+			if(_isfield(val)) {
+				SQObjectPtr &o = _defaultvalues[_member_idx(val)].val;
+				val = _realval(o);
+			}
+			else {
+				val = _methods[_member_idx(val)].val;
+			}
+			return true;
+		}
+		return false;
+	}
+	bool Exists(const SQObjectPtr &key) {
+		return _members->Exists(key);
+	}
+	bool Set(const SQObjectPtr &key,const SQObjectPtr &val) {
+		SQObjectPtr idx;
 		if(_members->Get(key,idx) && !_isfield(idx)) {
             //if(_isfield(idx)) _members->Set(key, val);
             //else
             return Set(idx, val);
 		}
-		return false;
+		return false;
 	}
     bool Set(SQObjectPtr &idx, const SQObjectPtr &val){
         SQClassMember &m = _methods[_member_idx(idx)];
         if(!(type(m.val) == OT_CLOSURE || type(m.val) == OT_NATIVECLOSURE)){
-            m.val = val;
+            m.val = val;
             return true;
         }
-        return false;
-    }
-	bool GetConstructor(SQObjectPtr &ctor)
-	{
-		if(_constructoridx != -1) {
-			ctor = _methods[_constructoridx].val;
-			return true;
-		}
-		return false;
-	}
-	bool GetDestructor(SQObjectPtr &dtor)
-	{
-		if(_destructoridx != -1) {
-			dtor = _methods[_destructoridx].val;
-			return true;
-		}
-		return false;
-	}
-	bool SetAttributes(const SQObjectPtr &key,const SQObjectPtr &val);
-	bool GetAttributes(const SQObjectPtr &key,SQObjectPtr &outval);
-	void Lock() { _locked = true; if(_base) _base->Lock(); }
-	void Release() {
-		if (_hook) { _hook(_typetag,0, 0);}
-		sq_delete(this, SQClass);
-	}
-	void Finalize();
-#ifndef NO_GARBAGE_COLLECTOR
-	void Mark(SQCollectable ** );
-	SQObjectType GetType() {return OT_CLASS;}
-#endif
-	SQInteger Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval);
-	SQInstance *CreateInstance();
-	SQTable *_members;
-	SQClass *_base;
-	SQClassMemberVec _defaultvalues;
-	SQClassMemberVec _methods;
-	SQObjectPtr _metamethods[MT_LAST];
-	SQObjectPtr _attributes;
-	SQUserPointer _typetag;
+        return false;
+    }
+	bool GetConstructor(SQObjectPtr &ctor)
+	{
+		if(_constructoridx != -1) {
+			ctor = _methods[_constructoridx].val;
+			return true;
+		}
+		return false;
+	}
+	bool GetDestructor(SQObjectPtr &dtor)
+	{
+		if(_destructoridx != -1) {
+			dtor = _methods[_destructoridx].val;
+			return true;
+		}
+		return false;
+	}
+	bool SetAttributes(const SQObjectPtr &key,const SQObjectPtr &val);
+	bool GetAttributes(const SQObjectPtr &key,SQObjectPtr &outval);
+	void Lock() { _locked = true; if(_base) _base->Lock(); }
+	void Release() {
+		if (_hook) { _hook(_typetag,0, 0);}
+		sq_delete(this, SQClass);
+	}
+	void Finalize();
+#ifndef NO_GARBAGE_COLLECTOR
+	void Mark(SQCollectable ** );
+	SQObjectType GetType() {return OT_CLASS;}
+#endif
+	SQInteger Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval);
+	SQInstance *CreateInstance();
+	SQTable *_members;
+	SQClass *_base;
+	SQClassMemberVec _defaultvalues;
+	SQClassMemberVec _methods;
+	SQObjectPtr _metamethods[MT_LAST];
+	SQObjectPtr _attributes;
+	SQUserPointer _typetag;
 	SQRELEASEHOOK _hook;
-	SQInt16 _constructoridx;
-	SQInt16 _destructoridx;
-	SQInteger _udsize;
-	bool _locked;
-};
-
-#define calcinstancesize(_theclass_) \
-	(_theclass_->_udsize + sq_aligning(sizeof(SQInstance) +  (sizeof(SQObjectPtr)*(_theclass_->_defaultvalues.size()>0?_theclass_->_defaultvalues.size()-1:0))))
-
-struct SQInstance : public SQDelegable
-{
-	void Init(SQSharedState *ss);
-	SQInstance(SQSharedState *ss, SQClass *c, SQInteger memsize);
-	SQInstance(SQSharedState *ss, SQInstance *c, SQInteger memsize);
-public:
-	static SQInstance* Create(SQSharedState *ss,SQClass *theclass) {
-
-		SQInteger size = calcinstancesize(theclass);
-		SQInstance *newinst = (SQInstance *)SQ_MALLOC(size);
-		new (newinst) SQInstance(ss, theclass,size);
-		if(theclass->_udsize) {
-			newinst->_userpointer = ((unsigned char *)newinst) + (size - theclass->_udsize);
-		}
-		return newinst;
-	}
-	SQInstance *Clone(SQSharedState *ss)
-	{
-		SQInteger size = calcinstancesize(_class);
-		SQInstance *newinst = (SQInstance *)SQ_MALLOC(size);
-		new (newinst) SQInstance(ss, this,size);
-		if(_class->_udsize) {
-			newinst->_userpointer = ((unsigned char *)newinst) + (size - _class->_udsize);
-		}
-		return newinst;
-	}
-	~SQInstance();
-	bool Get(const SQObjectPtr &key,SQObjectPtr &val)  {
-		if(_class->_members->Get(key,val)) {
+	SQInt16 _constructoridx;
+	SQInt16 _destructoridx;
+	SQInteger _udsize;
+	bool _locked;
+};
+
+#define calcinstancesize(_theclass_) \
+	(_theclass_->_udsize + sq_aligning(sizeof(SQInstance) +  (sizeof(SQObjectPtr)*(_theclass_->_defaultvalues.size()>0?_theclass_->_defaultvalues.size()-1:0))))
+
+struct SQInstance : public SQDelegable
+{
+	void Init(SQSharedState *ss);
+	SQInstance(SQSharedState *ss, SQClass *c, SQInteger memsize);
+	SQInstance(SQSharedState *ss, SQInstance *c, SQInteger memsize);
+public:
+	static SQInstance* Create(SQSharedState *ss,SQClass *theclass) {
+
+		SQInteger size = calcinstancesize(theclass);
+		SQInstance *newinst = (SQInstance *)SQ_MALLOC(size);
+		new (newinst) SQInstance(ss, theclass,size);
+		if(theclass->_udsize) {
+			newinst->_userpointer = ((unsigned char *)newinst) + (size - theclass->_udsize);
+		}
+		return newinst;
+	}
+	SQInstance *Clone(SQSharedState *ss)
+	{
+		SQInteger size = calcinstancesize(_class);
+		SQInstance *newinst = (SQInstance *)SQ_MALLOC(size);
+		new (newinst) SQInstance(ss, this,size);
+		if(_class->_udsize) {
+			newinst->_userpointer = ((unsigned char *)newinst) + (size - _class->_udsize);
+		}
+		return newinst;
+	}
+	~SQInstance();
+	bool Get(const SQObjectPtr &key,SQObjectPtr &val)  {
+		if(_class->_members->Get(key,val)) {
 			if(_isfield(val)) {
-				SQObjectPtr &o = _values[_member_idx(val)];
-				val = _realval(o);
-			}
-			else {
-				val = _class->_methods[_member_idx(val)].val;
-			}
-			return true;
-		}
-		return false;
-	}
-	bool Exists(const SQObjectPtr &key)  {
-		return _class->_members->Exists(key);
-	}
-	bool Set(const SQObjectPtr &key,const SQObjectPtr &val) {
-		SQObjectPtr idx;
+				SQObjectPtr &o = _values[_member_idx(val)];
+				val = _realval(o);
+			}
+			else {
+				val = _class->_methods[_member_idx(val)].val;
+			}
+			return true;
+		}
+		return false;
+	}
+	bool Exists(const SQObjectPtr &key)  {
+		return _class->_members->Exists(key);
+	}
+	bool Set(const SQObjectPtr &key,const SQObjectPtr &val) {
+		SQObjectPtr idx;
 		if(_class->_members->Get(key,idx)){
-            if(_isfield(idx)) {
-                _values[_member_idx(idx)] = val;
+            if(_isfield(idx)) {
+                _values[_member_idx(idx)] = val;
                 return true;
             }
             else
             {
                 return _class->Set(idx, val);
-            }
-		}
-		return false;
-	}
-	void Release() {
-		_uiRef++;
+            }
+		}
+		return false;
+	}
+	void Release() {
+		_uiRef++;
 		if (_hook) {
-#ifndef NO_GARBAGE_COLLECTOR
+#if !defined(NO_GARBAGE_COLLECTOR) && defined(SQ_WITH_DELAYED_RELEASE_HOOKS)
 		    _sharedstate->AddDelayedReleaseHook(_hook, _userpointer, 0);
 #else
 		    _hook(_userpointer,0, 0);
 #endif
-        }
-		_uiRef--;
-		if(_uiRef > 0) return;
-		SQInteger size = _memsize;
-		this->~SQInstance();
-		SQ_FREE(this, size);
-	}
-	void Finalize();
-#ifndef NO_GARBAGE_COLLECTOR
-	void Mark(SQCollectable ** );
-	SQObjectType GetType() {return OT_INSTANCE;}
-#endif
-	bool InstanceOf(SQClass *trg);
-	bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res);
-
-	SQClass *_class;
-	SQUserPointer _userpointer;
-	SQRELEASEHOOK _hook;
-	SQInteger _memsize;
-	SQObjectPtr _values[1];
-};
-
-#endif //_SQCLASS_H_
+        }
+		_uiRef--;
+		if(_uiRef > 0) return;
+		SQInteger size = _memsize;
+		this->~SQInstance();
+		SQ_FREE(this, size);
+	}
+	void Finalize();
+#ifndef NO_GARBAGE_COLLECTOR
+	void Mark(SQCollectable ** );
+	SQObjectType GetType() {return OT_INSTANCE;}
+#endif
+	bool InstanceOf(SQClass *trg);
+	bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res);
+
+	SQClass *_class;
+	SQUserPointer _userpointer;
+	SQRELEASEHOOK _hook;
+	SQInteger _memsize;
+	SQObjectPtr _values[1];
+};
+
+#endif //_SQCLASS_H_

+ 5 - 1
SquiLu/squirrel/sqcompiler.cpp

@@ -100,7 +100,8 @@ struct SQScope {
 		CASE_TK_LOCAL_INT_TYPES: \
 		case TK_LOCAL_BOOL_T: \
 		case TK_LOCAL_TABLE_T: \
-		case TK_LOCAL_ARRAY_T
+		case TK_LOCAL_ARRAY_T: \
+		case TK_LOCAL_VOIDPTR_T
 
 static SQInteger compilerReadFunc(SQUserPointer fp)
 {
@@ -545,6 +546,7 @@ public:
 			FunctionStatement();
 			break;
 		case TK_CLASS:
+		case TK_STRUCT:
 			ClassStatement();
 			break;
 		case TK_ENUM:
@@ -1146,6 +1148,7 @@ public:
 			break;
 		case TK_FUNCTION: FunctionExp(_token);break;
 		case _SC('@'): FunctionExp(_token,true);break;
+		case TK_STRUCT:
 		case TK_CLASS: Lex(); ClassExp();break;
 		case _SC('-'):
 			Lex();
@@ -1817,6 +1820,7 @@ if(color == "yellow"){
 		return tk_type;
 error:
         Error(_SC("constant or scalar expected : integer, float or string"));
+        return 0;
 	}
 	void EnumStatement()
 	{

+ 3 - 1
SquiLu/squirrel/sqcompiler.h

@@ -96,12 +96,14 @@ struct SQVM;
     ENUM_TK(LOCAL_FLOAT_T)\
     ENUM_TK(LOCAL_DOUBLE_T)\
     ENUM_TK(LOCAL_LONG_DOUBLE_T)\
+    ENUM_TK(LOCAL_VOIDPTR_T)\
     ENUM_TK(BIT_AND_EQ)\
     ENUM_TK(BIT_OR_EQ)\
     ENUM_TK(BIT_XOR_EQ)\
     ENUM_TK(BIT_SHIFT_LEFT_EQ)\
     ENUM_TK(BIT_SHIFT_RIGHT_EQ)\
-    ENUM_TK(PRAGMA)
+    ENUM_TK(PRAGMA)\
+    ENUM_TK(STRUCT)
     //ENUM_TK(VARGC)
     //ENUM_TK(VARGV)
 

+ 2 - 0
SquiLu/squirrel/sqlexer.cpp

@@ -88,6 +88,7 @@ SQTable * SQLexer::GetKeywords()
 	ADD_KEYWORD(float_t, TK_LOCAL_FLOAT_T);
 	ADD_KEYWORD(double_t, TK_LOCAL_DOUBLE_T);
 	ADD_KEYWORD(long_double_t, TK_LOCAL_LONG_DOUBLE_T);
+	ADD_KEYWORD(void_ptr_t, TK_LOCAL_VOIDPTR_T);
 
 	ADD_KEYWORD(for, TK_FOR);
 	ADD_KEYWORD(foreach, TK_FOREACH);
@@ -106,6 +107,7 @@ SQTable * SQLexer::GetKeywords()
 	ADD_KEYWORD(default, TK_DEFAULT);
 	ADD_KEYWORD(this, TK_THIS);
 	ADD_KEYWORD(class,TK_CLASS);
+	ADD_KEYWORD(struct,TK_STRUCT);
 	ADD_KEYWORD(extends,TK_EXTENDS);
 	ADD_KEYWORD(constructor,TK_CONSTRUCTOR);
 	ADD_KEYWORD(destructor,TK_DESTRUCTOR);

+ 4 - 0
SquiLu/squirrel/sqstate.cpp

@@ -25,7 +25,9 @@ SQSharedState::SQSharedState()
 	_errorfunc = NULL;
 	_debuginfo = false;
 	_notifyallexceptions = false;
+#ifdef SQ_WITH_DELAYED_RELEASE_HOOKS
 	_already_in_CallDelayedReleaseHooks = false;
+#endif // SQ_WITH_DELAYED_RELEASE_HOOKS
 #ifdef SQ_JIT_LLVM
 	//llvm::StructType::create(
 #endif
@@ -233,6 +235,7 @@ SQInteger SQSharedState::GetMetaMethodIdxByName(const SQObjectPtr &name)
 	return -1;
 }
 
+#ifdef SQ_WITH_DELAYED_RELEASE_HOOKS
 void SQSharedState::AddDelayedReleaseHook(SQRELEASEHOOK hook, SQUserPointer ptr, SQInteger size)
 {
     SQDelayedReleseHook dh;
@@ -260,6 +263,7 @@ void SQSharedState::CallDelayedReleaseHooks(SQVM *vm, int count)
         _already_in_CallDelayedReleaseHooks = false;
     }
 }
+#endif // SQ_WITH_DELAYED_RELEASE_HOOKS
 
 #ifndef NO_GARBAGE_COLLECTOR
 

+ 4 - 0
SquiLu/squirrel/sqstate.h

@@ -93,8 +93,10 @@ public:
 #ifndef NO_GARBAGE_COLLECTOR
 	SQCollectable *_gc_chain;
 #endif
+#ifdef SQ_WITH_DELAYED_RELEASE_HOOKS
     void AddDelayedReleaseHook(SQRELEASEHOOK hook, SQUserPointer ptr, SQInteger size);
     void CallDelayedReleaseHooks(SQVM *vm, int count=0);
+#endif // SQ_WITH_DELAYED_RELEASE_HOOKS
 	SQObjectPtr _root_vm;
 	SQObjectPtr _table_default_delegate_squirrel;
 	static SQRegFunction _table_default_delegate_squirrel_funcz[];
@@ -125,8 +127,10 @@ public:
 	bool _debuginfo;
 	bool _notifyallexceptions;
 private:
+#ifdef SQ_WITH_DELAYED_RELEASE_HOOKS
     bool _already_in_CallDelayedReleaseHooks;
     sqvector<SQDelayedReleseHook> _delayed_release_hook;
+#endif // SQ_WITH_DELAYED_RELEASE_HOOKS
 	SQChar *_scratchpad;
 	SQInteger _scratchpadsize;
 };

+ 42 - 42
SquiLu/squirrel/squserdata.h

@@ -1,46 +1,46 @@
-/*	see copyright notice in squirrel.h */
-#ifndef _SQUSERDATA_H_
-#define _SQUSERDATA_H_
-
-struct SQUserData : SQDelegable
-{
-	SQUserData(SQSharedState *ss){ _delegate = 0; _hook = NULL; INIT_CHAIN(); ADD_TO_CHAIN(&_ss(this)->_gc_chain, this); }
-	~SQUserData()
-	{
-		REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain, this);
-		SetDelegate(NULL);
-	}
-	static SQUserData* Create(SQSharedState *ss, SQInteger size)
-	{
-		SQUserData* ud = (SQUserData*)SQ_MALLOC(sq_aligning(sizeof(SQUserData))+size);
-		new (ud) SQUserData(ss);
-		ud->_size = size;
-		ud->_typetag = 0;
-		return ud;
-	}
-#ifndef NO_GARBAGE_COLLECTOR
-	void Mark(SQCollectable **chain);
-	void Finalize(){SetDelegate(NULL);}
-	SQObjectType GetType(){ return OT_USERDATA;}
-#endif
-	void Release() {
+/*	see copyright notice in squirrel.h */
+#ifndef _SQUSERDATA_H_
+#define _SQUSERDATA_H_
+
+struct SQUserData : SQDelegable
+{
+	SQUserData(SQSharedState *ss){ _delegate = 0; _hook = NULL; INIT_CHAIN(); ADD_TO_CHAIN(&_ss(this)->_gc_chain, this); }
+	~SQUserData()
+	{
+		REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain, this);
+		SetDelegate(NULL);
+	}
+	static SQUserData* Create(SQSharedState *ss, SQInteger size)
+	{
+		SQUserData* ud = (SQUserData*)SQ_MALLOC(sq_aligning(sizeof(SQUserData))+size);
+		new (ud) SQUserData(ss);
+		ud->_size = size;
+		ud->_typetag = 0;
+		return ud;
+	}
+#ifndef NO_GARBAGE_COLLECTOR
+	void Mark(SQCollectable **chain);
+	void Finalize(){SetDelegate(NULL);}
+	SQObjectType GetType(){ return OT_USERDATA;}
+#endif
+	void Release() {
 		if (_hook) {
-#ifndef NO_GARBAGE_COLLECTOR
+#if !defined(NO_GARBAGE_COLLECTOR) && defined(SQ_WITH_DELAYED_RELEASE_HOOKS)
 		    _sharedstate->AddDelayedReleaseHook(_hook, (SQUserPointer)sq_aligning(this + 1), _size);
 #else
 		    _hook((SQUserPointer)sq_aligning(this + 1),_size, 0);
-#endif
-		}
-		SQInteger tsize = _size;
-		this->~SQUserData();
-		SQ_FREE(this, sq_aligning(sizeof(SQUserData)) + tsize);
-	}
-
-
-	SQInteger _size;
-	SQRELEASEHOOK _hook;
-	SQUserPointer _typetag;
-	//SQChar _val[1];
-};
-
-#endif //_SQUSERDATA_H_
+#endif
+		}
+		SQInteger tsize = _size;
+		this->~SQUserData();
+		SQ_FREE(this, sq_aligning(sizeof(SQUserData)) + tsize);
+	}
+
+
+	SQInteger _size;
+	SQRELEASEHOOK _hook;
+	SQUserPointer _typetag;
+	//SQChar _val[1];
+};
+
+#endif //_SQUSERDATA_H_

+ 6 - 2
SquiLu/squirrel/sqvm.cpp

@@ -157,7 +157,9 @@ SQVM::SQVM(SQSharedState *ss)
 void SQVM::Finalize()
 {
     CallAtExitHandler();
+#ifdef SQ_WITH_DELAYED_RELEASE_HOOKS
     _sharedstate->CallDelayedReleaseHooks(this);
+#endif
 	if(_openouters) CloseOuters(&_stack._vals[0]);
 	_roottable.Null();
 	_lasterror.Null();
@@ -921,9 +923,9 @@ exception_restore:
 					case OT_NATIVECLOSURE: {
 						bool suspend;
 						_GUARD(CallNative(_nativeclosure(clo), arg3, _stackbase+arg2, clo,suspend));
-
+#ifdef SQ_WITH_DELAYED_RELEASE_HOOKS
 						if(_check_delayed_relase_hooks) _sharedstate->CallDelayedReleaseHooks(this);
-
+#endif
 						if(suspend){
 							_suspended = SQTrue;
 							_suspended_target = sarg0;
@@ -1884,7 +1886,9 @@ void SQVM::LeaveFrame() {
 	ci = (css) ? &_callsstack[css-1] : NULL;
 
 	if(_openouters) CloseOuters(&(_stack._vals[last_stackbase]));
+#ifdef SQ_WITH_DELAYED_RELEASE_HOOKS
 	if(_check_delayed_relase_hooks) _sharedstate->CallDelayedReleaseHooks(this);
+#endif
 }
 #endif