Fix literal string concatenation in parser
This commit is contained in:
parent
fcc2cbbebe
commit
dd1f5b9043
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -259,6 +259,7 @@ public:
|
|||
|
||||
const Ident * mTokenIdent;
|
||||
uint8 mTokenString[1024], mTokenChar;
|
||||
int mTokenStringSize;
|
||||
|
||||
uint8 * mTokenEmbed;
|
||||
int mTokenEmbedSize;
|
||||
|
|
Loading…
Reference in New Issue