Browse Source

various fixes and memory corruption bug.

Jeff Hutchinson 4 năm trước cách đây
mục cha
commit
35b33f1864

+ 2 - 2
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);
-}
+}

+ 4 - 3
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);

+ 2 - 1
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());
 }

+ 27 - 2
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