forked from OSchip/llvm-project
Change Parser & Sema to use interned "super" for comparions.
- Added as private members for each because it is not clear where to put the common definition. Perhaps the IdentifierInfos all of these "pseudo-keywords" should be collected into one place (this would KnownFunctionIDs and Objective-C property IDs, for example). Remove Token::isNamedIdentifier. - There isn't a good reason to use strcmp when we have interned strings, and there isn't a good reason to encourage clients to do so. llvm-svn: 54794
This commit is contained in:
parent
c44423853a
commit
12c9ddced1
|
@ -85,10 +85,6 @@ public:
|
|||
IdentInfo = II;
|
||||
}
|
||||
|
||||
/// isNamedIdentifier - Return true if this token is a ppidentifier with the
|
||||
/// specified name. For example, tok.isNamedIdentifier("this").
|
||||
bool isNamedIdentifier(const char *Name) const;
|
||||
|
||||
/// setFlag - Set the specified flag.
|
||||
void setFlag(TokenFlags Flag) {
|
||||
Flags |= Flag;
|
||||
|
|
|
@ -51,6 +51,11 @@ class Parser {
|
|||
enum { ScopeCacheSize = 16 };
|
||||
unsigned NumCachedScopes;
|
||||
Scope *ScopeCache[ScopeCacheSize];
|
||||
|
||||
/// Ident_super - IdentifierInfo for "super", to support fast
|
||||
/// comparison.
|
||||
IdentifierInfo *Ident_super;
|
||||
|
||||
public:
|
||||
Parser(Preprocessor &PP, Action &Actions);
|
||||
~Parser();
|
||||
|
@ -434,7 +439,7 @@ private:
|
|||
if (Actions.isTypeName(*Tok.getIdentifierInfo(), CurScope))
|
||||
return true;
|
||||
|
||||
return Tok.isNamedIdentifier("super");
|
||||
return Tok.getIdentifierInfo() == Ident_super;
|
||||
}
|
||||
|
||||
ExprResult ParseObjCAtExpression(SourceLocation AtLocation);
|
||||
|
|
|
@ -51,12 +51,6 @@ tok::ObjCKeywordKind Token::getObjCKeywordID() const {
|
|||
return specId ? specId->getObjCKeywordID() : tok::objc_not_keyword;
|
||||
}
|
||||
|
||||
/// isNamedIdentifier - Return true if this token is a ppidentifier with the
|
||||
/// specified name. For example, tok.isNamedIdentifier("this").
|
||||
bool Token::isNamedIdentifier(const char *Name) const {
|
||||
return IdentInfo && !strcmp(IdentInfo->getName(), Name);
|
||||
}
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Lexer Class Implementation
|
||||
|
|
|
@ -267,6 +267,8 @@ void Parser::Initialize() {
|
|||
&PP.getIdentifierTable().get("nonatomic");
|
||||
ObjCForCollectionInKW = &PP.getIdentifierTable().get("in");
|
||||
}
|
||||
|
||||
Ident_super = &PP.getIdentifierTable().get("super");
|
||||
}
|
||||
|
||||
/// ParseTopLevelDecl - Parse one top-level declaration, return whatever the
|
||||
|
|
|
@ -103,6 +103,8 @@ Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer)
|
|||
KnownFunctionIDs[id_vsprintf] = &IT.get("vsprintf");
|
||||
KnownFunctionIDs[id_vprintf] = &IT.get("vprintf");
|
||||
|
||||
SuperID = &IT.get("super");
|
||||
|
||||
TUScope = 0;
|
||||
if (getLangOptions().CPlusPlus)
|
||||
FieldCollector.reset(new CXXFieldCollector());
|
||||
|
|
|
@ -137,7 +137,10 @@ public:
|
|||
/// kinds of checking (e.g. checking format string errors in printf calls).
|
||||
/// This list is populated upon the creation of a Sema object.
|
||||
IdentifierInfo* KnownFunctionIDs[ id_num_known_functions ];
|
||||
|
||||
|
||||
/// SuperID - Identifier for "super" used for Objective-C checking.
|
||||
IdentifierInfo* SuperID;
|
||||
|
||||
/// Translation Unit Scope - useful to Objective-C actions that need
|
||||
/// to lookup file scope declarations in the "ordinary" C decl namespace.
|
||||
/// For example, user-defined classes, built-in "id" type, etc.
|
||||
|
|
|
@ -328,7 +328,7 @@ Sema::ExprResult Sema::ActOnIdentifierExpr(Scope *S, SourceLocation Loc,
|
|||
}
|
||||
}
|
||||
// Needed to implement property "super.method" notation.
|
||||
if (SD == 0 && !strcmp(II.getName(), "super")) {
|
||||
if (SD == 0 && &II == SuperID) {
|
||||
QualType T = Context.getPointerType(Context.getObjCInterfaceType(
|
||||
getCurMethodDecl()->getClassInterface()));
|
||||
return new PredefinedExpr(Loc, T, PredefinedExpr::ObjCSuper);
|
||||
|
|
|
@ -150,7 +150,7 @@ Sema::ExprResult Sema::ActOnClassMessage(
|
|||
ObjCInterfaceDecl* ClassDecl = 0;
|
||||
bool isSuper = false;
|
||||
|
||||
if (!strcmp(receiverName->getName(), "super") && getCurMethodDecl()) {
|
||||
if (receiverName == SuperID && getCurMethodDecl()) {
|
||||
isSuper = true;
|
||||
ClassDecl = getCurMethodDecl()->getClassInterface()->getSuperClass();
|
||||
if (!ClassDecl)
|
||||
|
|
Loading…
Reference in New Issue