various fixes and memory corruption bug.

This commit is contained in:
Jeff Hutchinson 2021-09-09 19:30:32 -04:00
parent 27a4868b6e
commit 35b33f1864
4 changed files with 35 additions and 8 deletions

View file

@ -55,7 +55,7 @@ bool CInterface::_isMethod(const char* className, const char* methodName) const
if (mIsMethodCallback) if (mIsMethodCallback)
return mIsMethodCallback(className, methodName); 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 const char* CInterface::_CallFunction(const char* nameSpace, const char* name, const char **argv, int argc, bool *result) const

View file

@ -1643,13 +1643,13 @@ static ConsoleValue _internalExecute(SimObject *object, S32 argc, ConsoleValue a
{ {
ConsoleValue val; ConsoleValue val;
val.setString(methodRes); val.setString(methodRes);
return std::move(val); return val;
} }
if(object->getNamespace()) if(object->getNamespace())
{ {
U32 ident = object->getId(); U32 ident = object->getId();
const char* oldIdent = argv[1].getString(); const char* oldIdent = dStrdup(argv[1].getString());
Namespace::Entry *ent = object->getNamespace()->lookup(funcName); Namespace::Entry *ent = object->getNamespace()->lookup(funcName);
@ -1671,8 +1671,9 @@ static ConsoleValue _internalExecute(SimObject *object, S32 argc, ConsoleValue a
// Twiddle it back // Twiddle it back
argv[1].setString(oldIdent); 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); warnf(ConsoleLogEntry::Script, "Con::execute - %d has no namespace: %s", object->getId(), funcName);

View file

@ -2971,7 +2971,8 @@ DefineEngineStringlyVariadicMethod( SimObject, call, const char*, 3, 0, "( strin
"@param args Zero or more arguments for the method.\n" "@param args Zero or more arguments for the method.\n"
"@return The result of the method call." ) "@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); ConsoleValue returnValue = Con::execute(object, argc - 1, argv + 1);
return Con::getReturnBuffer(returnValue.getString()); return Con::getReturnBuffer(returnValue.getString());
} }

View file

@ -969,8 +969,6 @@ TEST(Script, MiscRegressions)
ASSERT_EQ(regression4.getFloat(), 0.5); ASSERT_EQ(regression4.getFloat(), 0.5);
Con::setBoolVariable("$Debug::DumpByteCode", true);
ConsoleValue regression5 = RunScript(R"( ConsoleValue regression5 = RunScript(R"(
function noOpInc() function noOpInc()
{ {
@ -982,6 +980,33 @@ TEST(Script, MiscRegressions)
)"); )");
ASSERT_EQ(regression5.getInt(), 2); 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 #endif