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

Side by Side Diff: src/parser.cc

Issue 181543002: Eliminate extended mode, and other modes clean-up (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 9 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/preparse-data.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 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 Handle<String> no_name = isolate()->factory()->empty_string(); 675 Handle<String> no_name = isolate()->factory()->empty_string();
676 676
677 FunctionLiteral* result = NULL; 677 FunctionLiteral* result = NULL;
678 { Scope* scope = NewScope(scope_, GLOBAL_SCOPE); 678 { Scope* scope = NewScope(scope_, GLOBAL_SCOPE);
679 info->SetGlobalScope(scope); 679 info->SetGlobalScope(scope);
680 if (!info->context().is_null()) { 680 if (!info->context().is_null()) {
681 scope = Scope::DeserializeScopeChain(*info->context(), scope, zone()); 681 scope = Scope::DeserializeScopeChain(*info->context(), scope, zone());
682 } 682 }
683 original_scope_ = scope; 683 original_scope_ = scope;
684 if (info->is_eval()) { 684 if (info->is_eval()) {
685 if (!scope->is_global_scope() || info->language_mode() != SLOPPY_MODE) { 685 if (!scope->is_global_scope() || info->strict_mode() == STRICT) {
686 scope = NewScope(scope, EVAL_SCOPE); 686 scope = NewScope(scope, EVAL_SCOPE);
687 } 687 }
688 } else if (info->is_global()) { 688 } else if (info->is_global()) {
689 scope = NewScope(scope, GLOBAL_SCOPE); 689 scope = NewScope(scope, GLOBAL_SCOPE);
690 } 690 }
691 scope->set_start_position(0); 691 scope->set_start_position(0);
692 scope->set_end_position(source->length()); 692 scope->set_end_position(source->length());
693 693
694 // Compute the parsing mode. 694 // Compute the parsing mode.
695 Mode mode = (FLAG_lazy && allow_lazy()) ? PARSE_LAZILY : PARSE_EAGERLY; 695 Mode mode = (FLAG_lazy && allow_lazy()) ? PARSE_LAZILY : PARSE_EAGERLY;
696 if (allow_natives_syntax() || 696 if (allow_natives_syntax() ||
697 extension_ != NULL || 697 extension_ != NULL ||
698 scope->is_eval_scope()) { 698 scope->is_eval_scope()) {
699 mode = PARSE_EAGERLY; 699 mode = PARSE_EAGERLY;
700 } 700 }
701 ParsingModeScope parsing_mode(this, mode); 701 ParsingModeScope parsing_mode(this, mode);
702 702
703 // Enters 'scope'. 703 // Enters 'scope'.
704 FunctionState function_state(&function_state_, &scope_, scope, zone()); 704 FunctionState function_state(&function_state_, &scope_, scope, zone());
705 705
706 scope_->SetLanguageMode(info->language_mode()); 706 scope_->SetStrictMode(info->strict_mode());
707 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); 707 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone());
708 bool ok = true; 708 bool ok = true;
709 int beg_pos = scanner()->location().beg_pos; 709 int beg_pos = scanner()->location().beg_pos;
710 ParseSourceElements(body, Token::EOS, info->is_eval(), true, &ok); 710 ParseSourceElements(body, Token::EOS, info->is_eval(), true, &ok);
711 if (ok && !scope_->is_sloppy_mode()) { 711 if (ok && strict_mode() == STRICT) {
712 CheckOctalLiteral(beg_pos, scanner()->location().end_pos, &ok); 712 CheckOctalLiteral(beg_pos, scanner()->location().end_pos, &ok);
713 } 713 }
714 714
715 if (ok && is_extended_mode()) { 715 if (ok && FLAG_harmony_scoping && strict_mode() == STRICT) {
716 CheckConflictingVarDeclarations(scope_, &ok); 716 CheckConflictingVarDeclarations(scope_, &ok);
717 } 717 }
718 718
719 if (ok && info->parse_restriction() == ONLY_SINGLE_FUNCTION_LITERAL) { 719 if (ok && info->parse_restriction() == ONLY_SINGLE_FUNCTION_LITERAL) {
720 if (body->length() != 1 || 720 if (body->length() != 1 ||
721 !body->at(0)->IsExpressionStatement() || 721 !body->at(0)->IsExpressionStatement() ||
722 !body->at(0)->AsExpressionStatement()-> 722 !body->at(0)->AsExpressionStatement()->
723 expression()->IsFunctionLiteral()) { 723 expression()->IsFunctionLiteral()) {
724 ReportMessage("single_function_literal", Vector<const char*>::empty()); 724 ReportMessage("single_function_literal", Vector<const char*>::empty());
725 ok = false; 725 ok = false;
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
810 { 810 {
811 // Parse the function literal. 811 // Parse the function literal.
812 Scope* scope = NewScope(scope_, GLOBAL_SCOPE); 812 Scope* scope = NewScope(scope_, GLOBAL_SCOPE);
813 info()->SetGlobalScope(scope); 813 info()->SetGlobalScope(scope);
814 if (!info()->closure().is_null()) { 814 if (!info()->closure().is_null()) {
815 scope = Scope::DeserializeScopeChain(info()->closure()->context(), scope, 815 scope = Scope::DeserializeScopeChain(info()->closure()->context(), scope,
816 zone()); 816 zone());
817 } 817 }
818 original_scope_ = scope; 818 original_scope_ = scope;
819 FunctionState function_state(&function_state_, &scope_, scope, zone()); 819 FunctionState function_state(&function_state_, &scope_, scope, zone());
820 ASSERT(scope->language_mode() != STRICT_MODE || !info()->is_sloppy_mode()); 820 ASSERT(scope->strict_mode() == SLOPPY || info()->strict_mode() == STRICT);
821 ASSERT(scope->language_mode() != EXTENDED_MODE || 821 ASSERT(info()->strict_mode() == shared_info->strict_mode());
822 info()->is_extended_mode()); 822 scope->SetStrictMode(shared_info->strict_mode());
823 ASSERT(info()->language_mode() == shared_info->language_mode());
824 scope->SetLanguageMode(shared_info->language_mode());
825 FunctionLiteral::FunctionType function_type = shared_info->is_expression() 823 FunctionLiteral::FunctionType function_type = shared_info->is_expression()
826 ? (shared_info->is_anonymous() 824 ? (shared_info->is_anonymous()
827 ? FunctionLiteral::ANONYMOUS_EXPRESSION 825 ? FunctionLiteral::ANONYMOUS_EXPRESSION
828 : FunctionLiteral::NAMED_EXPRESSION) 826 : FunctionLiteral::NAMED_EXPRESSION)
829 : FunctionLiteral::DECLARATION; 827 : FunctionLiteral::DECLARATION;
830 bool ok = true; 828 bool ok = true;
831 result = ParseFunctionLiteral(name, 829 result = ParseFunctionLiteral(name,
832 Scanner::Location::invalid(), 830 Scanner::Location::invalid(),
833 false, // Strict mode name already checked. 831 false, // Strict mode name already checked.
834 shared_info->is_generator(), 832 shared_info->is_generator(),
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
890 // A shot at a directive. 888 // A shot at a directive.
891 ExpressionStatement* e_stat; 889 ExpressionStatement* e_stat;
892 Literal* literal; 890 Literal* literal;
893 // Still processing directive prologue? 891 // Still processing directive prologue?
894 if ((e_stat = stat->AsExpressionStatement()) != NULL && 892 if ((e_stat = stat->AsExpressionStatement()) != NULL &&
895 (literal = e_stat->expression()->AsLiteral()) != NULL && 893 (literal = e_stat->expression()->AsLiteral()) != NULL &&
896 literal->value()->IsString()) { 894 literal->value()->IsString()) {
897 Handle<String> directive = Handle<String>::cast(literal->value()); 895 Handle<String> directive = Handle<String>::cast(literal->value());
898 896
899 // Check "use strict" directive (ES5 14.1). 897 // Check "use strict" directive (ES5 14.1).
900 if (scope_->is_sloppy_mode() && 898 if (strict_mode() == SLOPPY &&
901 directive->Equals(isolate()->heap()->use_strict_string()) && 899 directive->Equals(isolate()->heap()->use_strict_string()) &&
902 token_loc.end_pos - token_loc.beg_pos == 900 token_loc.end_pos - token_loc.beg_pos ==
903 isolate()->heap()->use_strict_string()->length() + 2) { 901 isolate()->heap()->use_strict_string()->length() + 2) {
904 // TODO(mstarzinger): Global strict eval calls, need their own scope 902 // TODO(mstarzinger): Global strict eval calls, need their own scope
905 // as specified in ES5 10.4.2(3). The correct fix would be to always 903 // as specified in ES5 10.4.2(3). The correct fix would be to always
906 // add this scope in DoParseProgram(), but that requires adaptations 904 // add this scope in DoParseProgram(), but that requires adaptations
907 // all over the code base, so we go with a quick-fix for now. 905 // all over the code base, so we go with a quick-fix for now.
908 // In the same manner, we have to patch the parsing mode. 906 // In the same manner, we have to patch the parsing mode.
909 if (is_eval && !scope_->is_eval_scope()) { 907 if (is_eval && !scope_->is_eval_scope()) {
910 ASSERT(scope_->is_global_scope()); 908 ASSERT(scope_->is_global_scope());
911 Scope* scope = NewScope(scope_, EVAL_SCOPE); 909 Scope* scope = NewScope(scope_, EVAL_SCOPE);
912 scope->set_start_position(scope_->start_position()); 910 scope->set_start_position(scope_->start_position());
913 scope->set_end_position(scope_->end_position()); 911 scope->set_end_position(scope_->end_position());
914 scope_ = scope; 912 scope_ = scope;
915 mode_ = PARSE_EAGERLY; 913 mode_ = PARSE_EAGERLY;
916 } 914 }
917 // TODO(ES6): Fix entering extended mode, once it is specified. 915 scope_->SetStrictMode(STRICT);
918 scope_->SetLanguageMode(allow_harmony_scoping()
919 ? EXTENDED_MODE : STRICT_MODE);
920 // "use strict" is the only directive for now. 916 // "use strict" is the only directive for now.
921 directive_prologue = false; 917 directive_prologue = false;
922 } 918 }
923 } else { 919 } else {
924 // End of the directive prologue. 920 // End of the directive prologue.
925 directive_prologue = false; 921 directive_prologue = false;
926 } 922 }
927 } 923 }
928 924
929 processor->Add(stat, zone()); 925 processor->Add(stat, zone());
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
1051 int pos = peek_position(); 1047 int pos = peek_position();
1052 // Construct block expecting 16 statements. 1048 // Construct block expecting 16 statements.
1053 Block* body = factory()->NewBlock(NULL, 16, false, RelocInfo::kNoPosition); 1049 Block* body = factory()->NewBlock(NULL, 16, false, RelocInfo::kNoPosition);
1054 #ifdef DEBUG 1050 #ifdef DEBUG
1055 if (FLAG_print_interface_details) PrintF("# Literal "); 1051 if (FLAG_print_interface_details) PrintF("# Literal ");
1056 #endif 1052 #endif
1057 Scope* scope = NewScope(scope_, MODULE_SCOPE); 1053 Scope* scope = NewScope(scope_, MODULE_SCOPE);
1058 1054
1059 Expect(Token::LBRACE, CHECK_OK); 1055 Expect(Token::LBRACE, CHECK_OK);
1060 scope->set_start_position(scanner()->location().beg_pos); 1056 scope->set_start_position(scanner()->location().beg_pos);
1061 scope->SetLanguageMode(EXTENDED_MODE); 1057 scope->SetStrictMode(STRICT);
1062 1058
1063 { 1059 {
1064 BlockState block_state(&scope_, scope); 1060 BlockState block_state(&scope_, scope);
1065 TargetCollector collector(zone()); 1061 TargetCollector collector(zone());
1066 Target target(&this->target_stack_, &collector); 1062 Target target(&this->target_stack_, &collector);
1067 Target target_body(&this->target_stack_, body); 1063 Target target_body(&this->target_stack_, body);
1068 1064
1069 while (peek() != Token::RBRACE) { 1065 while (peek() != Token::RBRACE) {
1070 Statement* stat = ParseModuleElement(NULL, CHECK_OK); 1066 Statement* stat = ParseModuleElement(NULL, CHECK_OK);
1071 if (stat && !stat->IsEmpty()) { 1067 if (stat && !stat->IsEmpty()) {
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after
1436 // (Ecma 262 5th Edition, clause 14): 1432 // (Ecma 262 5th Edition, clause 14):
1437 // SourceElement: 1433 // SourceElement:
1438 // Statement 1434 // Statement
1439 // FunctionDeclaration 1435 // FunctionDeclaration
1440 // Common language extension is to allow function declaration in place 1436 // Common language extension is to allow function declaration in place
1441 // of any statement. This language extension is disabled in strict mode. 1437 // of any statement. This language extension is disabled in strict mode.
1442 // 1438 //
1443 // In Harmony mode, this case also handles the extension: 1439 // In Harmony mode, this case also handles the extension:
1444 // Statement: 1440 // Statement:
1445 // GeneratorDeclaration 1441 // GeneratorDeclaration
1446 if (!scope_->is_sloppy_mode()) { 1442 if (strict_mode() == STRICT) {
1447 ReportMessageAt(scanner()->peek_location(), "strict_function"); 1443 ReportMessageAt(scanner()->peek_location(), "strict_function");
1448 *ok = false; 1444 *ok = false;
1449 return NULL; 1445 return NULL;
1450 } 1446 }
1451 return ParseFunctionDeclaration(NULL, ok); 1447 return ParseFunctionDeclaration(NULL, ok);
1452 } 1448 }
1453 1449
1454 case Token::DEBUGGER: 1450 case Token::DEBUGGER:
1455 return ParseDebuggerStatement(ok); 1451 return ParseDebuggerStatement(ok);
1456 1452
(...skipping 24 matching lines...) Expand all
1481 1477
1482 // If a suitable scope exists, then we can statically declare this 1478 // If a suitable scope exists, then we can statically declare this
1483 // variable and also set its mode. In any case, a Declaration node 1479 // variable and also set its mode. In any case, a Declaration node
1484 // will be added to the scope so that the declaration can be added 1480 // will be added to the scope so that the declaration can be added
1485 // to the corresponding activation frame at runtime if necessary. 1481 // to the corresponding activation frame at runtime if necessary.
1486 // For instance declarations inside an eval scope need to be added 1482 // For instance declarations inside an eval scope need to be added
1487 // to the calling function context. 1483 // to the calling function context.
1488 // Similarly, strict mode eval scope does not leak variable declarations to 1484 // Similarly, strict mode eval scope does not leak variable declarations to
1489 // the caller's scope so we declare all locals, too. 1485 // the caller's scope so we declare all locals, too.
1490 if (declaration_scope->is_function_scope() || 1486 if (declaration_scope->is_function_scope() ||
1491 declaration_scope->is_strict_or_extended_eval_scope() || 1487 declaration_scope->is_strict_eval_scope() ||
1492 declaration_scope->is_block_scope() || 1488 declaration_scope->is_block_scope() ||
1493 declaration_scope->is_module_scope() || 1489 declaration_scope->is_module_scope() ||
1494 declaration_scope->is_global_scope()) { 1490 declaration_scope->is_global_scope()) {
1495 // Declare the variable in the declaration scope. 1491 // Declare the variable in the declaration scope.
1496 // For the global scope, we have to check for collisions with earlier 1492 // For the global scope, we have to check for collisions with earlier
1497 // (i.e., enclosing) global scopes, to maintain the illusion of a single 1493 // (i.e., enclosing) global scopes, to maintain the illusion of a single
1498 // global scope. 1494 // global scope.
1499 var = declaration_scope->is_global_scope() 1495 var = declaration_scope->is_global_scope()
1500 ? declaration_scope->Lookup(name) 1496 ? declaration_scope->Lookup(name)
1501 : declaration_scope->LocalLookup(name); 1497 : declaration_scope->LocalLookup(name);
(...skipping 12 matching lines...) Expand all
1514 // functions. The function CheckNonConflictingScope checks for conflicting 1510 // functions. The function CheckNonConflictingScope checks for conflicting
1515 // var and let bindings from different scopes whereas this is a check for 1511 // var and let bindings from different scopes whereas this is a check for
1516 // conflicting declarations within the same scope. This check also covers 1512 // conflicting declarations within the same scope. This check also covers
1517 // the special case 1513 // the special case
1518 // 1514 //
1519 // function () { let x; { var x; } } 1515 // function () { let x; { var x; } }
1520 // 1516 //
1521 // because the var declaration is hoisted to the function scope where 'x' 1517 // because the var declaration is hoisted to the function scope where 'x'
1522 // is already bound. 1518 // is already bound.
1523 ASSERT(IsDeclaredVariableMode(var->mode())); 1519 ASSERT(IsDeclaredVariableMode(var->mode()));
1524 if (is_extended_mode()) { 1520 if (FLAG_harmony_scoping && strict_mode() == STRICT) {
1525 // In harmony mode we treat re-declarations as early errors. See 1521 // In harmony we treat re-declarations as early errors. See
1526 // ES5 16 for a definition of early errors. 1522 // ES5 16 for a definition of early errors.
1527 SmartArrayPointer<char> c_string = name->ToCString(DISALLOW_NULLS); 1523 SmartArrayPointer<char> c_string = name->ToCString(DISALLOW_NULLS);
1528 const char* elms[2] = { "Variable", c_string.get() }; 1524 const char* elms[2] = { "Variable", c_string.get() };
1529 Vector<const char*> args(elms, 2); 1525 Vector<const char*> args(elms, 2);
1530 ReportMessage("redeclaration", args); 1526 ReportMessage("redeclaration", args);
1531 *ok = false; 1527 *ok = false;
1532 return; 1528 return;
1533 } 1529 }
1534 Handle<String> message_string = 1530 Handle<String> message_string =
1535 isolate()->factory()->NewStringFromUtf8(CStrVector("Variable"), 1531 isolate()->factory()->NewStringFromUtf8(CStrVector("Variable"),
(...skipping 16 matching lines...) Expand all
1552 // bound during variable resolution time unless it was pre-bound 1548 // bound during variable resolution time unless it was pre-bound
1553 // below. 1549 // below.
1554 // 1550 //
1555 // WARNING: This will lead to multiple declaration nodes for the 1551 // WARNING: This will lead to multiple declaration nodes for the
1556 // same variable if it is declared several times. This is not a 1552 // same variable if it is declared several times. This is not a
1557 // semantic issue as long as we keep the source order, but it may be 1553 // semantic issue as long as we keep the source order, but it may be
1558 // a performance issue since it may lead to repeated 1554 // a performance issue since it may lead to repeated
1559 // Runtime::DeclareContextSlot() calls. 1555 // Runtime::DeclareContextSlot() calls.
1560 declaration_scope->AddDeclaration(declaration); 1556 declaration_scope->AddDeclaration(declaration);
1561 1557
1562 if (mode == CONST && declaration_scope->is_global_scope()) { 1558 if (mode == CONST_LEGACY && declaration_scope->is_global_scope()) {
1563 // For global const variables we bind the proxy to a variable. 1559 // For global const variables we bind the proxy to a variable.
1564 ASSERT(resolve); // should be set by all callers 1560 ASSERT(resolve); // should be set by all callers
1565 Variable::Kind kind = Variable::NORMAL; 1561 Variable::Kind kind = Variable::NORMAL;
1566 var = new(zone()) Variable( 1562 var = new(zone()) Variable(
1567 declaration_scope, name, mode, true, kind, 1563 declaration_scope, name, mode, true, kind,
1568 kNeedsInitialization, proxy->interface()); 1564 kNeedsInitialization, proxy->interface());
1569 } else if (declaration_scope->is_eval_scope() && 1565 } else if (declaration_scope->is_eval_scope() &&
1570 declaration_scope->is_sloppy_mode()) { 1566 declaration_scope->strict_mode() == SLOPPY) {
1571 // For variable declarations in a sloppy eval scope the proxy is bound 1567 // For variable declarations in a sloppy eval scope the proxy is bound
1572 // to a lookup variable to force a dynamic declaration using the 1568 // to a lookup variable to force a dynamic declaration using the
1573 // DeclareContextSlot runtime function. 1569 // DeclareContextSlot runtime function.
1574 Variable::Kind kind = Variable::NORMAL; 1570 Variable::Kind kind = Variable::NORMAL;
1575 var = new(zone()) Variable( 1571 var = new(zone()) Variable(
1576 declaration_scope, name, mode, true, kind, 1572 declaration_scope, name, mode, true, kind,
1577 declaration->initialization(), proxy->interface()); 1573 declaration->initialization(), proxy->interface());
1578 var->AllocateTo(Variable::LOOKUP, -1); 1574 var->AllocateTo(Variable::LOOKUP, -1);
1579 resolve = true; 1575 resolve = true;
1580 } 1576 }
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
1692 is_generator, 1688 is_generator,
1693 pos, 1689 pos,
1694 FunctionLiteral::DECLARATION, 1690 FunctionLiteral::DECLARATION,
1695 CHECK_OK); 1691 CHECK_OK);
1696 // Even if we're not at the top-level of the global or a function 1692 // Even if we're not at the top-level of the global or a function
1697 // scope, we treat it as such and introduce the function with its 1693 // scope, we treat it as such and introduce the function with its
1698 // initial value upon entering the corresponding scope. 1694 // initial value upon entering the corresponding scope.
1699 // In extended mode, a function behaves as a lexical binding, except in the 1695 // In extended mode, a function behaves as a lexical binding, except in the
1700 // global scope. 1696 // global scope.
1701 VariableMode mode = 1697 VariableMode mode =
1702 is_extended_mode() && !scope_->is_global_scope() ? LET : VAR; 1698 FLAG_harmony_scoping &&
1699 strict_mode() == STRICT && !scope_->is_global_scope() ? LET : VAR;
1703 VariableProxy* proxy = NewUnresolved(name, mode, Interface::NewValue()); 1700 VariableProxy* proxy = NewUnresolved(name, mode, Interface::NewValue());
1704 Declaration* declaration = 1701 Declaration* declaration =
1705 factory()->NewFunctionDeclaration(proxy, mode, fun, scope_, pos); 1702 factory()->NewFunctionDeclaration(proxy, mode, fun, scope_, pos);
1706 Declare(declaration, true, CHECK_OK); 1703 Declare(declaration, true, CHECK_OK);
1707 if (names) names->Add(name, zone()); 1704 if (names) names->Add(name, zone());
1708 return factory()->NewEmptyStatement(RelocInfo::kNoPosition); 1705 return factory()->NewEmptyStatement(RelocInfo::kNoPosition);
1709 } 1706 }
1710 1707
1711 1708
1712 Block* Parser::ParseBlock(ZoneStringList* labels, bool* ok) { 1709 Block* Parser::ParseBlock(ZoneStringList* labels, bool* ok) {
1713 if (scope_->is_extended_mode()) return ParseScopedBlock(labels, ok); 1710 if (FLAG_harmony_scoping && strict_mode() == STRICT) {
1711 return ParseScopedBlock(labels, ok);
1712 }
1714 1713
1715 // Block :: 1714 // Block ::
1716 // '{' Statement* '}' 1715 // '{' Statement* '}'
1717 1716
1718 // Note that a Block does not introduce a new execution scope! 1717 // Note that a Block does not introduce a new execution scope!
1719 // (ECMA-262, 3rd, 12.2) 1718 // (ECMA-262, 3rd, 12.2)
1720 // 1719 //
1721 // Construct block expecting 16 statements. 1720 // Construct block expecting 16 statements.
1722 Block* result = 1721 Block* result =
1723 factory()->NewBlock(labels, 16, false, RelocInfo::kNoPosition); 1722 factory()->NewBlock(labels, 16, false, RelocInfo::kNoPosition);
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
1823 // 1822 //
1824 // ConstDeclaration : const ConstBinding (',' ConstBinding)* ';' 1823 // ConstDeclaration : const ConstBinding (',' ConstBinding)* ';'
1825 // 1824 //
1826 // * It is a Syntax Error if the code that matches this production is not 1825 // * It is a Syntax Error if the code that matches this production is not
1827 // contained in extended code. 1826 // contained in extended code.
1828 // 1827 //
1829 // However disallowing const in sloppy mode will break compatibility with 1828 // However disallowing const in sloppy mode will break compatibility with
1830 // existing pages. Therefore we keep allowing const with the old 1829 // existing pages. Therefore we keep allowing const with the old
1831 // non-harmony semantics in sloppy mode. 1830 // non-harmony semantics in sloppy mode.
1832 Consume(Token::CONST); 1831 Consume(Token::CONST);
1833 switch (scope_->language_mode()) { 1832 switch (strict_mode()) {
1834 case SLOPPY_MODE: 1833 case SLOPPY:
1835 mode = CONST; 1834 mode = CONST_LEGACY;
1836 init_op = Token::INIT_CONST; 1835 init_op = Token::INIT_CONST_LEGACY;
1837 break; 1836 break;
1838 case STRICT_MODE: 1837 case STRICT:
1839 ReportMessage("strict_const", Vector<const char*>::empty()); 1838 if (FLAG_harmony_scoping) {
1840 *ok = false; 1839 if (var_context == kStatement) {
1841 return NULL; 1840 // In strict mode 'const' declarations are only allowed in source
1842 case EXTENDED_MODE: 1841 // element positions.
1843 if (var_context == kStatement) { 1842 ReportMessage("unprotected_const", Vector<const char*>::empty());
1844 // In extended mode 'const' declarations are only allowed in source 1843 *ok = false;
1845 // element positions. 1844 return NULL;
1846 ReportMessage("unprotected_const", Vector<const char*>::empty()); 1845 }
1846 mode = CONST;
1847 init_op = Token::INIT_CONST;
1848 } else {
1849 ReportMessage("strict_const", Vector<const char*>::empty());
1847 *ok = false; 1850 *ok = false;
1848 return NULL; 1851 return NULL;
1849 } 1852 }
1850 mode = CONST_HARMONY;
1851 init_op = Token::INIT_CONST_HARMONY;
1852 } 1853 }
1853 is_const = true; 1854 is_const = true;
1854 needs_init = true; 1855 needs_init = true;
1855 } else if (peek() == Token::LET) { 1856 } else if (peek() == Token::LET) {
1856 // ES6 Draft Rev4 section 12.2.1: 1857 // ES6 Draft Rev4 section 12.2.1:
1857 // 1858 //
1858 // LetDeclaration : let LetBindingList ; 1859 // LetDeclaration : let LetBindingList ;
1859 // 1860 //
1860 // * It is a Syntax Error if the code that matches this production is not 1861 // * It is a Syntax Error if the code that matches this production is not
1861 // contained in extended code. 1862 // contained in extended code.
1862 if (!is_extended_mode()) { 1863 //
1864 // TODO(rossberg): make 'let' a legal identifier in sloppy mode.
1865 if (!FLAG_harmony_scoping || strict_mode() == SLOPPY) {
1863 ReportMessage("illegal_let", Vector<const char*>::empty()); 1866 ReportMessage("illegal_let", Vector<const char*>::empty());
1864 *ok = false; 1867 *ok = false;
1865 return NULL; 1868 return NULL;
1866 } 1869 }
1867 Consume(Token::LET); 1870 Consume(Token::LET);
1868 if (var_context == kStatement) { 1871 if (var_context == kStatement) {
1869 // Let declarations are only allowed in source element positions. 1872 // Let declarations are only allowed in source element positions.
1870 ReportMessage("unprotected_let", Vector<const char*>::empty()); 1873 ReportMessage("unprotected_let", Vector<const char*>::empty());
1871 *ok = false; 1874 *ok = false;
1872 return NULL; 1875 return NULL;
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
1957 // const c; c = x; 1960 // const c; c = x;
1958 // 1961 //
1959 // The "variable" c initialized to x is the same as the declared 1962 // The "variable" c initialized to x is the same as the declared
1960 // one - there is no re-lookup (see the last parameter of the 1963 // one - there is no re-lookup (see the last parameter of the
1961 // Declare() call above). 1964 // Declare() call above).
1962 1965
1963 Scope* initialization_scope = is_const ? declaration_scope : scope_; 1966 Scope* initialization_scope = is_const ? declaration_scope : scope_;
1964 Expression* value = NULL; 1967 Expression* value = NULL;
1965 int pos = -1; 1968 int pos = -1;
1966 // Harmony consts have non-optional initializers. 1969 // Harmony consts have non-optional initializers.
1967 if (peek() == Token::ASSIGN || mode == CONST_HARMONY) { 1970 if (peek() == Token::ASSIGN || mode == CONST) {
1968 Expect(Token::ASSIGN, CHECK_OK); 1971 Expect(Token::ASSIGN, CHECK_OK);
1969 pos = position(); 1972 pos = position();
1970 value = ParseAssignmentExpression(var_context != kForStatement, CHECK_OK); 1973 value = ParseAssignmentExpression(var_context != kForStatement, CHECK_OK);
1971 // Don't infer if it is "a = function(){...}();"-like expression. 1974 // Don't infer if it is "a = function(){...}();"-like expression.
1972 if (fni_ != NULL && 1975 if (fni_ != NULL &&
1973 value->AsCall() == NULL && 1976 value->AsCall() == NULL &&
1974 value->AsCallNew() == NULL) { 1977 value->AsCallNew() == NULL) {
1975 fni_->Infer(); 1978 fni_->Infer();
1976 } else { 1979 } else {
1977 fni_->RemoveLastFunction(); 1980 fni_->RemoveLastFunction();
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2025 // and add it to the initialization statement block. 2028 // and add it to the initialization statement block.
2026 // Note that the function does different things depending on 2029 // Note that the function does different things depending on
2027 // the number of arguments (1 or 2). 2030 // the number of arguments (1 or 2).
2028 initialize = factory()->NewCallRuntime( 2031 initialize = factory()->NewCallRuntime(
2029 isolate()->factory()->InitializeConstGlobal_string(), 2032 isolate()->factory()->InitializeConstGlobal_string(),
2030 Runtime::FunctionForId(Runtime::kInitializeConstGlobal), 2033 Runtime::FunctionForId(Runtime::kInitializeConstGlobal),
2031 arguments, pos); 2034 arguments, pos);
2032 } else { 2035 } else {
2033 // Add strict mode. 2036 // Add strict mode.
2034 // We may want to pass singleton to avoid Literal allocations. 2037 // We may want to pass singleton to avoid Literal allocations.
2035 LanguageMode language_mode = initialization_scope->language_mode(); 2038 StrictMode strict_mode = initialization_scope->strict_mode();
2036 arguments->Add(factory()->NewNumberLiteral(language_mode, pos), zone()); 2039 arguments->Add(factory()->NewNumberLiteral(strict_mode, pos), zone());
2037 2040
2038 // Be careful not to assign a value to the global variable if 2041 // Be careful not to assign a value to the global variable if
2039 // we're in a with. The initialization value should not 2042 // we're in a with. The initialization value should not
2040 // necessarily be stored in the global object in that case, 2043 // necessarily be stored in the global object in that case,
2041 // which is why we need to generate a separate assignment node. 2044 // which is why we need to generate a separate assignment node.
2042 if (value != NULL && !inside_with()) { 2045 if (value != NULL && !inside_with()) {
2043 arguments->Add(value, zone()); 2046 arguments->Add(value, zone());
2044 value = NULL; // zap the value to avoid the unnecessary assignment 2047 value = NULL; // zap the value to avoid the unnecessary assignment
2045 } 2048 }
2046 2049
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
2326 } 2329 }
2327 2330
2328 2331
2329 Statement* Parser::ParseWithStatement(ZoneStringList* labels, bool* ok) { 2332 Statement* Parser::ParseWithStatement(ZoneStringList* labels, bool* ok) {
2330 // WithStatement :: 2333 // WithStatement ::
2331 // 'with' '(' Expression ')' Statement 2334 // 'with' '(' Expression ')' Statement
2332 2335
2333 Expect(Token::WITH, CHECK_OK); 2336 Expect(Token::WITH, CHECK_OK);
2334 int pos = position(); 2337 int pos = position();
2335 2338
2336 if (!scope_->is_sloppy_mode()) { 2339 if (strict_mode() == STRICT) {
2337 ReportMessage("strict_mode_with", Vector<const char*>::empty()); 2340 ReportMessage("strict_mode_with", Vector<const char*>::empty());
2338 *ok = false; 2341 *ok = false;
2339 return NULL; 2342 return NULL;
2340 } 2343 }
2341 2344
2342 Expect(Token::LPAREN, CHECK_OK); 2345 Expect(Token::LPAREN, CHECK_OK);
2343 Expression* expr = ParseExpression(true, CHECK_OK); 2346 Expression* expr = ParseExpression(true, CHECK_OK);
2344 Expect(Token::RPAREN, CHECK_OK); 2347 Expect(Token::RPAREN, CHECK_OK);
2345 2348
2346 scope_->DeclarationScope()->RecordWithStatement(); 2349 scope_->DeclarationScope()->RecordWithStatement();
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
2478 Consume(Token::CATCH); 2481 Consume(Token::CATCH);
2479 2482
2480 Expect(Token::LPAREN, CHECK_OK); 2483 Expect(Token::LPAREN, CHECK_OK);
2481 catch_scope = NewScope(scope_, CATCH_SCOPE); 2484 catch_scope = NewScope(scope_, CATCH_SCOPE);
2482 catch_scope->set_start_position(scanner()->location().beg_pos); 2485 catch_scope->set_start_position(scanner()->location().beg_pos);
2483 name = ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); 2486 name = ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK);
2484 2487
2485 Expect(Token::RPAREN, CHECK_OK); 2488 Expect(Token::RPAREN, CHECK_OK);
2486 2489
2487 Target target(&this->target_stack_, &catch_collector); 2490 Target target(&this->target_stack_, &catch_collector);
2488 VariableMode mode = is_extended_mode() ? LET : VAR; 2491 VariableMode mode =
2492 FLAG_harmony_scoping && strict_mode() == STRICT ? LET : VAR;
2489 catch_variable = 2493 catch_variable =
2490 catch_scope->DeclareLocal(name, mode, kCreatedInitialized); 2494 catch_scope->DeclareLocal(name, mode, kCreatedInitialized);
2491 2495
2492 BlockState block_state(&scope_, catch_scope); 2496 BlockState block_state(&scope_, catch_scope);
2493 catch_block = ParseBlock(NULL, CHECK_OK); 2497 catch_block = ParseBlock(NULL, CHECK_OK);
2494 2498
2495 catch_scope->set_end_position(scanner()->location().end_pos); 2499 catch_scope->set_end_position(scanner()->location().end_pos);
2496 tok = peek(); 2500 tok = peek();
2497 } 2501 }
2498 2502
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after
2900 // side expression. We could report this as a syntax error here but 2904 // side expression. We could report this as a syntax error here but
2901 // for compatibility with JSC we choose to report the error at 2905 // for compatibility with JSC we choose to report the error at
2902 // runtime. 2906 // runtime.
2903 // TODO(ES5): Should change parsing for spec conformance. 2907 // TODO(ES5): Should change parsing for spec conformance.
2904 if (expression == NULL || !expression->IsValidLeftHandSide()) { 2908 if (expression == NULL || !expression->IsValidLeftHandSide()) {
2905 Handle<String> message = 2909 Handle<String> message =
2906 isolate()->factory()->invalid_lhs_in_assignment_string(); 2910 isolate()->factory()->invalid_lhs_in_assignment_string();
2907 expression = NewThrowReferenceError(message); 2911 expression = NewThrowReferenceError(message);
2908 } 2912 }
2909 2913
2910 if (!scope_->is_sloppy_mode()) { 2914 if (strict_mode() == STRICT) {
2911 // Assignment to eval or arguments is disallowed in strict mode. 2915 // Assignment to eval or arguments is disallowed in strict mode.
2912 CheckStrictModeLValue(expression, CHECK_OK); 2916 CheckStrictModeLValue(expression, CHECK_OK);
2913 } 2917 }
2914 MarkAsLValue(expression); 2918 MarkAsLValue(expression);
2915 2919
2916 Token::Value op = Next(); // Get assignment operator. 2920 Token::Value op = Next(); // Get assignment operator.
2917 int pos = position(); 2921 int pos = position();
2918 Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK); 2922 Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK);
2919 2923
2920 // TODO(1231235): We try to estimate the set of properties set by 2924 // TODO(1231235): We try to estimate the set of properties set by
(...skipping 13 matching lines...) Expand all
2934 // literal so it can be added as a constant function property. 2938 // literal so it can be added as a constant function property.
2935 if (property != NULL && right->AsFunctionLiteral() != NULL) { 2939 if (property != NULL && right->AsFunctionLiteral() != NULL) {
2936 right->AsFunctionLiteral()->set_pretenure(); 2940 right->AsFunctionLiteral()->set_pretenure();
2937 } 2941 }
2938 2942
2939 if (fni_ != NULL) { 2943 if (fni_ != NULL) {
2940 // Check if the right hand side is a call to avoid inferring a 2944 // Check if the right hand side is a call to avoid inferring a
2941 // name if we're dealing with "a = function(){...}();"-like 2945 // name if we're dealing with "a = function(){...}();"-like
2942 // expression. 2946 // expression.
2943 if ((op == Token::INIT_VAR 2947 if ((op == Token::INIT_VAR
2944 || op == Token::INIT_CONST 2948 || op == Token::INIT_CONST_LEGACY
2945 || op == Token::ASSIGN) 2949 || op == Token::ASSIGN)
2946 && (right->AsCall() == NULL && right->AsCallNew() == NULL)) { 2950 && (right->AsCall() == NULL && right->AsCallNew() == NULL)) {
2947 fni_->Infer(); 2951 fni_->Infer();
2948 } else { 2952 } else {
2949 fni_->RemoveLastFunction(); 2953 fni_->RemoveLastFunction();
2950 } 2954 }
2951 fni_->Leave(); 2955 fni_->Leave();
2952 } 2956 }
2953 2957
2954 return factory()->NewAssignment(op, expression, right, pos); 2958 return factory()->NewAssignment(op, expression, right, pos);
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
3124 return factory()->NewNumberLiteral(-value, pos); 3128 return factory()->NewNumberLiteral(-value, pos);
3125 case Token::BIT_NOT: 3129 case Token::BIT_NOT:
3126 return factory()->NewNumberLiteral(~DoubleToInt32(value), pos); 3130 return factory()->NewNumberLiteral(~DoubleToInt32(value), pos);
3127 default: 3131 default:
3128 break; 3132 break;
3129 } 3133 }
3130 } 3134 }
3131 } 3135 }
3132 3136
3133 // "delete identifier" is a syntax error in strict mode. 3137 // "delete identifier" is a syntax error in strict mode.
3134 if (op == Token::DELETE && !scope_->is_sloppy_mode()) { 3138 if (op == Token::DELETE && strict_mode() == STRICT) {
3135 VariableProxy* operand = expression->AsVariableProxy(); 3139 VariableProxy* operand = expression->AsVariableProxy();
3136 if (operand != NULL && !operand->is_this()) { 3140 if (operand != NULL && !operand->is_this()) {
3137 ReportMessage("strict_delete", Vector<const char*>::empty()); 3141 ReportMessage("strict_delete", Vector<const char*>::empty());
3138 *ok = false; 3142 *ok = false;
3139 return NULL; 3143 return NULL;
3140 } 3144 }
3141 } 3145 }
3142 3146
3143 // Desugar '+foo' into 'foo*1', this enables the collection of type feedback 3147 // Desugar '+foo' into 'foo*1', this enables the collection of type feedback
3144 // without any special stub and the multiplication is removed later in 3148 // without any special stub and the multiplication is removed later in
(...skipping 27 matching lines...) Expand all
3172 // Signal a reference error if the expression is an invalid 3176 // Signal a reference error if the expression is an invalid
3173 // left-hand side expression. We could report this as a syntax 3177 // left-hand side expression. We could report this as a syntax
3174 // error here but for compatibility with JSC we choose to report the 3178 // error here but for compatibility with JSC we choose to report the
3175 // error at runtime. 3179 // error at runtime.
3176 if (expression == NULL || !expression->IsValidLeftHandSide()) { 3180 if (expression == NULL || !expression->IsValidLeftHandSide()) {
3177 Handle<String> message = 3181 Handle<String> message =
3178 isolate()->factory()->invalid_lhs_in_prefix_op_string(); 3182 isolate()->factory()->invalid_lhs_in_prefix_op_string();
3179 expression = NewThrowReferenceError(message); 3183 expression = NewThrowReferenceError(message);
3180 } 3184 }
3181 3185
3182 if (!scope_->is_sloppy_mode()) { 3186 if (strict_mode() == STRICT) {
3183 // Prefix expression operand in strict mode may not be eval or arguments. 3187 // Prefix expression operand in strict mode may not be eval or arguments.
3184 CheckStrictModeLValue(expression, CHECK_OK); 3188 CheckStrictModeLValue(expression, CHECK_OK);
3185 } 3189 }
3186 MarkAsLValue(expression); 3190 MarkAsLValue(expression);
3187 3191
3188 return factory()->NewCountOperation(op, 3192 return factory()->NewCountOperation(op,
3189 true /* prefix */, 3193 true /* prefix */,
3190 expression, 3194 expression,
3191 position()); 3195 position());
3192 3196
(...skipping 13 matching lines...) Expand all
3206 // Signal a reference error if the expression is an invalid 3210 // Signal a reference error if the expression is an invalid
3207 // left-hand side expression. We could report this as a syntax 3211 // left-hand side expression. We could report this as a syntax
3208 // error here but for compatibility with JSC we choose to report the 3212 // error here but for compatibility with JSC we choose to report the
3209 // error at runtime. 3213 // error at runtime.
3210 if (expression == NULL || !expression->IsValidLeftHandSide()) { 3214 if (expression == NULL || !expression->IsValidLeftHandSide()) {
3211 Handle<String> message = 3215 Handle<String> message =
3212 isolate()->factory()->invalid_lhs_in_postfix_op_string(); 3216 isolate()->factory()->invalid_lhs_in_postfix_op_string();
3213 expression = NewThrowReferenceError(message); 3217 expression = NewThrowReferenceError(message);
3214 } 3218 }
3215 3219
3216 if (!scope_->is_sloppy_mode()) { 3220 if (strict_mode() == STRICT) {
3217 // Postfix expression operand in strict mode may not be eval or arguments. 3221 // Postfix expression operand in strict mode may not be eval or arguments.
3218 CheckStrictModeLValue(expression, CHECK_OK); 3222 CheckStrictModeLValue(expression, CHECK_OK);
3219 } 3223 }
3220 MarkAsLValue(expression); 3224 MarkAsLValue(expression);
3221 3225
3222 Token::Value next = Next(); 3226 Token::Value next = Next();
3223 expression = 3227 expression =
3224 factory()->NewCountOperation(next, 3228 factory()->NewCountOperation(next,
3225 false /* postfix */, 3229 false /* postfix */,
3226 expression, 3230 expression,
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
3496 // ((IdentifierName | String | Number) ':' AssignmentExpression) 3500 // ((IdentifierName | String | Number) ':' AssignmentExpression)
3497 // | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral) 3501 // | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral)
3498 // )*[','] '}' 3502 // )*[','] '}'
3499 3503
3500 int pos = peek_position(); 3504 int pos = peek_position();
3501 ZoneList<ObjectLiteral::Property*>* properties = 3505 ZoneList<ObjectLiteral::Property*>* properties =
3502 new(zone()) ZoneList<ObjectLiteral::Property*>(4, zone()); 3506 new(zone()) ZoneList<ObjectLiteral::Property*>(4, zone());
3503 int number_of_boilerplate_properties = 0; 3507 int number_of_boilerplate_properties = 0;
3504 bool has_function = false; 3508 bool has_function = false;
3505 3509
3506 ObjectLiteralChecker checker(this, scope_->language_mode()); 3510 ObjectLiteralChecker checker(this, strict_mode());
3507 3511
3508 Expect(Token::LBRACE, CHECK_OK); 3512 Expect(Token::LBRACE, CHECK_OK);
3509 3513
3510 while (peek() != Token::RBRACE) { 3514 while (peek() != Token::RBRACE) {
3511 if (fni_ != NULL) fni_->Enter(); 3515 if (fni_ != NULL) fni_->Enter();
3512 3516
3513 Literal* key = NULL; 3517 Literal* key = NULL;
3514 Token::Value next = peek(); 3518 Token::Value next = peek();
3515 int next_pos = peek_position(); 3519 int next_pos = peek_position();
3516 3520
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
3684 public: 3688 public:
3685 SingletonLogger() : has_error_(false), start_(-1), end_(-1) { } 3689 SingletonLogger() : has_error_(false), start_(-1), end_(-1) { }
3686 virtual ~SingletonLogger() { } 3690 virtual ~SingletonLogger() { }
3687 3691
3688 void Reset() { has_error_ = false; } 3692 void Reset() { has_error_ = false; }
3689 3693
3690 virtual void LogFunction(int start, 3694 virtual void LogFunction(int start,
3691 int end, 3695 int end,
3692 int literals, 3696 int literals,
3693 int properties, 3697 int properties,
3694 LanguageMode mode) { 3698 StrictMode strict_mode) {
3695 ASSERT(!has_error_); 3699 ASSERT(!has_error_);
3696 start_ = start; 3700 start_ = start;
3697 end_ = end; 3701 end_ = end;
3698 literals_ = literals; 3702 literals_ = literals;
3699 properties_ = properties; 3703 properties_ = properties;
3700 mode_ = mode; 3704 strict_mode_ = strict_mode;
3701 }; 3705 };
3702 3706
3703 // Logs a symbol creation of a literal or identifier. 3707 // Logs a symbol creation of a literal or identifier.
3704 virtual void LogAsciiSymbol(int start, Vector<const char> literal) { } 3708 virtual void LogAsciiSymbol(int start, Vector<const char> literal) { }
3705 virtual void LogUtf16Symbol(int start, Vector<const uc16> literal) { } 3709 virtual void LogUtf16Symbol(int start, Vector<const uc16> literal) { }
3706 3710
3707 // Logs an error message and marks the log as containing an error. 3711 // Logs an error message and marks the log as containing an error.
3708 // Further logging will be ignored, and ExtractData will return a vector 3712 // Further logging will be ignored, and ExtractData will return a vector
3709 // representing the error only. 3713 // representing the error only.
3710 virtual void LogMessage(int start, 3714 virtual void LogMessage(int start,
(...skipping 28 matching lines...) Expand all
3739 int start() { return start_; } 3743 int start() { return start_; }
3740 int end() { return end_; } 3744 int end() { return end_; }
3741 int literals() { 3745 int literals() {
3742 ASSERT(!has_error_); 3746 ASSERT(!has_error_);
3743 return literals_; 3747 return literals_;
3744 } 3748 }
3745 int properties() { 3749 int properties() {
3746 ASSERT(!has_error_); 3750 ASSERT(!has_error_);
3747 return properties_; 3751 return properties_;
3748 } 3752 }
3749 LanguageMode language_mode() { 3753 StrictMode strict_mode() {
3750 ASSERT(!has_error_); 3754 ASSERT(!has_error_);
3751 return mode_; 3755 return strict_mode_;
3752 } 3756 }
3753 const char* message() { 3757 const char* message() {
3754 ASSERT(has_error_); 3758 ASSERT(has_error_);
3755 return message_; 3759 return message_;
3756 } 3760 }
3757 const char* argument_opt() { 3761 const char* argument_opt() {
3758 ASSERT(has_error_); 3762 ASSERT(has_error_);
3759 return argument_opt_; 3763 return argument_opt_;
3760 } 3764 }
3761 3765
3762 private: 3766 private:
3763 bool has_error_; 3767 bool has_error_;
3764 int start_; 3768 int start_;
3765 int end_; 3769 int end_;
3766 // For function entries. 3770 // For function entries.
3767 int literals_; 3771 int literals_;
3768 int properties_; 3772 int properties_;
3769 LanguageMode mode_; 3773 StrictMode strict_mode_;
3770 // For error messages. 3774 // For error messages.
3771 const char* message_; 3775 const char* message_;
3772 const char* argument_opt_; 3776 const char* argument_opt_;
3773 }; 3777 };
3774 3778
3775 3779
3776 FunctionLiteral* Parser::ParseFunctionLiteral( 3780 FunctionLiteral* Parser::ParseFunctionLiteral(
3777 Handle<String> function_name, 3781 Handle<String> function_name,
3778 Scanner::Location function_name_location, 3782 Scanner::Location function_name_location,
3779 bool name_is_strict_reserved, 3783 bool name_is_strict_reserved,
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
3821 // under which we compile is _not_ a declaration scope. This holds because 3825 // under which we compile is _not_ a declaration scope. This holds because
3822 // in all normal cases, function declarations are fully hoisted to a 3826 // in all normal cases, function declarations are fully hoisted to a
3823 // declaration scope and compiled relative to that. 3827 // declaration scope and compiled relative to that.
3824 // - (2) is the case iff the current declaration scope is still the original 3828 // - (2) is the case iff the current declaration scope is still the original
3825 // one relative to the deserialized scope chain. Otherwise we must be 3829 // one relative to the deserialized scope chain. Otherwise we must be
3826 // compiling a function in an inner declaration scope in the eval, e.g. a 3830 // compiling a function in an inner declaration scope in the eval, e.g. a
3827 // nested function, and hoisting works normally relative to that. 3831 // nested function, and hoisting works normally relative to that.
3828 Scope* declaration_scope = scope_->DeclarationScope(); 3832 Scope* declaration_scope = scope_->DeclarationScope();
3829 Scope* original_declaration_scope = original_scope_->DeclarationScope(); 3833 Scope* original_declaration_scope = original_scope_->DeclarationScope();
3830 Scope* scope = 3834 Scope* scope =
3831 function_type == FunctionLiteral::DECLARATION && !is_extended_mode() && 3835 function_type == FunctionLiteral::DECLARATION &&
3836 (!FLAG_harmony_scoping || strict_mode() == SLOPPY) &&
3832 (original_scope_ == original_declaration_scope || 3837 (original_scope_ == original_declaration_scope ||
3833 declaration_scope != original_declaration_scope) 3838 declaration_scope != original_declaration_scope)
3834 ? NewScope(declaration_scope, FUNCTION_SCOPE) 3839 ? NewScope(declaration_scope, FUNCTION_SCOPE)
3835 : NewScope(scope_, FUNCTION_SCOPE); 3840 : NewScope(scope_, FUNCTION_SCOPE);
3836 ZoneList<Statement*>* body = NULL; 3841 ZoneList<Statement*>* body = NULL;
3837 int materialized_literal_count = -1; 3842 int materialized_literal_count = -1;
3838 int expected_property_count = -1; 3843 int expected_property_count = -1;
3839 int handler_count = 0; 3844 int handler_count = 0;
3840 FunctionLiteral::ParameterFlag duplicate_parameters = 3845 FunctionLiteral::ParameterFlag duplicate_parameters =
3841 FunctionLiteral::kNoDuplicateParameters; 3846 FunctionLiteral::kNoDuplicateParameters;
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
3910 3915
3911 Expect(Token::LBRACE, CHECK_OK); 3916 Expect(Token::LBRACE, CHECK_OK);
3912 3917
3913 // If we have a named function expression, we add a local variable 3918 // If we have a named function expression, we add a local variable
3914 // declaration to the body of the function with the name of the 3919 // declaration to the body of the function with the name of the
3915 // function and let it refer to the function itself (closure). 3920 // function and let it refer to the function itself (closure).
3916 // NOTE: We create a proxy and resolve it here so that in the 3921 // NOTE: We create a proxy and resolve it here so that in the
3917 // future we can change the AST to only refer to VariableProxies 3922 // future we can change the AST to only refer to VariableProxies
3918 // instead of Variables and Proxis as is the case now. 3923 // instead of Variables and Proxis as is the case now.
3919 Variable* fvar = NULL; 3924 Variable* fvar = NULL;
3920 Token::Value fvar_init_op = Token::INIT_CONST; 3925 Token::Value fvar_init_op = Token::INIT_CONST_LEGACY;
3921 if (function_type == FunctionLiteral::NAMED_EXPRESSION) { 3926 if (function_type == FunctionLiteral::NAMED_EXPRESSION) {
3922 if (is_extended_mode()) fvar_init_op = Token::INIT_CONST_HARMONY; 3927 if (FLAG_harmony_scoping && strict_mode() == STRICT) {
3923 VariableMode fvar_mode = is_extended_mode() ? CONST_HARMONY : CONST; 3928 fvar_init_op = Token::INIT_CONST;
3929 }
3930 VariableMode fvar_mode = FLAG_harmony_scoping && strict_mode() == STRICT
3931 ? CONST : CONST_LEGACY;
3924 fvar = new(zone()) Variable(scope_, 3932 fvar = new(zone()) Variable(scope_,
3925 function_name, fvar_mode, true /* is valid LHS */, 3933 function_name, fvar_mode, true /* is valid LHS */,
3926 Variable::NORMAL, kCreatedInitialized, Interface::NewConst()); 3934 Variable::NORMAL, kCreatedInitialized, Interface::NewConst());
3927 VariableProxy* proxy = factory()->NewVariableProxy(fvar); 3935 VariableProxy* proxy = factory()->NewVariableProxy(fvar);
3928 VariableDeclaration* fvar_declaration = factory()->NewVariableDeclaration( 3936 VariableDeclaration* fvar_declaration = factory()->NewVariableDeclaration(
3929 proxy, fvar_mode, scope_, RelocInfo::kNoPosition); 3937 proxy, fvar_mode, scope_, RelocInfo::kNoPosition);
3930 scope_->DeclareFunctionVar(fvar_declaration); 3938 scope_->DeclareFunctionVar(fvar_declaration);
3931 } 3939 }
3932 3940
3933 // Determine if the function can be parsed lazily. Lazy parsing is different 3941 // Determine if the function can be parsed lazily. Lazy parsing is different
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
3983 ReportInvalidPreparseData(function_name, CHECK_OK); 3991 ReportInvalidPreparseData(function_name, CHECK_OK);
3984 } 3992 }
3985 scanner()->SeekForward(entry.end_pos() - 1); 3993 scanner()->SeekForward(entry.end_pos() - 1);
3986 3994
3987 scope->set_end_position(entry.end_pos()); 3995 scope->set_end_position(entry.end_pos());
3988 Expect(Token::RBRACE, CHECK_OK); 3996 Expect(Token::RBRACE, CHECK_OK);
3989 isolate()->counters()->total_preparse_skipped()->Increment( 3997 isolate()->counters()->total_preparse_skipped()->Increment(
3990 scope->end_position() - function_block_pos); 3998 scope->end_position() - function_block_pos);
3991 materialized_literal_count = entry.literal_count(); 3999 materialized_literal_count = entry.literal_count();
3992 expected_property_count = entry.property_count(); 4000 expected_property_count = entry.property_count();
3993 scope_->SetLanguageMode(entry.language_mode()); 4001 scope_->SetStrictMode(entry.strict_mode());
3994 } else { 4002 } else {
3995 // This case happens when we have preparse data but it doesn't contain 4003 // This case happens when we have preparse data but it doesn't contain
3996 // an entry for the function. As a safety net, fall back to eager 4004 // an entry for the function. As a safety net, fall back to eager
3997 // parsing. It is unclear whether PreParser's laziness analysis can 4005 // parsing. It is unclear whether PreParser's laziness analysis can
3998 // produce different results than the Parser's laziness analysis (see 4006 // produce different results than the Parser's laziness analysis (see
3999 // https://codereview.chromium.org/7565003 ). This safety net is 4007 // https://codereview.chromium.org/7565003 ). This safety net is
4000 // guarding against the case where Parser thinks a function should be 4008 // guarding against the case where Parser thinks a function should be
4001 // lazily parsed, but PreParser thinks it should be eagerly parsed -- 4009 // lazily parsed, but PreParser thinks it should be eagerly parsed --
4002 // in that case we fall back to eager parsing in Parser, too. Note 4010 // in that case we fall back to eager parsing in Parser, too. Note
4003 // that the opposite case is worse: if PreParser thinks a function 4011 // that the opposite case is worse: if PreParser thinks a function
(...skipping 27 matching lines...) Expand all
4031 args); 4039 args);
4032 *ok = false; 4040 *ok = false;
4033 return NULL; 4041 return NULL;
4034 } 4042 }
4035 scope->set_end_position(logger.end()); 4043 scope->set_end_position(logger.end());
4036 Expect(Token::RBRACE, CHECK_OK); 4044 Expect(Token::RBRACE, CHECK_OK);
4037 isolate()->counters()->total_preparse_skipped()->Increment( 4045 isolate()->counters()->total_preparse_skipped()->Increment(
4038 scope->end_position() - function_block_pos); 4046 scope->end_position() - function_block_pos);
4039 materialized_literal_count = logger.literals(); 4047 materialized_literal_count = logger.literals();
4040 expected_property_count = logger.properties(); 4048 expected_property_count = logger.properties();
4041 scope_->SetLanguageMode(logger.language_mode()); 4049 scope_->SetStrictMode(logger.strict_mode());
4042 } 4050 }
4043 } 4051 }
4044 4052
4045 if (!is_lazily_parsed) { 4053 if (!is_lazily_parsed) {
4046 // Everything inside an eagerly parsed function will be parsed eagerly 4054 // Everything inside an eagerly parsed function will be parsed eagerly
4047 // (see comment above). 4055 // (see comment above).
4048 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); 4056 ParsingModeScope parsing_mode(this, PARSE_EAGERLY);
4049 body = new(zone()) ZoneList<Statement*>(8, zone()); 4057 body = new(zone()) ZoneList<Statement*>(8, zone());
4050 if (fvar != NULL) { 4058 if (fvar != NULL) {
4051 VariableProxy* fproxy = scope_->NewUnresolved( 4059 VariableProxy* fproxy = scope_->NewUnresolved(
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
4095 materialized_literal_count = function_state.materialized_literal_count(); 4103 materialized_literal_count = function_state.materialized_literal_count();
4096 expected_property_count = function_state.expected_property_count(); 4104 expected_property_count = function_state.expected_property_count();
4097 handler_count = function_state.handler_count(); 4105 handler_count = function_state.handler_count();
4098 4106
4099 Expect(Token::RBRACE, CHECK_OK); 4107 Expect(Token::RBRACE, CHECK_OK);
4100 scope->set_end_position(scanner()->location().end_pos); 4108 scope->set_end_position(scanner()->location().end_pos);
4101 } 4109 }
4102 4110
4103 // Validate strict mode. We can do this only after parsing the function, 4111 // Validate strict mode. We can do this only after parsing the function,
4104 // since the function can declare itself strict. 4112 // since the function can declare itself strict.
4105 if (!scope_->is_sloppy_mode()) { 4113 if (strict_mode() == STRICT) {
4106 if (IsEvalOrArguments(function_name)) { 4114 if (IsEvalOrArguments(function_name)) {
4107 ReportMessageAt(function_name_location, "strict_eval_arguments"); 4115 ReportMessageAt(function_name_location, "strict_eval_arguments");
4108 *ok = false; 4116 *ok = false;
4109 return NULL; 4117 return NULL;
4110 } 4118 }
4111 if (name_is_strict_reserved) { 4119 if (name_is_strict_reserved) {
4112 ReportMessageAt(function_name_location, "unexpected_strict_reserved"); 4120 ReportMessageAt(function_name_location, "unexpected_strict_reserved");
4113 *ok = false; 4121 *ok = false;
4114 return NULL; 4122 return NULL;
4115 } 4123 }
(...skipping 14 matching lines...) Expand all
4130 } 4138 }
4131 CheckOctalLiteral(scope->start_position(), 4139 CheckOctalLiteral(scope->start_position(),
4132 scope->end_position(), 4140 scope->end_position(),
4133 CHECK_OK); 4141 CHECK_OK);
4134 } 4142 }
4135 ast_properties = *factory()->visitor()->ast_properties(); 4143 ast_properties = *factory()->visitor()->ast_properties();
4136 slot_processor = factory()->visitor()->slot_processor(); 4144 slot_processor = factory()->visitor()->slot_processor();
4137 dont_optimize_reason = factory()->visitor()->dont_optimize_reason(); 4145 dont_optimize_reason = factory()->visitor()->dont_optimize_reason();
4138 } 4146 }
4139 4147
4140 if (is_extended_mode()) { 4148 if (FLAG_harmony_scoping && strict_mode() == STRICT) {
4141 CheckConflictingVarDeclarations(scope, CHECK_OK); 4149 CheckConflictingVarDeclarations(scope, CHECK_OK);
4142 } 4150 }
4143 4151
4144 FunctionLiteral* function_literal = 4152 FunctionLiteral* function_literal =
4145 factory()->NewFunctionLiteral(function_name, 4153 factory()->NewFunctionLiteral(function_name,
4146 scope, 4154 scope,
4147 body, 4155 body,
4148 materialized_literal_count, 4156 materialized_literal_count,
4149 expected_property_count, 4157 expected_property_count,
4150 handler_count, 4158 handler_count,
(...skipping 25 matching lines...) Expand all
4176 reusable_preparser_->set_allow_harmony_scoping(allow_harmony_scoping()); 4184 reusable_preparser_->set_allow_harmony_scoping(allow_harmony_scoping());
4177 reusable_preparser_->set_allow_modules(allow_modules()); 4185 reusable_preparser_->set_allow_modules(allow_modules());
4178 reusable_preparser_->set_allow_natives_syntax(allow_natives_syntax()); 4186 reusable_preparser_->set_allow_natives_syntax(allow_natives_syntax());
4179 reusable_preparser_->set_allow_lazy(true); 4187 reusable_preparser_->set_allow_lazy(true);
4180 reusable_preparser_->set_allow_generators(allow_generators()); 4188 reusable_preparser_->set_allow_generators(allow_generators());
4181 reusable_preparser_->set_allow_for_of(allow_for_of()); 4189 reusable_preparser_->set_allow_for_of(allow_for_of());
4182 reusable_preparser_->set_allow_harmony_numeric_literals( 4190 reusable_preparser_->set_allow_harmony_numeric_literals(
4183 allow_harmony_numeric_literals()); 4191 allow_harmony_numeric_literals());
4184 } 4192 }
4185 PreParser::PreParseResult result = 4193 PreParser::PreParseResult result =
4186 reusable_preparser_->PreParseLazyFunction(scope_->language_mode(), 4194 reusable_preparser_->PreParseLazyFunction(strict_mode(),
4187 is_generator(), 4195 is_generator(),
4188 logger); 4196 logger);
4189 return result; 4197 return result;
4190 } 4198 }
4191 4199
4192 4200
4193 Expression* Parser::ParseV8Intrinsic(bool* ok) { 4201 Expression* Parser::ParseV8Intrinsic(bool* ok) {
4194 // CallRuntime :: 4202 // CallRuntime ::
4195 // '%' Identifier Arguments 4203 // '%' Identifier Arguments
4196 4204
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
4258 : NULL; 4266 : NULL;
4259 4267
4260 if (proxy != NULL) proxy->MarkAsLValue(); 4268 if (proxy != NULL) proxy->MarkAsLValue();
4261 } 4269 }
4262 4270
4263 4271
4264 // Checks LHS expression for assignment and prefix/postfix increment/decrement 4272 // Checks LHS expression for assignment and prefix/postfix increment/decrement
4265 // in strict mode. 4273 // in strict mode.
4266 void Parser::CheckStrictModeLValue(Expression* expression, 4274 void Parser::CheckStrictModeLValue(Expression* expression,
4267 bool* ok) { 4275 bool* ok) {
4268 ASSERT(!scope_->is_sloppy_mode()); 4276 ASSERT(strict_mode() == STRICT);
4269 VariableProxy* lhs = expression != NULL 4277 VariableProxy* lhs = expression != NULL
4270 ? expression->AsVariableProxy() 4278 ? expression->AsVariableProxy()
4271 : NULL; 4279 : NULL;
4272 4280
4273 if (lhs != NULL && !lhs->is_this() && IsEvalOrArguments(lhs->name())) { 4281 if (lhs != NULL && !lhs->is_this() && IsEvalOrArguments(lhs->name())) {
4274 ReportMessage("strict_eval_arguments", Vector<const char*>::empty()); 4282 ReportMessage("strict_eval_arguments", Vector<const char*>::empty());
4275 *ok = false; 4283 *ok = false;
4276 } 4284 }
4277 } 4285 }
4278 4286
(...skipping 1074 matching lines...) Expand 10 before | Expand all | Expand 10 after
5353 ASSERT(info()->isolate()->has_pending_exception()); 5361 ASSERT(info()->isolate()->has_pending_exception());
5354 } else { 5362 } else {
5355 result = ParseProgram(); 5363 result = ParseProgram();
5356 } 5364 }
5357 } 5365 }
5358 info()->SetFunction(result); 5366 info()->SetFunction(result);
5359 return (result != NULL); 5367 return (result != NULL);
5360 } 5368 }
5361 5369
5362 } } // namespace v8::internal 5370 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/parser.h ('k') | src/preparse-data.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698