From c6047b24ebca733a22b4a35d167ffdb9832ccac8 Mon Sep 17 00:00:00 2001 From: Lukas Aldershaab Date: Sun, 24 Sep 2023 20:55:16 +0200 Subject: [PATCH] Fix foreach over non-existant objects --- .../console/torquescript/compiledEval.cpp | 2 + Engine/source/testing/ScriptTest.cpp | 39 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index bb57b7370..257f85d0b 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -2121,6 +2121,8 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi Con::errorf(ConsoleLogEntry::General, "No SimSet object '%s'", stack[_STK].getString()); Con::errorf(ConsoleLogEntry::General, "Did you mean to use 'foreach$' instead of 'foreach'?"); ip = failIp; + // Pop the iterated value + _STK--; continue; } diff --git a/Engine/source/testing/ScriptTest.cpp b/Engine/source/testing/ScriptTest.cpp index 4de2b77d2..c59af9a5e 100644 --- a/Engine/source/testing/ScriptTest.cpp +++ b/Engine/source/testing/ScriptTest.cpp @@ -540,6 +540,45 @@ TEST_F(ScriptTest, ForEachLoop) )"); ASSERT_EQ(forEachNestedReturn.getInt(), 42); + + + ConsoleValue forEachNonExistantObject = RunScript(R"( + $counter = 0; + foreach ($obj in NonExistantSimSet) + { + $counter++; + } + + return $counter; + )"); + + ASSERT_EQ(forEachNonExistantObject.getInt(), 0); + + + ConsoleValue forEachOnZero = RunScript(R"( + $counter = 0; + foreach ($obj in 0) + { + $counter++; + } + + return $counter; + )"); + + ASSERT_EQ(forEachOnZero.getInt(), 0); + + + ConsoleValue forEachOnEmptyString = RunScript(R"( + $counter = 0; + foreach ($obj in "") + { + $counter++; + } + + return $counter; + )"); + + ASSERT_EQ(forEachOnEmptyString.getInt(), 0); } TEST_F(ScriptTest, TorqueScript_Array_Testing)