فهرست منبع

Expose raw access to tables, this way we can rawset, rawget, rawin, rawdelete any key value on a table.
Without then we'll could make common table operations unreachable, for example if we performed a rawset with a key that is equal to any delegate method name.
table_rawset(atable, akey, avalue);
table_rawget(atable, akey, adefaultvalue);
table_rawin(atable, akey);
table_rawdelete(atable, akey);
table_len(atable);
table_clear(atable);

mingodad 10 سال پیش
والد
کامیت
147b811d54
1فایلهای تغییر یافته به همراه52 افزوده شده و 45 حذف شده
  1. 52 45
      SquiLu/squirrel/sqbaselib.cpp

+ 52 - 45
SquiLu/squirrel/sqbaselib.cpp

@@ -387,6 +387,52 @@ static SQRESULT base_str_from_chars (HSQUIRRELVM v) {
   return 1;
   return 1;
 }
 }
 
 
+/////////////////////////////////////////////////////////////////
+//TABLE DEFAULT DELEGATE
+
+static SQRESULT table_rawdelete(HSQUIRRELVM v)
+{
+	if(SQ_FAILED(sq_rawdeleteslot(v,1,SQTrue)))
+		return SQ_ERROR;
+	return 1;
+}
+
+
+static SQRESULT container_rawexists(HSQUIRRELVM v)
+{
+	sq_pushbool(v, sq_rawexists(v,-2));
+	return 1;
+}
+
+static SQRESULT container_rawset(HSQUIRRELVM v)
+{
+	return sq_rawset(v,-3);
+}
+
+static SQRESULT container_rawget(HSQUIRRELVM v)
+{
+    switch(sq_gettop(v)){
+        case 2: return SQ_SUCCEEDED(sq_rawget(v,-2))?1:SQ_ERROR;break;
+        case 3: {
+            sq_push(v, 2); //copy key to top
+            sq_rawget(v,-4); //if it fail pop the key and default value is on top
+            return 1;
+        }
+        break;
+    }
+    return sq_throwerror(v, _SC("invalid number of parameters"));
+}
+
+static SQRESULT obj_clear(HSQUIRRELVM v)
+{
+	return sq_clear(v,-1);
+}
+
+static SQRESULT default_delegate_len(HSQUIRRELVM v)
+{
+	v->Push(SQInteger(sq_getsize(v,1)));
+	return 1;
+}
 
 
 static SQRegFunction base_funcs[]={
 static SQRegFunction base_funcs[]={
 	//generic
 	//generic
@@ -425,6 +471,12 @@ static SQRegFunction base_funcs[]={
 	{_SC("call_delayed_release_hooks"),base_call_delayed_release_hooks,1, NULL},
 	{_SC("call_delayed_release_hooks"),base_call_delayed_release_hooks,1, NULL},
 #endif
 #endif
 	{_SC("str_from_chars"),base_str_from_chars,-2, _SC(".i")},
 	{_SC("str_from_chars"),base_str_from_chars,-2, _SC(".i")},
+	{_SC("table_rawget"),container_rawget,-3, _SC(".t.")},
+	{_SC("table_rawset"),container_rawset,4, _SC(".t..")},
+	{_SC("table_rawdelete"),table_rawdelete,3, _SC(".t.")},
+	{_SC("table_rawin"),container_rawexists,3, _SC(".t.")},
+	{_SC("table_len"),default_delegate_len,2, _SC(".t")},
+	{_SC("table_clear"),obj_clear,2, _SC(".t")},
 	{0,0}
 	{0,0}
 };
 };
 
 
@@ -459,12 +511,6 @@ void sq_base_register(HSQUIRRELVM v)
 	sq_pop(v,1);
 	sq_pop(v,1);
 }
 }
 
 
-static SQRESULT default_delegate_len(HSQUIRRELVM v)
-{
-	v->Push(SQInteger(sq_getsize(v,1)));
-	return 1;
-}
-
 static SQRESULT default_delegate_tofloat(HSQUIRRELVM v)
 static SQRESULT default_delegate_tofloat(HSQUIRRELVM v)
 {
 {
 	SQObjectPtr &o=stack_get(v,1);
 	SQObjectPtr &o=stack_get(v,1);
@@ -535,12 +581,6 @@ static SQRESULT obj_delegate_weakref(HSQUIRRELVM v)
 	return 1;
 	return 1;
 }
 }
 
 
-static SQRESULT obj_clear(HSQUIRRELVM v)
-{
-	return sq_clear(v,-1);
-}
-
-
 static SQRESULT number_delegate_tochar(HSQUIRRELVM v)
 static SQRESULT number_delegate_tochar(HSQUIRRELVM v)
 {
 {
 	SQObject &o=stack_get(v,1);
 	SQObject &o=stack_get(v,1);
@@ -554,39 +594,6 @@ static SQRESULT number_delegate_tochar(HSQUIRRELVM v)
 /////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////
 //TABLE DEFAULT DELEGATE
 //TABLE DEFAULT DELEGATE
 
 
-static SQRESULT table_rawdelete(HSQUIRRELVM v)
-{
-	if(SQ_FAILED(sq_rawdeleteslot(v,1,SQTrue)))
-		return SQ_ERROR;
-	return 1;
-}
-
-
-static SQRESULT container_rawexists(HSQUIRRELVM v)
-{
-	sq_pushbool(v, sq_rawexists(v,-2));
-	return 1;
-}
-
-static SQRESULT container_rawset(HSQUIRRELVM v)
-{
-	return sq_rawset(v,-3);
-}
-
-static SQRESULT container_rawget(HSQUIRRELVM v)
-{
-    switch(sq_gettop(v)){
-        case 2: return SQ_SUCCEEDED(sq_rawget(v,-2))?1:SQ_ERROR;break;
-        case 3: {
-            sq_push(v, 2); //copy key to top
-            sq_rawget(v,-4); //if it fail pop the key and default value is on top
-            return 1;
-        }
-        break;
-    }
-    return sq_throwerror(v, _SC("invalid number of parameters"));
-}
-
 static SQRESULT container_get(HSQUIRRELVM v)
 static SQRESULT container_get(HSQUIRRELVM v)
 {
 {
     switch(sq_gettop(v)){
     switch(sq_gettop(v)){