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

Side by Side Diff: src/preparser.h

Issue 1024063002: [strong] checking of this & super in constructors (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Comments Created 5 years, 8 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
OLDNEW
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 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 int materialized_literal_count() { 210 int materialized_literal_count() {
211 return next_materialized_literal_index_; 211 return next_materialized_literal_index_;
212 } 212 }
213 213
214 int NextHandlerIndex() { return next_handler_index_++; } 214 int NextHandlerIndex() { return next_handler_index_++; }
215 int handler_count() { return next_handler_index_; } 215 int handler_count() { return next_handler_index_; }
216 216
217 void AddProperty() { expected_property_count_++; } 217 void AddProperty() { expected_property_count_++; }
218 int expected_property_count() { return expected_property_count_; } 218 int expected_property_count() { return expected_property_count_; }
219 219
220 Scanner::Location this_location() const { return this_location_; }
221 Scanner::Location super_location() const { return super_location_; }
220 Scanner::Location return_location() const { return return_location_; } 222 Scanner::Location return_location() const { return return_location_; }
221 Scanner::Location super_call_location() const { 223 void set_this_location(Scanner::Location location) {
222 return super_call_location_; 224 this_location_ = location;
225 }
226 void set_super_location(Scanner::Location location) {
227 super_location_ = location;
223 } 228 }
224 void set_return_location(Scanner::Location location) { 229 void set_return_location(Scanner::Location location) {
225 return_location_ = location; 230 return_location_ = location;
226 } 231 }
227 void set_super_call_location(Scanner::Location location) {
228 super_call_location_ = location;
229 }
230 232
231 bool is_generator() const { return IsGeneratorFunction(kind_); } 233 bool is_generator() const { return IsGeneratorFunction(kind_); }
232 234
233 FunctionKind kind() const { return kind_; } 235 FunctionKind kind() const { return kind_; }
234 FunctionState* outer() const { return outer_function_state_; } 236 FunctionState* outer() const { return outer_function_state_; }
235 237
236 void set_generator_object_variable( 238 void set_generator_object_variable(
237 typename Traits::Type::GeneratorVariable* variable) { 239 typename Traits::Type::GeneratorVariable* variable) {
238 DCHECK(variable != NULL); 240 DCHECK(variable != NULL);
239 DCHECK(is_generator()); 241 DCHECK(is_generator());
(...skipping 11 matching lines...) Expand all
251 // the function. Includes regexp literals, and boilerplate for object and 253 // the function. Includes regexp literals, and boilerplate for object and
252 // array literals. 254 // array literals.
253 int next_materialized_literal_index_; 255 int next_materialized_literal_index_;
254 256
255 // Used to assign a per-function index to try and catch handlers. 257 // Used to assign a per-function index to try and catch handlers.
256 int next_handler_index_; 258 int next_handler_index_;
257 259
258 // Properties count estimation. 260 // Properties count estimation.
259 int expected_property_count_; 261 int expected_property_count_;
260 262
263 // Location of most recent use of 'this' (invalid if none).
264 Scanner::Location this_location_;
265
261 // Location of most recent 'return' statement (invalid if none). 266 // Location of most recent 'return' statement (invalid if none).
262 Scanner::Location return_location_; 267 Scanner::Location return_location_;
263 268
264 // Location of call to the "super" constructor (invalid if none). 269 // Location of call to the "super" constructor (invalid if none).
265 Scanner::Location super_call_location_; 270 Scanner::Location super_location_;
266 271
267 FunctionKind kind_; 272 FunctionKind kind_;
268 // For generators, this variable may hold the generator object. It variable 273 // For generators, this variable may hold the generator object. It variable
269 // is used by yield expressions and return statements. It is not necessary 274 // is used by yield expressions and return statements. It is not necessary
270 // for generator functions to have this variable set. 275 // for generator functions to have this variable set.
271 Variable* generator_object_variable_; 276 Variable* generator_object_variable_;
272 277
273 FunctionState** function_state_stack_; 278 FunctionState** function_state_stack_;
274 FunctionState* outer_function_state_; 279 FunctionState* outer_function_state_;
275 Scope** scope_stack_; 280 Scope** scope_stack_;
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 ExpressionT ParseLeftHandSideExpression(bool* ok); 602 ExpressionT ParseLeftHandSideExpression(bool* ok);
598 ExpressionT ParseMemberWithNewPrefixesExpression(bool* ok); 603 ExpressionT ParseMemberWithNewPrefixesExpression(bool* ok);
599 ExpressionT ParseMemberExpression(bool* ok); 604 ExpressionT ParseMemberExpression(bool* ok);
600 ExpressionT ParseMemberExpressionContinuation(ExpressionT expression, 605 ExpressionT ParseMemberExpressionContinuation(ExpressionT expression,
601 bool* ok); 606 bool* ok);
602 ExpressionT ParseArrowFunctionLiteral(int start_pos, ExpressionT params_ast, 607 ExpressionT ParseArrowFunctionLiteral(int start_pos, ExpressionT params_ast,
603 bool* ok); 608 bool* ok);
604 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, bool* ok); 609 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, bool* ok);
605 void AddTemplateExpression(ExpressionT); 610 void AddTemplateExpression(ExpressionT);
606 ExpressionT ParseSuperExpression(bool is_new, bool* ok); 611 ExpressionT ParseSuperExpression(bool is_new, bool* ok);
612 ExpressionT ParseStrongInitializationExpression(bool* ok);
613 ExpressionT ParseStrongSuperCallExpression(bool* ok);
607 614
608 // Checks if the expression is a valid reference expression (e.g., on the 615 // Checks if the expression is a valid reference expression (e.g., on the
609 // left-hand side of assignments). Although ruled out by ECMA as early errors, 616 // left-hand side of assignments). Although ruled out by ECMA as early errors,
610 // we allow calls for web compatibility and rewrite them to a runtime throw. 617 // we allow calls for web compatibility and rewrite them to a runtime throw.
611 ExpressionT CheckAndRewriteReferenceExpression( 618 ExpressionT CheckAndRewriteReferenceExpression(
612 ExpressionT expression, 619 ExpressionT expression,
613 Scanner::Location location, const char* message, bool* ok); 620 Scanner::Location location, const char* message, bool* ok);
614 621
615 // Used to validate property names in object literals and class literals 622 // Used to validate property names in object literals and class literals
616 enum PropertyKind { 623 enum PropertyKind {
(...skipping 823 matching lines...) Expand 10 before | Expand all | Expand 10 after
1440 } 1447 }
1441 1448
1442 static PreParserStatementList NewStatementList(int size, Zone* zone) { 1449 static PreParserStatementList NewStatementList(int size, Zone* zone) {
1443 return PreParserStatementList(); 1450 return PreParserStatementList();
1444 } 1451 }
1445 1452
1446 static PreParserExpressionList NewPropertyList(int size, Zone* zone) { 1453 static PreParserExpressionList NewPropertyList(int size, Zone* zone) {
1447 return PreParserExpressionList(); 1454 return PreParserExpressionList();
1448 } 1455 }
1449 1456
1450 V8_INLINE void SkipLazyFunctionBody(PreParserIdentifier function_name, 1457 V8_INLINE void SkipLazyFunctionBody(int* materialized_literal_count,
1451 int* materialized_literal_count,
1452 int* expected_property_count, bool* ok) { 1458 int* expected_property_count, bool* ok) {
1453 UNREACHABLE(); 1459 UNREACHABLE();
1454 } 1460 }
1455 1461
1456 V8_INLINE PreParserStatementList 1462 V8_INLINE PreParserStatementList
1457 ParseEagerFunctionBody(PreParserIdentifier function_name, int pos, 1463 ParseEagerFunctionBody(PreParserIdentifier function_name, int pos,
1458 Variable* fvar, Token::Value fvar_init_op, 1464 Variable* fvar, Token::Value fvar_init_op,
1459 FunctionKind kind, bool* ok); 1465 FunctionKind kind, bool* ok);
1460 1466
1461 // Utility functions 1467 // Utility functions
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
1611 Statement ParseDoWhileStatement(bool* ok); 1617 Statement ParseDoWhileStatement(bool* ok);
1612 Statement ParseWhileStatement(bool* ok); 1618 Statement ParseWhileStatement(bool* ok);
1613 Statement ParseForStatement(bool* ok); 1619 Statement ParseForStatement(bool* ok);
1614 Statement ParseThrowStatement(bool* ok); 1620 Statement ParseThrowStatement(bool* ok);
1615 Statement ParseTryStatement(bool* ok); 1621 Statement ParseTryStatement(bool* ok);
1616 Statement ParseDebuggerStatement(bool* ok); 1622 Statement ParseDebuggerStatement(bool* ok);
1617 Expression ParseConditionalExpression(bool accept_IN, bool* ok); 1623 Expression ParseConditionalExpression(bool accept_IN, bool* ok);
1618 Expression ParseObjectLiteral(bool* ok); 1624 Expression ParseObjectLiteral(bool* ok);
1619 Expression ParseV8Intrinsic(bool* ok); 1625 Expression ParseV8Intrinsic(bool* ok);
1620 1626
1621 V8_INLINE void SkipLazyFunctionBody(PreParserIdentifier function_name, 1627 V8_INLINE void SkipLazyFunctionBody(int* materialized_literal_count,
1622 int* materialized_literal_count,
1623 int* expected_property_count, bool* ok); 1628 int* expected_property_count, bool* ok);
1624 V8_INLINE PreParserStatementList 1629 V8_INLINE PreParserStatementList
1625 ParseEagerFunctionBody(PreParserIdentifier function_name, int pos, 1630 ParseEagerFunctionBody(PreParserIdentifier function_name, int pos,
1626 Variable* fvar, Token::Value fvar_init_op, 1631 Variable* fvar, Token::Value fvar_init_op,
1627 FunctionKind kind, bool* ok); 1632 FunctionKind kind, bool* ok);
1628 1633
1629 Expression ParseFunctionLiteral( 1634 Expression ParseFunctionLiteral(
1630 Identifier name, Scanner::Location function_name_location, 1635 Identifier name, Scanner::Location function_name_location,
1631 bool name_is_strict_reserved, FunctionKind kind, int function_token_pos, 1636 bool name_is_strict_reserved, FunctionKind kind, int function_token_pos,
1632 FunctionLiteral::FunctionType function_type, 1637 FunctionLiteral::FunctionType function_type,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1667 } 1672 }
1668 1673
1669 1674
1670 template <class Traits> 1675 template <class Traits>
1671 ParserBase<Traits>::FunctionState::FunctionState( 1676 ParserBase<Traits>::FunctionState::FunctionState(
1672 FunctionState** function_state_stack, Scope** scope_stack, Scope* scope, 1677 FunctionState** function_state_stack, Scope** scope_stack, Scope* scope,
1673 FunctionKind kind, typename Traits::Type::Factory* factory) 1678 FunctionKind kind, typename Traits::Type::Factory* factory)
1674 : next_materialized_literal_index_(0), 1679 : next_materialized_literal_index_(0),
1675 next_handler_index_(0), 1680 next_handler_index_(0),
1676 expected_property_count_(0), 1681 expected_property_count_(0),
1682 this_location_(Scanner::Location::invalid()),
1677 return_location_(Scanner::Location::invalid()), 1683 return_location_(Scanner::Location::invalid()),
1678 super_call_location_(Scanner::Location::invalid()), 1684 super_location_(Scanner::Location::invalid()),
1679 kind_(kind), 1685 kind_(kind),
1680 generator_object_variable_(NULL), 1686 generator_object_variable_(NULL),
1681 function_state_stack_(function_state_stack), 1687 function_state_stack_(function_state_stack),
1682 outer_function_state_(*function_state_stack), 1688 outer_function_state_(*function_state_stack),
1683 scope_stack_(scope_stack), 1689 scope_stack_(scope_stack),
1684 outer_scope_(*scope_stack), 1690 outer_scope_(*scope_stack),
1685 factory_(factory) { 1691 factory_(factory) {
1686 *scope_stack_ = scope; 1692 *scope_stack_ = scope;
1687 *function_state_stack = this; 1693 *function_state_stack = this;
1688 } 1694 }
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
1881 // '(' Expression ')' 1887 // '(' Expression ')'
1882 // TemplateLiteral 1888 // TemplateLiteral
1883 1889
1884 int beg_pos = scanner()->peek_location().beg_pos; 1890 int beg_pos = scanner()->peek_location().beg_pos;
1885 int end_pos = scanner()->peek_location().end_pos; 1891 int end_pos = scanner()->peek_location().end_pos;
1886 ExpressionT result = this->EmptyExpression(); 1892 ExpressionT result = this->EmptyExpression();
1887 Token::Value token = peek(); 1893 Token::Value token = peek();
1888 switch (token) { 1894 switch (token) {
1889 case Token::THIS: { 1895 case Token::THIS: {
1890 Consume(Token::THIS); 1896 Consume(Token::THIS);
1897 if (is_strong(language_mode())) {
1898 // Constructors' usages of 'this' in strong mode are parsed separately.
1899 // TODO(rossberg): this does not work with arrow functions yet.
1900 if (i::IsConstructor(function_state_->kind())) {
1901 ReportMessage("strong_constructor_this");
1902 *ok = false;
1903 break;
1904 }
1905 }
1891 scope_->RecordThisUsage(); 1906 scope_->RecordThisUsage();
1892 result = this->ThisExpression(scope_, factory(), beg_pos); 1907 result = this->ThisExpression(scope_, factory(), beg_pos);
1893 break; 1908 break;
1894 } 1909 }
1895 1910
1896 case Token::NULL_LITERAL: 1911 case Token::NULL_LITERAL:
1897 case Token::TRUE_LITERAL: 1912 case Token::TRUE_LITERAL:
1898 case Token::FALSE_LITERAL: 1913 case Token::FALSE_LITERAL:
1899 case Token::SMI: 1914 case Token::SMI:
1900 case Token::NUMBER: 1915 case Token::NUMBER:
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1951 parenthesized_function_ = (peek() == Token::FUNCTION); 1966 parenthesized_function_ = (peek() == Token::FUNCTION);
1952 result = this->ParseExpression(true, CHECK_OK); 1967 result = this->ParseExpression(true, CHECK_OK);
1953 result->increase_parenthesization_level(); 1968 result->increase_parenthesization_level();
1954 Expect(Token::RPAREN, CHECK_OK); 1969 Expect(Token::RPAREN, CHECK_OK);
1955 } 1970 }
1956 break; 1971 break;
1957 1972
1958 case Token::CLASS: { 1973 case Token::CLASS: {
1959 Consume(Token::CLASS); 1974 Consume(Token::CLASS);
1960 if (!allow_harmony_sloppy() && is_sloppy(language_mode())) { 1975 if (!allow_harmony_sloppy() && is_sloppy(language_mode())) {
1961 ReportMessage("sloppy_lexical", NULL); 1976 ReportMessage("sloppy_lexical");
1962 *ok = false; 1977 *ok = false;
1963 break; 1978 break;
1964 } 1979 }
1965 int class_token_position = position(); 1980 int class_token_position = position();
1966 IdentifierT name = this->EmptyIdentifier(); 1981 IdentifierT name = this->EmptyIdentifier();
1967 bool is_strict_reserved_name = false; 1982 bool is_strict_reserved_name = false;
1968 Scanner::Location class_name_location = Scanner::Location::invalid(); 1983 Scanner::Location class_name_location = Scanner::Location::invalid();
1969 if (peek_any_identifier()) { 1984 if (peek_any_identifier()) {
1970 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name, 1985 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name,
1971 CHECK_OK); 1986 CHECK_OK);
(...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after
2778 result = ParsePrimaryExpression(CHECK_OK); 2793 result = ParsePrimaryExpression(CHECK_OK);
2779 } 2794 }
2780 2795
2781 result = ParseMemberExpressionContinuation(result, CHECK_OK); 2796 result = ParseMemberExpressionContinuation(result, CHECK_OK);
2782 return result; 2797 return result;
2783 } 2798 }
2784 2799
2785 2800
2786 template <class Traits> 2801 template <class Traits>
2787 typename ParserBase<Traits>::ExpressionT 2802 typename ParserBase<Traits>::ExpressionT
2803 ParserBase<Traits>::ParseStrongInitializationExpression(bool* ok) {
2804 // InitializationExpression :: (strong mode)
2805 // 'this' '.' IdentifierName '=' AssignmentExpression
2806 // 'this' '[' Expression ']' '=' AssignmentExpression
2807
2808 Consume(Token::THIS);
2809 int pos = position();
2810 function_state_->set_this_location(scanner()->location());
2811 scope_->RecordThisUsage();
2812 ExpressionT this_expr = this->ThisExpression(scope_, factory(), pos);
2813
2814 ExpressionT left = this->EmptyExpression();
2815 switch (peek()) {
2816 case Token::LBRACK: {
2817 Consume(Token::LBRACK);
2818 int pos = position();
2819 ExpressionT index = this->ParseExpression(true, CHECK_OK);
2820 left = factory()->NewProperty(this_expr, index, pos);
2821 if (fni_ != NULL) {
2822 this->PushPropertyName(fni_, index);
2823 }
2824 Expect(Token::RBRACK, CHECK_OK);
2825 break;
2826 }
2827 case Token::PERIOD: {
2828 Consume(Token::PERIOD);
2829 int pos = position();
2830 IdentifierT name = ParseIdentifierName(CHECK_OK);
2831 left = factory()->NewProperty(
2832 this_expr, factory()->NewStringLiteral(name, pos), pos);
2833 if (fni_ != NULL) {
2834 this->PushLiteralName(fni_, name);
2835 }
2836 break;
2837 }
2838 default:
2839 ReportMessage("strong_constructor_this");
2840 *ok = false;
2841 return this->EmptyExpression();
2842 }
2843
2844 if (peek() != Token::ASSIGN) {
2845 ReportMessageAt(function_state_->this_location(),
2846 "strong_constructor_this");
2847 *ok = false;
2848 return this->EmptyExpression();
2849 }
2850 Consume(Token::ASSIGN);
2851 left = this->MarkExpressionAsAssigned(left);
2852
2853 ExpressionT right = this->ParseAssignmentExpression(true, CHECK_OK);
2854 this->CheckAssigningFunctionLiteralToProperty(left, right);
2855 function_state_->AddProperty();
2856 if (fni_ != NULL) {
2857 // Check if the right hand side is a call to avoid inferring a
2858 // name if we're dealing with "this.a = function(){...}();"-like
2859 // expression.
2860 if (!right->IsCall() && !right->IsCallNew()) {
2861 fni_->Infer();
2862 } else {
2863 fni_->RemoveLastFunction();
2864 }
2865 fni_->Leave();
2866 }
2867
2868 if (function_state_->return_location().IsValid()) {
2869 ReportMessageAt(function_state_->return_location(),
2870 "strong_constructor_return_misplaced");
2871 *ok = false;
2872 return this->EmptyExpression();
2873 }
2874
2875 return factory()->NewAssignment(Token::ASSIGN, left, right, pos);
2876 }
2877
2878
2879 template <class Traits>
2880 typename ParserBase<Traits>::ExpressionT
2881 ParserBase<Traits>::ParseStrongSuperCallExpression(bool* ok) {
2882 // SuperCallExpression :: (strong mode)
2883 // 'super' '(' ExpressionList ')'
2884
2885 Consume(Token::SUPER);
2886 int pos = position();
2887 Scanner::Location super_loc = scanner()->location();
2888 ExpressionT expr = this->SuperReference(scope_, factory());
2889
2890 if (peek() != Token::LPAREN) {
2891 ReportMessage("strong_constructor_super");
2892 *ok = false;
2893 return this->EmptyExpression();
2894 }
2895
2896 typename Traits::Type::ExpressionList args = ParseArguments(CHECK_OK);
2897
2898 // TODO(rossberg): This doesn't work with arrow functions yet.
2899 if (!IsSubclassConstructor(function_state_->kind())) {
2900 ReportMessage("unexpected_super");
2901 *ok = false;
2902 return this->EmptyExpression();
2903 } else if (function_state_->super_location().IsValid()) {
2904 ReportMessageAt(scanner()->location(), "strong_super_call_duplicate");
2905 *ok = false;
2906 return this->EmptyExpression();
2907 } else if (function_state_->this_location().IsValid()) {
2908 ReportMessageAt(scanner()->location(), "strong_super_call_misplaced");
2909 *ok = false;
2910 return this->EmptyExpression();
2911 } else if (function_state_->return_location().IsValid()) {
2912 ReportMessageAt(function_state_->return_location(),
2913 "strong_constructor_return_misplaced");
2914 *ok = false;
2915 return this->EmptyExpression();
2916 }
2917
2918 function_state_->set_super_location(super_loc);
2919 return factory()->NewCall(expr, args, pos);
2920 }
2921
2922
2923 template <class Traits>
2924 typename ParserBase<Traits>::ExpressionT
2788 ParserBase<Traits>::ParseSuperExpression(bool is_new, bool* ok) { 2925 ParserBase<Traits>::ParseSuperExpression(bool is_new, bool* ok) {
2789 Expect(Token::SUPER, CHECK_OK); 2926 Expect(Token::SUPER, CHECK_OK);
2790 2927
2928 // TODO(aperez): Does this actually work with lazily compiled arrows?
marja 2015/04/21 09:01:37 -> wingo, since he took over?
rossberg 2015/04/21 09:47:47 Done.
2791 FunctionState* function_state = function_state_; 2929 FunctionState* function_state = function_state_;
2792 while (IsArrowFunction(function_state->kind())) { 2930 while (IsArrowFunction(function_state->kind())) {
2793 function_state = function_state->outer(); 2931 function_state = function_state->outer();
2794 } 2932 }
2795 // TODO(arv): Handle eval scopes similarly. 2933 // TODO(arv): Handle eval scopes similarly.
2796 2934
2797 FunctionKind kind = function_state->kind(); 2935 FunctionKind kind = function_state->kind();
2798 if (IsConciseMethod(kind) || IsAccessorFunction(kind) || 2936 if (IsConciseMethod(kind) || IsAccessorFunction(kind) ||
2799 i::IsConstructor(kind)) { 2937 i::IsConstructor(kind)) {
2800 if (peek() == Token::PERIOD || peek() == Token::LBRACK) { 2938 if (peek() == Token::PERIOD || peek() == Token::LBRACK) {
2801 scope_->RecordSuperPropertyUsage(); 2939 scope_->RecordSuperPropertyUsage();
2802 return this->SuperReference(scope_, factory()); 2940 return this->SuperReference(scope_, factory());
2803 } 2941 }
2804 // new super() is never allowed. 2942 // new super() is never allowed.
2805 // super() is only allowed in derived constructor 2943 // super() is only allowed in derived constructor
2806 if (!is_new && peek() == Token::LPAREN && IsSubclassConstructor(kind)) { 2944 if (!is_new && peek() == Token::LPAREN && IsSubclassConstructor(kind)) {
2807 if (is_strong(language_mode())) { 2945 if (is_strong(language_mode())) {
2808 if (function_state->super_call_location().IsValid()) { 2946 // Super calls in strong mode are parsed separately.
2809 ReportMessageAt(scanner()->location(), "strong_super_call_duplicate"); 2947 ReportMessageAt(scanner()->location(), "strong_constructor_super");
2810 *ok = false; 2948 *ok = false;
2811 return this->EmptyExpression(); 2949 return this->EmptyExpression();
2812 } else if (function_state->return_location().IsValid()) {
2813 ReportMessageAt(function_state->return_location(),
2814 "strong_constructor_return_misplaced");
2815 *ok = false;
2816 return this->EmptyExpression();
2817 }
2818 } 2950 }
2819 function_state->set_super_call_location(scanner()->location()); 2951 function_state->set_super_location(scanner()->location());
2820 return this->SuperReference(scope_, factory()); 2952 return this->SuperReference(scope_, factory());
2821 } 2953 }
2822 } 2954 }
2823 2955
2824 ReportMessageAt(scanner()->location(), "unexpected_super"); 2956 ReportMessageAt(scanner()->location(), "unexpected_super");
2825 *ok = false; 2957 *ok = false;
2826 return this->EmptyExpression(); 2958 return this->EmptyExpression();
2827 } 2959 }
2828 2960
2829 2961
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
2928 3060
2929 Expect(Token::ARROW, CHECK_OK); 3061 Expect(Token::ARROW, CHECK_OK);
2930 3062
2931 if (peek() == Token::LBRACE) { 3063 if (peek() == Token::LBRACE) {
2932 // Multiple statemente body 3064 // Multiple statemente body
2933 Consume(Token::LBRACE); 3065 Consume(Token::LBRACE);
2934 bool is_lazily_parsed = 3066 bool is_lazily_parsed =
2935 (mode() == PARSE_LAZILY && scope_->AllowsLazyCompilation()); 3067 (mode() == PARSE_LAZILY && scope_->AllowsLazyCompilation());
2936 if (is_lazily_parsed) { 3068 if (is_lazily_parsed) {
2937 body = this->NewStatementList(0, zone()); 3069 body = this->NewStatementList(0, zone());
2938 this->SkipLazyFunctionBody(this->EmptyIdentifier(), 3070 this->SkipLazyFunctionBody(&materialized_literal_count,
2939 &materialized_literal_count,
2940 &expected_property_count, CHECK_OK); 3071 &expected_property_count, CHECK_OK);
2941 } else { 3072 } else {
2942 body = this->ParseEagerFunctionBody( 3073 body = this->ParseEagerFunctionBody(
2943 this->EmptyIdentifier(), RelocInfo::kNoPosition, NULL, 3074 this->EmptyIdentifier(), RelocInfo::kNoPosition, NULL,
2944 Token::INIT_VAR, kArrowFunction, CHECK_OK); 3075 Token::INIT_VAR, kArrowFunction, CHECK_OK);
2945 materialized_literal_count = 3076 materialized_literal_count =
2946 function_state.materialized_literal_count(); 3077 function_state.materialized_literal_count();
2947 expected_property_count = function_state.expected_property_count(); 3078 expected_property_count = function_state.expected_property_count();
2948 handler_count = function_state.handler_count(); 3079 handler_count = function_state.handler_count();
2949 } 3080 }
2950 } else { 3081 } else {
2951 // Single-expression body 3082 // Single-expression body
2952 int pos = position(); 3083 int pos = position();
2953 parenthesized_function_ = false; 3084 parenthesized_function_ = false;
2954 ExpressionT expression = ParseAssignmentExpression(true, CHECK_OK); 3085 ExpressionT expression = ParseAssignmentExpression(true, CHECK_OK);
2955 body = this->NewStatementList(1, zone()); 3086 body = this->NewStatementList(1, zone());
2956 body->Add(factory()->NewReturnStatement(expression, pos), zone()); 3087 body->Add(factory()->NewReturnStatement(expression, pos), zone());
2957 materialized_literal_count = function_state.materialized_literal_count(); 3088 materialized_literal_count = function_state.materialized_literal_count();
2958 expected_property_count = function_state.expected_property_count(); 3089 expected_property_count = function_state.expected_property_count();
2959 handler_count = function_state.handler_count(); 3090 handler_count = function_state.handler_count();
2960 } 3091 }
2961 super_loc = function_state.super_call_location(); 3092 super_loc = function_state.super_location();
2962 3093
2963 scope->set_start_position(start_pos); 3094 scope->set_start_position(start_pos);
2964 scope->set_end_position(scanner()->location().end_pos); 3095 scope->set_end_position(scanner()->location().end_pos);
2965 3096
2966 // Arrow function *parameter lists* are always checked as in strict mode. 3097 // Arrow function *parameter lists* are always checked as in strict mode.
2967 // TODO(arv): eval_args_error_loc and reserved_loc needs to be set by 3098 // TODO(arv): eval_args_error_loc and reserved_loc needs to be set by
2968 // DeclareArrowParametersFromExpression. 3099 // DeclareArrowParametersFromExpression.
2969 Scanner::Location eval_args_error_loc = Scanner::Location::invalid(); 3100 Scanner::Location eval_args_error_loc = Scanner::Location::invalid();
2970 Scanner::Location reserved_loc = Scanner::Location::invalid(); 3101 Scanner::Location reserved_loc = Scanner::Location::invalid();
2971 const bool use_strict_params = true; 3102 const bool use_strict_params = true;
(...skipping 10 matching lines...) Expand all
2982 3113
2983 FunctionLiteralT function_literal = factory()->NewFunctionLiteral( 3114 FunctionLiteralT function_literal = factory()->NewFunctionLiteral(
2984 this->EmptyIdentifierString(), ast_value_factory(), scope, body, 3115 this->EmptyIdentifierString(), ast_value_factory(), scope, body,
2985 materialized_literal_count, expected_property_count, handler_count, 3116 materialized_literal_count, expected_property_count, handler_count,
2986 num_parameters, FunctionLiteral::kNoDuplicateParameters, 3117 num_parameters, FunctionLiteral::kNoDuplicateParameters,
2987 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kIsFunction, 3118 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kIsFunction,
2988 FunctionLiteral::kNotParenthesized, FunctionKind::kArrowFunction, 3119 FunctionLiteral::kNotParenthesized, FunctionKind::kArrowFunction,
2989 start_pos); 3120 start_pos);
2990 3121
2991 function_literal->set_function_token_position(start_pos); 3122 function_literal->set_function_token_position(start_pos);
2992 if (super_loc.IsValid()) function_state_->set_super_call_location(super_loc); 3123 if (super_loc.IsValid()) function_state_->set_super_location(super_loc);
2993 3124
2994 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal); 3125 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal);
2995 3126
2996 return function_literal; 3127 return function_literal;
2997 } 3128 }
2998 3129
2999 3130
3000 template <typename Traits> 3131 template <typename Traits>
3001 typename ParserBase<Traits>::ExpressionT 3132 typename ParserBase<Traits>::ExpressionT
3002 ParserBase<Traits>::ParseTemplateLiteral(ExpressionT tag, int start, bool* ok) { 3133 ParserBase<Traits>::ParseTemplateLiteral(ExpressionT tag, int start, bool* ok) {
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
3167 *ok = false; 3298 *ok = false;
3168 return; 3299 return;
3169 } 3300 }
3170 has_seen_constructor_ = true; 3301 has_seen_constructor_ = true;
3171 return; 3302 return;
3172 } 3303 }
3173 } 3304 }
3174 } } // v8::internal 3305 } } // v8::internal
3175 3306
3176 #endif // V8_PREPARSER_H 3307 #endif // V8_PREPARSER_H
OLDNEW
« no previous file with comments | « src/parser.cc ('k') | src/preparser.cc » ('j') | test/cctest/test-parsing.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698