소스 검색

Create a new api function to remove keys on the registry table without use the stack,
it's mainly to be used in release hook functions, like sq_sqlite3.cpp

mingodad 9 년 전
부모
커밋
30e859fb39
3개의 변경된 파일12개의 추가작업 그리고 8개의 파일을 삭제
  1. 1 8
      SquiLu-ext/sq_sqlite3.cpp
  2. 1 0
      SquiLu/include/squirrel.h
  3. 10 0
      SquiLu/squirrel/sqapi.cpp

+ 1 - 8
SquiLu-ext/sq_sqlite3.cpp

@@ -1445,15 +1445,8 @@ static SQRESULT sq_sqlite3_close_release(HSQUIRRELVM v, sq_sqlite3_sdb *sdb)
         {
         {
             rc = SQ_OK;
             rc = SQ_OK;
 
 
-            //we do not need remove the weak reference
-            //it's done automatically
-            /*
             //remove waekref from registrytable
             //remove waekref from registrytable
-            sq_pushregistrytable(sdb->v); //here we enter a loop that call us again
-            sq_pushuserpointer(sdb->v, db);
-            sq_deleteslot(sdb->v, -2, SQFalse);
-            sq_poptop(sdb->v);
-            */
+            sq_delete_on_registry_table(sdb->v, db);
 
 
             if(sdb->func)
             if(sdb->func)
             {
             {

+ 1 - 0
SquiLu/include/squirrel.h

@@ -380,6 +380,7 @@ SQUIRREL_API SQRESULT sq_setonroottable(HSQUIRRELVM v);
 SQUIRREL_API void sq_pushregistrytable(HSQUIRRELVM v);
 SQUIRREL_API void sq_pushregistrytable(HSQUIRRELVM v);
 SQUIRREL_API SQRESULT sq_getonregistrytable(HSQUIRRELVM v);
 SQUIRREL_API SQRESULT sq_getonregistrytable(HSQUIRRELVM v);
 SQUIRREL_API SQRESULT sq_setonregistrytable(HSQUIRRELVM v);
 SQUIRREL_API SQRESULT sq_setonregistrytable(HSQUIRRELVM v);
+SQUIRREL_API SQRESULT sq_delete_on_registry_table(HSQUIRRELVM v, SQUserPointer uptr);
 
 
 #define SQ_EXTENSIONS_KEY _SC("sq__Extensions")
 #define SQ_EXTENSIONS_KEY _SC("sq__Extensions")
 typedef struct {
 typedef struct {

+ 10 - 0
SquiLu/squirrel/sqapi.cpp

@@ -677,6 +677,16 @@ SQRESULT sq_setonregistrytable(HSQUIRRELVM v)
     return SQ_OK;
     return SQ_OK;
 }
 }
 
 
+SQRESULT sq_delete_on_registry_table(HSQUIRRELVM v, SQUserPointer uptr)
+{
+    SQObjectPtr key = uptr;
+	if(type(key) == OT_NULL) {
+		return sq_throwerror(v, _SC("null key"));
+	}
+    _table(_ss(v)->_registry)->Remove(key);
+    return SQ_OK;
+}
+
 int sq_preload_modules(HSQUIRRELVM v, sq_modules_preload_st *modules){
 int sq_preload_modules(HSQUIRRELVM v, sq_modules_preload_st *modules){
     int result = 0;
     int result = 0;
     int saved_top = sq_gettop(v);
     int saved_top = sq_gettop(v);