Changeset 63055 in webkit for trunk/JavaScriptCore
- Timestamp:
- Jul 10, 2010, 5:11:08 PM (15 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r63032 r63055 1 2010-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 1 18 2010-07-09 Leon Clarke <[email protected]> 2 19 -
trunk/JavaScriptCore/parser/JSParser.cpp
r63024 r63055 59 59 #define TreeProperty typename TreeBuilder::Property 60 60 #define TreePropertyList typename TreeBuilder::PropertyList 61 62 COMPILE_ASSERT(LastUntaggedToken < 64, LessThan64UntaggedTokens); 61 63 62 64 // This matches v8 … … 161 163 enum FunctionRequirements { FunctionNoRequirements, FunctionNeedsName }; 162 164 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); 164 166 bool allowAutomaticSemicolon(); 165 167 … … 1030 1032 } 1031 1033 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 } 1034 ALWAYS_INLINE static bool isUnaryOp(JSTokenType token) 1035 { 1036 return token & UnaryOpTokenFlag; 1050 1037 } 1051 1038 1052 1039 int JSParser::isBinaryOperator(JSTokenType token) 1053 1040 { 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; 1106 1044 } 1107 1045 -
trunk/JavaScriptCore/parser/JSParser.h
r63024 r63055 33 33 class SourceCode; 34 34 35 enum { 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 35 45 enum JSTokenType { 36 46 NULLTOKEN, … … 47 57 FUNCTION, 48 58 RETURN, 49 VOIDTOKEN,50 DELETETOKEN,51 59 IF, 52 60 THISTOKEN, 53 61 DO, 54 62 WHILE, 55 INTOKEN,56 INSTANCEOF,57 TYPEOF,58 63 SWITCH, 59 64 WITH, … … 64 69 FINALLY, 65 70 DEBUGGER, 66 IF_WITHOUT_ELSE,67 71 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, 68 88 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,84 89 PLUSEQUAL, 85 90 MINUSEQUAL, … … 93 98 XOREQUAL, 94 99 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) 123 135 }; 124 136
Note:
See TracChangeset
for help on using the changeset viewer.