Browse Source

Fix temporary buffer for scripting conversions.

Jeff Hutchinson 4 years ago
parent
commit
c16b88d709

+ 1 - 0
Engine/source/app/mainLoop.cpp

@@ -633,6 +633,7 @@ bool StandardMainLoop::doMainLoop()
 
       ThreadPool::processMainThreadWorkItems();
       Sampler::endFrame();
+      ConsoleValue::resetConversionBuffer();
       PROFILE_END_NAMED(MainLoop);
    }
    

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

@@ -46,21 +46,29 @@
 extern StringStack STR;
 extern ConsoleValueStack<4096> gCallStack;
 
-char ConsoleValue::sConversionBuffer[ConversionBufferSize];
+Vector<ConsoleValue::ConversionBuffer> ConsoleValue::sConversionBuffer;
 
 void ConsoleValue::init()
 {
-   dMemset(sConversionBuffer, '\0', ConversionBufferSize);
+   sConversionBuffer.reserve(8192);
+}
+
+void ConsoleValue::resetConversionBuffer()
+{
+   sConversionBuffer.resetAndTreatAsScratchBuffer();
 }
 
 char* ConsoleValue::convertToBuffer() const
 {
+   ConversionBuffer conversion;
+   
    if (type == ConsoleValueType::cvFloat)
-      dSprintf(sConversionBuffer, ConversionBufferSize, "%.9g", f);
+      dSprintf(conversion.buffer, ConversionBufferStride, "%.9g", f);
    else
-      dSprintf(sConversionBuffer, ConversionBufferSize, "%lld", i);
+      dSprintf(conversion.buffer, ConversionBufferStride, "%lld", i);
 
-   return sConversionBuffer;
+   sConversionBuffer.push_back(std::move(conversion));
+   return sConversionBuffer.last().buffer;
 }
 
 const char* ConsoleValue::getConsoleData() const

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

@@ -148,10 +148,15 @@ class ConsoleValue
 
    enum Constants
    {
-      ConversionBufferSize = 32
+      ConversionBufferStride = 32
    };
 
-   static char sConversionBuffer[ConversionBufferSize];
+   struct ConversionBuffer
+   {
+      char buffer[ConversionBufferStride];
+   };
+   
+   static Vector<ConversionBuffer> sConversionBuffer;
 
    char* convertToBuffer() const;
 
@@ -387,6 +392,7 @@ public:
    }
 
    static void init();
+   static void resetConversionBuffer();
 };
 
 // Transparently converts ConsoleValue[] to const char**

+ 10 - 0
Engine/source/core/util/tVector.h

@@ -160,6 +160,7 @@ class Vector
    void erase(U32 index, U32 count);
    void erase_fast(iterator);
    void clear();
+   void resetAndTreatAsScratchBuffer();
    void compact();
    void sort(compare_func f);
    void fill( const T& value );
@@ -529,6 +530,15 @@ template<class T> inline void Vector<T>::clear()
    mElementCount = 0;
 }
 
+/// This method sets the vector as its 0 and will overwrite memory on subsequent usage.
+/// Note that the current memory in use is never freed or deallocated, so only use this if the vector
+/// is being used as a scratch buffer only.
+template<class T> inline
+void Vector<T>::resetAndTreatAsScratchBuffer()
+{
+   mElementCount = 0;
+}
+
 template<class T> inline void Vector<T>::compact()
 {
    resize(mElementCount);