Chromium Code Reviews| 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 738 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 749 return PreParserExpression( | 749 return PreParserExpression( |
| 750 TypeField::encode(kExpression) | | 750 TypeField::encode(kExpression) | |
| 751 ExpressionTypeField::encode(kPropertyExpression)); | 751 ExpressionTypeField::encode(kPropertyExpression)); |
| 752 } | 752 } |
| 753 | 753 |
| 754 static PreParserExpression Call() { | 754 static PreParserExpression Call() { |
| 755 return PreParserExpression(TypeField::encode(kExpression) | | 755 return PreParserExpression(TypeField::encode(kExpression) | |
| 756 ExpressionTypeField::encode(kCallExpression)); | 756 ExpressionTypeField::encode(kCallExpression)); |
| 757 } | 757 } |
| 758 | 758 |
| 759 static PreParserExpression NoTemplateTag() { | |
| 760 return PreParserExpression(TypeField::encode(kExpression) | | |
| 761 ExpressionTypeField::encode( | |
| 762 kNoTemplateTagExpression)); | |
|
arv (Not doing code reviews)
2014/12/11 15:29:38
Is this the formatting `git cl format` gives you?
caitp (gmail)
2014/12/11 16:14:04
clang-formatter doesn't complain about this becaus
| |
| 763 } | |
| 764 | |
| 759 bool IsIdentifier() const { | 765 bool IsIdentifier() const { |
| 760 return TypeField::decode(code_) == kIdentifierExpression; | 766 return TypeField::decode(code_) == kIdentifierExpression; |
| 761 } | 767 } |
| 762 | 768 |
| 763 PreParserIdentifier AsIdentifier() const { | 769 PreParserIdentifier AsIdentifier() const { |
| 764 DCHECK(IsIdentifier()); | 770 DCHECK(IsIdentifier()); |
| 765 return PreParserIdentifier(IdentifierTypeField::decode(code_)); | 771 return PreParserIdentifier(IdentifierTypeField::decode(code_)); |
| 766 } | 772 } |
| 767 | 773 |
| 768 bool IsStringLiteral() const { | 774 bool IsStringLiteral() const { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 802 bool IsValidArrowParamList() const { | 808 bool IsValidArrowParamList() const { |
| 803 return IsValidArrowParams() && | 809 return IsValidArrowParams() && |
| 804 ParenthesizationField::decode(code_) != | 810 ParenthesizationField::decode(code_) != |
| 805 kMultiParenthesizedExpression; | 811 kMultiParenthesizedExpression; |
| 806 } | 812 } |
| 807 | 813 |
| 808 // At the moment PreParser doesn't track these expression types. | 814 // At the moment PreParser doesn't track these expression types. |
| 809 bool IsFunctionLiteral() const { return false; } | 815 bool IsFunctionLiteral() const { return false; } |
| 810 bool IsCallNew() const { return false; } | 816 bool IsCallNew() const { return false; } |
| 811 | 817 |
| 818 bool IsNoTemplateTag() const { | |
| 819 return TypeField::decode(code_) == kExpression && | |
| 820 ExpressionTypeField::decode(code_) == kNoTemplateTagExpression; | |
| 821 } | |
| 822 | |
| 812 PreParserExpression AsFunctionLiteral() { return *this; } | 823 PreParserExpression AsFunctionLiteral() { return *this; } |
| 813 | 824 |
| 814 bool IsBinaryOperation() const { | 825 bool IsBinaryOperation() const { |
| 815 return TypeField::decode(code_) == kBinaryOperationExpression; | 826 return TypeField::decode(code_) == kBinaryOperationExpression; |
| 816 } | 827 } |
| 817 | 828 |
| 818 bool is_parenthesized() const { | 829 bool is_parenthesized() const { |
| 819 return ParenthesizationField::decode(code_) != kNotParenthesized; | 830 return ParenthesizationField::decode(code_) != kNotParenthesized; |
| 820 } | 831 } |
| 821 | 832 |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 848 kNotParenthesized, | 859 kNotParenthesized, |
| 849 kParanthesizedExpression, | 860 kParanthesizedExpression, |
| 850 kMultiParenthesizedExpression | 861 kMultiParenthesizedExpression |
| 851 }; | 862 }; |
| 852 | 863 |
| 853 enum ExpressionType { | 864 enum ExpressionType { |
| 854 kThisExpression, | 865 kThisExpression, |
| 855 kThisPropertyExpression, | 866 kThisPropertyExpression, |
| 856 kPropertyExpression, | 867 kPropertyExpression, |
| 857 kCallExpression, | 868 kCallExpression, |
| 858 kSuperExpression | 869 kSuperExpression, |
| 870 kNoTemplateTagExpression | |
| 859 }; | 871 }; |
| 860 | 872 |
| 861 explicit PreParserExpression(uint32_t expression_code) | 873 explicit PreParserExpression(uint32_t expression_code) |
| 862 : code_(expression_code) {} | 874 : code_(expression_code) {} |
| 863 | 875 |
| 864 V8_INLINE bool IsValidArrowParams() const { | 876 V8_INLINE bool IsValidArrowParams() const { |
| 865 return IsBinaryOperation() | 877 return IsBinaryOperation() |
| 866 ? IsValidArrowParamListField::decode(code_) | 878 ? IsValidArrowParamListField::decode(code_) |
| 867 : (IsIdentifier() && AsIdentifier().IsValidArrowParam()); | 879 : (IsIdentifier() && AsIdentifier().IsValidArrowParam()); |
| 868 } | 880 } |
| (...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1391 } | 1403 } |
| 1392 | 1404 |
| 1393 struct TemplateLiteralState {}; | 1405 struct TemplateLiteralState {}; |
| 1394 | 1406 |
| 1395 TemplateLiteralState OpenTemplateLiteral(int pos) { | 1407 TemplateLiteralState OpenTemplateLiteral(int pos) { |
| 1396 return TemplateLiteralState(); | 1408 return TemplateLiteralState(); |
| 1397 } | 1409 } |
| 1398 void AddTemplateSpan(TemplateLiteralState*, bool) {} | 1410 void AddTemplateSpan(TemplateLiteralState*, bool) {} |
| 1399 void AddTemplateExpression(TemplateLiteralState*, PreParserExpression) {} | 1411 void AddTemplateExpression(TemplateLiteralState*, PreParserExpression) {} |
| 1400 PreParserExpression CloseTemplateLiteral(TemplateLiteralState*, int, | 1412 PreParserExpression CloseTemplateLiteral(TemplateLiteralState*, int, |
| 1401 PreParserExpression) { | 1413 PreParserExpression tag) { |
| 1414 if (IsTaggedTemplate(tag)) { | |
| 1415 // Emulate generation of array literals for tag callsite | |
|
arv (Not doing code reviews)
2014/12/11 15:29:38
This comment goes better with PreParserTraits::Mat
| |
| 1416 // 1st is array of cooked strings, second is array of raw strings | |
| 1417 MaterializeTemplateCallsiteLiterals(); | |
| 1418 } | |
| 1402 return EmptyExpression(); | 1419 return EmptyExpression(); |
| 1403 } | 1420 } |
| 1404 PreParserExpression NoTemplateTag() { return PreParserExpression::Default(); } | 1421 inline void MaterializeTemplateCallsiteLiterals(); |
| 1422 PreParserExpression NoTemplateTag() { | |
| 1423 return PreParserExpression::NoTemplateTag(); | |
| 1424 } | |
| 1425 static bool IsTaggedTemplate(const PreParserExpression tag) { | |
| 1426 return !tag.IsNoTemplateTag(); | |
| 1427 } | |
| 1405 static AstValueFactory* ast_value_factory() { return NULL; } | 1428 static AstValueFactory* ast_value_factory() { return NULL; } |
| 1406 | 1429 |
| 1407 void CheckConflictingVarDeclarations(PreParserScope scope, bool* ok) {} | 1430 void CheckConflictingVarDeclarations(PreParserScope scope, bool* ok) {} |
| 1408 | 1431 |
| 1409 // Temporary glue; these functions will move to ParserBase. | 1432 // Temporary glue; these functions will move to ParserBase. |
| 1410 PreParserExpression ParseV8Intrinsic(bool* ok); | 1433 PreParserExpression ParseV8Intrinsic(bool* ok); |
| 1411 PreParserExpression ParseFunctionLiteral( | 1434 PreParserExpression ParseFunctionLiteral( |
| 1412 PreParserIdentifier name, Scanner::Location function_name_location, | 1435 PreParserIdentifier name, Scanner::Location function_name_location, |
| 1413 bool name_is_strict_reserved, FunctionKind kind, | 1436 bool name_is_strict_reserved, FunctionKind kind, |
| 1414 int function_token_position, FunctionLiteral::FunctionType type, | 1437 int function_token_position, FunctionLiteral::FunctionType type, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1448 }; | 1471 }; |
| 1449 | 1472 |
| 1450 PreParser(Scanner* scanner, ParserRecorder* log, uintptr_t stack_limit) | 1473 PreParser(Scanner* scanner, ParserRecorder* log, uintptr_t stack_limit) |
| 1451 : ParserBase<PreParserTraits>(scanner, stack_limit, NULL, log, NULL, | 1474 : ParserBase<PreParserTraits>(scanner, stack_limit, NULL, log, NULL, |
| 1452 this) {} | 1475 this) {} |
| 1453 | 1476 |
| 1454 // Pre-parse the program from the character stream; returns true on | 1477 // Pre-parse the program from the character stream; returns true on |
| 1455 // success (even if parsing failed, the pre-parse data successfully | 1478 // success (even if parsing failed, the pre-parse data successfully |
| 1456 // captured the syntax error), and false if a stack-overflow happened | 1479 // captured the syntax error), and false if a stack-overflow happened |
| 1457 // during parsing. | 1480 // during parsing. |
| 1458 PreParseResult PreParseProgram() { | 1481 PreParseResult PreParseProgram(int* materialized_literals = 0) { |
| 1459 PreParserScope scope(scope_, SCRIPT_SCOPE); | 1482 PreParserScope scope(scope_, SCRIPT_SCOPE); |
| 1460 PreParserFactory factory(NULL); | 1483 PreParserFactory factory(NULL); |
| 1461 FunctionState top_scope(&function_state_, &scope_, &scope, &factory); | 1484 FunctionState top_scope(&function_state_, &scope_, &scope, &factory); |
| 1462 bool ok = true; | 1485 bool ok = true; |
| 1463 int start_position = scanner()->peek_location().beg_pos; | 1486 int start_position = scanner()->peek_location().beg_pos; |
| 1464 ParseSourceElements(Token::EOS, &ok); | 1487 ParseSourceElements(Token::EOS, &ok); |
| 1465 if (stack_overflow()) return kPreParseStackOverflow; | 1488 if (stack_overflow()) return kPreParseStackOverflow; |
| 1466 if (!ok) { | 1489 if (!ok) { |
| 1467 ReportUnexpectedToken(scanner()->current_token()); | 1490 ReportUnexpectedToken(scanner()->current_token()); |
| 1468 } else if (scope_->strict_mode() == STRICT) { | 1491 } else if (scope_->strict_mode() == STRICT) { |
| 1469 CheckOctalLiteral(start_position, scanner()->location().end_pos, &ok); | 1492 CheckOctalLiteral(start_position, scanner()->location().end_pos, &ok); |
| 1470 } | 1493 } |
| 1494 if (materialized_literals) { | |
| 1495 *materialized_literals = function_state_->materialized_literal_count(); | |
| 1496 } | |
| 1471 return kPreParseSuccess; | 1497 return kPreParseSuccess; |
| 1472 } | 1498 } |
| 1473 | 1499 |
| 1474 // Parses a single function literal, from the opening parentheses before | 1500 // Parses a single function literal, from the opening parentheses before |
| 1475 // parameters to the closing brace after the body. | 1501 // parameters to the closing brace after the body. |
| 1476 // Returns a FunctionEntry describing the body of the function in enough | 1502 // Returns a FunctionEntry describing the body of the function in enough |
| 1477 // detail that it can be lazily compiled. | 1503 // detail that it can be lazily compiled. |
| 1478 // The scanner is expected to have matched the "function" or "function*" | 1504 // The scanner is expected to have matched the "function" or "function*" |
| 1479 // keyword and parameters, and have consumed the initial '{'. | 1505 // keyword and parameters, and have consumed the initial '{'. |
| 1480 // At return, unless an error occurred, the scanner is positioned before the | 1506 // At return, unless an error occurred, the scanner is positioned before the |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1558 | 1584 |
| 1559 PreParserExpression ParseClassLiteral(PreParserIdentifier name, | 1585 PreParserExpression ParseClassLiteral(PreParserIdentifier name, |
| 1560 Scanner::Location class_name_location, | 1586 Scanner::Location class_name_location, |
| 1561 bool name_is_strict_reserved, int pos, | 1587 bool name_is_strict_reserved, int pos, |
| 1562 bool* ok); | 1588 bool* ok); |
| 1563 | 1589 |
| 1564 bool CheckInOrOf(bool accept_OF); | 1590 bool CheckInOrOf(bool accept_OF); |
| 1565 }; | 1591 }; |
| 1566 | 1592 |
| 1567 | 1593 |
| 1594 void PreParserTraits::MaterializeTemplateCallsiteLiterals() { | |
| 1595 pre_parser_->function_state_->NextMaterializedLiteralIndex(); | |
| 1596 pre_parser_->function_state_->NextMaterializedLiteralIndex(); | |
| 1597 } | |
| 1598 | |
| 1599 | |
| 1568 PreParserStatementList PreParser::ParseEagerFunctionBody( | 1600 PreParserStatementList PreParser::ParseEagerFunctionBody( |
| 1569 PreParserIdentifier function_name, int pos, Variable* fvar, | 1601 PreParserIdentifier function_name, int pos, Variable* fvar, |
| 1570 Token::Value fvar_init_op, bool is_generator, bool* ok) { | 1602 Token::Value fvar_init_op, bool is_generator, bool* ok) { |
| 1571 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); | 1603 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); |
| 1572 | 1604 |
| 1573 ParseSourceElements(Token::RBRACE, ok); | 1605 ParseSourceElements(Token::RBRACE, ok); |
| 1574 if (!*ok) return PreParserStatementList(); | 1606 if (!*ok) return PreParserStatementList(); |
| 1575 | 1607 |
| 1576 Expect(Token::RBRACE, ok); | 1608 Expect(Token::RBRACE, ok); |
| 1577 return PreParserStatementList(); | 1609 return PreParserStatementList(); |
| (...skipping 1344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2922 DCHECK(IsAccessorAccessorConflict(old_type, type)); | 2954 DCHECK(IsAccessorAccessorConflict(old_type, type)); |
| 2923 // Both accessors of the same type. | 2955 // Both accessors of the same type. |
| 2924 parser()->ReportMessage("accessor_get_set"); | 2956 parser()->ReportMessage("accessor_get_set"); |
| 2925 } | 2957 } |
| 2926 *ok = false; | 2958 *ok = false; |
| 2927 } | 2959 } |
| 2928 } | 2960 } |
| 2929 } } // v8::internal | 2961 } } // v8::internal |
| 2930 | 2962 |
| 2931 #endif // V8_PREPARSER_H | 2963 #endif // V8_PREPARSER_H |
| OLD | NEW |