Kaynağa Gözat

Added two new operators for identity equality and unequality like the ones in javascript and php

mingodad 12 yıl önce
ebeveyn
işleme
4eb5a431d8

+ 2 - 0
SquiLu/squirrel/sqcompiler.cpp

@@ -711,7 +711,9 @@ public:
 		CompExp();
 		for(;;) switch(_token) {
 		case TK_EQ: BIN_EXP(_OP_EQ, &SQCompiler::CompExp); break;
+		case TK_EQ_IDENTITY :BIN_EXP(_OP_EQI, &SQCompiler::CompExp); break;
 		case TK_NE: BIN_EXP(_OP_NE, &SQCompiler::CompExp); break;
+		case TK_NE_IDENTITY: BIN_EXP(_OP_NEI, &SQCompiler::CompExp); break;
 		case TK_3WAYSCMP: BIN_EXP(_OP_CMP, &SQCompiler::CompExp,CMP_3W); break;
 		default: return;
 		}

+ 2 - 0
SquiLu/squirrel/sqcompiler.h

@@ -17,7 +17,9 @@ enum SQKeywordsEnum {
     TK_BASE,
     TK_DELETE,
     TK_EQ,
+    TK_EQ_IDENTITY,
     TK_NE,
+    TK_NE_IDENTITY,
     TK_LE,
     TK_GE,
     TK_SWITCH,

+ 10 - 2
SquiLu/squirrel/sqlexer.cpp

@@ -214,7 +214,11 @@ SQInteger SQLexer::Lex()
 		case _SC('='):
 			NEXT();
 			if (CUR_CHAR != _SC('=')){ RETURN_TOKEN('=') }
-			else { NEXT(); RETURN_TOKEN(TK_EQ); }
+			else {
+                NEXT();
+                if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_EQ_IDENTITY) }
+                else { RETURN_TOKEN(TK_EQ); }
+            }
 		case _SC('<'):
 			NEXT();
 			switch(CUR_CHAR) {
@@ -246,7 +250,11 @@ SQInteger SQLexer::Lex()
 		case _SC('!'):
 			NEXT();
 			if (CUR_CHAR != _SC('=')){ RETURN_TOKEN('!')}
-			else { NEXT(); RETURN_TOKEN(TK_NE); }
+			else {
+                NEXT();
+                if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_NE_IDENTITY)}
+                else { RETURN_TOKEN(TK_NE); }
+            }
 		case _SC('@'): {
 			SQInteger stype;
 			NEXT();

+ 3 - 1
SquiLu/squirrel/sqopcodes.h

@@ -98,7 +98,9 @@ enum AppendArrayType {
 	ENUM_OP(_OP_NEWSLOTA, 0x3A)\
 	ENUM_OP(_OP_GETBASE, 0x3B)\
 	ENUM_OP(_OP_CLOSE, 0x3C)\
-	ENUM_OP(_OP__LAST__, 0x3D)
+	ENUM_OP(_OP_EQI, 0x3D)\
+	ENUM_OP(_OP_NEI, 0x3E)\
+	ENUM_OP(_OP__LAST__, 0x3F)
 
 //#define ENUM_OP(a,b) a = b,
 //there is no point right now to manually number the opcodes

+ 15 - 0
SquiLu/squirrel/sqvm.cpp

@@ -685,6 +685,15 @@ bool SQVM::IsEqual(const SQObjectPtr &o1,const SQObjectPtr &o2)
 	return res;
 }
 
+bool SQVM::IsEqualIdentity(const SQObjectPtr &o1,const SQObjectPtr &o2)
+{
+	bool res = false;
+	if(type(o1) == type(o2)) {
+		res = (_rawval(o1) == _rawval(o2));
+	}
+	return res;
+}
+
 bool SQVM::IsFalse(SQObjectPtr &o)
 {
 	if(((type(o) & SQOBJECT_CANBEFALSE)
@@ -918,9 +927,15 @@ exception_restore:
 			case _OP_EQ:
 				TARGET = IsEqual(STK(arg2),COND_LITERAL)?true:false;
 				continue;
+			case _OP_EQI:
+				TARGET = IsEqualIdentity(STK(arg2),COND_LITERAL)?true:false;
+				continue;
 			case _OP_NE:
 				TARGET = (!IsEqual(STK(arg2),COND_LITERAL))?true:false;
 				continue;
+			case _OP_NEI:
+				TARGET = (!IsEqualIdentity(STK(arg2),COND_LITERAL))?true:false;
+				continue;
 			case _OP_ADD: _ARITH_(+,TARGET,STK(arg2),STK(arg1)); continue;
 			case _OP_SUB: _ARITH_(-,TARGET,STK(arg2),STK(arg1)); continue;
 			case _OP_MUL: _ARITH_(*,TARGET,STK(arg2),STK(arg1)); continue;

+ 1 - 0
SquiLu/squirrel/sqvm.h

@@ -86,6 +86,7 @@ public:
 	bool ObjCmp(const SQObjectPtr &o1, const SQObjectPtr &o2,SQInteger &res);
 	bool StringCat(const SQObjectPtr &str, const SQObjectPtr &obj, SQObjectPtr &dest);
 	static bool IsEqual(const SQObjectPtr &o1,const SQObjectPtr &o2);
+	static bool IsEqualIdentity(const SQObjectPtr &o1,const SQObjectPtr &o2);
 	bool ToString(const SQObjectPtr &o,SQObjectPtr &res);
 	SQString *PrintObjVal(const SQObjectPtr &o);