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::):
File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.