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 1396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1407 return PreParserExpression::Default(); | 1407 return PreParserExpression::Default(); |
1408 } | 1408 } |
1409 | 1409 |
1410 static PreParserExpression ExpressionFromLiteral( | 1410 static PreParserExpression ExpressionFromLiteral( |
1411 Token::Value token, int pos, Scanner* scanner, | 1411 Token::Value token, int pos, Scanner* scanner, |
1412 PreParserFactory* factory) { | 1412 PreParserFactory* factory) { |
1413 return PreParserExpression::Default(); | 1413 return PreParserExpression::Default(); |
1414 } | 1414 } |
1415 | 1415 |
1416 static PreParserExpression ExpressionFromIdentifier( | 1416 static PreParserExpression ExpressionFromIdentifier( |
1417 PreParserIdentifier name, int pos, Scope* scope, | 1417 PreParserIdentifier name, int start_position, int end_position, |
1418 PreParserFactory* factory) { | 1418 Scope* scope, PreParserFactory* factory) { |
1419 return PreParserExpression::FromIdentifier(name); | 1419 return PreParserExpression::FromIdentifier(name); |
1420 } | 1420 } |
1421 | 1421 |
1422 PreParserExpression ExpressionFromString(int pos, | 1422 PreParserExpression ExpressionFromString(int pos, |
1423 Scanner* scanner, | 1423 Scanner* scanner, |
1424 PreParserFactory* factory = NULL); | 1424 PreParserFactory* factory = NULL); |
1425 | 1425 |
1426 PreParserExpression GetIterator(PreParserExpression iterable, | 1426 PreParserExpression GetIterator(PreParserExpression iterable, |
1427 PreParserFactory* factory) { | 1427 PreParserFactory* factory) { |
1428 return PreParserExpression::Default(); | 1428 return PreParserExpression::Default(); |
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1858 // Identifier | 1858 // Identifier |
1859 // Number | 1859 // Number |
1860 // String | 1860 // String |
1861 // ArrayLiteral | 1861 // ArrayLiteral |
1862 // ObjectLiteral | 1862 // ObjectLiteral |
1863 // RegExpLiteral | 1863 // RegExpLiteral |
1864 // ClassLiteral | 1864 // ClassLiteral |
1865 // '(' Expression ')' | 1865 // '(' Expression ')' |
1866 // TemplateLiteral | 1866 // TemplateLiteral |
1867 | 1867 |
1868 int pos = peek_position(); | 1868 int beg_pos = scanner()->peek_location().beg_pos; |
| 1869 int end_pos = scanner()->peek_location().end_pos; |
1869 ExpressionT result = this->EmptyExpression(); | 1870 ExpressionT result = this->EmptyExpression(); |
1870 Token::Value token = peek(); | 1871 Token::Value token = peek(); |
1871 switch (token) { | 1872 switch (token) { |
1872 case Token::THIS: { | 1873 case Token::THIS: { |
1873 Consume(Token::THIS); | 1874 Consume(Token::THIS); |
1874 scope_->RecordThisUsage(); | 1875 scope_->RecordThisUsage(); |
1875 result = this->ThisExpression(scope_, factory(), pos); | 1876 result = this->ThisExpression(scope_, factory(), beg_pos); |
1876 break; | 1877 break; |
1877 } | 1878 } |
1878 | 1879 |
1879 case Token::NULL_LITERAL: | 1880 case Token::NULL_LITERAL: |
1880 case Token::TRUE_LITERAL: | 1881 case Token::TRUE_LITERAL: |
1881 case Token::FALSE_LITERAL: | 1882 case Token::FALSE_LITERAL: |
1882 case Token::NUMBER: | 1883 case Token::NUMBER: |
1883 Next(); | 1884 Next(); |
1884 result = this->ExpressionFromLiteral(token, pos, scanner(), factory()); | 1885 result = |
| 1886 this->ExpressionFromLiteral(token, beg_pos, scanner(), factory()); |
1885 break; | 1887 break; |
1886 | 1888 |
1887 case Token::IDENTIFIER: | 1889 case Token::IDENTIFIER: |
1888 case Token::LET: | 1890 case Token::LET: |
1889 case Token::STATIC: | 1891 case Token::STATIC: |
1890 case Token::YIELD: | 1892 case Token::YIELD: |
1891 case Token::FUTURE_STRICT_RESERVED_WORD: { | 1893 case Token::FUTURE_STRICT_RESERVED_WORD: { |
1892 // Using eval or arguments in this context is OK even in strict mode. | 1894 // Using eval or arguments in this context is OK even in strict mode. |
1893 IdentifierT name = ParseIdentifier(kAllowEvalOrArguments, CHECK_OK); | 1895 IdentifierT name = ParseIdentifier(kAllowEvalOrArguments, CHECK_OK); |
1894 result = this->ExpressionFromIdentifier(name, pos, scope_, factory()); | 1896 result = this->ExpressionFromIdentifier(name, beg_pos, end_pos, scope_, |
| 1897 factory()); |
1895 break; | 1898 break; |
1896 } | 1899 } |
1897 | 1900 |
1898 case Token::STRING: { | 1901 case Token::STRING: { |
1899 Consume(Token::STRING); | 1902 Consume(Token::STRING); |
1900 result = this->ExpressionFromString(pos, scanner(), factory()); | 1903 result = this->ExpressionFromString(beg_pos, scanner(), factory()); |
1901 break; | 1904 break; |
1902 } | 1905 } |
1903 | 1906 |
1904 case Token::ASSIGN_DIV: | 1907 case Token::ASSIGN_DIV: |
1905 result = this->ParseRegExpLiteral(true, CHECK_OK); | 1908 result = this->ParseRegExpLiteral(true, CHECK_OK); |
1906 break; | 1909 break; |
1907 | 1910 |
1908 case Token::DIV: | 1911 case Token::DIV: |
1909 result = this->ParseRegExpLiteral(false, CHECK_OK); | 1912 result = this->ParseRegExpLiteral(false, CHECK_OK); |
1910 break; | 1913 break; |
1911 | 1914 |
1912 case Token::LBRACK: | 1915 case Token::LBRACK: |
1913 result = this->ParseArrayLiteral(CHECK_OK); | 1916 result = this->ParseArrayLiteral(CHECK_OK); |
1914 break; | 1917 break; |
1915 | 1918 |
1916 case Token::LBRACE: | 1919 case Token::LBRACE: |
1917 result = this->ParseObjectLiteral(CHECK_OK); | 1920 result = this->ParseObjectLiteral(CHECK_OK); |
1918 break; | 1921 break; |
1919 | 1922 |
1920 case Token::LPAREN: | 1923 case Token::LPAREN: |
1921 Consume(Token::LPAREN); | 1924 Consume(Token::LPAREN); |
1922 if (allow_harmony_arrow_functions() && peek() == Token::RPAREN) { | 1925 if (allow_harmony_arrow_functions() && peek() == Token::RPAREN) { |
1923 // Arrow functions are the only expression type constructions | 1926 // Arrow functions are the only expression type constructions |
1924 // for which an empty parameter list "()" is valid input. | 1927 // for which an empty parameter list "()" is valid input. |
1925 Consume(Token::RPAREN); | 1928 Consume(Token::RPAREN); |
1926 result = this->ParseArrowFunctionLiteral( | 1929 result = this->ParseArrowFunctionLiteral( |
1927 pos, this->EmptyArrowParamList(), CHECK_OK); | 1930 beg_pos, this->EmptyArrowParamList(), CHECK_OK); |
1928 } else { | 1931 } else { |
1929 // Heuristically try to detect immediately called functions before | 1932 // Heuristically try to detect immediately called functions before |
1930 // seeing the call parentheses. | 1933 // seeing the call parentheses. |
1931 parenthesized_function_ = (peek() == Token::FUNCTION); | 1934 parenthesized_function_ = (peek() == Token::FUNCTION); |
1932 result = this->ParseExpression(true, CHECK_OK); | 1935 result = this->ParseExpression(true, CHECK_OK); |
1933 result->increase_parenthesization_level(); | 1936 result->increase_parenthesization_level(); |
1934 Expect(Token::RPAREN, CHECK_OK); | 1937 Expect(Token::RPAREN, CHECK_OK); |
1935 } | 1938 } |
1936 break; | 1939 break; |
1937 | 1940 |
(...skipping 14 matching lines...) Expand all Loading... |
1952 class_name_location = scanner()->location(); | 1955 class_name_location = scanner()->location(); |
1953 } | 1956 } |
1954 result = this->ParseClassLiteral(name, class_name_location, | 1957 result = this->ParseClassLiteral(name, class_name_location, |
1955 is_strict_reserved_name, | 1958 is_strict_reserved_name, |
1956 class_token_position, CHECK_OK); | 1959 class_token_position, CHECK_OK); |
1957 break; | 1960 break; |
1958 } | 1961 } |
1959 | 1962 |
1960 case Token::TEMPLATE_SPAN: | 1963 case Token::TEMPLATE_SPAN: |
1961 case Token::TEMPLATE_TAIL: | 1964 case Token::TEMPLATE_TAIL: |
1962 result = | 1965 result = this->ParseTemplateLiteral(Traits::NoTemplateTag(), beg_pos, |
1963 this->ParseTemplateLiteral(Traits::NoTemplateTag(), pos, CHECK_OK); | 1966 CHECK_OK); |
1964 break; | 1967 break; |
1965 | 1968 |
1966 case Token::MOD: | 1969 case Token::MOD: |
1967 if (allow_natives() || extension_ != NULL) { | 1970 if (allow_natives() || extension_ != NULL) { |
1968 result = this->ParseV8Intrinsic(CHECK_OK); | 1971 result = this->ParseV8Intrinsic(CHECK_OK); |
1969 break; | 1972 break; |
1970 } | 1973 } |
1971 // If we're not allowing special syntax we fall-through to the | 1974 // If we're not allowing special syntax we fall-through to the |
1972 // default case. | 1975 // default case. |
1973 | 1976 |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2099 bool* ok) { | 2102 bool* ok) { |
2100 DCHECK(!in_class || is_static || has_seen_constructor != nullptr); | 2103 DCHECK(!in_class || is_static || has_seen_constructor != nullptr); |
2101 ExpressionT value = this->EmptyExpression(); | 2104 ExpressionT value = this->EmptyExpression(); |
2102 IdentifierT name = this->EmptyIdentifier(); | 2105 IdentifierT name = this->EmptyIdentifier(); |
2103 bool is_get = false; | 2106 bool is_get = false; |
2104 bool is_set = false; | 2107 bool is_set = false; |
2105 bool name_is_static = false; | 2108 bool name_is_static = false; |
2106 bool is_generator = allow_harmony_object_literals_ && Check(Token::MUL); | 2109 bool is_generator = allow_harmony_object_literals_ && Check(Token::MUL); |
2107 | 2110 |
2108 Token::Value name_token = peek(); | 2111 Token::Value name_token = peek(); |
2109 int next_pos = peek_position(); | 2112 int next_beg_pos = scanner()->peek_location().beg_pos; |
| 2113 int next_end_pos = scanner()->peek_location().end_pos; |
2110 ExpressionT name_expression = ParsePropertyName( | 2114 ExpressionT name_expression = ParsePropertyName( |
2111 &name, &is_get, &is_set, &name_is_static, is_computed_name, | 2115 &name, &is_get, &is_set, &name_is_static, is_computed_name, |
2112 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); | 2116 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
2113 | 2117 |
2114 if (fni_ != nullptr && !*is_computed_name) { | 2118 if (fni_ != nullptr && !*is_computed_name) { |
2115 this->PushLiteralName(fni_, name); | 2119 this->PushLiteralName(fni_, name); |
2116 } | 2120 } |
2117 | 2121 |
2118 if (!in_class && !is_generator && peek() == Token::COLON) { | 2122 if (!in_class && !is_generator && peek() == Token::COLON) { |
2119 // PropertyDefinition : PropertyName ':' AssignmentExpression | 2123 // PropertyDefinition : PropertyName ':' AssignmentExpression |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2194 return factory()->NewObjectLiteralProperty( | 2198 return factory()->NewObjectLiteralProperty( |
2195 name_expression, value, | 2199 name_expression, value, |
2196 is_get ? ObjectLiteralProperty::GETTER : ObjectLiteralProperty::SETTER, | 2200 is_get ? ObjectLiteralProperty::GETTER : ObjectLiteralProperty::SETTER, |
2197 is_static, *is_computed_name); | 2201 is_static, *is_computed_name); |
2198 | 2202 |
2199 } else if (!in_class && allow_harmony_object_literals_ && | 2203 } else if (!in_class && allow_harmony_object_literals_ && |
2200 Token::IsIdentifier(name_token, language_mode(), | 2204 Token::IsIdentifier(name_token, language_mode(), |
2201 this->is_generator())) { | 2205 this->is_generator())) { |
2202 DCHECK(!*is_computed_name); | 2206 DCHECK(!*is_computed_name); |
2203 DCHECK(!is_static); | 2207 DCHECK(!is_static); |
2204 value = this->ExpressionFromIdentifier(name, next_pos, scope_, factory()); | 2208 value = this->ExpressionFromIdentifier(name, next_beg_pos, next_end_pos, |
| 2209 scope_, factory()); |
2205 return factory()->NewObjectLiteralProperty( | 2210 return factory()->NewObjectLiteralProperty( |
2206 name_expression, value, ObjectLiteralProperty::COMPUTED, false, false); | 2211 name_expression, value, ObjectLiteralProperty::COMPUTED, false, false); |
2207 | 2212 |
2208 } else { | 2213 } else { |
2209 Token::Value next = Next(); | 2214 Token::Value next = Next(); |
2210 ReportUnexpectedToken(next); | 2215 ReportUnexpectedToken(next); |
2211 *ok = false; | 2216 *ok = false; |
2212 return this->EmptyObjectLiteralProperty(); | 2217 return this->EmptyObjectLiteralProperty(); |
2213 } | 2218 } |
2214 | 2219 |
(...skipping 894 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3109 *ok = false; | 3114 *ok = false; |
3110 return; | 3115 return; |
3111 } | 3116 } |
3112 has_seen_constructor_ = true; | 3117 has_seen_constructor_ = true; |
3113 return; | 3118 return; |
3114 } | 3119 } |
3115 } | 3120 } |
3116 } } // v8::internal | 3121 } } // v8::internal |
3117 | 3122 |
3118 #endif // V8_PREPARSER_H | 3123 #endif // V8_PREPARSER_H |
OLD | NEW |