From 6de2b455c45782429abdea90407beb416e81d121 Mon Sep 17 00:00:00 2001 From: Lukas Aldershaab Date: Sun, 17 Sep 2023 00:22:44 +0200 Subject: [PATCH] Fix evaluatef argument handling and add regression test --- Engine/source/console/script.h | 7 ++-- .../source/console/torquescript/runtime.cpp | 2 +- Engine/source/testing/inspectorFieldTest.cpp | 34 +++++++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 Engine/source/testing/inspectorFieldTest.cpp diff --git a/Engine/source/console/script.h b/Engine/source/console/script.h index ded8acca6..89f290e09 100644 --- a/Engine/source/console/script.h +++ b/Engine/source/console/script.h @@ -50,10 +50,13 @@ namespace Con /// NOTE: This function restores the console stack on return. inline EvalResult evaluatef(const char* string, ...) { + char buffer[4096]; va_list args; - va_start(args, string); - EvalResult result = setLastEvalResult(getRuntime()->evaluatef(string, args)); + va_start(args, &string); + dVsprintf(buffer, sizeof(buffer), string, args); va_end(args); + + EvalResult result = setLastEvalResult(getRuntime()->evaluate(buffer)); return result; }; diff --git a/Engine/source/console/torquescript/runtime.cpp b/Engine/source/console/torquescript/runtime.cpp index f0064f152..1e13b4989 100644 --- a/Engine/source/console/torquescript/runtime.cpp +++ b/Engine/source/console/torquescript/runtime.cpp @@ -97,7 +97,7 @@ namespace TorqueScript { char buffer[4096]; va_list args; - va_start(args, string); + va_start(args, &string); dVsprintf(buffer, sizeof(buffer), string, args); va_end(args); return evaluate(buffer); diff --git a/Engine/source/testing/inspectorFieldTest.cpp b/Engine/source/testing/inspectorFieldTest.cpp new file mode 100644 index 000000000..cadcfb119 --- /dev/null +++ b/Engine/source/testing/inspectorFieldTest.cpp @@ -0,0 +1,34 @@ +#include +#include + +#include "console/script.h" +#include "T3D/fx/particle.h" +#include "T3D/gameBase/gameBase.h" + +TEST(InspectoreFieldTest, Datablocks_Can_Be_Overridden) +{ + GuiInspector* inspector = new GuiInspector(); + inspector->registerObject(); + + ParticleData* exampleObj = new ParticleData(); + exampleObj->registerObject(); + // Add it to inspector so inspector field can find it + inspector->addInspectObject(exampleObj); + + AbstractClassRep::Field* field = const_cast(exampleObj->findField(StringTable->insert("lifetimeMS"))); + + GuiInspectorGroup* group = new GuiInspectorGroup("testing", NULL); + ASSERT_TRUE(group->registerObject()); + + GuiInspectorField* inspectorField = new GuiInspectorField(inspector, group, field); + ASSERT_TRUE(inspectorField->registerObject()); + + inspectorField->setData("12345"); + EXPECT_EQ(exampleObj->lifetimeMS, 12345); + + // Cleanup + inspectorField->deleteObject(); + group->deleteObject(); + inspector->deleteObject(); + exampleObj->deleteObject(); +}