소스 검색

Add new functions to the api to make less verbose writing extensions.
sq_getonregistrytable will rawget on registrytable using the top of the stack.
sq_setonregistrytable will rawset on registrytable key from top-2 and value ftom top.
sq_getlasterror_str utility function that return the last error message to be used on sq_throwerror most of the time.

mingodad 13 년 전
부모
커밋
ef72e4984e
3개의 변경된 파일33개의 추가작업 그리고 12개의 파일을 삭제
  1. 3 9
      ext/sqfs.c
  2. 6 3
      include/squirrel.h
  3. 24 0
      squirrel/sqapi.cpp

+ 3 - 9
ext/sqfs.c

@@ -475,13 +475,9 @@ static SQRESULT _dir__get(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS_NO_TOP(v);
     GET_dir_INSTANCE();
-    sq_pushregistrytable(v);
     sq_pushuserpointer(v, self);
-    if(sq_rawget(v, -2) == SQ_OK) sq_remove(v, -2); //remove registrytable
-    else {
-        sq_poptop(v);//remove registrytable
-        sq_pushnull(v);
-    }
+    if(sq_getonregistrytable(v) != SQ_OK) sq_pushnull(v);
+    //do not worry about registry table it will be removed anyway when restoring the stack
     return 1;
 }
 
@@ -530,11 +526,9 @@ static SQRESULT _dir__nexti(HSQUIRRELVM v)
     }
     fname = entry->d_name;
 #endif
-    sq_pushregistrytable(v);
     sq_pushuserpointer(v, self);
     sq_pushstring(v, fname, -1);
-    sq_rawset(v, -3);
-    sq_poptop(v);//remove registrytable
+    sq_setonregistrytable(v);
 
 	sq_pushinteger(v, idx);
 	return 1;

+ 6 - 3
include/squirrel.h

@@ -48,9 +48,9 @@ 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 int SQInt32;
 typedef unsigned int SQUnsignedInteger32;
-#else 
+#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)*/
@@ -298,7 +298,7 @@ typedef struct SQVM* HSQUIRRELVM;
 typedef SQObject HSQOBJECT;
 typedef SQMemberHandle HSQMEMBERHANDLE;
 typedef SQInteger (*SQFUNCTION)(HSQUIRRELVM);
-typedef SQInteger (*SQRELEASEHOOK)(SQUserPointer,SQInteger size);
+typedef SQInteger (*SQRELEASEHOOK)(SQUserPointer ptr, SQInteger size);
 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*/);
@@ -407,6 +407,8 @@ SQUIRREL_API SQRESULT sq_setbyhandle(HSQUIRRELVM v,SQInteger idx,const HSQMEMBER
 /*object manipulation*/
 SQUIRREL_API void sq_pushroottable(HSQUIRRELVM v);
 SQUIRREL_API void sq_pushregistrytable(HSQUIRRELVM v);
+SQUIRREL_API SQRESULT sq_getonregistrytable(HSQUIRRELVM v);
+SQUIRREL_API SQRESULT sq_setonregistrytable(HSQUIRRELVM v);
 SQUIRREL_API void sq_pushconsttable(HSQUIRRELVM v);
 SQUIRREL_API SQRESULT sq_setroottable(HSQUIRRELVM v);
 SQUIRREL_API SQRESULT sq_setconsttable(HSQUIRRELVM v);
@@ -443,6 +445,7 @@ SQUIRREL_API SQRESULT sq_throwerror(HSQUIRRELVM v,const SQChar *fmt, ...);
 SQUIRREL_API SQRESULT sq_throwobject(HSQUIRRELVM v);
 SQUIRREL_API void sq_reseterror(HSQUIRRELVM v);
 SQUIRREL_API void sq_getlasterror(HSQUIRRELVM v);
+const SQChar *sq_getlasterror_str(HSQUIRRELVM v);
 
 /*raw object handling*/
 SQUIRREL_API SQRESULT sq_getstackobj(HSQUIRRELVM v,SQInteger idx,HSQOBJECT *po);

+ 24 - 0
squirrel/sqapi.cpp

@@ -512,6 +512,25 @@ void sq_pushregistrytable(HSQUIRRELVM v)
 	v->Push(_ss(v)->_registry);
 }
 
+SQRESULT sq_getonregistrytable(HSQUIRRELVM v)
+{
+	if(_table(_ss(v)->_registry)->Get(v->GetUp(-1),v->GetUp(-1)))
+		return SQ_OK;
+	v->Pop();
+	return SQ_ERROR;
+}
+
+SQRESULT sq_setonregistrytable(HSQUIRRELVM v)
+{
+	if(type(v->GetUp(-2)) == OT_NULL) {
+		v->Pop(2);
+		return sq_throwerror(v, _SC("null key"));
+	}
+    _table(_ss(v)->_registry)->NewSlot(v->GetUp(-2), v->GetUp(-1));
+    v->Pop(2);
+    return SQ_OK;
+}
+
 void sq_pushconsttable(HSQUIRRELVM v)
 {
 	v->Push(_ss(v)->_consts);
@@ -1076,6 +1095,11 @@ void sq_getlasterror(HSQUIRRELVM v)
 	v->Push(v->_lasterror);
 }
 
+const SQChar *sq_getlasterror_str(HSQUIRRELVM v)
+{
+	return _string(v->_lasterror)->_val;
+}
+
 SQRESULT sq_reservestack(HSQUIRRELVM v,SQInteger nsize)
 {
 	if (((SQUnsignedInteger)v->_top + nsize) > v->_stack.size()) {