Fix temporary buffer for scripting conversions.

This commit is contained in:
Jeff Hutchinson 2021-09-04 21:25:11 -04:00
parent 478a04bea8
commit c16b88d709
4 changed files with 32 additions and 7 deletions

View file

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

View file

@ -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

View file

@ -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**

View file

@ -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);