Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(473)

Side by Side Diff: src/preparser.cc

Issue 163333003: (Pre)Parser: Move ParsePrimaryExpression to ParserBase. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: ws Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/preparser.h ('k') | test/cctest/test-parsing.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 74
75 75
76 void PreParserTraits::ReportMessageAt(int start_pos, 76 void PreParserTraits::ReportMessageAt(int start_pos,
77 int end_pos, 77 int end_pos,
78 const char* type, 78 const char* type,
79 const char* name_opt) { 79 const char* name_opt) {
80 pre_parser_->log_->LogMessage(start_pos, end_pos, type, name_opt); 80 pre_parser_->log_->LogMessage(start_pos, end_pos, type, name_opt);
81 } 81 }
82 82
83 83
84 PreParserIdentifier PreParserTraits::GetSymbol() { 84 PreParserIdentifier PreParserTraits::GetSymbol(Scanner* scanner) {
85 Scanner* scanner = pre_parser_->scanner();
86 pre_parser_->LogSymbol(); 85 pre_parser_->LogSymbol();
87 if (scanner->current_token() == Token::FUTURE_RESERVED_WORD) { 86 if (scanner->current_token() == Token::FUTURE_RESERVED_WORD) {
88 return PreParserIdentifier::FutureReserved(); 87 return PreParserIdentifier::FutureReserved();
89 } else if (scanner->current_token() == 88 } else if (scanner->current_token() ==
90 Token::FUTURE_STRICT_RESERVED_WORD) { 89 Token::FUTURE_STRICT_RESERVED_WORD) {
91 return PreParserIdentifier::FutureStrictReserved(); 90 return PreParserIdentifier::FutureStrictReserved();
92 } else if (scanner->current_token() == Token::YIELD) { 91 } else if (scanner->current_token() == Token::YIELD) {
93 return PreParserIdentifier::Yield(); 92 return PreParserIdentifier::Yield();
94 } 93 }
95 if (scanner->is_literal_ascii()) { 94 if (scanner->is_literal_ascii()) {
96 // Detect strict-mode poison words. 95 // Detect strict-mode poison words.
97 if (scanner->literal_length() == 4 && 96 if (scanner->literal_length() == 4 &&
98 !strncmp(scanner->literal_ascii_string().start(), "eval", 4)) { 97 !strncmp(scanner->literal_ascii_string().start(), "eval", 4)) {
99 return PreParserIdentifier::Eval(); 98 return PreParserIdentifier::Eval();
100 } 99 }
101 if (scanner->literal_length() == 9 && 100 if (scanner->literal_length() == 9 &&
102 !strncmp(scanner->literal_ascii_string().start(), "arguments", 9)) { 101 !strncmp(scanner->literal_ascii_string().start(), "arguments", 9)) {
103 return PreParserIdentifier::Arguments(); 102 return PreParserIdentifier::Arguments();
104 } 103 }
105 } 104 }
106 return PreParserIdentifier::Default(); 105 return PreParserIdentifier::Default();
107 } 106 }
108 107
109 108
109 PreParserExpression PreParserTraits::ExpressionFromString(
110 int pos, Scanner* scanner, PreParserFactory* factory) {
111 const int kUseStrictLength = 10;
112 const char* kUseStrictChars = "use strict";
113 pre_parser_->LogSymbol();
114 if (scanner->is_literal_ascii() &&
115 scanner->literal_length() == kUseStrictLength &&
116 !scanner->literal_contains_escapes() &&
117 !strncmp(scanner->literal_ascii_string().start(), kUseStrictChars,
118 kUseStrictLength)) {
119 return PreParserExpression::UseStrictStringLiteral();
120 }
121 return PreParserExpression::StringLiteral();
122 }
123
124
125 PreParserExpression PreParserTraits::ParseArrayLiteral(bool* ok) {
126 return pre_parser_->ParseArrayLiteral(ok);
127 }
128
129
130 PreParserExpression PreParserTraits::ParseObjectLiteral(bool* ok) {
131 return pre_parser_->ParseObjectLiteral(ok);
132 }
133
134
135 PreParserExpression PreParserTraits::ParseExpression(bool accept_IN, bool* ok) {
136 return pre_parser_->ParseExpression(accept_IN, ok);
137 }
138
139
140 PreParserExpression PreParserTraits::ParseV8Intrinsic(bool* ok) {
141 return pre_parser_->ParseV8Intrinsic(ok);
142 }
143
144
110 PreParser::PreParseResult PreParser::PreParseLazyFunction( 145 PreParser::PreParseResult PreParser::PreParseLazyFunction(
111 LanguageMode mode, bool is_generator, ParserRecorder* log) { 146 LanguageMode mode, bool is_generator, ParserRecorder* log) {
112 log_ = log; 147 log_ = log;
113 // Lazy functions always have trivial outer scopes (no with/catch scopes). 148 // Lazy functions always have trivial outer scopes (no with/catch scopes).
114 PreParserScope top_scope(scope_, GLOBAL_SCOPE); 149 PreParserScope top_scope(scope_, GLOBAL_SCOPE);
115 FunctionState top_state(&function_state_, &scope_, &top_scope); 150 FunctionState top_state(&function_state_, &scope_, &top_scope);
116 scope_->SetLanguageMode(mode); 151 scope_->SetLanguageMode(mode);
117 PreParserScope function_scope(scope_, FUNCTION_SCOPE); 152 PreParserScope function_scope(scope_, FUNCTION_SCOPE);
118 FunctionState function_state(&function_state_, &scope_, &function_scope); 153 FunctionState function_state(&function_state_, &scope_, &function_scope);
119 function_state.set_is_generator(is_generator); 154 function_state.set_is_generator(is_generator);
(...skipping 984 matching lines...) Expand 10 before | Expand all | Expand 10 after
1104 result = Expression::Default(); 1139 result = Expression::Default();
1105 break; 1140 break;
1106 } 1141 }
1107 default: 1142 default:
1108 return result; 1143 return result;
1109 } 1144 }
1110 } 1145 }
1111 } 1146 }
1112 1147
1113 1148
1114 PreParser::Expression PreParser::ParsePrimaryExpression(bool* ok) {
1115 // PrimaryExpression ::
1116 // 'this'
1117 // 'null'
1118 // 'true'
1119 // 'false'
1120 // Identifier
1121 // Number
1122 // String
1123 // ArrayLiteral
1124 // ObjectLiteral
1125 // RegExpLiteral
1126 // '(' Expression ')'
1127
1128 Expression result = Expression::Default();
1129 switch (peek()) {
1130 case Token::THIS: {
1131 Next();
1132 result = Expression::This();
1133 break;
1134 }
1135
1136 case Token::FUTURE_RESERVED_WORD:
1137 case Token::FUTURE_STRICT_RESERVED_WORD:
1138 case Token::YIELD:
1139 case Token::IDENTIFIER: {
1140 // Using eval or arguments in this context is OK even in strict mode.
1141 Identifier id = ParseIdentifier(kAllowEvalOrArguments, CHECK_OK);
1142 result = Expression::FromIdentifier(id);
1143 break;
1144 }
1145
1146 case Token::NULL_LITERAL:
1147 case Token::TRUE_LITERAL:
1148 case Token::FALSE_LITERAL:
1149 case Token::NUMBER: {
1150 Next();
1151 break;
1152 }
1153 case Token::STRING: {
1154 Next();
1155 result = GetStringSymbol();
1156 break;
1157 }
1158
1159 case Token::ASSIGN_DIV:
1160 result = ParseRegExpLiteral(true, CHECK_OK);
1161 break;
1162
1163 case Token::DIV:
1164 result = ParseRegExpLiteral(false, CHECK_OK);
1165 break;
1166
1167 case Token::LBRACK:
1168 result = ParseArrayLiteral(CHECK_OK);
1169 break;
1170
1171 case Token::LBRACE:
1172 result = ParseObjectLiteral(CHECK_OK);
1173 break;
1174
1175 case Token::LPAREN:
1176 Consume(Token::LPAREN);
1177 parenthesized_function_ = (peek() == Token::FUNCTION);
1178 result = ParseExpression(true, CHECK_OK);
1179 Expect(Token::RPAREN, CHECK_OK);
1180 break;
1181
1182 case Token::MOD:
1183 result = ParseV8Intrinsic(CHECK_OK);
1184 break;
1185
1186 default: {
1187 Token::Value next = Next();
1188 ReportUnexpectedToken(next);
1189 *ok = false;
1190 return Expression::Default();
1191 }
1192 }
1193
1194 return result;
1195 }
1196
1197
1198 PreParser::Expression PreParser::ParseArrayLiteral(bool* ok) { 1149 PreParser::Expression PreParser::ParseArrayLiteral(bool* ok) {
1199 // ArrayLiteral :: 1150 // ArrayLiteral ::
1200 // '[' Expression? (',' Expression?)* ']' 1151 // '[' Expression? (',' Expression?)* ']'
1201 Expect(Token::LBRACK, CHECK_OK); 1152 Expect(Token::LBRACK, CHECK_OK);
1202 while (peek() != Token::RBRACK) { 1153 while (peek() != Token::RBRACK) {
1203 if (peek() != Token::COMMA) { 1154 if (peek() != Token::COMMA) {
1204 ParseAssignmentExpression(true, CHECK_OK); 1155 ParseAssignmentExpression(true, CHECK_OK);
1205 } 1156 }
1206 if (peek() != Token::RBRACK) { 1157 if (peek() != Token::RBRACK) {
1207 Expect(Token::COMMA, CHECK_OK); 1158 Expect(Token::COMMA, CHECK_OK);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1259 Expect(Token::COMMA, CHECK_OK); 1210 Expect(Token::COMMA, CHECK_OK);
1260 } 1211 }
1261 continue; // restart the while 1212 continue; // restart the while
1262 } 1213 }
1263 checker.CheckProperty(next, kValueProperty, CHECK_OK); 1214 checker.CheckProperty(next, kValueProperty, CHECK_OK);
1264 break; 1215 break;
1265 } 1216 }
1266 case Token::STRING: 1217 case Token::STRING:
1267 Consume(next); 1218 Consume(next);
1268 checker.CheckProperty(next, kValueProperty, CHECK_OK); 1219 checker.CheckProperty(next, kValueProperty, CHECK_OK);
1269 GetStringSymbol(); 1220 LogSymbol();
1270 break; 1221 break;
1271 case Token::NUMBER: 1222 case Token::NUMBER:
1272 Consume(next); 1223 Consume(next);
1273 checker.CheckProperty(next, kValueProperty, CHECK_OK); 1224 checker.CheckProperty(next, kValueProperty, CHECK_OK);
1274 break; 1225 break;
1275 default: 1226 default:
1276 if (Token::IsKeyword(next)) { 1227 if (Token::IsKeyword(next)) {
1277 Consume(next); 1228 Consume(next);
1278 checker.CheckProperty(next, kValueProperty, CHECK_OK); 1229 checker.CheckProperty(next, kValueProperty, CHECK_OK);
1279 } else { 1230 } else {
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
1468 void PreParser::LogSymbol() { 1419 void PreParser::LogSymbol() {
1469 int identifier_pos = position(); 1420 int identifier_pos = position();
1470 if (scanner()->is_literal_ascii()) { 1421 if (scanner()->is_literal_ascii()) {
1471 log_->LogAsciiSymbol(identifier_pos, scanner()->literal_ascii_string()); 1422 log_->LogAsciiSymbol(identifier_pos, scanner()->literal_ascii_string());
1472 } else { 1423 } else {
1473 log_->LogUtf16Symbol(identifier_pos, scanner()->literal_utf16_string()); 1424 log_->LogUtf16Symbol(identifier_pos, scanner()->literal_utf16_string());
1474 } 1425 }
1475 } 1426 }
1476 1427
1477 1428
1478 PreParser::Expression PreParser::GetStringSymbol() {
1479 const int kUseStrictLength = 10;
1480 const char* kUseStrictChars = "use strict";
1481 LogSymbol();
1482 if (scanner()->is_literal_ascii() &&
1483 scanner()->literal_length() == kUseStrictLength &&
1484 !scanner()->literal_contains_escapes() &&
1485 !strncmp(scanner()->literal_ascii_string().start(), kUseStrictChars,
1486 kUseStrictLength)) {
1487 return Expression::UseStrictStringLiteral();
1488 }
1489 return Expression::StringLiteral();
1490 }
1491
1492
1493 } } // v8::internal 1429 } } // v8::internal
OLDNEW
« no previous file with comments | « src/preparser.h ('k') | test/cctest/test-parsing.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698