2
0
Эх сурвалжийг харах

if statements

Changed:
if check on vals now return true if the value has a string value
%val = "test me" if(%val) will now return true since %val is not null

Script side:
string checks for "true" and "false" will now be parsed as integer values of 1 and 0.

TEST VIGOUROUSLY
marauder2k7 1 жил өмнө
parent
commit
e56f4cb6a6

+ 1 - 1
Engine/source/console/console.h

@@ -245,7 +245,7 @@ public:
       if (type == ConsoleValueType::cvSTEntry)
          return s == StringTable->EmptyString() ? 0 : dAtoi(s);
       if (type == ConsoleValueType::cvString)
-         return dStrcmp(s, "") == 0 ? 0 : dAtoi(s);
+         return dStrcmp(s, "") == 0 ? 0 : dIsdigit(*s) ? dAtoi(s) : s == StringTable->EmptyString() ? 0 : 1;
       return dAtoi(getConsoleData());
    }
 

+ 12 - 0
Engine/source/console/torquescript/CMDscan.cpp

@@ -2827,6 +2827,18 @@ static int Sc_ScanString(int ret)
    if(!collapseEscape(CMDtext+1))
       return -1;
 
+   const char* scannedStr = CMDtext + 1;
+
+   if (dStrcmp(scannedStr, "true") == 0) {
+      CMDlval.i = MakeToken<int>(1, yylineno);
+      return INTCONST;
+   }
+
+   if (dStrcmp(scannedStr, "false") == 0) {
+      CMDlval.i = MakeToken<int>(0, yylineno);
+      return INTCONST;
+   }
+
    dsize_t bufferLen = dStrlen( CMDtext );
    char* buffer = ( char* ) consoleAlloc( bufferLen );
    dStrcpy( buffer, CMDtext + 1, bufferLen );

+ 12 - 0
Engine/source/console/torquescript/CMDscan.l

@@ -377,6 +377,18 @@ static int Sc_ScanString(int ret)
    if(!collapseEscape(CMDtext+1))
       return -1;
 
+   const char* scannedStr = CMDtext + 1;
+
+   if (dStrcmp(scannedStr, "true") == 0) {
+      CMDlval.i = MakeToken<int>(1, yylineno);
+      return INTCONST;
+   }
+
+   if (dStrcmp(scannedStr, "false") == 0) {
+      CMDlval.i = MakeToken<int>(0, yylineno);
+      return INTCONST;
+   }
+
    dsize_t bufferLen = dStrlen( CMDtext );
    char* buffer = ( char* ) consoleAlloc( bufferLen );
    dStrcpy( buffer, CMDtext + 1, bufferLen );

+ 13 - 3
Engine/source/console/torquescript/astNodes.cpp

@@ -200,7 +200,9 @@ U32 IfStmtNode::compileStmt(CodeStream& codeStream, U32 ip)
    U32 endifIp, elseIp;
    addBreakLine(codeStream);
 
-   if (testExpr->getPreferredType() == TypeReqUInt)
+   TypeReq testType = testExpr->getPreferredType();
+
+   if (testType == TypeReqUInt)
    {
       integer = true;
    }
@@ -209,8 +211,16 @@ U32 IfStmtNode::compileStmt(CodeStream& codeStream, U32 ip)
       integer = false;
    }
 
-   ip = testExpr->compile(codeStream, ip, integer ? TypeReqUInt : TypeReqFloat);
-   codeStream.emit(integer ? OP_JMPIFNOT : OP_JMPIFFNOT);
+   if (testType == TypeReqString)
+   {
+      ip = testExpr->compile(codeStream, ip, TypeReqString);
+      codeStream.emit(OP_JMPIFNOT);
+   }
+   else
+   {
+      ip = testExpr->compile(codeStream, ip, integer ? TypeReqUInt : TypeReqFloat);
+      codeStream.emit(integer ? OP_JMPIFNOT : OP_JMPIFFNOT);
+   }
 
    if (elseBlock)
    {

+ 1 - 0
Engine/source/console/torquescript/compiledEval.cpp

@@ -1144,6 +1144,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi
             ip++;
             break;
          }
+
          ip = code[ip];
          break;
       case OP_JMPIFF: