| 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/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
| 10 #include "src/base/platform/platform.h" | 10 #include "src/base/platform/platform.h" |
| (...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 | 458 |
| 459 bool ParserTraits::IsArguments(const AstRawString* identifier) const { | 459 bool ParserTraits::IsArguments(const AstRawString* identifier) const { |
| 460 return identifier == parser_->ast_value_factory()->arguments_string(); | 460 return identifier == parser_->ast_value_factory()->arguments_string(); |
| 461 } | 461 } |
| 462 | 462 |
| 463 | 463 |
| 464 bool ParserTraits::IsEvalOrArguments(const AstRawString* identifier) const { | 464 bool ParserTraits::IsEvalOrArguments(const AstRawString* identifier) const { |
| 465 return IsEval(identifier) || IsArguments(identifier); | 465 return IsEval(identifier) || IsArguments(identifier); |
| 466 } | 466 } |
| 467 | 467 |
| 468 bool ParserTraits::IsUndefined(const AstRawString* identifier) const { |
| 469 return identifier == parser_->ast_value_factory()->undefined_string(); |
| 470 } |
| 468 | 471 |
| 469 bool ParserTraits::IsPrototype(const AstRawString* identifier) const { | 472 bool ParserTraits::IsPrototype(const AstRawString* identifier) const { |
| 470 return identifier == parser_->ast_value_factory()->prototype_string(); | 473 return identifier == parser_->ast_value_factory()->prototype_string(); |
| 471 } | 474 } |
| 472 | 475 |
| 473 | 476 |
| 474 bool ParserTraits::IsConstructor(const AstRawString* identifier) const { | 477 bool ParserTraits::IsConstructor(const AstRawString* identifier) const { |
| 475 return identifier == parser_->ast_value_factory()->constructor_string(); | 478 return identifier == parser_->ast_value_factory()->constructor_string(); |
| 476 } | 479 } |
| 477 | 480 |
| (...skipping 991 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1469 local_name = ParseIdentifierName(CHECK_OK); | 1472 local_name = ParseIdentifierName(CHECK_OK); |
| 1470 } | 1473 } |
| 1471 if (!Token::IsIdentifier(scanner()->current_token(), STRICT, false)) { | 1474 if (!Token::IsIdentifier(scanner()->current_token(), STRICT, false)) { |
| 1472 *ok = false; | 1475 *ok = false; |
| 1473 ReportMessage("unexpected_reserved"); | 1476 ReportMessage("unexpected_reserved"); |
| 1474 return NULL; | 1477 return NULL; |
| 1475 } else if (IsEvalOrArguments(local_name)) { | 1478 } else if (IsEvalOrArguments(local_name)) { |
| 1476 *ok = false; | 1479 *ok = false; |
| 1477 ReportMessage("strict_eval_arguments"); | 1480 ReportMessage("strict_eval_arguments"); |
| 1478 return NULL; | 1481 return NULL; |
| 1482 } else if (is_strong(language_mode()) && IsUndefined(local_name)) { |
| 1483 *ok = false; |
| 1484 ReportMessage("strong_undefined"); |
| 1485 return NULL; |
| 1479 } | 1486 } |
| 1480 VariableProxy* proxy = NewUnresolved(local_name, IMPORT); | 1487 VariableProxy* proxy = NewUnresolved(local_name, IMPORT); |
| 1481 ImportDeclaration* declaration = | 1488 ImportDeclaration* declaration = |
| 1482 factory()->NewImportDeclaration(proxy, import_name, NULL, scope_, pos); | 1489 factory()->NewImportDeclaration(proxy, import_name, NULL, scope_, pos); |
| 1483 Declare(declaration, true, CHECK_OK); | 1490 Declare(declaration, true, CHECK_OK); |
| 1484 result->Add(declaration, zone()); | 1491 result->Add(declaration, zone()); |
| 1485 if (peek() == Token::RBRACE) break; | 1492 if (peek() == Token::RBRACE) break; |
| 1486 Expect(Token::COMMA, CHECK_OK); | 1493 Expect(Token::COMMA, CHECK_OK); |
| 1487 } | 1494 } |
| 1488 | 1495 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1518 ExpectSemicolon(CHECK_OK); | 1525 ExpectSemicolon(CHECK_OK); |
| 1519 // TODO(ES6): Add module to the requested modules of scope_->module(). | 1526 // TODO(ES6): Add module to the requested modules of scope_->module(). |
| 1520 USE(module_specifier); | 1527 USE(module_specifier); |
| 1521 return factory()->NewEmptyStatement(pos); | 1528 return factory()->NewEmptyStatement(pos); |
| 1522 } | 1529 } |
| 1523 | 1530 |
| 1524 // Parse ImportedDefaultBinding if present. | 1531 // Parse ImportedDefaultBinding if present. |
| 1525 ImportDeclaration* import_default_declaration = NULL; | 1532 ImportDeclaration* import_default_declaration = NULL; |
| 1526 if (tok != Token::MUL && tok != Token::LBRACE) { | 1533 if (tok != Token::MUL && tok != Token::LBRACE) { |
| 1527 const AstRawString* local_name = | 1534 const AstRawString* local_name = |
| 1528 ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); | 1535 ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK); |
| 1529 VariableProxy* proxy = NewUnresolved(local_name, IMPORT); | 1536 VariableProxy* proxy = NewUnresolved(local_name, IMPORT); |
| 1530 import_default_declaration = factory()->NewImportDeclaration( | 1537 import_default_declaration = factory()->NewImportDeclaration( |
| 1531 proxy, ast_value_factory()->default_string(), NULL, scope_, pos); | 1538 proxy, ast_value_factory()->default_string(), NULL, scope_, pos); |
| 1532 Declare(import_default_declaration, true, CHECK_OK); | 1539 Declare(import_default_declaration, true, CHECK_OK); |
| 1533 } | 1540 } |
| 1534 | 1541 |
| 1535 const AstRawString* module_instance_binding = NULL; | 1542 const AstRawString* module_instance_binding = NULL; |
| 1536 ZoneList<ImportDeclaration*>* named_declarations = NULL; | 1543 ZoneList<ImportDeclaration*>* named_declarations = NULL; |
| 1537 if (import_default_declaration == NULL || Check(Token::COMMA)) { | 1544 if (import_default_declaration == NULL || Check(Token::COMMA)) { |
| 1538 switch (peek()) { | 1545 switch (peek()) { |
| 1539 case Token::MUL: { | 1546 case Token::MUL: { |
| 1540 Consume(Token::MUL); | 1547 Consume(Token::MUL); |
| 1541 ExpectContextualKeyword(CStrVector("as"), CHECK_OK); | 1548 ExpectContextualKeyword(CStrVector("as"), CHECK_OK); |
| 1542 module_instance_binding = | 1549 module_instance_binding = |
| 1543 ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); | 1550 ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK); |
| 1544 // TODO(ES6): Add an appropriate declaration. | 1551 // TODO(ES6): Add an appropriate declaration. |
| 1545 break; | 1552 break; |
| 1546 } | 1553 } |
| 1547 | 1554 |
| 1548 case Token::LBRACE: | 1555 case Token::LBRACE: |
| 1549 named_declarations = ParseNamedImports(pos, CHECK_OK); | 1556 named_declarations = ParseNamedImports(pos, CHECK_OK); |
| 1550 break; | 1557 break; |
| 1551 | 1558 |
| 1552 default: | 1559 default: |
| 1553 *ok = false; | 1560 *ok = false; |
| (...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2026 | 2033 |
| 2027 | 2034 |
| 2028 // Language extension which is only enabled for source files loaded | 2035 // Language extension which is only enabled for source files loaded |
| 2029 // through the API's extension mechanism. A native function | 2036 // through the API's extension mechanism. A native function |
| 2030 // declaration is resolved by looking up the function through a | 2037 // declaration is resolved by looking up the function through a |
| 2031 // callback provided by the extension. | 2038 // callback provided by the extension. |
| 2032 Statement* Parser::ParseNativeDeclaration(bool* ok) { | 2039 Statement* Parser::ParseNativeDeclaration(bool* ok) { |
| 2033 int pos = peek_position(); | 2040 int pos = peek_position(); |
| 2034 Expect(Token::FUNCTION, CHECK_OK); | 2041 Expect(Token::FUNCTION, CHECK_OK); |
| 2035 // Allow "eval" or "arguments" for backward compatibility. | 2042 // Allow "eval" or "arguments" for backward compatibility. |
| 2036 const AstRawString* name = ParseIdentifier(kAllowEvalOrArguments, CHECK_OK); | 2043 const AstRawString* name = |
| 2044 ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK); |
| 2037 Expect(Token::LPAREN, CHECK_OK); | 2045 Expect(Token::LPAREN, CHECK_OK); |
| 2038 bool done = (peek() == Token::RPAREN); | 2046 bool done = (peek() == Token::RPAREN); |
| 2039 while (!done) { | 2047 while (!done) { |
| 2040 ParseIdentifier(kAllowEvalOrArguments, CHECK_OK); | 2048 ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK); |
| 2041 done = (peek() == Token::RPAREN); | 2049 done = (peek() == Token::RPAREN); |
| 2042 if (!done) { | 2050 if (!done) { |
| 2043 Expect(Token::COMMA, CHECK_OK); | 2051 Expect(Token::COMMA, CHECK_OK); |
| 2044 } | 2052 } |
| 2045 } | 2053 } |
| 2046 Expect(Token::RPAREN, CHECK_OK); | 2054 Expect(Token::RPAREN, CHECK_OK); |
| 2047 Expect(Token::SEMICOLON, CHECK_OK); | 2055 Expect(Token::SEMICOLON, CHECK_OK); |
| 2048 | 2056 |
| 2049 // Make sure that the function containing the native declaration | 2057 // Make sure that the function containing the native declaration |
| 2050 // isn't lazily compiled. The extension structures are only | 2058 // isn't lazily compiled. The extension structures are only |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2312 int nvars = 0; // the number of variables declared | 2320 int nvars = 0; // the number of variables declared |
| 2313 int bindings_start = peek_position(); | 2321 int bindings_start = peek_position(); |
| 2314 const AstRawString* name = NULL; | 2322 const AstRawString* name = NULL; |
| 2315 const AstRawString* first_name = NULL; | 2323 const AstRawString* first_name = NULL; |
| 2316 bool is_for_iteration_variable; | 2324 bool is_for_iteration_variable; |
| 2317 do { | 2325 do { |
| 2318 if (fni_ != NULL) fni_->Enter(); | 2326 if (fni_ != NULL) fni_->Enter(); |
| 2319 | 2327 |
| 2320 // Parse variable name. | 2328 // Parse variable name. |
| 2321 if (nvars > 0) Consume(Token::COMMA); | 2329 if (nvars > 0) Consume(Token::COMMA); |
| 2322 name = ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); | 2330 name = ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK); |
| 2323 if (!first_name) first_name = name; | 2331 if (!first_name) first_name = name; |
| 2324 Scanner::Location variable_loc = scanner()->location(); | 2332 Scanner::Location variable_loc = scanner()->location(); |
| 2325 if (fni_ != NULL) fni_->PushVariableName(name); | 2333 if (fni_ != NULL) fni_->PushVariableName(name); |
| 2326 | 2334 |
| 2327 // Declare variable. | 2335 // Declare variable. |
| 2328 // Note that we *always* must treat the initial value via a separate init | 2336 // Note that we *always* must treat the initial value via a separate init |
| 2329 // assignment for variables and constants because the value must be assigned | 2337 // assignment for variables and constants because the value must be assigned |
| 2330 // when the variable is encountered in the source. But the variable/constant | 2338 // when the variable is encountered in the source. But the variable/constant |
| 2331 // is declared (and set to 'undefined') upon entering the function within | 2339 // is declared (and set to 'undefined') upon entering the function within |
| 2332 // which the variable or constant is declared. Only function variables have | 2340 // which the variable or constant is declared. Only function variables have |
| (...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2664 // ContinueStatement :: | 2672 // ContinueStatement :: |
| 2665 // 'continue' Identifier? ';' | 2673 // 'continue' Identifier? ';' |
| 2666 | 2674 |
| 2667 int pos = peek_position(); | 2675 int pos = peek_position(); |
| 2668 Expect(Token::CONTINUE, CHECK_OK); | 2676 Expect(Token::CONTINUE, CHECK_OK); |
| 2669 const AstRawString* label = NULL; | 2677 const AstRawString* label = NULL; |
| 2670 Token::Value tok = peek(); | 2678 Token::Value tok = peek(); |
| 2671 if (!scanner()->HasAnyLineTerminatorBeforeNext() && | 2679 if (!scanner()->HasAnyLineTerminatorBeforeNext() && |
| 2672 tok != Token::SEMICOLON && tok != Token::RBRACE && tok != Token::EOS) { | 2680 tok != Token::SEMICOLON && tok != Token::RBRACE && tok != Token::EOS) { |
| 2673 // ECMA allows "eval" or "arguments" as labels even in strict mode. | 2681 // ECMA allows "eval" or "arguments" as labels even in strict mode. |
| 2674 label = ParseIdentifier(kAllowEvalOrArguments, CHECK_OK); | 2682 label = ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK); |
| 2675 } | 2683 } |
| 2676 IterationStatement* target = LookupContinueTarget(label, CHECK_OK); | 2684 IterationStatement* target = LookupContinueTarget(label, CHECK_OK); |
| 2677 if (target == NULL) { | 2685 if (target == NULL) { |
| 2678 // Illegal continue statement. | 2686 // Illegal continue statement. |
| 2679 const char* message = "illegal_continue"; | 2687 const char* message = "illegal_continue"; |
| 2680 if (label != NULL) { | 2688 if (label != NULL) { |
| 2681 message = "unknown_label"; | 2689 message = "unknown_label"; |
| 2682 } | 2690 } |
| 2683 ParserTraits::ReportMessage(message, label); | 2691 ParserTraits::ReportMessage(message, label); |
| 2684 *ok = false; | 2692 *ok = false; |
| 2685 return NULL; | 2693 return NULL; |
| 2686 } | 2694 } |
| 2687 ExpectSemicolon(CHECK_OK); | 2695 ExpectSemicolon(CHECK_OK); |
| 2688 return factory()->NewContinueStatement(target, pos); | 2696 return factory()->NewContinueStatement(target, pos); |
| 2689 } | 2697 } |
| 2690 | 2698 |
| 2691 | 2699 |
| 2692 Statement* Parser::ParseBreakStatement(ZoneList<const AstRawString*>* labels, | 2700 Statement* Parser::ParseBreakStatement(ZoneList<const AstRawString*>* labels, |
| 2693 bool* ok) { | 2701 bool* ok) { |
| 2694 // BreakStatement :: | 2702 // BreakStatement :: |
| 2695 // 'break' Identifier? ';' | 2703 // 'break' Identifier? ';' |
| 2696 | 2704 |
| 2697 int pos = peek_position(); | 2705 int pos = peek_position(); |
| 2698 Expect(Token::BREAK, CHECK_OK); | 2706 Expect(Token::BREAK, CHECK_OK); |
| 2699 const AstRawString* label = NULL; | 2707 const AstRawString* label = NULL; |
| 2700 Token::Value tok = peek(); | 2708 Token::Value tok = peek(); |
| 2701 if (!scanner()->HasAnyLineTerminatorBeforeNext() && | 2709 if (!scanner()->HasAnyLineTerminatorBeforeNext() && |
| 2702 tok != Token::SEMICOLON && tok != Token::RBRACE && tok != Token::EOS) { | 2710 tok != Token::SEMICOLON && tok != Token::RBRACE && tok != Token::EOS) { |
| 2703 // ECMA allows "eval" or "arguments" as labels even in strict mode. | 2711 // ECMA allows "eval" or "arguments" as labels even in strict mode. |
| 2704 label = ParseIdentifier(kAllowEvalOrArguments, CHECK_OK); | 2712 label = ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK); |
| 2705 } | 2713 } |
| 2706 // Parse labeled break statements that target themselves into | 2714 // Parse labeled break statements that target themselves into |
| 2707 // empty statements, e.g. 'l1: l2: l3: break l2;' | 2715 // empty statements, e.g. 'l1: l2: l3: break l2;' |
| 2708 if (label != NULL && ContainsLabel(labels, label)) { | 2716 if (label != NULL && ContainsLabel(labels, label)) { |
| 2709 ExpectSemicolon(CHECK_OK); | 2717 ExpectSemicolon(CHECK_OK); |
| 2710 return factory()->NewEmptyStatement(pos); | 2718 return factory()->NewEmptyStatement(pos); |
| 2711 } | 2719 } |
| 2712 BreakableStatement* target = NULL; | 2720 BreakableStatement* target = NULL; |
| 2713 target = LookupBreakTarget(label, CHECK_OK); | 2721 target = LookupBreakTarget(label, CHECK_OK); |
| 2714 if (target == NULL) { | 2722 if (target == NULL) { |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2919 Scope* catch_scope = NULL; | 2927 Scope* catch_scope = NULL; |
| 2920 Variable* catch_variable = NULL; | 2928 Variable* catch_variable = NULL; |
| 2921 Block* catch_block = NULL; | 2929 Block* catch_block = NULL; |
| 2922 const AstRawString* name = NULL; | 2930 const AstRawString* name = NULL; |
| 2923 if (tok == Token::CATCH) { | 2931 if (tok == Token::CATCH) { |
| 2924 Consume(Token::CATCH); | 2932 Consume(Token::CATCH); |
| 2925 | 2933 |
| 2926 Expect(Token::LPAREN, CHECK_OK); | 2934 Expect(Token::LPAREN, CHECK_OK); |
| 2927 catch_scope = NewScope(scope_, CATCH_SCOPE); | 2935 catch_scope = NewScope(scope_, CATCH_SCOPE); |
| 2928 catch_scope->set_start_position(scanner()->location().beg_pos); | 2936 catch_scope->set_start_position(scanner()->location().beg_pos); |
| 2929 name = ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); | 2937 name = ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK); |
| 2930 | 2938 |
| 2931 Expect(Token::RPAREN, CHECK_OK); | 2939 Expect(Token::RPAREN, CHECK_OK); |
| 2932 | 2940 |
| 2933 catch_variable = catch_scope->DeclareLocal(name, VAR, kCreatedInitialized, | 2941 catch_variable = catch_scope->DeclareLocal(name, VAR, kCreatedInitialized, |
| 2934 Variable::NORMAL); | 2942 Variable::NORMAL); |
| 2935 BlockState block_state(&scope_, catch_scope); | 2943 BlockState block_state(&scope_, catch_scope); |
| 2936 catch_block = ParseBlock(NULL, CHECK_OK); | 2944 catch_block = ParseBlock(NULL, CHECK_OK); |
| 2937 | 2945 |
| 2938 catch_scope->set_end_position(scanner()->location().end_pos); | 2946 catch_scope->set_end_position(scanner()->location().end_pos); |
| 2939 tok = peek(); | 2947 tok = peek(); |
| (...skipping 926 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3866 Expect(Token::LPAREN, CHECK_OK); | 3874 Expect(Token::LPAREN, CHECK_OK); |
| 3867 scope->set_start_position(scanner()->location().beg_pos); | 3875 scope->set_start_position(scanner()->location().beg_pos); |
| 3868 | 3876 |
| 3869 // We don't yet know if the function will be strict, so we cannot yet | 3877 // We don't yet know if the function will be strict, so we cannot yet |
| 3870 // produce errors for parameter names or duplicates. However, we remember | 3878 // produce errors for parameter names or duplicates. However, we remember |
| 3871 // the locations of these errors if they occur and produce the errors later. | 3879 // the locations of these errors if they occur and produce the errors later. |
| 3872 Scanner::Location eval_args_error_loc = Scanner::Location::invalid(); | 3880 Scanner::Location eval_args_error_loc = Scanner::Location::invalid(); |
| 3873 Scanner::Location dupe_error_loc = Scanner::Location::invalid(); | 3881 Scanner::Location dupe_error_loc = Scanner::Location::invalid(); |
| 3874 Scanner::Location reserved_error_loc = Scanner::Location::invalid(); | 3882 Scanner::Location reserved_error_loc = Scanner::Location::invalid(); |
| 3875 | 3883 |
| 3884 // Similarly for strong mode. |
| 3885 Scanner::Location undefined_error_loc = Scanner::Location::invalid(); |
| 3886 |
| 3876 bool is_rest = false; | 3887 bool is_rest = false; |
| 3877 bool done = arity_restriction == FunctionLiteral::GETTER_ARITY || | 3888 bool done = arity_restriction == FunctionLiteral::GETTER_ARITY || |
| 3878 (peek() == Token::RPAREN && | 3889 (peek() == Token::RPAREN && |
| 3879 arity_restriction != FunctionLiteral::SETTER_ARITY); | 3890 arity_restriction != FunctionLiteral::SETTER_ARITY); |
| 3880 while (!done) { | 3891 while (!done) { |
| 3881 bool is_strict_reserved = false; | 3892 bool is_strict_reserved = false; |
| 3882 is_rest = peek() == Token::ELLIPSIS && allow_harmony_rest_params(); | 3893 is_rest = peek() == Token::ELLIPSIS && allow_harmony_rest_params(); |
| 3883 if (is_rest) { | 3894 if (is_rest) { |
| 3884 Consume(Token::ELLIPSIS); | 3895 Consume(Token::ELLIPSIS); |
| 3885 } | 3896 } |
| 3886 | 3897 |
| 3887 const AstRawString* param_name = | 3898 const AstRawString* param_name = |
| 3888 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); | 3899 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); |
| 3889 | 3900 |
| 3890 // Store locations for possible future error reports. | 3901 // Store locations for possible future error reports. |
| 3891 if (!eval_args_error_loc.IsValid() && IsEvalOrArguments(param_name)) { | 3902 if (!eval_args_error_loc.IsValid() && IsEvalOrArguments(param_name)) { |
| 3892 eval_args_error_loc = scanner()->location(); | 3903 eval_args_error_loc = scanner()->location(); |
| 3893 } | 3904 } |
| 3905 if (!undefined_error_loc.IsValid() && IsUndefined(param_name)) { |
| 3906 undefined_error_loc = scanner()->location(); |
| 3907 } |
| 3894 if (!reserved_error_loc.IsValid() && is_strict_reserved) { | 3908 if (!reserved_error_loc.IsValid() && is_strict_reserved) { |
| 3895 reserved_error_loc = scanner()->location(); | 3909 reserved_error_loc = scanner()->location(); |
| 3896 } | 3910 } |
| 3897 if (!dupe_error_loc.IsValid() && | 3911 if (!dupe_error_loc.IsValid() && |
| 3898 scope_->IsDeclaredParameter(param_name)) { | 3912 scope_->IsDeclaredParameter(param_name)) { |
| 3899 duplicate_parameters = FunctionLiteral::kHasDuplicateParameters; | 3913 duplicate_parameters = FunctionLiteral::kHasDuplicateParameters; |
| 3900 dupe_error_loc = scanner()->location(); | 3914 dupe_error_loc = scanner()->location(); |
| 3901 } | 3915 } |
| 3902 | 3916 |
| 3903 Variable* var = scope_->DeclareParameter(param_name, VAR, is_rest); | 3917 Variable* var = scope_->DeclareParameter(param_name, VAR, is_rest); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4002 handler_count = function_state.handler_count(); | 4016 handler_count = function_state.handler_count(); |
| 4003 } | 4017 } |
| 4004 | 4018 |
| 4005 // Validate name and parameter names. We can do this only after parsing the | 4019 // Validate name and parameter names. We can do this only after parsing the |
| 4006 // function, since the function can declare itself strict. | 4020 // function, since the function can declare itself strict. |
| 4007 CheckFunctionName(language_mode(), kind, function_name, | 4021 CheckFunctionName(language_mode(), kind, function_name, |
| 4008 name_is_strict_reserved, function_name_location, | 4022 name_is_strict_reserved, function_name_location, |
| 4009 CHECK_OK); | 4023 CHECK_OK); |
| 4010 const bool use_strict_params = is_rest || IsConciseMethod(kind); | 4024 const bool use_strict_params = is_rest || IsConciseMethod(kind); |
| 4011 CheckFunctionParameterNames(language_mode(), use_strict_params, | 4025 CheckFunctionParameterNames(language_mode(), use_strict_params, |
| 4012 eval_args_error_loc, dupe_error_loc, | 4026 eval_args_error_loc, undefined_error_loc, |
| 4013 reserved_error_loc, CHECK_OK); | 4027 dupe_error_loc, reserved_error_loc, CHECK_OK); |
| 4014 | 4028 |
| 4015 if (is_strict(language_mode())) { | 4029 if (is_strict(language_mode())) { |
| 4016 CheckStrictOctalLiteral(scope->start_position(), scope->end_position(), | 4030 CheckStrictOctalLiteral(scope->start_position(), scope->end_position(), |
| 4017 CHECK_OK); | 4031 CHECK_OK); |
| 4018 } | 4032 } |
| 4019 if (is_strict(language_mode())) { | 4033 if (is_strict(language_mode())) { |
| 4020 CheckConflictingVarDeclarations(scope, CHECK_OK); | 4034 CheckConflictingVarDeclarations(scope, CHECK_OK); |
| 4021 } | 4035 } |
| 4022 if (is_strong(language_mode()) && IsSubclassConstructor(kind)) { | 4036 if (is_strong(language_mode()) && IsSubclassConstructor(kind)) { |
| 4023 if (!function_state.super_call_location().IsValid()) { | 4037 if (!function_state.super_call_location().IsValid()) { |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4257 if (name_is_strict_reserved) { | 4271 if (name_is_strict_reserved) { |
| 4258 ReportMessageAt(class_name_location, "unexpected_strict_reserved"); | 4272 ReportMessageAt(class_name_location, "unexpected_strict_reserved"); |
| 4259 *ok = false; | 4273 *ok = false; |
| 4260 return NULL; | 4274 return NULL; |
| 4261 } | 4275 } |
| 4262 if (IsEvalOrArguments(name)) { | 4276 if (IsEvalOrArguments(name)) { |
| 4263 ReportMessageAt(class_name_location, "strict_eval_arguments"); | 4277 ReportMessageAt(class_name_location, "strict_eval_arguments"); |
| 4264 *ok = false; | 4278 *ok = false; |
| 4265 return NULL; | 4279 return NULL; |
| 4266 } | 4280 } |
| 4281 if (is_strong(language_mode()) && IsUndefined(name)) { |
| 4282 ReportMessageAt(class_name_location, "strong_undefined"); |
| 4283 *ok = false; |
| 4284 return NULL; |
| 4285 } |
| 4267 | 4286 |
| 4268 // Create a block scope which is additionally tagged as class scope; this is | 4287 // Create a block scope which is additionally tagged as class scope; this is |
| 4269 // important for resolving variable references to the class name in the strong | 4288 // important for resolving variable references to the class name in the strong |
| 4270 // mode. | 4289 // mode. |
| 4271 Scope* block_scope = NewScope(scope_, BLOCK_SCOPE); | 4290 Scope* block_scope = NewScope(scope_, BLOCK_SCOPE); |
| 4272 block_scope->tag_as_class_scope(); | 4291 block_scope->tag_as_class_scope(); |
| 4273 BlockState block_state(&scope_, block_scope); | 4292 BlockState block_state(&scope_, block_scope); |
| 4274 scope_->SetLanguageMode( | 4293 scope_->SetLanguageMode( |
| 4275 static_cast<LanguageMode>(scope_->language_mode() | STRICT_BIT)); | 4294 static_cast<LanguageMode>(scope_->language_mode() | STRICT_BIT)); |
| 4276 scope_->SetScopeName(name); | 4295 scope_->SetScopeName(name); |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4348 } | 4367 } |
| 4349 | 4368 |
| 4350 | 4369 |
| 4351 Expression* Parser::ParseV8Intrinsic(bool* ok) { | 4370 Expression* Parser::ParseV8Intrinsic(bool* ok) { |
| 4352 // CallRuntime :: | 4371 // CallRuntime :: |
| 4353 // '%' Identifier Arguments | 4372 // '%' Identifier Arguments |
| 4354 | 4373 |
| 4355 int pos = peek_position(); | 4374 int pos = peek_position(); |
| 4356 Expect(Token::MOD, CHECK_OK); | 4375 Expect(Token::MOD, CHECK_OK); |
| 4357 // Allow "eval" or "arguments" for backward compatibility. | 4376 // Allow "eval" or "arguments" for backward compatibility. |
| 4358 const AstRawString* name = ParseIdentifier(kAllowEvalOrArguments, CHECK_OK); | 4377 const AstRawString* name = ParseIdentifier(kAllowRestrictedIdentifiers, |
| 4378 CHECK_OK); |
| 4359 Scanner::Location spread_pos; | 4379 Scanner::Location spread_pos; |
| 4360 ZoneList<Expression*>* args = ParseArguments(&spread_pos, CHECK_OK); | 4380 ZoneList<Expression*>* args = ParseArguments(&spread_pos, CHECK_OK); |
| 4361 | 4381 |
| 4362 DCHECK(!spread_pos.IsValid()); | 4382 DCHECK(!spread_pos.IsValid()); |
| 4363 | 4383 |
| 4364 if (extension_ != NULL) { | 4384 if (extension_ != NULL) { |
| 4365 // The extension structures are only accessible while parsing the | 4385 // The extension structures are only accessible while parsing the |
| 4366 // very first time not when reparsing because of lazy compilation. | 4386 // very first time not when reparsing because of lazy compilation. |
| 4367 scope_->DeclarationScope()->ForceEagerCompilation(); | 4387 scope_->DeclarationScope()->ForceEagerCompilation(); |
| 4368 } | 4388 } |
| (...skipping 1366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5735 | 5755 |
| 5736 Expression* Parser::SpreadCallNew(Expression* function, | 5756 Expression* Parser::SpreadCallNew(Expression* function, |
| 5737 ZoneList<v8::internal::Expression*>* args, | 5757 ZoneList<v8::internal::Expression*>* args, |
| 5738 int pos) { | 5758 int pos) { |
| 5739 args->InsertAt(0, function, zone()); | 5759 args->InsertAt(0, function, zone()); |
| 5740 | 5760 |
| 5741 return factory()->NewCallRuntime( | 5761 return factory()->NewCallRuntime( |
| 5742 ast_value_factory()->reflect_construct_string(), NULL, args, pos); | 5762 ast_value_factory()->reflect_construct_string(), NULL, args, pos); |
| 5743 } | 5763 } |
| 5744 } } // namespace v8::internal | 5764 } } // namespace v8::internal |
| OLD | NEW |