Jeff Hutchinson 4 lat temu
rodzic
commit
55b0ecb487

+ 27 - 16
Engine/source/console/compiledEval.cpp

@@ -57,6 +57,7 @@ enum EvalConstants
    MaxStackSize = 1024,
    FieldBufferSizeString = 2048,
    FieldBufferSizeNumeric = 128,
+   ConcatBufferInitialSize = 8192,
    MethodOnComponent = -2
 };
 
@@ -118,6 +119,23 @@ S32 _STK = 0;
 char curFieldArray[256];
 char prevFieldArray[256];
 
+const char* tsconcat(const char* strA, const char* strB, S32& outputLen)
+{
+   S32 lenA = dStrlen(strA);
+   S32 lenB = dStrlen(strB);
+
+   S32 len = lenA + lenB + 1;
+
+   char* concatBuffer = (char*)dMalloc(len);
+
+   concatBuffer[len - 1] = '\0';
+   memcpy(concatBuffer, strA, lenA);
+   memcpy(concatBuffer + lenA, strB, lenB);
+
+   outputLen = lenA + lenB;
+   return concatBuffer;
+}
+
 namespace Con
 {
    // Current script file name and root, these are registered as
@@ -1727,7 +1745,6 @@ ConsoleValue CodeBlock::exec(U32 ip, const char* functionName, Namespace* thisNa
          {
             if (nsEntry->mFunctionOffset)
             {
-               // TODO: not make this strings only for returns.
                ConsoleValue returnFromFn = nsEntry->mCode->exec(nsEntry->mFunctionOffset, fnName, nsEntry->mNamespace, callArgc, callArgv, false, nsEntry->mPackage);
                stack[_STK + 1] = std::move(returnFromFn);
             }
@@ -1834,34 +1851,28 @@ ConsoleValue CodeBlock::exec(U32 ip, const char* functionName, Namespace* thisNa
 
       case OP_ADVANCE_STR_APPENDCHAR:
       {
-         // TODO: Create a better way to handle string concatination without
-         // heap allocating every time.
-
-         val = stack[_STK].getString();
-         dsize_t len = dStrlen(val) + 2;
-
          char buff[2];
          buff[0] = (char)code[ip++];
          buff[1] = '\0';
 
-         char* concat = new char[len];
-         dMemset(concat, 0, len);
-         dStrcat(concat, val, len);
-         dStrcat(concat, buff, len);
-
-         stack[_STK].setString(concat);
-
-         delete[] concat;
+         S32 len;
+         const char* concat = tsconcat(stack[_STK].getString(), buff, len);
 
+         stack[_STK].setStringRef(concat, len);
          break;
       }
 
       case OP_REWIND_STR:
          TORQUE_CASE_FALLTHROUGH;
       case OP_TERMINATE_REWIND_STR:
-         stack[_STK - 1].setString((String(stack[_STK - 1] + String(stack[_STK]))));
+      {
+         S32 len;
+         const char* concat = tsconcat(stack[_STK - 1].getString(), stack[_STK].getString(), len);
+
+         stack[_STK - 1].setStringRef(concat, len);
          _STK--;
          break;
+      }
 
       case OP_COMPARE_STR:
          stack[_STK - 1].setBool(!dStricmp(stack[_STK].getString(), stack[_STK - 1].getString()));

+ 3 - 13
Engine/source/console/console.cpp

@@ -46,31 +46,21 @@
 extern StringStack STR;
 extern ConsoleValueStack<4096> gCallStack;
 
-S32 ConsoleValue::sBufferOffset = 0;
 char ConsoleValue::sConversionBuffer[ConversionBufferSize];
 
 void ConsoleValue::init()
 {
-   sBufferOffset = 0;
    dMemset(sConversionBuffer, '\0', ConversionBufferSize);
 }
 
 char* ConsoleValue::convertToBuffer() const
 {
-   sBufferOffset += StringSize;
-   if (sBufferOffset > ConversionBufferSize)
-   {
-      dMemset(sConversionBuffer, '\0', ConversionBufferSize);
-      sBufferOffset = 0;
-   }
-
-   char* offset = sConversionBuffer + sBufferOffset;
    if (type == ConsoleValueType::cvFloat)
-      dSprintf(offset, StringSize, "%.9g", f);
+      dSprintf(sConversionBuffer, ConversionBufferSize, "%.9g", f);
    else
-      dSprintf(offset, StringSize, "%lld", i);
+      dSprintf(sConversionBuffer, ConversionBufferSize, "%lld", i);
 
-   return offset;
+   return sConversionBuffer;
 }
 
 const char* ConsoleValue::getConsoleData() const

+ 8 - 4
Engine/source/console/console.h

@@ -149,12 +149,10 @@ class ConsoleValue
 
    enum Constants
    {
-      ConversionBufferSize = 1024,
-      StringSize = 16
+      ConversionBufferSize = 32
    };
 
    static char sConversionBuffer[ConversionBufferSize];
-   static S32 sBufferOffset;
 
    char* convertToBuffer() const;
 
@@ -314,6 +312,13 @@ public:
       dStrcpy(s, val, static_cast<dsize_t>(len) + 1);
    }
 
+   TORQUE_FORCEINLINE void setStringRef(const char* ref, S32 len)
+   {
+      cleanupData();
+      type = ConsoleValueType::cvString;
+      s = const_cast<char*>(ref);
+   }
+
    TORQUE_FORCEINLINE void setBool(const bool val)
    {
       cleanupData();
@@ -361,7 +366,6 @@ public:
    }
 
    static void init();
-   static S32 getConstantBufferCount() { return (S32)ConversionBufferSize / StringSize; }
 };
 
 // Transparently converts ConsoleValue[] to const char**