optimizations

This commit is contained in:
Jeff Hutchinson 2021-04-30 01:20:01 -04:00
parent dcd01e1231
commit 55b0ecb487
3 changed files with 38 additions and 33 deletions

View file

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

View file

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

View file

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