minor cleanups to StringLiteralParser: no need to pass target info

into its ctor.  Also, make it handle validity checking of pascal
strings instead of making clients do it.

llvm-svn: 62332
This commit is contained in:
Chris Lattner 2009-01-16 18:51:42 +00:00
parent 86afde337d
commit 8a24e588d7
3 changed files with 14 additions and 13 deletions

View File

@ -141,7 +141,6 @@ public:
/// literals) (C99 5.1.1.2p1). /// literals) (C99 5.1.1.2p1).
class StringLiteralParser { class StringLiteralParser {
Preprocessor &PP; Preprocessor &PP;
TargetInfo &Target;
unsigned MaxTokenLength; unsigned MaxTokenLength;
unsigned SizeBound; unsigned SizeBound;
@ -150,7 +149,7 @@ class StringLiteralParser {
char *ResultPtr; // cursor char *ResultPtr; // cursor
public: public:
StringLiteralParser(const Token *StringToks, unsigned NumStringToks, StringLiteralParser(const Token *StringToks, unsigned NumStringToks,
Preprocessor &PP, TargetInfo &T); Preprocessor &PP);
bool hadError; bool hadError;
bool AnyWide; bool AnyWide;
bool Pascal; bool Pascal;

View File

@ -647,8 +647,7 @@ CharLiteralParser::CharLiteralParser(const char *begin, const char *end,
/// ///
StringLiteralParser:: StringLiteralParser::
StringLiteralParser(const Token *StringToks, unsigned NumStringToks, StringLiteralParser(const Token *StringToks, unsigned NumStringToks,
Preprocessor &pp, TargetInfo &t) Preprocessor &pp) : PP(pp) {
: PP(pp), Target(t) {
// Scan all of the string portions, remember the max individual token length, // Scan all of the string portions, remember the max individual token length,
// computing a bound on the concatenated string length, and see whether any // computing a bound on the concatenated string length, and see whether any
// piece is a wide-string. If any of the string portions is a wide-string // piece is a wide-string. If any of the string portions is a wide-string
@ -684,7 +683,7 @@ StringLiteralParser(const Token *StringToks, unsigned NumStringToks,
// query the target. As such, wchar_tByteWidth is only valid if AnyWide=true. // query the target. As such, wchar_tByteWidth is only valid if AnyWide=true.
wchar_tByteWidth = ~0U; wchar_tByteWidth = ~0U;
if (AnyWide) { if (AnyWide) {
wchar_tByteWidth = Target.getWCharWidth(); wchar_tByteWidth = PP.getTargetInfo().getWCharWidth();
assert((wchar_tByteWidth & 7) == 0 && "Assumes wchar_t is byte multiple!"); assert((wchar_tByteWidth & 7) == 0 && "Assumes wchar_t is byte multiple!");
wchar_tByteWidth /= 8; wchar_tByteWidth /= 8;
} }
@ -787,6 +786,15 @@ StringLiteralParser(const Token *StringToks, unsigned NumStringToks,
*ResultPtr++ = 0; *ResultPtr++ = 0;
} }
if (Pascal) if (Pascal) {
ResultBuf[0] = ResultPtr-&ResultBuf[0]-1; ResultBuf[0] = ResultPtr-&ResultBuf[0]-1;
// Verify that pascal strings aren't too large.
if (GetStringLength() > 256)
PP.Diag(StringToks[0].getLocation(), diag::err_pascal_string_too_long)
<< SourceRange(StringToks[0].getLocation(),
StringToks[NumStringToks-1].getLocation());
hadError = 1;
return;
}
} }

View File

@ -295,7 +295,7 @@ Action::ExprResult
Sema::ActOnStringLiteral(const Token *StringToks, unsigned NumStringToks) { Sema::ActOnStringLiteral(const Token *StringToks, unsigned NumStringToks) {
assert(NumStringToks && "Must have at least one string!"); assert(NumStringToks && "Must have at least one string!");
StringLiteralParser Literal(StringToks, NumStringToks, PP, Context.Target); StringLiteralParser Literal(StringToks, NumStringToks, PP);
if (Literal.hadError) if (Literal.hadError)
return ExprResult(true); return ExprResult(true);
@ -303,12 +303,6 @@ Sema::ActOnStringLiteral(const Token *StringToks, unsigned NumStringToks) {
for (unsigned i = 0; i != NumStringToks; ++i) for (unsigned i = 0; i != NumStringToks; ++i)
StringTokLocs.push_back(StringToks[i].getLocation()); StringTokLocs.push_back(StringToks[i].getLocation());
// Verify that pascal strings aren't too large.
if (Literal.Pascal && Literal.GetStringLength() > 256)
return Diag(StringToks[0].getLocation(), diag::err_pascal_string_too_long)
<< SourceRange(StringToks[0].getLocation(),
StringToks[NumStringToks-1].getLocation());
QualType StrTy = Context.CharTy; QualType StrTy = Context.CharTy;
if (Literal.AnyWide) StrTy = Context.getWCharType(); if (Literal.AnyWide) StrTy = Context.getWCharType();
if (Literal.Pascal) StrTy = Context.UnsignedCharTy; if (Literal.Pascal) StrTy = Context.UnsignedCharTy;