Fix literal string concatenation in parser

This commit is contained in:
drmortalwombat 2024-07-07 21:18:17 +02:00
parent fcc2cbbebe
commit dd1f5b9043
4 changed files with 35 additions and 10 deletions

View File

@ -46899,6 +46899,28 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterateN(int i, int pass)
return true;
}
}
else
{
mProc->ResetPatched();
if (CheckForwardSumYPointer(this, mIns[i + 3].mAddress, mIns[i + 1].mAddress, mIns[i + 3], i + 7, yval, 3))
{
mProc->ResetPatched();
if (PatchForwardSumYPointer(this, mIns[i + 3].mAddress, mIns[i + 1].mAddress, mIns[i + 3], i + 7, yval))
{
mIns[i + 1].CopyMode(mIns[i + 2]);
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
mIns[i + 4].mType = ASMIT_NOP; mIns[i + 4].mMode = ASMIM_IMPLIED;
mIns[i + 5].mType = ASMIT_NOP; mIns[i + 5].mMode = ASMIM_IMPLIED;
mIns[i + 6].mType = ASMIT_NOP; mIns[i + 6].mMode = ASMIM_IMPLIED;
if (mTrueJump)
mTrueJump->CheckLive();
if (mFalseJump)
mFalseJump->CheckLive();
return true;
}
}
}
}
#endif
#if 1
@ -50368,7 +50390,6 @@ void NativeCodeProcedure::Optimize(void)
#endif
if (step == 2)
{
ResetVisited();

View File

@ -1536,7 +1536,7 @@ Declaration * Parser::CopyConstantInitializer(int offset, Declaration* dtype, Ex
uint8* Parser::ParseStringLiteral(int msize)
{
int size = ustrlen(mScanner->mTokenString);
int size = mScanner->mTokenStringSize;
if (size + 1 > msize)
msize = size + 1;
uint8* d = new uint8[msize];
@ -1559,7 +1559,7 @@ uint8* Parser::ParseStringLiteral(int msize)
// automatic string concatenation
while (mScanner->mToken == TK_STRING)
{
int s = ustrlen(mScanner->mTokenString);
int s = mScanner->mTokenStringSize;
if (size + s + 1 > msize)
msize = size + s + 1;
@ -5462,7 +5462,7 @@ Expression* Parser::ParseSimpleExpression(bool lhs, bool tid)
case TK_STRING:
{
dec = new Declaration(mScanner->mLocation, DT_CONST_DATA);
int size = ustrlen(mScanner->mTokenString);
int size = mScanner->mTokenStringSize;
dec->mSize = size + 1;
dec->mVarIndex = -1;
dec->mSection = mCodeSection;
@ -5490,7 +5490,7 @@ Expression* Parser::ParseSimpleExpression(bool lhs, bool tid)
// automatic string concatenation
while (mScanner->mToken == TK_STRING)
{
int s = ustrlen(mScanner->mTokenString);
int s = mScanner->mTokenStringSize;
uint8* d = new uint8[size + s + 1];
memcpy(d, dec->mData, size);
int i = 0;

View File

@ -322,9 +322,9 @@ TokenSequence::TokenSequence(Scanner* scanner)
{
if (mToken == TK_STRING)
{
int ssize = ustrlen(scanner->mTokenString);
uint8 * str = new uint8[ssize + 1];
ustrcpy(str, scanner->mTokenString);
uint8 * str = new uint8[scanner->mTokenStringSize + 1];
memcpy(str, scanner->mTokenString, scanner->mTokenStringSize + 1);
mTokenInteger = scanner->mTokenStringSize;
mTokenString = str;
}
}
@ -487,7 +487,10 @@ void Scanner::NextToken(void)
mTokenNumber = mReplay->mTokenNumber;
mTokenInteger = mReplay->mTokenInteger;
if (mReplay->mTokenString)
ustrcpy(mTokenString, mReplay->mTokenString);
{
mTokenStringSize = (int)mReplay->mTokenInteger;
memcpy(mTokenString, mReplay->mTokenString, mTokenStringSize + 1);
}
mReplay = mReplay->mNext;
}
@ -2064,7 +2067,7 @@ void Scanner::StringToken(char terminator, char mode)
mTokenString[n++] = mTokenChar;
}
mTokenStringSize = n;
mTokenString[n] = 0;
if (mLine[mOffset] && mLine[mOffset] == terminator)

View File

@ -259,6 +259,7 @@ public:
const Ident * mTokenIdent;
uint8 mTokenString[1024], mTokenChar;
int mTokenStringSize;
uint8 * mTokenEmbed;
int mTokenEmbedSize;