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;
|
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
|
#endif
|
||||||
#if 1
|
#if 1
|
||||||
|
@ -50368,7 +50390,6 @@ void NativeCodeProcedure::Optimize(void)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
if (step == 2)
|
if (step == 2)
|
||||||
{
|
{
|
||||||
ResetVisited();
|
ResetVisited();
|
||||||
|
|
|
@ -1536,7 +1536,7 @@ Declaration * Parser::CopyConstantInitializer(int offset, Declaration* dtype, Ex
|
||||||
|
|
||||||
uint8* Parser::ParseStringLiteral(int msize)
|
uint8* Parser::ParseStringLiteral(int msize)
|
||||||
{
|
{
|
||||||
int size = ustrlen(mScanner->mTokenString);
|
int size = mScanner->mTokenStringSize;
|
||||||
if (size + 1 > msize)
|
if (size + 1 > msize)
|
||||||
msize = size + 1;
|
msize = size + 1;
|
||||||
uint8* d = new uint8[msize];
|
uint8* d = new uint8[msize];
|
||||||
|
@ -1559,7 +1559,7 @@ uint8* Parser::ParseStringLiteral(int msize)
|
||||||
// automatic string concatenation
|
// automatic string concatenation
|
||||||
while (mScanner->mToken == TK_STRING)
|
while (mScanner->mToken == TK_STRING)
|
||||||
{
|
{
|
||||||
int s = ustrlen(mScanner->mTokenString);
|
int s = mScanner->mTokenStringSize;
|
||||||
|
|
||||||
if (size + s + 1 > msize)
|
if (size + s + 1 > msize)
|
||||||
msize = size + s + 1;
|
msize = size + s + 1;
|
||||||
|
@ -5462,7 +5462,7 @@ Expression* Parser::ParseSimpleExpression(bool lhs, bool tid)
|
||||||
case TK_STRING:
|
case TK_STRING:
|
||||||
{
|
{
|
||||||
dec = new Declaration(mScanner->mLocation, DT_CONST_DATA);
|
dec = new Declaration(mScanner->mLocation, DT_CONST_DATA);
|
||||||
int size = ustrlen(mScanner->mTokenString);
|
int size = mScanner->mTokenStringSize;
|
||||||
dec->mSize = size + 1;
|
dec->mSize = size + 1;
|
||||||
dec->mVarIndex = -1;
|
dec->mVarIndex = -1;
|
||||||
dec->mSection = mCodeSection;
|
dec->mSection = mCodeSection;
|
||||||
|
@ -5490,7 +5490,7 @@ Expression* Parser::ParseSimpleExpression(bool lhs, bool tid)
|
||||||
// automatic string concatenation
|
// automatic string concatenation
|
||||||
while (mScanner->mToken == TK_STRING)
|
while (mScanner->mToken == TK_STRING)
|
||||||
{
|
{
|
||||||
int s = ustrlen(mScanner->mTokenString);
|
int s = mScanner->mTokenStringSize;
|
||||||
uint8* d = new uint8[size + s + 1];
|
uint8* d = new uint8[size + s + 1];
|
||||||
memcpy(d, dec->mData, size);
|
memcpy(d, dec->mData, size);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
|
@ -322,9 +322,9 @@ TokenSequence::TokenSequence(Scanner* scanner)
|
||||||
{
|
{
|
||||||
if (mToken == TK_STRING)
|
if (mToken == TK_STRING)
|
||||||
{
|
{
|
||||||
int ssize = ustrlen(scanner->mTokenString);
|
uint8 * str = new uint8[scanner->mTokenStringSize + 1];
|
||||||
uint8 * str = new uint8[ssize + 1];
|
memcpy(str, scanner->mTokenString, scanner->mTokenStringSize + 1);
|
||||||
ustrcpy(str, scanner->mTokenString);
|
mTokenInteger = scanner->mTokenStringSize;
|
||||||
mTokenString = str;
|
mTokenString = str;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -487,7 +487,10 @@ void Scanner::NextToken(void)
|
||||||
mTokenNumber = mReplay->mTokenNumber;
|
mTokenNumber = mReplay->mTokenNumber;
|
||||||
mTokenInteger = mReplay->mTokenInteger;
|
mTokenInteger = mReplay->mTokenInteger;
|
||||||
if (mReplay->mTokenString)
|
if (mReplay->mTokenString)
|
||||||
ustrcpy(mTokenString, mReplay->mTokenString);
|
{
|
||||||
|
mTokenStringSize = (int)mReplay->mTokenInteger;
|
||||||
|
memcpy(mTokenString, mReplay->mTokenString, mTokenStringSize + 1);
|
||||||
|
}
|
||||||
|
|
||||||
mReplay = mReplay->mNext;
|
mReplay = mReplay->mNext;
|
||||||
}
|
}
|
||||||
|
@ -2064,7 +2067,7 @@ void Scanner::StringToken(char terminator, char mode)
|
||||||
|
|
||||||
mTokenString[n++] = mTokenChar;
|
mTokenString[n++] = mTokenChar;
|
||||||
}
|
}
|
||||||
|
mTokenStringSize = n;
|
||||||
mTokenString[n] = 0;
|
mTokenString[n] = 0;
|
||||||
|
|
||||||
if (mLine[mOffset] && mLine[mOffset] == terminator)
|
if (mLine[mOffset] && mLine[mOffset] == terminator)
|
||||||
|
|
|
@ -259,6 +259,7 @@ public:
|
||||||
|
|
||||||
const Ident * mTokenIdent;
|
const Ident * mTokenIdent;
|
||||||
uint8 mTokenString[1024], mTokenChar;
|
uint8 mTokenString[1024], mTokenChar;
|
||||||
|
int mTokenStringSize;
|
||||||
|
|
||||||
uint8 * mTokenEmbed;
|
uint8 * mTokenEmbed;
|
||||||
int mTokenEmbedSize;
|
int mTokenEmbedSize;
|
||||||
|
|
Loading…
Reference in New Issue