| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_PREPARSER_H | 5 #ifndef V8_PREPARSER_H |
| 6 #define V8_PREPARSER_H | 6 #define V8_PREPARSER_H |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/bailout-reason.h" | 10 #include "src/bailout-reason.h" |
| (...skipping 1177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1188 bool IsSpreadExpression() const { | 1188 bool IsSpreadExpression() const { |
| 1189 return TypeField::decode(code_) == kSpreadExpression; | 1189 return TypeField::decode(code_) == kSpreadExpression; |
| 1190 } | 1190 } |
| 1191 | 1191 |
| 1192 PreParserExpression AsFunctionLiteral() { return *this; } | 1192 PreParserExpression AsFunctionLiteral() { return *this; } |
| 1193 | 1193 |
| 1194 bool IsBinaryOperation() const { | 1194 bool IsBinaryOperation() const { |
| 1195 return TypeField::decode(code_) == kBinaryOperationExpression; | 1195 return TypeField::decode(code_) == kBinaryOperationExpression; |
| 1196 } | 1196 } |
| 1197 | 1197 |
| 1198 bool is_single_parenthesized() const { | |
| 1199 return ParenthesizationField::decode(code_) != kNotParenthesized; | |
| 1200 } | |
| 1201 | |
| 1202 void increase_parenthesization_level() { | |
| 1203 code_ = ParenthesizationField::update( | |
| 1204 code_, is_single_parenthesized() ? kMultiParenthesizedExpression | |
| 1205 : kParanthesizedExpression); | |
| 1206 } | |
| 1207 | |
| 1208 // Dummy implementation for making expression->somefunc() work in both Parser | 1198 // Dummy implementation for making expression->somefunc() work in both Parser |
| 1209 // and PreParser. | 1199 // and PreParser. |
| 1210 PreParserExpression* operator->() { return this; } | 1200 PreParserExpression* operator->() { return this; } |
| 1211 | 1201 |
| 1212 // More dummy implementations of things PreParser doesn't need to track: | 1202 // More dummy implementations of things PreParser doesn't need to track: |
| 1213 void set_index(int index) {} // For YieldExpressions | 1203 void set_index(int index) {} // For YieldExpressions |
| 1214 void set_should_eager_compile() {} | 1204 void set_should_eager_compile() {} |
| 1215 | 1205 |
| 1216 int position() const { return RelocInfo::kNoPosition; } | 1206 int position() const { return RelocInfo::kNoPosition; } |
| 1217 void set_function_token_position(int position) {} | 1207 void set_function_token_position(int position) {} |
| 1218 | 1208 |
| 1219 private: | 1209 private: |
| 1220 enum Type { | 1210 enum Type { |
| 1221 kExpression, | 1211 kExpression, |
| 1222 kIdentifierExpression, | 1212 kIdentifierExpression, |
| 1223 kStringLiteralExpression, | 1213 kStringLiteralExpression, |
| 1224 kBinaryOperationExpression, | 1214 kBinaryOperationExpression, |
| 1225 kSpreadExpression | 1215 kSpreadExpression |
| 1226 }; | 1216 }; |
| 1227 | 1217 |
| 1228 enum Parenthesization { | |
| 1229 kNotParenthesized, | |
| 1230 kParanthesizedExpression, | |
| 1231 kMultiParenthesizedExpression | |
| 1232 }; | |
| 1233 | |
| 1234 enum ExpressionType { | 1218 enum ExpressionType { |
| 1235 kThisExpression, | 1219 kThisExpression, |
| 1236 kThisPropertyExpression, | 1220 kThisPropertyExpression, |
| 1237 kPropertyExpression, | 1221 kPropertyExpression, |
| 1238 kCallExpression, | 1222 kCallExpression, |
| 1239 kNoTemplateTagExpression | 1223 kNoTemplateTagExpression |
| 1240 }; | 1224 }; |
| 1241 | 1225 |
| 1242 explicit PreParserExpression(uint32_t expression_code) | 1226 explicit PreParserExpression(uint32_t expression_code) |
| 1243 : code_(expression_code) {} | 1227 : code_(expression_code) {} |
| 1244 | 1228 |
| 1245 // The first five bits are for the Type and Parenthesization. | 1229 // The first three bits are for the Type. |
| 1246 typedef BitField<Type, 0, 3> TypeField; | 1230 typedef BitField<Type, 0, 3> TypeField; |
| 1247 typedef BitField<Parenthesization, TypeField::kNext, 2> ParenthesizationField; | |
| 1248 | 1231 |
| 1249 // The rest of the bits are interpreted depending on the value | 1232 // The rest of the bits are interpreted depending on the value |
| 1250 // of the Type field, so they can share the storage. | 1233 // of the Type field, so they can share the storage. |
| 1251 typedef BitField<ExpressionType, ParenthesizationField::kNext, 3> | 1234 typedef BitField<ExpressionType, TypeField::kNext, 3> ExpressionTypeField; |
| 1252 ExpressionTypeField; | 1235 typedef BitField<bool, TypeField::kNext, 1> IsUseStrictField; |
| 1253 typedef BitField<bool, ParenthesizationField::kNext, 1> IsUseStrictField; | |
| 1254 typedef BitField<bool, IsUseStrictField::kNext, 1> IsUseStrongField; | 1236 typedef BitField<bool, IsUseStrictField::kNext, 1> IsUseStrongField; |
| 1255 typedef BitField<PreParserIdentifier::Type, ParenthesizationField::kNext, 10> | 1237 typedef BitField<PreParserIdentifier::Type, TypeField::kNext, 10> |
| 1256 IdentifierTypeField; | 1238 IdentifierTypeField; |
| 1257 | 1239 |
| 1258 uint32_t code_; | 1240 uint32_t code_; |
| 1259 }; | 1241 }; |
| 1260 | 1242 |
| 1261 | 1243 |
| 1262 // The pre-parser doesn't need to build lists of expressions, identifiers, or | 1244 // The pre-parser doesn't need to build lists of expressions, identifiers, or |
| 1263 // the like. | 1245 // the like. |
| 1264 template <typename T> | 1246 template <typename T> |
| 1265 class PreParserList { | 1247 class PreParserList { |
| (...skipping 1099 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2365 scope->set_start_position(beg_pos); | 2347 scope->set_start_position(beg_pos); |
| 2366 ExpressionClassifier args_classifier; | 2348 ExpressionClassifier args_classifier; |
| 2367 bool has_rest = false; | 2349 bool has_rest = false; |
| 2368 result = this->ParseArrowFunctionLiteral(scope, has_rest, | 2350 result = this->ParseArrowFunctionLiteral(scope, has_rest, |
| 2369 args_classifier, CHECK_OK); | 2351 args_classifier, CHECK_OK); |
| 2370 } else { | 2352 } else { |
| 2371 // Heuristically try to detect immediately called functions before | 2353 // Heuristically try to detect immediately called functions before |
| 2372 // seeing the call parentheses. | 2354 // seeing the call parentheses. |
| 2373 parenthesized_function_ = (peek() == Token::FUNCTION); | 2355 parenthesized_function_ = (peek() == Token::FUNCTION); |
| 2374 result = this->ParseExpression(true, classifier, CHECK_OK); | 2356 result = this->ParseExpression(true, classifier, CHECK_OK); |
| 2375 result->increase_parenthesization_level(); | |
| 2376 Expect(Token::RPAREN, CHECK_OK); | 2357 Expect(Token::RPAREN, CHECK_OK); |
| 2377 } | 2358 } |
| 2378 break; | 2359 break; |
| 2379 | 2360 |
| 2380 case Token::CLASS: { | 2361 case Token::CLASS: { |
| 2381 BindingPatternUnexpectedToken(classifier); | 2362 BindingPatternUnexpectedToken(classifier); |
| 2382 Consume(Token::CLASS); | 2363 Consume(Token::CLASS); |
| 2383 if (!allow_harmony_sloppy() && is_sloppy(language_mode())) { | 2364 if (!allow_harmony_sloppy() && is_sloppy(language_mode())) { |
| 2384 ReportMessage("sloppy_lexical"); | 2365 ReportMessage("sloppy_lexical"); |
| 2385 *ok = false; | 2366 *ok = false; |
| (...skipping 1554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3940 *ok = false; | 3921 *ok = false; |
| 3941 return; | 3922 return; |
| 3942 } | 3923 } |
| 3943 has_seen_constructor_ = true; | 3924 has_seen_constructor_ = true; |
| 3944 return; | 3925 return; |
| 3945 } | 3926 } |
| 3946 } | 3927 } |
| 3947 } } // v8::internal | 3928 } } // v8::internal |
| 3948 | 3929 |
| 3949 #endif // V8_PREPARSER_H | 3930 #endif // V8_PREPARSER_H |
| OLD | NEW |