From 35b33f186429ad9f39358531e0361a9ead44e7e2 Mon Sep 17 00:00:00 2001 From: Jeff Hutchinson Date: Thu, 9 Sep 2021 19:30:32 -0400 Subject: [PATCH] various fixes and memory corruption bug. --- Engine/source/cinterface/cinterface.cpp | 4 ++-- Engine/source/console/console.cpp | 7 +++--- Engine/source/console/simObject.cpp | 3 ++- Engine/source/console/test/ScriptTest.cpp | 29 +++++++++++++++++++++-- 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/Engine/source/cinterface/cinterface.cpp b/Engine/source/cinterface/cinterface.cpp index e62db2c91..3cd717c13 100644 --- a/Engine/source/cinterface/cinterface.cpp +++ b/Engine/source/cinterface/cinterface.cpp @@ -55,7 +55,7 @@ bool CInterface::_isMethod(const char* className, const char* methodName) const if (mIsMethodCallback) return mIsMethodCallback(className, methodName); - return NULL; + return false; } const char* CInterface::_CallFunction(const char* nameSpace, const char* name, const char **argv, int argc, bool *result) const @@ -93,4 +93,4 @@ TORQUE_API void SetCallbacks(void* ptr, void* methodPtr, void* isMethodPtr, void CInterface::GetCInterface().SetCallMethodCallback(methodPtr); CInterface::GetCInterface().SetCallIsMethodCallback(isMethodPtr); CInterface::GetCInterface().SetMainCallback(mainPtr); -} \ No newline at end of file +} diff --git a/Engine/source/console/console.cpp b/Engine/source/console/console.cpp index 399298864..ab93d554e 100644 --- a/Engine/source/console/console.cpp +++ b/Engine/source/console/console.cpp @@ -1643,13 +1643,13 @@ static ConsoleValue _internalExecute(SimObject *object, S32 argc, ConsoleValue a { ConsoleValue val; val.setString(methodRes); - return std::move(val); + return val; } if(object->getNamespace()) { U32 ident = object->getId(); - const char* oldIdent = argv[1].getString(); + const char* oldIdent = dStrdup(argv[1].getString()); Namespace::Entry *ent = object->getNamespace()->lookup(funcName); @@ -1671,8 +1671,9 @@ static ConsoleValue _internalExecute(SimObject *object, S32 argc, ConsoleValue a // Twiddle it back argv[1].setString(oldIdent); + dFree(oldIdent); - return std::move(ret); + return ret; } warnf(ConsoleLogEntry::Script, "Con::execute - %d has no namespace: %s", object->getId(), funcName); diff --git a/Engine/source/console/simObject.cpp b/Engine/source/console/simObject.cpp index e9cae8130..6b54bdd1d 100644 --- a/Engine/source/console/simObject.cpp +++ b/Engine/source/console/simObject.cpp @@ -2971,7 +2971,8 @@ DefineEngineStringlyVariadicMethod( SimObject, call, const char*, 3, 0, "( strin "@param args Zero or more arguments for the method.\n" "@return The result of the method call." ) { - argv[1].setString(argv[2]); + argv[1].setString(argv[2].getString()); + ConsoleValue returnValue = Con::execute(object, argc - 1, argv + 1); return Con::getReturnBuffer(returnValue.getString()); } diff --git a/Engine/source/console/test/ScriptTest.cpp b/Engine/source/console/test/ScriptTest.cpp index 24905aba3..05775694f 100644 --- a/Engine/source/console/test/ScriptTest.cpp +++ b/Engine/source/console/test/ScriptTest.cpp @@ -969,8 +969,6 @@ TEST(Script, MiscRegressions) ASSERT_EQ(regression4.getFloat(), 0.5); - Con::setBoolVariable("$Debug::DumpByteCode", true); - ConsoleValue regression5 = RunScript(R"( function noOpInc() { @@ -982,6 +980,33 @@ TEST(Script, MiscRegressions) )"); ASSERT_EQ(regression5.getInt(), 2); + + ConsoleValue regression6 = RunScript(R"( + function SimObject::crashMe(%this, %line) + { + return %line @ "1"; + } + + function doTest() + { + %obj = new SimObject(); + for (%i = 0; %i < 99999; %i++) + { + %function = "crashMe"; + if (%obj.isMethod(%function)) + { + %line = "abcdefg"; + %output = %obj.call(%function, %line); + } + } + + return true; + } + + return doTest(); + )"); + + ASSERT_EQ(regression6.getBool(), true); } #endif