Kaynağa Gözat

Add new api function "SQBool sq_rawexists(HSQUIRRELVM v,SQInteger idx)" that do not throw error if not found.

mingodad 13 yıl önce
ebeveyn
işleme
6d30d3313a
2 değiştirilmiş dosya ile 31 ekleme ve 1 silme
  1. 2 1
      include/squirrel.h
  2. 29 0
      squirrel/sqapi.cpp

+ 2 - 1
include/squirrel.h

@@ -444,7 +444,8 @@ SQUIRREL_API SQRESULT sq_deleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
 SQUIRREL_API SQRESULT sq_set(HSQUIRRELVM v,SQInteger idx);
 SQUIRREL_API SQRESULT sq_get(HSQUIRRELVM v,SQInteger idx);
 SQUIRREL_API SQRESULT sq_getbyname(HSQUIRRELVM v,SQInteger idx, const SQChar *key, SQInteger key_len);
-SQUIRREL_API SQRESULT sq_rawget(HSQUIRRELVM v,SQInteger idx);
+SQUIRREL_API SQRESULT sq_rawget(HSQUIRRELVM v,SQInteger idx);
+SQUIRREL_API SQBool sq_rawexists(HSQUIRRELVM v,SQInteger idx);
 SQUIRREL_API SQRESULT sq_rawset(HSQUIRRELVM v,SQInteger idx);
 SQUIRREL_API SQRESULT sq_rawdeleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
 SQUIRREL_API SQRESULT sq_newmember(HSQUIRRELVM v,SQInteger idx,SQBool bstatic);

+ 29 - 0
squirrel/sqapi.cpp

@@ -1141,6 +1141,35 @@ SQRESULT sq_rawget(HSQUIRRELVM v,SQInteger idx)
 	v->Pop();
 	return sq_throwerror(v,_SC("the index doesn't exist"));
 }
+
+SQBool sq_rawexists(HSQUIRRELVM v,SQInteger idx)
+{
+	SQObjectPtr &self=stack_get(v,idx);
+	SQObjectPtr &obj = v->GetUp(-1);
+	switch(type(self)) {
+	case OT_TABLE:
+		if(_table(self)->Exists(obj))
+			return SQTrue;
+		break;
+	case OT_CLASS:
+		if(_class(self)->Exists(obj))
+			return SQTrue;
+		break;
+	case OT_INSTANCE:
+		if(_instance(self)->Exists(obj))
+			return SQTrue;
+		break;
+	case OT_ARRAY:
+		if(sq_isnumeric(obj)){
+			if(_array(self)->Exists(tointeger(obj))) {
+				return SQTrue;
+			}
+		}
+	default:
+		v->Pop();
+	}
+	return SQFalse;
+}
 
 SQRESULT sq_getstackobj(HSQUIRRELVM v,SQInteger idx,HSQOBJECT *po)
 {