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

Side by Side Diff: src/preparser.h

Issue 561913002: Class syntax parsing (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: git rebase Created 6 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « src/parser.cc ('k') | src/preparser.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/func-name-inferrer.h" 10 #include "src/func-name-inferrer.h"
(...skipping 28 matching lines...) Expand all
39 // // In particular... 39 // // In particular...
40 // struct Type { 40 // struct Type {
41 // // Used by FunctionState and BlockState. 41 // // Used by FunctionState and BlockState.
42 // typedef Scope; 42 // typedef Scope;
43 // typedef GeneratorVariable; 43 // typedef GeneratorVariable;
44 // typedef Zone; 44 // typedef Zone;
45 // // Return types for traversing functions. 45 // // Return types for traversing functions.
46 // typedef Identifier; 46 // typedef Identifier;
47 // typedef Expression; 47 // typedef Expression;
48 // typedef FunctionLiteral; 48 // typedef FunctionLiteral;
49 // typedef ClassLiteral;
49 // typedef ObjectLiteralProperty; 50 // typedef ObjectLiteralProperty;
50 // typedef Literal; 51 // typedef Literal;
51 // typedef ExpressionList; 52 // typedef ExpressionList;
52 // typedef PropertyList; 53 // typedef PropertyList;
53 // // For constructing objects returned by the traversing functions. 54 // // For constructing objects returned by the traversing functions.
54 // typedef Factory; 55 // typedef Factory;
55 // }; 56 // };
56 // // ... 57 // // ...
57 // }; 58 // };
58 59
59 template <typename Traits> 60 template <typename Traits>
60 class ParserBase : public Traits { 61 class ParserBase : public Traits {
61 public: 62 public:
62 // Shorten type names defined by Traits. 63 // Shorten type names defined by Traits.
63 typedef typename Traits::Type::Expression ExpressionT; 64 typedef typename Traits::Type::Expression ExpressionT;
64 typedef typename Traits::Type::Identifier IdentifierT; 65 typedef typename Traits::Type::Identifier IdentifierT;
65 typedef typename Traits::Type::FunctionLiteral FunctionLiteralT; 66 typedef typename Traits::Type::FunctionLiteral FunctionLiteralT;
67 typedef typename Traits::Type::ClassLiteral ClassLiteralT;
66 typedef typename Traits::Type::Literal LiteralT; 68 typedef typename Traits::Type::Literal LiteralT;
67 typedef typename Traits::Type::ObjectLiteralProperty ObjectLiteralPropertyT; 69 typedef typename Traits::Type::ObjectLiteralProperty ObjectLiteralPropertyT;
68 70
69 ParserBase(Scanner* scanner, uintptr_t stack_limit, v8::Extension* extension, 71 ParserBase(Scanner* scanner, uintptr_t stack_limit, v8::Extension* extension,
70 ParserRecorder* log, typename Traits::Type::Zone* zone, 72 ParserRecorder* log, typename Traits::Type::Zone* zone,
71 AstNode::IdGen* ast_node_id_gen, 73 AstNode::IdGen* ast_node_id_gen,
72 typename Traits::Type::Parser this_object) 74 typename Traits::Type::Parser this_object)
73 : Traits(this_object), 75 : Traits(this_object),
74 parenthesized_function_(false), 76 parenthesized_function_(false),
75 scope_(NULL), 77 scope_(NULL),
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 // Parses an identifier and determines whether or not it is 'get' or 'set'. 475 // Parses an identifier and determines whether or not it is 'get' or 'set'.
474 IdentifierT ParseIdentifierNameOrGetOrSet(bool* is_get, 476 IdentifierT ParseIdentifierNameOrGetOrSet(bool* is_get,
475 bool* is_set, 477 bool* is_set,
476 bool* ok); 478 bool* ok);
477 479
478 ExpressionT ParseRegExpLiteral(bool seen_equal, bool* ok); 480 ExpressionT ParseRegExpLiteral(bool seen_equal, bool* ok);
479 481
480 ExpressionT ParsePrimaryExpression(bool* ok); 482 ExpressionT ParsePrimaryExpression(bool* ok);
481 ExpressionT ParseExpression(bool accept_IN, bool* ok); 483 ExpressionT ParseExpression(bool accept_IN, bool* ok);
482 ExpressionT ParseArrayLiteral(bool* ok); 484 ExpressionT ParseArrayLiteral(bool* ok);
485 IdentifierT ParsePropertyName(bool* is_get, bool* is_set, bool* is_static,
486 bool* ok);
483 ExpressionT ParseObjectLiteral(bool* ok); 487 ExpressionT ParseObjectLiteral(bool* ok);
484 ObjectLiteralPropertyT ParsePropertyDefinition(ObjectLiteralChecker* checker, 488 ObjectLiteralPropertyT ParsePropertyDefinition(ObjectLiteralChecker* checker,
489 bool in_class, bool is_static,
485 bool* ok); 490 bool* ok);
486 IdentifierT ParsePropertyName(bool* is_getter, bool* is_setter, bool* ok);
487 typename Traits::Type::ExpressionList ParseArguments(bool* ok); 491 typename Traits::Type::ExpressionList ParseArguments(bool* ok);
488 ExpressionT ParseAssignmentExpression(bool accept_IN, bool* ok); 492 ExpressionT ParseAssignmentExpression(bool accept_IN, bool* ok);
489 ExpressionT ParseYieldExpression(bool* ok); 493 ExpressionT ParseYieldExpression(bool* ok);
490 ExpressionT ParseConditionalExpression(bool accept_IN, bool* ok); 494 ExpressionT ParseConditionalExpression(bool accept_IN, bool* ok);
491 ExpressionT ParseBinaryExpression(int prec, bool accept_IN, bool* ok); 495 ExpressionT ParseBinaryExpression(int prec, bool accept_IN, bool* ok);
492 ExpressionT ParseUnaryExpression(bool* ok); 496 ExpressionT ParseUnaryExpression(bool* ok);
493 ExpressionT ParsePostfixExpression(bool* ok); 497 ExpressionT ParsePostfixExpression(bool* ok);
494 ExpressionT ParseLeftHandSideExpression(bool* ok); 498 ExpressionT ParseLeftHandSideExpression(bool* ok);
495 ExpressionT ParseMemberWithNewPrefixesExpression(bool* ok); 499 ExpressionT ParseMemberWithNewPrefixesExpression(bool* ok);
496 ExpressionT ParseMemberExpression(bool* ok); 500 ExpressionT ParseMemberExpression(bool* ok);
497 ExpressionT ParseMemberExpressionContinuation(ExpressionT expression, 501 ExpressionT ParseMemberExpressionContinuation(ExpressionT expression,
498 bool* ok); 502 bool* ok);
499 ExpressionT ParseArrowFunctionLiteral(int start_pos, ExpressionT params_ast, 503 ExpressionT ParseArrowFunctionLiteral(int start_pos, ExpressionT params_ast,
500 bool* ok); 504 bool* ok);
505 ClassLiteralT ParseClassLiteral(IdentifierT name,
506 Scanner::Location function_name_location,
507 bool name_is_strict_reserved, int pos,
508 bool* ok);
501 509
502 // Checks if the expression is a valid reference expression (e.g., on the 510 // Checks if the expression is a valid reference expression (e.g., on the
503 // left-hand side of assignments). Although ruled out by ECMA as early errors, 511 // left-hand side of assignments). Although ruled out by ECMA as early errors,
504 // we allow calls for web compatibility and rewrite them to a runtime throw. 512 // we allow calls for web compatibility and rewrite them to a runtime throw.
505 ExpressionT CheckAndRewriteReferenceExpression( 513 ExpressionT CheckAndRewriteReferenceExpression(
506 ExpressionT expression, 514 ExpressionT expression,
507 Scanner::Location location, const char* message, bool* ok); 515 Scanner::Location location, const char* message, bool* ok);
508 516
509 // Used to detect duplicates in object literals. Each of the values 517 // Used to detect duplicates in object literals. Each of the values
510 // kGetterProperty, kSetterProperty and kValueProperty represents 518 // kGetterProperty, kSetterProperty and kValueProperty represents
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
605 } 613 }
606 static PreParserIdentifier FutureStrictReserved() { 614 static PreParserIdentifier FutureStrictReserved() {
607 return PreParserIdentifier(kFutureStrictReservedIdentifier); 615 return PreParserIdentifier(kFutureStrictReservedIdentifier);
608 } 616 }
609 static PreParserIdentifier Let() { 617 static PreParserIdentifier Let() {
610 return PreParserIdentifier(kLetIdentifier); 618 return PreParserIdentifier(kLetIdentifier);
611 } 619 }
612 static PreParserIdentifier Yield() { 620 static PreParserIdentifier Yield() {
613 return PreParserIdentifier(kYieldIdentifier); 621 return PreParserIdentifier(kYieldIdentifier);
614 } 622 }
623 static PreParserIdentifier Prototype() {
624 return PreParserIdentifier(kPrototypeIdentifier);
625 }
626 static PreParserIdentifier Constructor() {
627 return PreParserIdentifier(kConstructorIdentifier);
628 }
615 bool IsEval() const { return type_ == kEvalIdentifier; } 629 bool IsEval() const { return type_ == kEvalIdentifier; }
616 bool IsArguments() const { return type_ == kArgumentsIdentifier; } 630 bool IsArguments() const { return type_ == kArgumentsIdentifier; }
617 bool IsEvalOrArguments() const { return type_ >= kEvalIdentifier; }
618 bool IsYield() const { return type_ == kYieldIdentifier; } 631 bool IsYield() const { return type_ == kYieldIdentifier; }
632 bool IsPrototype() const { return type_ == kPrototypeIdentifier; }
633 bool IsConstructor() const { return type_ == kConstructorIdentifier; }
634 bool IsEvalOrArguments() const {
635 return type_ == kEvalIdentifier || type_ == kArgumentsIdentifier;
636 }
619 bool IsFutureReserved() const { return type_ == kFutureReservedIdentifier; } 637 bool IsFutureReserved() const { return type_ == kFutureReservedIdentifier; }
620 bool IsFutureStrictReserved() const { 638 bool IsFutureStrictReserved() const {
621 return type_ == kFutureStrictReservedIdentifier; 639 return type_ == kFutureStrictReservedIdentifier;
622 } 640 }
623 bool IsValidStrictVariable() const { return type_ == kUnknownIdentifier; } 641 bool IsValidStrictVariable() const { return type_ == kUnknownIdentifier; }
624 642
625 // Allow identifier->name()[->length()] to work. The preparser 643 // Allow identifier->name()[->length()] to work. The preparser
626 // does not need the actual positions/lengths of the identifiers. 644 // does not need the actual positions/lengths of the identifiers.
627 const PreParserIdentifier* operator->() const { return this; } 645 const PreParserIdentifier* operator->() const { return this; }
628 const PreParserIdentifier raw_name() const { return *this; } 646 const PreParserIdentifier raw_name() const { return *this; }
629 647
630 int position() const { return 0; } 648 int position() const { return 0; }
631 int length() const { return 0; } 649 int length() const { return 0; }
632 650
633 private: 651 private:
634 enum Type { 652 enum Type {
635 kUnknownIdentifier, 653 kUnknownIdentifier,
636 kFutureReservedIdentifier, 654 kFutureReservedIdentifier,
637 kFutureStrictReservedIdentifier, 655 kFutureStrictReservedIdentifier,
638 kLetIdentifier, 656 kLetIdentifier,
639 kYieldIdentifier, 657 kYieldIdentifier,
640 kEvalIdentifier, 658 kEvalIdentifier,
641 kArgumentsIdentifier 659 kArgumentsIdentifier,
660 kPrototypeIdentifier,
661 kConstructorIdentifier
642 }; 662 };
643 explicit PreParserIdentifier(Type type) : type_(type) {} 663 explicit PreParserIdentifier(Type type) : type_(type) {}
644 Type type_; 664 Type type_;
645 665
646 friend class PreParserExpression; 666 friend class PreParserExpression;
647 friend class PreParserScope; 667 friend class PreParserScope;
648 }; 668 };
649 669
650 670
651 // Bits 0 and 1 are used to identify the type of expression: 671 // Bits 0 and 1 are used to identify the type of expression:
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
920 public: 940 public:
921 explicit PreParserScope(PreParserScope* outer_scope, ScopeType scope_type, 941 explicit PreParserScope(PreParserScope* outer_scope, ScopeType scope_type,
922 void* = NULL) 942 void* = NULL)
923 : scope_type_(scope_type) { 943 : scope_type_(scope_type) {
924 strict_mode_ = outer_scope ? outer_scope->strict_mode() : SLOPPY; 944 strict_mode_ = outer_scope ? outer_scope->strict_mode() : SLOPPY;
925 } 945 }
926 946
927 ScopeType type() { return scope_type_; } 947 ScopeType type() { return scope_type_; }
928 StrictMode strict_mode() const { return strict_mode_; } 948 StrictMode strict_mode() const { return strict_mode_; }
929 void SetStrictMode(StrictMode strict_mode) { strict_mode_ = strict_mode; } 949 void SetStrictMode(StrictMode strict_mode) { strict_mode_ = strict_mode; }
950 void SetScopeName(PreParserIdentifier name) {}
930 951
931 // When PreParser is in use, lazy compilation is already being done, 952 // When PreParser is in use, lazy compilation is already being done,
932 // things cannot get lazier than that. 953 // things cannot get lazier than that.
933 bool AllowsLazyCompilation() const { return false; } 954 bool AllowsLazyCompilation() const { return false; }
934 955
935 void set_start_position(int position) {} 956 void set_start_position(int position) {}
936 void set_end_position(int position) {} 957 void set_end_position(int position) {}
937 958
938 bool IsDeclared(const PreParserIdentifier& identifier) const { return false; } 959 bool IsDeclared(const PreParserIdentifier& identifier) const { return false; }
939 void DeclareParameter(const PreParserIdentifier& identifier, VariableMode) {} 960 void DeclareParameter(const PreParserIdentifier& identifier, VariableMode) {}
(...skipping 24 matching lines...) Expand all
964 int pos) { 985 int pos) {
965 return PreParserExpression::Default(); 986 return PreParserExpression::Default();
966 } 987 }
967 PreParserExpression NewArrayLiteral(PreParserExpressionList values, 988 PreParserExpression NewArrayLiteral(PreParserExpressionList values,
968 int literal_index, 989 int literal_index,
969 int pos) { 990 int pos) {
970 return PreParserExpression::Default(); 991 return PreParserExpression::Default();
971 } 992 }
972 PreParserExpression NewObjectLiteralProperty(bool is_getter, 993 PreParserExpression NewObjectLiteralProperty(bool is_getter,
973 PreParserExpression value, 994 PreParserExpression value,
974 int pos) { 995 int pos, bool is_static) {
975 return PreParserExpression::Default(); 996 return PreParserExpression::Default();
976 } 997 }
977 PreParserExpression NewObjectLiteralProperty(PreParserExpression key, 998 PreParserExpression NewObjectLiteralProperty(PreParserExpression key,
978 PreParserExpression value) { 999 PreParserExpression value,
1000 bool is_static) {
979 return PreParserExpression::Default(); 1001 return PreParserExpression::Default();
980 } 1002 }
981 PreParserExpression NewObjectLiteral(PreParserExpressionList properties, 1003 PreParserExpression NewObjectLiteral(PreParserExpressionList properties,
982 int literal_index, 1004 int literal_index,
983 int boilerplate_properties, 1005 int boilerplate_properties,
984 bool has_function, 1006 bool has_function,
985 int pos) { 1007 int pos) {
986 return PreParserExpression::Default(); 1008 return PreParserExpression::Default();
987 } 1009 }
988 PreParserExpression NewVariableProxy(void* generator_variable) { 1010 PreParserExpression NewVariableProxy(void* variable) {
989 return PreParserExpression::Default(); 1011 return PreParserExpression::Default();
990 } 1012 }
991 PreParserExpression NewProperty(PreParserExpression obj, 1013 PreParserExpression NewProperty(PreParserExpression obj,
992 PreParserExpression key, 1014 PreParserExpression key,
993 int pos) { 1015 int pos) {
994 if (obj.IsThis()) { 1016 if (obj.IsThis()) {
995 return PreParserExpression::ThisProperty(); 1017 return PreParserExpression::ThisProperty();
996 } 1018 }
997 return PreParserExpression::Property(); 1019 return PreParserExpression::Property();
998 } 1020 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1054 const PreParserScope& scope, PreParserStatementList body, 1076 const PreParserScope& scope, PreParserStatementList body,
1055 int materialized_literal_count, int expected_property_count, 1077 int materialized_literal_count, int expected_property_count,
1056 int handler_count, int parameter_count, 1078 int handler_count, int parameter_count,
1057 FunctionLiteral::ParameterFlag has_duplicate_parameters, 1079 FunctionLiteral::ParameterFlag has_duplicate_parameters,
1058 FunctionLiteral::FunctionType function_type, 1080 FunctionLiteral::FunctionType function_type,
1059 FunctionLiteral::IsFunctionFlag is_function, 1081 FunctionLiteral::IsFunctionFlag is_function,
1060 FunctionLiteral::IsParenthesizedFlag is_parenthesized, FunctionKind kind, 1082 FunctionLiteral::IsParenthesizedFlag is_parenthesized, FunctionKind kind,
1061 int position) { 1083 int position) {
1062 return PreParserExpression::Default(); 1084 return PreParserExpression::Default();
1063 } 1085 }
1086 PreParserExpression NewClassLiteral(PreParserIdentifier name,
1087 PreParserExpression extends,
1088 PreParserExpression constructor,
1089 PreParserExpressionList properties,
1090 AstValueFactory* ast_value_factory,
1091 int position) {
1092 return PreParserExpression::Default();
1093 }
1064 1094
1065 // Return the object itself as AstVisitor and implement the needed 1095 // Return the object itself as AstVisitor and implement the needed
1066 // dummy method right in this class. 1096 // dummy method right in this class.
1067 PreParserFactory* visitor() { return this; } 1097 PreParserFactory* visitor() { return this; }
1068 BailoutReason dont_optimize_reason() { return kNoReason; } 1098 BailoutReason dont_optimize_reason() { return kNoReason; }
1069 int* ast_properties() { 1099 int* ast_properties() {
1070 static int dummy = 42; 1100 static int dummy = 42;
1071 return &dummy; 1101 return &dummy;
1072 } 1102 }
1073 }; 1103 };
(...skipping 18 matching lines...) Expand all
1092 typedef void Zone; 1122 typedef void Zone;
1093 1123
1094 typedef int AstProperties; 1124 typedef int AstProperties;
1095 typedef Vector<PreParserIdentifier> ParameterIdentifierVector; 1125 typedef Vector<PreParserIdentifier> ParameterIdentifierVector;
1096 1126
1097 // Return types for traversing functions. 1127 // Return types for traversing functions.
1098 typedef PreParserIdentifier Identifier; 1128 typedef PreParserIdentifier Identifier;
1099 typedef PreParserExpression Expression; 1129 typedef PreParserExpression Expression;
1100 typedef PreParserExpression YieldExpression; 1130 typedef PreParserExpression YieldExpression;
1101 typedef PreParserExpression FunctionLiteral; 1131 typedef PreParserExpression FunctionLiteral;
1132 typedef PreParserExpression ClassLiteral;
1102 typedef PreParserExpression ObjectLiteralProperty; 1133 typedef PreParserExpression ObjectLiteralProperty;
1103 typedef PreParserExpression Literal; 1134 typedef PreParserExpression Literal;
1104 typedef PreParserExpressionList ExpressionList; 1135 typedef PreParserExpressionList ExpressionList;
1105 typedef PreParserExpressionList PropertyList; 1136 typedef PreParserExpressionList PropertyList;
1106 typedef PreParserStatementList StatementList; 1137 typedef PreParserStatementList StatementList;
1107 1138
1108 // For constructing objects returned by the traversing functions. 1139 // For constructing objects returned by the traversing functions.
1109 typedef PreParserFactory Factory; 1140 typedef PreParserFactory Factory;
1110 }; 1141 };
1111 1142
1112 class Checkpoint; 1143 class Checkpoint;
1113 1144
1114 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} 1145 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {}
1115 1146
1116 // Custom operations executed when FunctionStates are created and 1147 // Custom operations executed when FunctionStates are created and
1117 // destructed. (The PreParser doesn't need to do anything.) 1148 // destructed. (The PreParser doesn't need to do anything.)
1118 template <typename FunctionState> 1149 template <typename FunctionState>
1119 static void SetUpFunctionState(FunctionState* function_state) {} 1150 static void SetUpFunctionState(FunctionState* function_state) {}
1120 template <typename FunctionState> 1151 template <typename FunctionState>
1121 static void TearDownFunctionState(FunctionState* function_state) {} 1152 static void TearDownFunctionState(FunctionState* function_state) {}
1122 1153
1123 // Helper functions for recursive descent. 1154 // Helper functions for recursive descent.
1124 static bool IsEvalOrArguments(PreParserIdentifier identifier) { 1155 static bool IsEvalOrArguments(PreParserIdentifier identifier) {
1125 return identifier.IsEvalOrArguments(); 1156 return identifier.IsEvalOrArguments();
1126 } 1157 }
1127 1158
1159 static bool IsPrototype(PreParserIdentifier identifier) {
1160 return identifier.IsPrototype();
1161 }
1162
1163 static bool IsConstructor(PreParserIdentifier identifier) {
1164 return identifier.IsConstructor();
1165 }
1166
1128 // Returns true if the expression is of type "this.foo". 1167 // Returns true if the expression is of type "this.foo".
1129 static bool IsThisProperty(PreParserExpression expression) { 1168 static bool IsThisProperty(PreParserExpression expression) {
1130 return expression.IsThisProperty(); 1169 return expression.IsThisProperty();
1131 } 1170 }
1132 1171
1133 static bool IsIdentifier(PreParserExpression expression) { 1172 static bool IsIdentifier(PreParserExpression expression) {
1134 return expression.IsIdentifier(); 1173 return expression.IsIdentifier();
1135 } 1174 }
1136 1175
1137 static PreParserIdentifier AsIdentifier(PreParserExpression expression) { 1176 static PreParserIdentifier AsIdentifier(PreParserExpression expression) {
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
1238 } 1277 }
1239 static PreParserExpression EmptyArrowParamList() { 1278 static PreParserExpression EmptyArrowParamList() {
1240 return PreParserExpression::EmptyArrowParamList(); 1279 return PreParserExpression::EmptyArrowParamList();
1241 } 1280 }
1242 static PreParserExpression EmptyLiteral() { 1281 static PreParserExpression EmptyLiteral() {
1243 return PreParserExpression::Default(); 1282 return PreParserExpression::Default();
1244 } 1283 }
1245 static PreParserExpression EmptyObjectLiteralProperty() { 1284 static PreParserExpression EmptyObjectLiteralProperty() {
1246 return PreParserExpression::Default(); 1285 return PreParserExpression::Default();
1247 } 1286 }
1287 static PreParserExpression EmptyFunctionLiteral() {
1288 return PreParserExpression::Default();
1289 }
1290 static PreParserExpression EmptyClassLiteral() {
1291 return PreParserExpression::Default();
1292 }
1248 static PreParserExpressionList NullExpressionList() { 1293 static PreParserExpressionList NullExpressionList() {
1249 return PreParserExpressionList(); 1294 return PreParserExpressionList();
1250 } 1295 }
1251 1296
1252 // Odd-ball literal creators. 1297 // Odd-ball literal creators.
1253 static PreParserExpression GetLiteralTheHole(int position, 1298 static PreParserExpression GetLiteralTheHole(int position,
1254 PreParserFactory* factory) { 1299 PreParserFactory* factory) {
1255 return PreParserExpression::Default(); 1300 return PreParserExpression::Default();
1256 } 1301 }
1257 1302
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
1428 }; 1473 };
1429 1474
1430 // All ParseXXX functions take as the last argument an *ok parameter 1475 // All ParseXXX functions take as the last argument an *ok parameter
1431 // which is set to false if parsing failed; it is unchanged otherwise. 1476 // which is set to false if parsing failed; it is unchanged otherwise.
1432 // By making the 'exception handling' explicit, we are forced to check 1477 // By making the 'exception handling' explicit, we are forced to check
1433 // for failure at the call sites. 1478 // for failure at the call sites.
1434 Statement ParseSourceElement(bool* ok); 1479 Statement ParseSourceElement(bool* ok);
1435 SourceElements ParseSourceElements(int end_token, bool* ok); 1480 SourceElements ParseSourceElements(int end_token, bool* ok);
1436 Statement ParseStatement(bool* ok); 1481 Statement ParseStatement(bool* ok);
1437 Statement ParseFunctionDeclaration(bool* ok); 1482 Statement ParseFunctionDeclaration(bool* ok);
1483 Statement ParseClassDeclaration(bool* ok);
1438 Statement ParseBlock(bool* ok); 1484 Statement ParseBlock(bool* ok);
1439 Statement ParseVariableStatement(VariableDeclarationContext var_context, 1485 Statement ParseVariableStatement(VariableDeclarationContext var_context,
1440 bool* ok); 1486 bool* ok);
1441 Statement ParseVariableDeclarations(VariableDeclarationContext var_context, 1487 Statement ParseVariableDeclarations(VariableDeclarationContext var_context,
1442 VariableDeclarationProperties* decl_props, 1488 VariableDeclarationProperties* decl_props,
1443 int* num_decl, 1489 int* num_decl,
1444 bool* ok); 1490 bool* ok);
1445 Statement ParseExpressionOrLabelledStatement(bool* ok); 1491 Statement ParseExpressionOrLabelledStatement(bool* ok);
1446 Statement ParseIfStatement(bool* ok); 1492 Statement ParseIfStatement(bool* ok);
1447 Statement ParseContinueStatement(bool* ok); 1493 Statement ParseContinueStatement(bool* ok);
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
1701 // 'this' 1747 // 'this'
1702 // 'null' 1748 // 'null'
1703 // 'true' 1749 // 'true'
1704 // 'false' 1750 // 'false'
1705 // Identifier 1751 // Identifier
1706 // Number 1752 // Number
1707 // String 1753 // String
1708 // ArrayLiteral 1754 // ArrayLiteral
1709 // ObjectLiteral 1755 // ObjectLiteral
1710 // RegExpLiteral 1756 // RegExpLiteral
1757 // ClassLiteral
1711 // '(' Expression ')' 1758 // '(' Expression ')'
1712 1759
1713 int pos = peek_position(); 1760 int pos = peek_position();
1714 ExpressionT result = this->EmptyExpression(); 1761 ExpressionT result = this->EmptyExpression();
1715 Token::Value token = peek(); 1762 Token::Value token = peek();
1716 switch (token) { 1763 switch (token) {
1717 case Token::THIS: { 1764 case Token::THIS: {
1718 Consume(Token::THIS); 1765 Consume(Token::THIS);
1719 result = this->ThisExpression(scope_, factory()); 1766 result = this->ThisExpression(scope_, factory());
1720 break; 1767 break;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1771 } else { 1818 } else {
1772 // Heuristically try to detect immediately called functions before 1819 // Heuristically try to detect immediately called functions before
1773 // seeing the call parentheses. 1820 // seeing the call parentheses.
1774 parenthesized_function_ = (peek() == Token::FUNCTION); 1821 parenthesized_function_ = (peek() == Token::FUNCTION);
1775 result = this->ParseExpression(true, CHECK_OK); 1822 result = this->ParseExpression(true, CHECK_OK);
1776 result->increase_parenthesization_level(); 1823 result->increase_parenthesization_level();
1777 Expect(Token::RPAREN, CHECK_OK); 1824 Expect(Token::RPAREN, CHECK_OK);
1778 } 1825 }
1779 break; 1826 break;
1780 1827
1828 case Token::CLASS: {
1829 Consume(Token::CLASS);
1830 int class_token_position = position();
1831 IdentifierT name = this->EmptyIdentifier();
1832 bool is_strict_reserved_name = false;
1833 Scanner::Location class_name_location = Scanner::Location::invalid();
1834 if (peek_any_identifier()) {
1835 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name,
1836 CHECK_OK);
1837 class_name_location = scanner()->location();
1838 }
1839 result = this->ParseClassLiteral(name, class_name_location,
1840 is_strict_reserved_name,
1841 class_token_position, CHECK_OK);
1842 break;
1843 }
1844
1781 case Token::MOD: 1845 case Token::MOD:
1782 if (allow_natives_syntax() || extension_ != NULL) { 1846 if (allow_natives_syntax() || extension_ != NULL) {
1783 result = this->ParseV8Intrinsic(CHECK_OK); 1847 result = this->ParseV8Intrinsic(CHECK_OK);
1784 break; 1848 break;
1785 } 1849 }
1786 // If we're not allowing special syntax we fall-through to the 1850 // If we're not allowing special syntax we fall-through to the
1787 // default case. 1851 // default case.
1788 1852
1789 default: { 1853 default: {
1790 Next(); 1854 Next();
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1841 1905
1842 // Update the scope information before the pre-parsing bailout. 1906 // Update the scope information before the pre-parsing bailout.
1843 int literal_index = function_state_->NextMaterializedLiteralIndex(); 1907 int literal_index = function_state_->NextMaterializedLiteralIndex();
1844 1908
1845 return factory()->NewArrayLiteral(values, literal_index, pos); 1909 return factory()->NewArrayLiteral(values, literal_index, pos);
1846 } 1910 }
1847 1911
1848 1912
1849 template <class Traits> 1913 template <class Traits>
1850 typename ParserBase<Traits>::IdentifierT ParserBase<Traits>::ParsePropertyName( 1914 typename ParserBase<Traits>::IdentifierT ParserBase<Traits>::ParsePropertyName(
1851 bool* is_getter, bool* is_setter, bool* ok) { 1915 bool* is_get, bool* is_set, bool* is_static, bool* ok) {
1852 Token::Value next = peek(); 1916 Token::Value next = peek();
1853 switch (next) { 1917 switch (next) {
1854 case Token::STRING: 1918 case Token::STRING:
1855 Consume(Token::STRING); 1919 Consume(Token::STRING);
1856 return this->GetSymbol(scanner_); 1920 return this->GetSymbol(scanner_);
1857 case Token::NUMBER: 1921 case Token::NUMBER:
1858 Consume(Token::NUMBER); 1922 Consume(Token::NUMBER);
1859 return this->GetNumberAsSymbol(scanner_); 1923 return this->GetNumberAsSymbol(scanner_);
1924 case Token::STATIC:
1925 *is_static = true;
1926 // Fall through.
1860 default: 1927 default:
1861 return ParseIdentifierNameOrGetOrSet(is_getter, is_setter, 1928 return ParseIdentifierNameOrGetOrSet(is_get, is_set, ok);
1862 CHECK_OK_CUSTOM(EmptyIdentifier));
1863 } 1929 }
1930 UNREACHABLE();
1931 return this->EmptyIdentifier();
1864 } 1932 }
1865 1933
1866 1934
1867 template <class Traits> 1935 template <class Traits>
1868 typename ParserBase<Traits>::ObjectLiteralPropertyT ParserBase< 1936 typename ParserBase<Traits>::ObjectLiteralPropertyT ParserBase<
1869 Traits>::ParsePropertyDefinition(ObjectLiteralChecker* checker, bool* ok) { 1937 Traits>::ParsePropertyDefinition(ObjectLiteralChecker* checker,
1938 bool in_class, bool is_static, bool* ok) {
1870 // TODO(arv): Add support for concise generator methods. 1939 // TODO(arv): Add support for concise generator methods.
1871 ExpressionT value = this->EmptyExpression(); 1940 ExpressionT value = this->EmptyExpression();
1872 bool is_getter = false; 1941 bool is_get = false;
1873 bool is_setter = false; 1942 bool is_set = false;
1943 bool name_is_static = false;
1874 Token::Value name_token = peek(); 1944 Token::Value name_token = peek();
1875 int next_pos = peek_position(); 1945 int next_pos = peek_position();
1876 IdentifierT name = ParsePropertyName( 1946 IdentifierT name =
1877 &is_getter, &is_setter, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); 1947 ParsePropertyName(&is_get, &is_set, &name_is_static,
1948 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
1949
1878 if (fni_ != NULL) this->PushLiteralName(fni_, name); 1950 if (fni_ != NULL) this->PushLiteralName(fni_, name);
1879 1951
1880 if (peek() == Token::COLON) { 1952 if (!in_class && peek() == Token::COLON) {
1881 // PropertyDefinition : PropertyName ':' AssignmentExpression 1953 // PropertyDefinition : PropertyName ':' AssignmentExpression
1882 checker->CheckProperty(name_token, kValueProperty, 1954 checker->CheckProperty(name_token, kValueProperty,
1883 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); 1955 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
1884 Consume(Token::COLON); 1956 Consume(Token::COLON);
1885 value = this->ParseAssignmentExpression( 1957 value = this->ParseAssignmentExpression(
1886 true, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); 1958 true, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
1887 1959
1888 } else if (allow_harmony_object_literals_ && peek() == Token::LPAREN) { 1960 } else if (allow_harmony_object_literals_ && peek() == Token::LPAREN) {
1889 // Concise Method 1961 // Concise Method
1962
1963 if (is_static && this->IsPrototype(name)) {
1964 ReportMessageAt(scanner()->location(), "static_prototype");
1965 *ok = false;
1966 return this->EmptyObjectLiteralProperty();
1967 }
1968
1890 checker->CheckProperty(name_token, kValueProperty, 1969 checker->CheckProperty(name_token, kValueProperty,
1891 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); 1970 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
1892 value = this->ParseFunctionLiteral( 1971 value = this->ParseFunctionLiteral(
1893 name, scanner()->location(), 1972 name, scanner()->location(),
1894 false, // reserved words are allowed here 1973 false, // reserved words are allowed here
1895 FunctionKind::kConciseMethod, RelocInfo::kNoPosition, 1974 FunctionKind::kConciseMethod, RelocInfo::kNoPosition,
1896 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::NORMAL_ARITY, 1975 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::NORMAL_ARITY,
1897 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); 1976 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
1898 1977
1899 } else if (is_getter || is_setter) { 1978 } else if (in_class && name_is_static && !is_static) {
1979 // static MethodDefinition
1980 return ParsePropertyDefinition(checker, true, true, ok);
1981
1982 } else if (is_get || is_set) {
1900 // Accessor 1983 // Accessor
1901 bool dont_care = false; 1984 bool dont_care = false;
1902 name_token = peek(); 1985 name_token = peek();
1903 name = ParsePropertyName(&dont_care, &dont_care, 1986 name = ParsePropertyName(&dont_care, &dont_care, &dont_care,
1904 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); 1987 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
1988
1905 // Validate the property. 1989 // Validate the property.
1990 if (is_static && this->IsPrototype(name)) {
1991 ReportMessageAt(scanner()->location(), "static_prototype");
1992 *ok = false;
1993 return this->EmptyObjectLiteralProperty();
1994 } else if (in_class && !is_static && this->IsConstructor(name)) {
1995 // ES6, spec draft rev 27, treats static get constructor as an error too.
1996 // https://bugs.ecmascript.org/show_bug.cgi?id=3223
1997 // TODO(arv): Update when bug is resolved.
1998 ReportMessageAt(scanner()->location(), "constructor_special_method");
1999 *ok = false;
2000 return this->EmptyObjectLiteralProperty();
2001 }
1906 checker->CheckProperty(name_token, 2002 checker->CheckProperty(name_token,
1907 is_getter ? kGetterProperty : kSetterProperty, 2003 is_get ? kGetterProperty : kSetterProperty,
1908 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); 2004 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
2005
1909 typename Traits::Type::FunctionLiteral value = this->ParseFunctionLiteral( 2006 typename Traits::Type::FunctionLiteral value = this->ParseFunctionLiteral(
1910 name, scanner()->location(), 2007 name, scanner()->location(),
1911 false, // reserved words are allowed here 2008 false, // reserved words are allowed here
1912 FunctionKind::kNormalFunction, RelocInfo::kNoPosition, 2009 FunctionKind::kNormalFunction, RelocInfo::kNoPosition,
1913 FunctionLiteral::ANONYMOUS_EXPRESSION, 2010 FunctionLiteral::ANONYMOUS_EXPRESSION,
1914 is_getter ? FunctionLiteral::GETTER_ARITY 2011 is_get ? FunctionLiteral::GETTER_ARITY : FunctionLiteral::SETTER_ARITY,
1915 : FunctionLiteral::SETTER_ARITY,
1916 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); 2012 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
1917 return factory()->NewObjectLiteralProperty(is_getter, value, next_pos); 2013 return factory()->NewObjectLiteralProperty(is_get, value, next_pos,
2014 is_static);
1918 } else { 2015 } else {
1919 Token::Value next = Next(); 2016 Token::Value next = Next();
1920 ReportUnexpectedToken(next); 2017 ReportUnexpectedToken(next);
1921 *ok = false; 2018 *ok = false;
1922 return this->EmptyObjectLiteralProperty(); 2019 return this->EmptyObjectLiteralProperty();
1923 } 2020 }
1924 2021
1925 uint32_t index; 2022 uint32_t index;
1926 LiteralT key = this->IsArrayIndex(name, &index) 2023 LiteralT key = this->IsArrayIndex(name, &index)
1927 ? factory()->NewNumberLiteral(index, next_pos) 2024 ? factory()->NewNumberLiteral(index, next_pos)
1928 : factory()->NewStringLiteral(name, next_pos); 2025 : factory()->NewStringLiteral(name, next_pos);
1929 2026
1930 return factory()->NewObjectLiteralProperty(key, value); 2027 return factory()->NewObjectLiteralProperty(key, value, is_static);
1931 } 2028 }
1932 2029
1933 2030
1934 template <class Traits> 2031 template <class Traits>
1935 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseObjectLiteral( 2032 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseObjectLiteral(
1936 bool* ok) { 2033 bool* ok) {
1937 // ObjectLiteral :: 2034 // ObjectLiteral ::
1938 // '{' (PropertyDefinition (',' PropertyDefinition)* ','? )? '}' 2035 // '{' (PropertyDefinition (',' PropertyDefinition)* ','? )? '}'
1939 2036
1940 int pos = peek_position(); 2037 int pos = peek_position();
1941 typename Traits::Type::PropertyList properties = 2038 typename Traits::Type::PropertyList properties =
1942 this->NewPropertyList(4, zone_); 2039 this->NewPropertyList(4, zone_);
1943 int number_of_boilerplate_properties = 0; 2040 int number_of_boilerplate_properties = 0;
1944 bool has_function = false; 2041 bool has_function = false;
1945 2042
1946 ObjectLiteralChecker checker(this, strict_mode()); 2043 ObjectLiteralChecker checker(this, strict_mode());
1947 2044
1948 Expect(Token::LBRACE, CHECK_OK); 2045 Expect(Token::LBRACE, CHECK_OK);
1949 2046
1950 while (peek() != Token::RBRACE) { 2047 while (peek() != Token::RBRACE) {
1951 if (fni_ != NULL) fni_->Enter(); 2048 if (fni_ != NULL) fni_->Enter();
1952 2049
2050 const bool in_class = false;
2051 const bool is_static = false;
1953 ObjectLiteralPropertyT property = 2052 ObjectLiteralPropertyT property =
1954 this->ParsePropertyDefinition(&checker, CHECK_OK); 2053 this->ParsePropertyDefinition(&checker, in_class, is_static, CHECK_OK);
1955 2054
1956 // Mark top-level object literals that contain function literals and 2055 // Mark top-level object literals that contain function literals and
1957 // pretenure the literal so it can be added as a constant function 2056 // pretenure the literal so it can be added as a constant function
1958 // property. (Parser only.) 2057 // property. (Parser only.)
1959 this->CheckFunctionLiteralInsideTopLevelObjectLiteral(scope_, property, 2058 this->CheckFunctionLiteralInsideTopLevelObjectLiteral(scope_, property,
1960 &has_function); 2059 &has_function);
1961 2060
1962 // Count CONSTANT or COMPUTED properties to maintain the enumeration order. 2061 // Count CONSTANT or COMPUTED properties to maintain the enumeration order.
1963 if (this->IsBoilerplateProperty(property)) { 2062 if (this->IsBoilerplateProperty(property)) {
1964 number_of_boilerplate_properties++; 2063 number_of_boilerplate_properties++;
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after
2393 } 2492 }
2394 // No 'new' or 'super' keyword. 2493 // No 'new' or 'super' keyword.
2395 return this->ParseMemberExpression(ok); 2494 return this->ParseMemberExpression(ok);
2396 } 2495 }
2397 2496
2398 2497
2399 template <class Traits> 2498 template <class Traits>
2400 typename ParserBase<Traits>::ExpressionT 2499 typename ParserBase<Traits>::ExpressionT
2401 ParserBase<Traits>::ParseMemberExpression(bool* ok) { 2500 ParserBase<Traits>::ParseMemberExpression(bool* ok) {
2402 // MemberExpression :: 2501 // MemberExpression ::
2403 // (PrimaryExpression | FunctionLiteral) 2502 // (PrimaryExpression | FunctionLiteral | ClassLiteral)
2404 // ('[' Expression ']' | '.' Identifier | Arguments)* 2503 // ('[' Expression ']' | '.' Identifier | Arguments)*
2405 2504
2406 // The '[' Expression ']' and '.' Identifier parts are parsed by 2505 // The '[' Expression ']' and '.' Identifier parts are parsed by
2407 // ParseMemberExpressionContinuation, and the Arguments part is parsed by the 2506 // ParseMemberExpressionContinuation, and the Arguments part is parsed by the
2408 // caller. 2507 // caller.
2409 2508
2410 // Parse the initial primary or function expression. 2509 // Parse the initial primary or function expression.
2411 ExpressionT result = this->EmptyExpression(); 2510 ExpressionT result = this->EmptyExpression();
2412 if (peek() == Token::FUNCTION) { 2511 if (peek() == Token::FUNCTION) {
2413 Consume(Token::FUNCTION); 2512 Consume(Token::FUNCTION);
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
2596 function_literal->set_function_token_position(start_pos); 2695 function_literal->set_function_token_position(start_pos);
2597 function_literal->set_ast_properties(&ast_properties); 2696 function_literal->set_ast_properties(&ast_properties);
2598 function_literal->set_dont_optimize_reason(dont_optimize_reason); 2697 function_literal->set_dont_optimize_reason(dont_optimize_reason);
2599 2698
2600 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal); 2699 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal);
2601 2700
2602 return function_literal; 2701 return function_literal;
2603 } 2702 }
2604 2703
2605 2704
2705 template <class Traits>
2706 typename ParserBase<Traits>::ClassLiteralT
2707 ParserBase<Traits>::ParseClassLiteral(IdentifierT name,
2708 Scanner::Location class_name_location,
2709 bool name_is_strict_reserved, int pos,
2710 bool* ok) {
2711 // All parts of a ClassDeclaration or a ClassExpression are strict code.
2712 if (name_is_strict_reserved) {
2713 ReportMessageAt(class_name_location, "unexpected_strict_reserved");
2714 *ok = false;
2715 return this->EmptyClassLiteral();
2716 }
2717 if (this->IsEvalOrArguments(name)) {
2718 ReportMessageAt(class_name_location, "strict_eval_arguments");
2719 *ok = false;
2720 return this->EmptyClassLiteral();
2721 }
2722
2723 // TODO(arv): Implement scopes and name binding in class body only.
2724 // TODO(arv): Maybe add CLASS_SCOPE?
2725 typename Traits::Type::ScopePtr extends_scope =
2726 this->NewScope(scope_, BLOCK_SCOPE);
2727 FunctionState extends_function_state(
2728 &function_state_, &scope_, &extends_scope, zone(),
2729 this->ast_value_factory(), ast_node_id_gen_);
2730 scope_->SetStrictMode(STRICT);
2731 scope_->SetScopeName(name);
2732
2733 ExpressionT extends = this->EmptyExpression();
2734 if (Check(Token::EXTENDS)) {
2735 extends =
2736 this->ParseLeftHandSideExpression(CHECK_OK_CUSTOM(EmptyClassLiteral));
2737 }
2738
2739 ObjectLiteralChecker checker(this, STRICT);
2740 typename Traits::Type::PropertyList properties =
2741 this->NewPropertyList(4, zone_);
2742 FunctionLiteralT constructor = this->EmptyFunctionLiteral();
2743
2744 Expect(Token::LBRACE, CHECK_OK_CUSTOM(EmptyClassLiteral));
2745 while (peek() != Token::RBRACE) {
2746 if (Check(Token::SEMICOLON)) continue;
2747 if (fni_ != NULL) fni_->Enter();
2748
2749 const bool in_class = true;
2750 const bool is_static = false;
2751 ObjectLiteralPropertyT property = this->ParsePropertyDefinition(
2752 &checker, in_class, is_static, CHECK_OK_CUSTOM(EmptyClassLiteral));
2753
2754 properties->Add(property, zone());
2755
2756 if (fni_ != NULL) {
2757 fni_->Infer();
2758 fni_->Leave();
2759 }
2760 }
2761 Expect(Token::RBRACE, CHECK_OK_CUSTOM(EmptyClassLiteral));
2762
2763 return factory()->NewClassLiteral(name, extends, constructor, properties,
2764 this->ast_value_factory(), pos);
2765 }
2766
2767
2606 template <typename Traits> 2768 template <typename Traits>
2607 typename ParserBase<Traits>::ExpressionT 2769 typename ParserBase<Traits>::ExpressionT
2608 ParserBase<Traits>::CheckAndRewriteReferenceExpression( 2770 ParserBase<Traits>::CheckAndRewriteReferenceExpression(
2609 ExpressionT expression, 2771 ExpressionT expression,
2610 Scanner::Location location, const char* message, bool* ok) { 2772 Scanner::Location location, const char* message, bool* ok) {
2611 if (strict_mode() == STRICT && this->IsIdentifier(expression) && 2773 if (strict_mode() == STRICT && this->IsIdentifier(expression) &&
2612 this->IsEvalOrArguments(this->AsIdentifier(expression))) { 2774 this->IsEvalOrArguments(this->AsIdentifier(expression))) {
2613 this->ReportMessageAt(location, "strict_eval_arguments", false); 2775 this->ReportMessageAt(location, "strict_eval_arguments", false);
2614 *ok = false; 2776 *ok = false;
2615 return this->EmptyExpression(); 2777 return this->EmptyExpression();
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2655 DCHECK(IsAccessorAccessorConflict(old_type, type)); 2817 DCHECK(IsAccessorAccessorConflict(old_type, type));
2656 // Both accessors of the same type. 2818 // Both accessors of the same type.
2657 parser()->ReportMessage("accessor_get_set"); 2819 parser()->ReportMessage("accessor_get_set");
2658 } 2820 }
2659 *ok = false; 2821 *ok = false;
2660 } 2822 }
2661 } 2823 }
2662 } } // v8::internal 2824 } } // v8::internal
2663 2825
2664 #endif // V8_PREPARSER_H 2826 #endif // V8_PREPARSER_H
OLDNEW
« no previous file with comments | « src/parser.cc ('k') | src/preparser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698