2011-06-13 Oliver Hunt <oliver@apple.com>
authoroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 13 Jun 2011 22:38:22 +0000 (22:38 +0000)
committeroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 13 Jun 2011 22:38:22 +0000 (22:38 +0000)
        Reviewed by Gavin Barraclough.

        Make it possible to inline the common case of identifier lexing
        https://bugs.webkit.org/show_bug.cgi?id=62600

        Add a lexing function that expects to lex an "normal" alpha numeric
        identifier (that ignores keywords) so it's possible to inline the
        common parsing cases.  This comes out as a reasonable parsing speed
        boost.

        * parser/JSParser.cpp:
        (JSC::JSParser::nextExpectIdentifier):
        (JSC::JSParser::parseProperty):
        (JSC::JSParser::parseMemberExpression):
        * parser/Lexer.cpp:
        * parser/Lexer.h:
        (JSC::Lexer::makeIdentifier):
        (JSC::Lexer::lexExpectIdentifier):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@88719 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/parser/JSParser.cpp
Source/JavaScriptCore/parser/Lexer.cpp
Source/JavaScriptCore/parser/Lexer.h

index 1b98d23..30ce02d 100644 (file)
@@ -1,3 +1,24 @@
+2011-06-13  Oliver Hunt  <oliver@apple.com>
+
+        Reviewed by Gavin Barraclough.
+
+        Make it possible to inline the common case of identifier lexing
+        https://bugs.webkit.org/show_bug.cgi?id=62600
+
+        Add a lexing function that expects to lex an "normal" alpha numeric
+        identifier (that ignores keywords) so it's possible to inline the
+        common parsing cases.  This comes out as a reasonable parsing speed
+        boost.
+
+        * parser/JSParser.cpp:
+        (JSC::JSParser::nextExpectIdentifier):
+        (JSC::JSParser::parseProperty):
+        (JSC::JSParser::parseMemberExpression):
+        * parser/Lexer.cpp:
+        * parser/Lexer.h:
+        (JSC::Lexer::makeIdentifier):
+        (JSC::Lexer::lexExpectIdentifier):
+
 2011-06-13  Xan Lopez  <xlopez@igalia.com>
 
         Reviewed by Martin Robinson.
index a3ea44d..d56155b 100644 (file)
@@ -107,6 +107,14 @@ private:
         m_token.m_type = m_lexer->lex(&m_token.m_data, &m_token.m_info, lexType, strictMode());
     }
     
+    ALWAYS_INLINE void nextExpectIdentifier(unsigned lexType = 0)
+    {
+        m_lastLine = m_token.m_info.line;
+        m_lastTokenEnd = m_token.m_info.endOffset;
+        m_lexer->setLastLineNumber(m_lastLine);
+        m_token.m_type = m_lexer->lexExpectIdentifier(&m_token.m_data, &m_token.m_info, lexType, strictMode());
+    }
+    
     ALWAYS_INLINE bool nextTokenIsColon()
     {
         return m_lexer->nextTokenIsColon();
@@ -1707,9 +1715,9 @@ template <bool complete, class TreeBuilder> TreeProperty JSParser::parseProperty
     case STRING: {
         const Identifier* ident = m_token.m_data.ident;
         if (complete || (wasIdent && (*ident == m_globalData->propertyNames->get || *ident == m_globalData->propertyNames->set)))
-            next(Lexer::IgnoreReservedWords);
+            nextExpectIdentifier(Lexer::IgnoreReservedWords);
         else
-            next(Lexer::IgnoreReservedWords | TreeBuilder::DontBuildKeywords);
+            nextExpectIdentifier(Lexer::IgnoreReservedWords | TreeBuilder::DontBuildKeywords);
 
         if (match(COLON)) {
             next();
@@ -2038,7 +2046,7 @@ template <class TreeBuilder> TreeExpression JSParser::parseMemberExpression(Tree
         case DOT: {
             m_nonTrivialExpressionCount++;
             int expressionEnd = lastTokenEnd();
-            next(Lexer::IgnoreReservedWords | TreeBuilder::DontBuildKeywords);
+            nextExpectIdentifier(Lexer::IgnoreReservedWords | TreeBuilder::DontBuildKeywords);
             matchOrFail(IDENT);
             base = context.createDotAccess(base, m_token.m_data.ident, expressionStart, expressionEnd, tokenEnd());
             next();
index 64ae264..b270455 100644 (file)
@@ -331,11 +331,6 @@ void Lexer::shiftLineTerminator()
     ++m_lineNumber;
 }
 
-ALWAYS_INLINE const Identifier* Lexer::makeIdentifier(const UChar* characters, size_t length)
-{
-    return &m_arena->makeIdentifier(m_globalData, characters, length);
-}
-
 ALWAYS_INLINE bool Lexer::lastTokenWasRestrKeyword() const
 {
     return m_lastToken == CONTINUE || m_lastToken == BREAK || m_lastToken == RETURN || m_lastToken == THROW;
index ee0a089..bd9690a 100644 (file)
@@ -88,7 +88,9 @@ namespace JSC {
         }
 
         SourceProvider* sourceProvider() const { return m_source->provider(); }
-
+        
+        JSTokenType lexExpectIdentifier(JSTokenData* lvalp, JSTokenInfo* llocp, unsigned, bool strictMode);
+        
     private:
         friend class JSGlobalData;
 
@@ -173,6 +175,55 @@ namespace JSC {
     {
         return (convertHex(c1, c2) << 8) | convertHex(c3, c4);
     }
+    
+    ALWAYS_INLINE const Identifier* Lexer::makeIdentifier(const UChar* characters, size_t length)
+    {
+        return &m_arena->makeIdentifier(m_globalData, characters, length);
+    }
+
+    ALWAYS_INLINE JSTokenType Lexer::lexExpectIdentifier(JSTokenData* lvalp, JSTokenInfo* llocp, unsigned lexType, bool strictMode)
+    {
+        ASSERT((lexType & IgnoreReservedWords));
+        const UChar* start = m_code;
+        const UChar* ptr = start;
+        const UChar* end = m_codeEnd;
+        if (ptr >= end) {
+            ASSERT(ptr == end);
+            goto slowCase;
+        }
+        if (!WTF::isASCIIAlpha(*ptr))
+            goto slowCase;
+        ++ptr;
+        while (ptr < end) {
+            if (!WTF::isASCIIAlphanumeric(*ptr))
+                break;
+            ++ptr;
+        }
+
+        // Here's the shift
+        if (ptr < end) {
+            if (!WTF::isASCII(*ptr) || (*ptr == '\\') || (*ptr == '_'))
+                goto slowCase;
+            m_current = *ptr;
+        } else
+            m_current = -1;
+
+        m_code = ptr;
+
+        // Create the identifier if needed
+        if (lexType & DontBuildKeywords)
+            lvalp->ident = 0;
+        else
+            lvalp->ident = makeIdentifier(start, ptr - start);
+        llocp->line = m_lineNumber;
+        llocp->startOffset = start - m_codeStart;
+        llocp->endOffset = currentOffset();
+        m_lastToken = IDENT;
+        return IDENT;
+        
+    slowCase:
+        return lex(lvalp, llocp, lexType, strictMode);
+    }
 
 } // namespace JSC