@@ -810,40 +810,40 @@ void Preprocessor::HandleDirective(LexerToken &Result) {
810
810
case tok::kw_if:
811
811
return HandleIfDirective (Result);
812
812
case tok::identifier:
813
- // Strip out trigraphs and embedded newlines.
814
- std::string Directive = getSpelling ( Result);
813
+ // Get the identifier name without trigraphs or embedded newlines.
814
+ const char * Directive = Result. getIdentifierInfo ()-> getName ( );
815
815
bool isExtension = false ;
816
- switch (Directive. size ()) {
816
+ switch (Result. getIdentifierInfo ()-> getNameLength ()) {
817
817
case 4 :
818
- if (Directive == " line" )
818
+ if (Directive[ 0 ] == ' l ' && ! strcmp (Directive, " line" ) )
819
819
;
820
- if (Directive == " elif" )
820
+ if (Directive[ 0 ] == ' e ' && ! strcmp (Directive, " elif" ) )
821
821
return HandleElifDirective (Result);
822
- if (Directive == " sccs" ) {
822
+ if (Directive[ 0 ] == ' s ' && ! strcmp (Directive, " sccs" ) ) {
823
823
isExtension = true ;
824
824
// SCCS is the same as #ident.
825
825
}
826
826
break ;
827
827
case 5 :
828
- if (Directive == " endif" )
828
+ if (Directive[ 0 ] == ' e ' && ! strcmp (Directive, " endif" ) )
829
829
return HandleEndifDirective (Result);
830
- if (Directive == " ifdef" )
830
+ if (Directive[ 0 ] == ' i ' && ! strcmp (Directive, " ifdef" ) )
831
831
return HandleIfdefDirective (Result, false );
832
- if (Directive == " undef" )
832
+ if (Directive[ 0 ] == ' u ' && ! strcmp (Directive, " undef" ) )
833
833
return HandleUndefDirective (Result);
834
- if (Directive == " error" )
834
+ if (Directive[ 0 ] == ' e ' && ! strcmp (Directive, " error" ) )
835
835
return HandleUserDiagnosticDirective (Result, false );
836
- if (Directive == " ident" )
836
+ if (Directive[ 0 ] == ' i ' && ! strcmp (Directive, " ident" ) )
837
837
isExtension = true ;
838
838
break ;
839
839
case 6 :
840
- if (Directive == " define" )
840
+ if (Directive[ 0 ] == ' d ' && ! strcmp (Directive, " define" ) )
841
841
return HandleDefineDirective (Result);
842
- if (Directive == " ifndef" )
842
+ if (Directive[ 0 ] == ' i ' && ! strcmp (Directive, " ifndef" ) )
843
843
return HandleIfdefDirective (Result, true );
844
- if (Directive == " import" )
844
+ if (Directive[ 0 ] == ' i ' && ! strcmp (Directive, " import" ) )
845
845
return HandleImportDirective (Result);
846
- if (Directive == " pragma" ) {
846
+ if (Directive[ 0 ] == ' p ' && ! strcmp (Directive, " pragma" ) ) {
847
847
// FIXME: implement #pragma
848
848
++NumPragma;
849
849
#if 1
@@ -854,26 +854,26 @@ void Preprocessor::HandleDirective(LexerToken &Result) {
854
854
855
855
return ;
856
856
#endif
857
- } else if (Directive == " assert" ) {
857
+ } else if (Directive[ 0 ] == ' a ' && ! strcmp (Directive, " assert" ) ) {
858
858
isExtension = true ;
859
859
}
860
860
break ;
861
861
case 7 :
862
- if (Directive == " include " ) // Handle # include.
863
- return HandleIncludeDirective (Result);
864
- if (Directive == " warning" ) {
862
+ if (Directive[ 0 ] == ' i ' && ! strcmp (Directive, " include" ))
863
+ return HandleIncludeDirective (Result); // Handle #include.
864
+ if (Directive[ 0 ] == ' w ' && ! strcmp (Directive, " warning" ) ) {
865
865
Diag (Result, diag::ext_pp_warning_directive);
866
866
return HandleUserDiagnosticDirective (Result, true );
867
867
}
868
868
break ;
869
869
case 8 :
870
- if (Directive == " unassert" ) {
870
+ if (Directive[ 0 ] == ' u ' && ! strcmp (Directive, " unassert" ) ) {
871
871
isExtension = true ;
872
872
}
873
873
break ;
874
874
case 12 :
875
- if (Directive == " include_next " ) // Handle # include_next.
876
- return HandleIncludeNextDirective (Result);
875
+ if (Directive[ 0 ] == ' i ' && ! strcmp (Directive, " include_next" ))
876
+ return HandleIncludeNextDirective (Result); // Handle #include_next.
877
877
break ;
878
878
}
879
879
break ;
0 commit comments