ソースを参照

Fix weird ternary operator in torquescript regression

With a test!
Jeff Hutchinson 3 年 前
コミット
59125c85eb

+ 6 - 1
Engine/source/console/astNodes.cpp

@@ -399,7 +399,12 @@ U32 ConditionalExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type)
 
 TypeReq ConditionalExprNode::getPreferredType()
 {
-   return trueExpr->getPreferredType();
+   // We can't make it calculate a type based on subsequent expressions as the expression
+   // could be a string, or just numbers. To play it safe, stringify anything that deals with
+   // a conditional, and let the interpreter cast as needed to other types safely.
+   //
+   // See: Regression Test 7 in ScriptTest. It has a string result in the else portion of the ?: ternary.
+   return TypeReqString;
 }
 
 //------------------------------------------------------------

+ 16 - 0
Engine/source/console/test/ScriptTest.cpp

@@ -1079,6 +1079,22 @@ TEST(Script, MiscRegressions)
    )");
 
    ASSERT_EQ(regression6.getBool(), true);
+
+   ConsoleValue regression7 = RunScript(R"(
+      function Tween::vectorAdd(%v1, %v2)
+      {
+         %temp = "";
+         for (%i = 0; %i < getWordCount(%v1); %i++) {
+            %e = getWord(%v1, %i) + getWord(%v2, %i);
+            %temp = %i == 0 ? %e : %temp SPC %e;
+         }
+
+         return %temp;
+      }
+      return Tween::vectorAdd("1 2 3", "4 5 6");
+   )");
+
+   ASSERT_STREQ(regression7.getString(), "5 7 9");
 }
 
 #endif