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_PARSING_PARSER_BASE_H | 5 #ifndef V8_PARSING_PARSER_BASE_H |
| 6 #define V8_PARSING_PARSER_BASE_H | 6 #define V8_PARSING_PARSER_BASE_H |
| 7 | 7 |
| 8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
| 9 #include "src/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
| 10 #include "src/hashmap.h" | 10 #include "src/hashmap.h" |
| (...skipping 1802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1813 template <class Traits> | 1813 template <class Traits> |
| 1814 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseObjectLiteral( | 1814 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseObjectLiteral( |
| 1815 ExpressionClassifier* classifier, bool* ok) { | 1815 ExpressionClassifier* classifier, bool* ok) { |
| 1816 // ObjectLiteral :: | 1816 // ObjectLiteral :: |
| 1817 // '{' (PropertyDefinition (',' PropertyDefinition)* ','? )? '}' | 1817 // '{' (PropertyDefinition (',' PropertyDefinition)* ','? )? '}' |
| 1818 | 1818 |
| 1819 int pos = peek_position(); | 1819 int pos = peek_position(); |
| 1820 typename Traits::Type::PropertyList properties = | 1820 typename Traits::Type::PropertyList properties = |
| 1821 this->NewPropertyList(4, zone_); | 1821 this->NewPropertyList(4, zone_); |
| 1822 int number_of_boilerplate_properties = 0; | 1822 int number_of_boilerplate_properties = 0; |
| 1823 bool has_function = false; | |
| 1824 bool has_computed_names = false; | 1823 bool has_computed_names = false; |
| 1825 ObjectLiteralChecker checker(this); | 1824 ObjectLiteralChecker checker(this); |
| 1826 | 1825 |
| 1827 Expect(Token::LBRACE, CHECK_OK); | 1826 Expect(Token::LBRACE, CHECK_OK); |
| 1828 | 1827 |
| 1829 while (peek() != Token::RBRACE) { | 1828 while (peek() != Token::RBRACE) { |
| 1830 FuncNameInferrer::State fni_state(fni_); | 1829 FuncNameInferrer::State fni_state(fni_); |
| 1831 | 1830 |
| 1832 const bool in_class = false; | 1831 const bool in_class = false; |
| 1833 const bool is_static = false; | 1832 const bool is_static = false; |
| 1834 const bool has_extends = false; | 1833 const bool has_extends = false; |
| 1835 bool is_computed_name = false; | 1834 bool is_computed_name = false; |
| 1836 IdentifierT name = this->EmptyIdentifier(); | 1835 IdentifierT name = this->EmptyIdentifier(); |
| 1837 ObjectLiteralPropertyT property = this->ParsePropertyDefinition( | 1836 ObjectLiteralPropertyT property = this->ParsePropertyDefinition( |
| 1838 &checker, in_class, has_extends, is_static, &is_computed_name, NULL, | 1837 &checker, in_class, has_extends, is_static, &is_computed_name, NULL, |
| 1839 classifier, &name, CHECK_OK); | 1838 classifier, &name, CHECK_OK); |
| 1840 | 1839 |
| 1841 if (is_computed_name) { | 1840 if (is_computed_name) { |
| 1842 has_computed_names = true; | 1841 has_computed_names = true; |
| 1843 } | 1842 } |
| 1844 | 1843 |
| 1845 // Mark top-level object literals that contain function literals and | 1844 // Mark top-level object literals that contain function literals and |
|
adamk
2016/03/08 19:56:49
This is probably the comment that gave me that ide
| |
| 1846 // pretenure the literal so it can be added as a constant function | 1845 // pretenure the literal so it can be added as a constant function |
| 1847 // property. (Parser only.) | 1846 // property. (Parser only.) |
| 1848 this->CheckFunctionLiteralInsideTopLevelObjectLiteral(scope_, property, | 1847 this->CheckFunctionLiteralInsideTopLevelObjectLiteral(scope_, property); |
| 1849 &has_function); | |
| 1850 | 1848 |
| 1851 // Count CONSTANT or COMPUTED properties to maintain the enumeration order. | 1849 // Count CONSTANT or COMPUTED properties to maintain the enumeration order. |
| 1852 if (!has_computed_names && this->IsBoilerplateProperty(property)) { | 1850 if (!has_computed_names && this->IsBoilerplateProperty(property)) { |
| 1853 number_of_boilerplate_properties++; | 1851 number_of_boilerplate_properties++; |
| 1854 } | 1852 } |
| 1855 properties->Add(property, zone()); | 1853 properties->Add(property, zone()); |
| 1856 | 1854 |
| 1857 if (peek() != Token::RBRACE) { | 1855 if (peek() != Token::RBRACE) { |
| 1858 // Need {} because of the CHECK_OK macro. | 1856 // Need {} because of the CHECK_OK macro. |
| 1859 Expect(Token::COMMA, CHECK_OK); | 1857 Expect(Token::COMMA, CHECK_OK); |
| 1860 } | 1858 } |
| 1861 | 1859 |
| 1862 if (fni_ != nullptr) fni_->Infer(); | 1860 if (fni_ != nullptr) fni_->Infer(); |
| 1863 | 1861 |
| 1864 if (allow_harmony_function_name()) { | 1862 if (allow_harmony_function_name()) { |
| 1865 Traits::SetFunctionNameFromPropertyName(property, name); | 1863 Traits::SetFunctionNameFromPropertyName(property, name); |
| 1866 } | 1864 } |
| 1867 } | 1865 } |
| 1868 Expect(Token::RBRACE, CHECK_OK); | 1866 Expect(Token::RBRACE, CHECK_OK); |
| 1869 | 1867 |
| 1870 // Computation of literal_index must happen before pre parse bailout. | 1868 // Computation of literal_index must happen before pre parse bailout. |
| 1871 int literal_index = function_state_->NextMaterializedLiteralIndex(); | 1869 int literal_index = function_state_->NextMaterializedLiteralIndex(); |
| 1872 | 1870 |
| 1873 return factory()->NewObjectLiteral(properties, | 1871 return factory()->NewObjectLiteral(properties, |
| 1874 literal_index, | 1872 literal_index, |
| 1875 number_of_boilerplate_properties, | 1873 number_of_boilerplate_properties, |
| 1876 has_function, | |
| 1877 pos); | 1874 pos); |
| 1878 } | 1875 } |
| 1879 | 1876 |
| 1880 | 1877 |
| 1881 template <class Traits> | 1878 template <class Traits> |
| 1882 typename Traits::Type::ExpressionList ParserBase<Traits>::ParseArguments( | 1879 typename Traits::Type::ExpressionList ParserBase<Traits>::ParseArguments( |
| 1883 Scanner::Location* first_spread_arg_loc, ExpressionClassifier* classifier, | 1880 Scanner::Location* first_spread_arg_loc, ExpressionClassifier* classifier, |
| 1884 bool* ok) { | 1881 bool* ok) { |
| 1885 // Arguments :: | 1882 // Arguments :: |
| 1886 // '(' (AssignmentExpression)*[','] ')' | 1883 // '(' (AssignmentExpression)*[','] ')' |
| (...skipping 1482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3369 has_seen_constructor_ = true; | 3366 has_seen_constructor_ = true; |
| 3370 return; | 3367 return; |
| 3371 } | 3368 } |
| 3372 } | 3369 } |
| 3373 | 3370 |
| 3374 | 3371 |
| 3375 } // namespace internal | 3372 } // namespace internal |
| 3376 } // namespace v8 | 3373 } // namespace v8 |
| 3377 | 3374 |
| 3378 #endif // V8_PARSING_PARSER_BASE_H | 3375 #endif // V8_PARSING_PARSER_BASE_H |
| OLD | NEW |