| 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 #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  Loading... | 
|   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  Loading... | 
|  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  Loading... | 
|  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  Loading... | 
|  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  Loading... | 
|  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  Loading... | 
|  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  Loading... | 
|  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 | 
| OLD | NEW |