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

Side by Side Diff: src/parser.cc

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.h ('k') | src/preparser.h » ('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 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/ast.h" 8 #include "src/ast.h"
9 #include "src/base/platform/platform.h" 9 #include "src/base/platform/platform.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
359 AstNode::IdGen saved_ast_node_id_gen_; 359 AstNode::IdGen saved_ast_node_id_gen_;
360 }; 360 };
361 361
362 362
363 bool ParserTraits::IsEvalOrArguments(const AstRawString* identifier) const { 363 bool ParserTraits::IsEvalOrArguments(const AstRawString* identifier) const {
364 return identifier == parser_->ast_value_factory()->eval_string() || 364 return identifier == parser_->ast_value_factory()->eval_string() ||
365 identifier == parser_->ast_value_factory()->arguments_string(); 365 identifier == parser_->ast_value_factory()->arguments_string();
366 } 366 }
367 367
368 368
369 bool ParserTraits::IsPrototype(const AstRawString* identifier) const {
370 return identifier == parser_->ast_value_factory()->prototype_string();
371 }
372
373
374 bool ParserTraits::IsConstructor(const AstRawString* identifier) const {
375 return identifier == parser_->ast_value_factory()->constructor_string();
376 }
377
378
369 bool ParserTraits::IsThisProperty(Expression* expression) { 379 bool ParserTraits::IsThisProperty(Expression* expression) {
370 DCHECK(expression != NULL); 380 DCHECK(expression != NULL);
371 Property* property = expression->AsProperty(); 381 Property* property = expression->AsProperty();
372 return property != NULL && 382 return property != NULL &&
373 property->obj()->AsVariableProxy() != NULL && 383 property->obj()->AsVariableProxy() != NULL &&
374 property->obj()->AsVariableProxy()->is_this(); 384 property->obj()->AsVariableProxy()->is_this();
375 } 385 }
376 386
377 387
378 bool ParserTraits::IsIdentifier(Expression* expression) { 388 bool ParserTraits::IsIdentifier(Expression* expression) {
(...skipping 750 matching lines...) Expand 10 before | Expand all | Expand 10 after
1129 // LetDeclaration 1139 // LetDeclaration
1130 // ConstDeclaration 1140 // ConstDeclaration
1131 // ModuleDeclaration 1141 // ModuleDeclaration
1132 // ImportDeclaration 1142 // ImportDeclaration
1133 // ExportDeclaration 1143 // ExportDeclaration
1134 // GeneratorDeclaration 1144 // GeneratorDeclaration
1135 1145
1136 switch (peek()) { 1146 switch (peek()) {
1137 case Token::FUNCTION: 1147 case Token::FUNCTION:
1138 return ParseFunctionDeclaration(NULL, ok); 1148 return ParseFunctionDeclaration(NULL, ok);
1149 case Token::CLASS:
1150 return ParseClassDeclaration(NULL, ok);
1139 case Token::IMPORT: 1151 case Token::IMPORT:
1140 return ParseImportDeclaration(ok); 1152 return ParseImportDeclaration(ok);
1141 case Token::EXPORT: 1153 case Token::EXPORT:
1142 return ParseExportDeclaration(ok); 1154 return ParseExportDeclaration(ok);
1143 case Token::CONST: 1155 case Token::CONST:
1144 return ParseVariableStatement(kModuleElement, NULL, ok); 1156 return ParseVariableStatement(kModuleElement, NULL, ok);
1145 case Token::LET: 1157 case Token::LET:
1146 DCHECK(allow_harmony_scoping()); 1158 DCHECK(allow_harmony_scoping());
1147 if (strict_mode() == STRICT) { 1159 if (strict_mode() == STRICT) {
1148 return ParseVariableStatement(kModuleElement, NULL, ok); 1160 return ParseVariableStatement(kModuleElement, NULL, ok);
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
1468 } else { 1480 } else {
1469 result = ParseModuleDeclaration(&names, CHECK_OK); 1481 result = ParseModuleDeclaration(&names, CHECK_OK);
1470 } 1482 }
1471 break; 1483 break;
1472 } 1484 }
1473 1485
1474 case Token::FUNCTION: 1486 case Token::FUNCTION:
1475 result = ParseFunctionDeclaration(&names, CHECK_OK); 1487 result = ParseFunctionDeclaration(&names, CHECK_OK);
1476 break; 1488 break;
1477 1489
1490 case Token::CLASS:
1491 result = ParseClassDeclaration(&names, CHECK_OK);
1492 break;
1493
1478 case Token::VAR: 1494 case Token::VAR:
1479 case Token::LET: 1495 case Token::LET:
1480 case Token::CONST: 1496 case Token::CONST:
1481 result = ParseVariableStatement(kModuleElement, &names, CHECK_OK); 1497 result = ParseVariableStatement(kModuleElement, &names, CHECK_OK);
1482 break; 1498 break;
1483 1499
1484 default: 1500 default:
1485 *ok = false; 1501 *ok = false;
1486 ReportUnexpectedToken(scanner()->current_token()); 1502 ReportUnexpectedToken(scanner()->current_token());
1487 return NULL; 1503 return NULL;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1530 // (Ecma 262 5th Edition, clause 14): 1546 // (Ecma 262 5th Edition, clause 14):
1531 // SourceElement: 1547 // SourceElement:
1532 // Statement 1548 // Statement
1533 // FunctionDeclaration 1549 // FunctionDeclaration
1534 // 1550 //
1535 // In harmony mode we allow additionally the following productions 1551 // In harmony mode we allow additionally the following productions
1536 // BlockElement (aka SourceElement): 1552 // BlockElement (aka SourceElement):
1537 // LetDeclaration 1553 // LetDeclaration
1538 // ConstDeclaration 1554 // ConstDeclaration
1539 // GeneratorDeclaration 1555 // GeneratorDeclaration
1556 // ClassDeclaration
1540 1557
1541 switch (peek()) { 1558 switch (peek()) {
1542 case Token::FUNCTION: 1559 case Token::FUNCTION:
1543 return ParseFunctionDeclaration(NULL, ok); 1560 return ParseFunctionDeclaration(NULL, ok);
1561 case Token::CLASS:
1562 return ParseClassDeclaration(NULL, ok);
1544 case Token::CONST: 1563 case Token::CONST:
1545 return ParseVariableStatement(kModuleElement, NULL, ok); 1564 return ParseVariableStatement(kModuleElement, NULL, ok);
1546 case Token::LET: 1565 case Token::LET:
1547 DCHECK(allow_harmony_scoping()); 1566 DCHECK(allow_harmony_scoping());
1548 if (strict_mode() == STRICT) { 1567 if (strict_mode() == STRICT) {
1549 return ParseVariableStatement(kModuleElement, NULL, ok); 1568 return ParseVariableStatement(kModuleElement, NULL, ok);
1550 } 1569 }
1551 // Fall through. 1570 // Fall through.
1552 default: 1571 default:
1553 return ParseStatement(labels, ok); 1572 return ParseStatement(labels, ok);
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
1645 // Statement: 1664 // Statement:
1646 // GeneratorDeclaration 1665 // GeneratorDeclaration
1647 if (strict_mode() == STRICT) { 1666 if (strict_mode() == STRICT) {
1648 ReportMessageAt(scanner()->peek_location(), "strict_function"); 1667 ReportMessageAt(scanner()->peek_location(), "strict_function");
1649 *ok = false; 1668 *ok = false;
1650 return NULL; 1669 return NULL;
1651 } 1670 }
1652 return ParseFunctionDeclaration(NULL, ok); 1671 return ParseFunctionDeclaration(NULL, ok);
1653 } 1672 }
1654 1673
1674 case Token::CLASS:
1675 return ParseClassDeclaration(NULL, ok);
1676
1655 case Token::DEBUGGER: 1677 case Token::DEBUGGER:
1656 return ParseDebuggerStatement(ok); 1678 return ParseDebuggerStatement(ok);
1657 1679
1658 case Token::VAR: 1680 case Token::VAR:
1659 case Token::CONST: 1681 case Token::CONST:
1660 return ParseVariableStatement(kStatement, NULL, ok); 1682 return ParseVariableStatement(kStatement, NULL, ok);
1661 1683
1662 case Token::LET: 1684 case Token::LET:
1663 DCHECK(allow_harmony_scoping()); 1685 DCHECK(allow_harmony_scoping());
1664 if (strict_mode() == STRICT) { 1686 if (strict_mode() == STRICT) {
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
1913 scope_->is_function_scope()) ? LET : VAR; 1935 scope_->is_function_scope()) ? LET : VAR;
1914 VariableProxy* proxy = NewUnresolved(name, mode, Interface::NewValue()); 1936 VariableProxy* proxy = NewUnresolved(name, mode, Interface::NewValue());
1915 Declaration* declaration = 1937 Declaration* declaration =
1916 factory()->NewFunctionDeclaration(proxy, mode, fun, scope_, pos); 1938 factory()->NewFunctionDeclaration(proxy, mode, fun, scope_, pos);
1917 Declare(declaration, true, CHECK_OK); 1939 Declare(declaration, true, CHECK_OK);
1918 if (names) names->Add(name, zone()); 1940 if (names) names->Add(name, zone());
1919 return factory()->NewEmptyStatement(RelocInfo::kNoPosition); 1941 return factory()->NewEmptyStatement(RelocInfo::kNoPosition);
1920 } 1942 }
1921 1943
1922 1944
1945 Statement* Parser::ParseClassDeclaration(ZoneList<const AstRawString*>* names,
1946 bool* ok) {
1947 // ClassDeclaration ::
1948 // 'class' Identifier ('extends' LeftHandExpression)? '{' ClassBody '}'
1949 //
1950 // A ClassDeclaration
1951 //
1952 // class C { ... }
1953 //
1954 // has the same semantics as:
1955 //
1956 // let C = class C { ... };
1957 //
1958 // so rewrite it as such.
1959
1960 Expect(Token::CLASS, CHECK_OK);
1961 int pos = position();
1962 bool is_strict_reserved = false;
1963 const AstRawString* name =
1964 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK);
1965 ClassLiteral* value = ParseClassLiteral(name, scanner()->location(),
1966 is_strict_reserved, pos, CHECK_OK);
1967
1968 Block* block = factory()->NewBlock(NULL, 1, true, pos);
1969 VariableMode mode = LET;
1970 VariableProxy* proxy = NewUnresolved(name, mode, Interface::NewValue());
1971 Declaration* declaration =
1972 factory()->NewVariableDeclaration(proxy, mode, scope_, pos);
1973 Declare(declaration, true, CHECK_OK);
1974
1975 Token::Value init_op = Token::INIT_LET;
1976 Assignment* assignment = factory()->NewAssignment(init_op, proxy, value, pos);
1977 block->AddStatement(
1978 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition),
1979 zone());
1980
1981 if (names) names->Add(name, zone());
1982 return block;
1983 }
1984
1985
1923 Block* Parser::ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok) { 1986 Block* Parser::ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok) {
1924 if (allow_harmony_scoping() && strict_mode() == STRICT) { 1987 if (allow_harmony_scoping() && strict_mode() == STRICT) {
1925 return ParseScopedBlock(labels, ok); 1988 return ParseScopedBlock(labels, ok);
1926 } 1989 }
1927 1990
1928 // Block :: 1991 // Block ::
1929 // '{' Statement* '}' 1992 // '{' Statement* '}'
1930 1993
1931 // Note that a Block does not introduce a new execution scope! 1994 // Note that a Block does not introduce a new execution scope!
1932 // (ECMA-262, 3rd, 12.2) 1995 // (ECMA-262, 3rd, 12.2)
(...skipping 2950 matching lines...) Expand 10 before | Expand all | Expand 10 after
4883 4946
4884 // We cannot internalize on a background thread; a foreground task will take 4947 // We cannot internalize on a background thread; a foreground task will take
4885 // care of calling Parser::Internalize just before compilation. 4948 // care of calling Parser::Internalize just before compilation.
4886 4949
4887 if (compile_options() == ScriptCompiler::kProduceParserCache) { 4950 if (compile_options() == ScriptCompiler::kProduceParserCache) {
4888 if (result != NULL) *info_->cached_data() = recorder.GetScriptData(); 4951 if (result != NULL) *info_->cached_data() = recorder.GetScriptData();
4889 log_ = NULL; 4952 log_ = NULL;
4890 } 4953 }
4891 } 4954 }
4892 } } // namespace v8::internal 4955 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/parser.h ('k') | src/preparser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698