Changeset 63055 in webkit for trunk/JavaScriptCore


Ignore:
Timestamp:
Jul 10, 2010, 5:11:08 PM (15 years ago)
Author:
[email protected]
Message:

2010-07-10 Oliver Hunt <[email protected]>

Reviewed by Gavin Barraclough.

Remove switches from inner expression loops in the parser
https://bugs.webkit.org/show_bug.cgi?id=42035

Use bitmasks and flags on the token types to identify unary and
binary operators, rather than switching on the token type to
identify them.

  • parser/JSParser.cpp: (JSC::isUnaryOp): (JSC::JSParser::isBinaryOperator):
  • parser/JSParser.h: (JSC::):
Location:
trunk/JavaScriptCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r63032 r63055  
     12010-07-10  Oliver Hunt  <[email protected]>
     2
     3        Reviewed by Gavin Barraclough.
     4
     5        Remove switches from inner expression loops in the parser
     6        https://bugs.webkit.org/show_bug.cgi?id=42035
     7
     8        Use bitmasks and flags on the token types to identify unary and
     9        binary operators, rather than switching on the token type to
     10        identify them.
     11
     12        * parser/JSParser.cpp:
     13        (JSC::isUnaryOp):
     14        (JSC::JSParser::isBinaryOperator):
     15        * parser/JSParser.h:
     16        (JSC::):
     17
    1182010-07-09  Leon Clarke  <[email protected]>
    219
  • trunk/JavaScriptCore/parser/JSParser.cpp

    r63024 r63055  
    5959#define TreeProperty typename TreeBuilder::Property
    6060#define TreePropertyList typename TreeBuilder::PropertyList
     61
     62COMPILE_ASSERT(LastUntaggedToken < 64, LessThan64UntaggedTokens);
    6163
    6264// This matches v8
     
    161163    enum FunctionRequirements { FunctionNoRequirements, FunctionNeedsName };
    162164    template <FunctionRequirements, class TreeBuilder> bool parseFunctionInfo(TreeBuilder&, const Identifier*&, TreeFormalParameterList&, TreeFunctionBody&, int& openBrace, int& closeBrace, int& bodyStartLine);
    163     int isBinaryOperator(JSTokenType token);
     165    ALWAYS_INLINE int isBinaryOperator(JSTokenType token);
    164166    bool allowAutomaticSemicolon();
    165167
     
    10301032}
    10311033
    1032 static bool isUnaryOp(JSTokenType token)
    1033 {
    1034     switch (token) {
    1035     case EXCLAMATION:
    1036     case TILDE:
    1037     case MINUS:
    1038     case PLUS:
    1039     case PLUSPLUS:
    1040     case AUTOPLUSPLUS:
    1041     case MINUSMINUS:
    1042     case AUTOMINUSMINUS:
    1043     case TYPEOF:
    1044     case VOIDTOKEN:
    1045     case DELETETOKEN:
    1046         return true;
    1047     default:
    1048         return false;
    1049     }
     1034ALWAYS_INLINE static bool isUnaryOp(JSTokenType token)
     1035{
     1036    return token & UnaryOpTokenFlag;
    10501037}
    10511038
    10521039int JSParser::isBinaryOperator(JSTokenType token)
    10531040{
    1054     switch (token) {
    1055     case OR:
    1056         return 1;
    1057 
    1058     case AND:
    1059         return 2;
    1060 
    1061     case BITOR:
    1062         return 3;
    1063 
    1064     case BITXOR:
    1065         return 4;
    1066 
    1067     case BITAND:
    1068         return 5;
    1069 
    1070     case EQEQ:
    1071     case NE:
    1072     case STREQ:
    1073     case STRNEQ:
    1074         return 6;
    1075 
    1076     case LT:
    1077     case GT:
    1078     case LE:
    1079     case GE:
    1080     case INSTANCEOF:
    1081         return 7;
    1082 
    1083     case INTOKEN:
    1084         // same precedence as the above but needs a validity check
    1085         if (m_allowsIn)
    1086             return 7;
    1087         return 0;
    1088 
    1089     case LSHIFT:
    1090     case RSHIFT:
    1091     case URSHIFT:
    1092         return 8;
    1093 
    1094     case PLUS:
    1095     case MINUS:
    1096         return 9;
    1097 
    1098     case TIMES:
    1099     case DIVIDE:
    1100     case MOD:
    1101         return 10;
    1102 
    1103     default:
    1104         return 0;
    1105     }
     1041    if (m_allowsIn)
     1042        return token & (BinaryOpTokenPrecedenceMask << BinaryOpTokenAllowsInPrecedenceAdditionalShift);
     1043    return token & BinaryOpTokenPrecedenceMask;
    11061044}
    11071045
  • trunk/JavaScriptCore/parser/JSParser.h

    r63024 r63055  
    3333class SourceCode;
    3434
     35enum {
     36    UnaryOpTokenFlag = 64,
     37    BinaryOpTokenPrecedenceShift = 7,
     38    BinaryOpTokenAllowsInPrecedenceAdditionalShift = 4,
     39    BinaryOpTokenPrecedenceMask = 15 << BinaryOpTokenPrecedenceShift
     40};
     41
     42#define BINARY_OP_PRECEDENCE(prec) (((prec) << BinaryOpTokenPrecedenceShift) | ((prec) << (BinaryOpTokenPrecedenceShift + BinaryOpTokenAllowsInPrecedenceAdditionalShift)))
     43#define IN_OP_PRECEDENCE(prec) ((prec) << (BinaryOpTokenPrecedenceShift + BinaryOpTokenAllowsInPrecedenceAdditionalShift))
     44
    3545enum JSTokenType {
    3646    NULLTOKEN,
     
    4757    FUNCTION,
    4858    RETURN,
    49     VOIDTOKEN,
    50     DELETETOKEN,
    5159    IF,
    5260    THISTOKEN,
    5361    DO,
    5462    WHILE,
    55     INTOKEN,
    56     INSTANCEOF,
    57     TYPEOF,
    5863    SWITCH,
    5964    WITH,
     
    6469    FINALLY,
    6570    DEBUGGER,
    66     IF_WITHOUT_ELSE,
    6771    ELSE,
     72    OPENBRACE,
     73    CLOSEBRACE,
     74    OPENPAREN,
     75    CLOSEPAREN,
     76    OPENBRACKET,
     77    CLOSEBRACKET,
     78    COMMA,
     79    QUESTION,
     80    NUMBER,
     81    IDENT,
     82    STRING,
     83    SEMICOLON,
     84    COLON,
     85    DOT,
     86    ERRORTOK,
     87    EOFTOK,
    6888    EQUAL,
    69     EQEQ,
    70     NE,
    71     STREQ,
    72     STRNEQ,
    73     LT,
    74     GT,
    75     LE,
    76     GE,
    77     OR,
    78     AND,
    79     PLUSPLUS,
    80     MINUSMINUS,
    81     LSHIFT,
    82     RSHIFT,
    83     URSHIFT,
    8489    PLUSEQUAL,
    8590    MINUSEQUAL,
     
    9398    XOREQUAL,
    9499    OREQUAL,
    95     BITOR,
    96     BITAND,
    97     BITXOR,
    98     PLUS,
    99     MINUS,
    100     TIMES,
    101     DIVIDE,
    102     MOD,
    103     OPENBRACE,
    104     CLOSEBRACE,
    105     OPENPAREN,
    106     CLOSEPAREN,
    107     OPENBRACKET,
    108     CLOSEBRACKET,
    109     COMMA,
    110     QUESTION,
    111     TILDE,
    112     EXCLAMATION,
    113     NUMBER,
    114     IDENT,
    115     STRING,
    116     AUTOPLUSPLUS,
    117     AUTOMINUSMINUS,
    118     SEMICOLON,
    119     COLON,
    120     DOT,
    121     ERRORTOK,
    122     EOFTOK
     100    LastUntaggedToken,
     101
     102    // Begin tagged tokens
     103    PLUSPLUS = 0 | UnaryOpTokenFlag,
     104    MINUSMINUS = 1 | UnaryOpTokenFlag,
     105    EXCLAMATION = 2 | UnaryOpTokenFlag,
     106    TILDE = 3 | UnaryOpTokenFlag,
     107    AUTOPLUSPLUS = 4 | UnaryOpTokenFlag,
     108    AUTOMINUSMINUS = 5 | UnaryOpTokenFlag,
     109    TYPEOF = 6 | UnaryOpTokenFlag,
     110    VOIDTOKEN = 7 | UnaryOpTokenFlag,
     111    DELETETOKEN = 8 | UnaryOpTokenFlag,
     112    OR = 0 | BINARY_OP_PRECEDENCE(1),
     113    AND = 1 | BINARY_OP_PRECEDENCE(2),
     114    BITOR = 2 | BINARY_OP_PRECEDENCE(3),
     115    BITXOR = 3 | BINARY_OP_PRECEDENCE(4),
     116    BITAND = 4 | BINARY_OP_PRECEDENCE(5),
     117    EQEQ = 5 | BINARY_OP_PRECEDENCE(6),
     118    NE = 6 | BINARY_OP_PRECEDENCE(6),
     119    STREQ = 7 | BINARY_OP_PRECEDENCE(6),
     120    STRNEQ = 8 | BINARY_OP_PRECEDENCE(6),
     121    LT = 9 | BINARY_OP_PRECEDENCE(7),
     122    GT = 10 | BINARY_OP_PRECEDENCE(7),
     123    LE = 11 | BINARY_OP_PRECEDENCE(7),
     124    GE = 12 | BINARY_OP_PRECEDENCE(7),
     125    INSTANCEOF = 13 | BINARY_OP_PRECEDENCE(7),
     126    INTOKEN = 14 | IN_OP_PRECEDENCE(7),
     127    LSHIFT = 15 | BINARY_OP_PRECEDENCE(8),
     128    RSHIFT = 16 | BINARY_OP_PRECEDENCE(8),
     129    URSHIFT = 17 | BINARY_OP_PRECEDENCE(8),
     130    PLUS = 18 | BINARY_OP_PRECEDENCE(9) | UnaryOpTokenFlag,
     131    MINUS = 19 | BINARY_OP_PRECEDENCE(9) | UnaryOpTokenFlag,
     132    TIMES = 20 | BINARY_OP_PRECEDENCE(10),
     133    DIVIDE = 21 | BINARY_OP_PRECEDENCE(10),
     134    MOD = 22 | BINARY_OP_PRECEDENCE(10)
    123135};
    124136
Note: See TracChangeset for help on using the changeset viewer.