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

Side by Side Diff: src/parser.cc

Issue 9460064: Further refactoring of declarations in the AST: (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 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
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 1203 matching lines...) Expand 10 before | Expand all | Expand 10 after
1214 } 1214 }
1215 1215
1216 1216
1217 Block* Parser::ParseModuleDeclaration(bool* ok) { 1217 Block* Parser::ParseModuleDeclaration(bool* ok) {
1218 // ModuleDeclaration: 1218 // ModuleDeclaration:
1219 // 'module' Identifier Module 1219 // 'module' Identifier Module
1220 1220
1221 // Create new block with one expected declaration. 1221 // Create new block with one expected declaration.
1222 Block* block = factory()->NewBlock(NULL, 1, true); 1222 Block* block = factory()->NewBlock(NULL, 1, true);
1223 Handle<String> name = ParseIdentifier(CHECK_OK); 1223 Handle<String> name = ParseIdentifier(CHECK_OK);
1224 // top_scope_->AddDeclaration( 1224 Module* module = ParseModule(CHECK_OK);
1225 // factory()->NewModuleDeclaration(proxy, module, top_scope_)); 1225 VariableProxy* proxy = NewUnresolved(name, LET);
1226 VariableProxy* proxy = Declare(name, LET, NULL, true, CHECK_OK); 1226 Declaration* declaration =
1227 Module* module = ParseModule(ok); 1227 factory()->NewModuleDeclaration(proxy, module, top_scope_);
1228 Declare(declaration, true, CHECK_OK);
1229
1228 // TODO(rossberg): Add initialization statement to block. 1230 // TODO(rossberg): Add initialization statement to block.
1229 USE(proxy); 1231
1230 USE(module);
1231 return block; 1232 return block;
1232 } 1233 }
1233 1234
1234 1235
1235 Module* Parser::ParseModule(bool* ok) { 1236 Module* Parser::ParseModule(bool* ok) {
1236 // Module: 1237 // Module:
1237 // '{' ModuleElement '}' 1238 // '{' ModuleElement '}'
1238 // '=' ModulePath 1239 // '=' ModulePath
1239 // 'at' String 1240 // 'at' String
1240 1241
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
1490 default: 1491 default:
1491 stmt = ParseExpressionOrLabelledStatement(labels, ok); 1492 stmt = ParseExpressionOrLabelledStatement(labels, ok);
1492 } 1493 }
1493 1494
1494 // Store the source position of the statement 1495 // Store the source position of the statement
1495 if (stmt != NULL) stmt->set_statement_pos(statement_pos); 1496 if (stmt != NULL) stmt->set_statement_pos(statement_pos);
1496 return stmt; 1497 return stmt;
1497 } 1498 }
1498 1499
1499 1500
1500 VariableProxy* Parser::Declare(Handle<String> name, 1501 VariableProxy* Parser::NewUnresolved(Handle<String> name, VariableMode mode) {
1501 VariableMode mode,
1502 FunctionLiteral* fun,
1503 bool resolve,
1504 bool* ok) {
1505 Variable* var = NULL;
1506 // If we are inside a function, a declaration of a var/const variable is a 1502 // If we are inside a function, a declaration of a var/const variable is a
1507 // truly local variable, and the scope of the variable is always the function 1503 // truly local variable, and the scope of the variable is always the function
1508 // scope. 1504 // scope.
1509 // Let/const variables in harmony mode are always added to the immediately 1505 // Let/const variables in harmony mode are always added to the immediately
1510 // enclosing scope. 1506 // enclosing scope.
1511 Scope* declaration_scope = (mode == LET || mode == CONST_HARMONY) 1507 return DeclarationScope(mode)->NewUnresolved(
1512 ? top_scope_ : top_scope_->DeclarationScope(); 1508 factory(), name, scanner().location().beg_pos);
1513 InitializationFlag init_flag = (fun != NULL || mode == VAR) 1509 }
1514 ? kCreatedInitialized : kNeedsInitialization; 1510
1511
1512 void Parser::Declare(Declaration* declaration, bool resolve, bool* ok) {
1513 Handle<String> name = declaration->proxy()->name();
1514 VariableMode mode = declaration->mode();
1515 Scope* declaration_scope = DeclarationScope(mode);
1516 Variable* var = NULL;
1515 1517
1516 // If a function scope exists, then we can statically declare this 1518 // If a function scope exists, then we can statically declare this
1517 // variable and also set its mode. In any case, a Declaration node 1519 // variable and also set its mode. In any case, a Declaration node
1518 // will be added to the scope so that the declaration can be added 1520 // will be added to the scope so that the declaration can be added
1519 // to the corresponding activation frame at runtime if necessary. 1521 // to the corresponding activation frame at runtime if necessary.
1520 // For instance declarations inside an eval scope need to be added 1522 // For instance declarations inside an eval scope need to be added
1521 // to the calling function context. 1523 // to the calling function context.
1522 // Similarly, strict mode eval scope does not leak variable declarations to 1524 // Similarly, strict mode eval scope does not leak variable declarations to
1523 // the caller's scope so we declare all locals, too. 1525 // the caller's scope so we declare all locals, too.
1524 // Also for block scoped let/const bindings the variable can be 1526 // Also for block scoped let/const bindings the variable can be
1525 // statically declared. 1527 // statically declared.
1526 if (declaration_scope->is_function_scope() || 1528 if (declaration_scope->is_function_scope() ||
1527 declaration_scope->is_strict_or_extended_eval_scope() || 1529 declaration_scope->is_strict_or_extended_eval_scope() ||
1528 declaration_scope->is_block_scope() || 1530 declaration_scope->is_block_scope() ||
1529 declaration_scope->is_module_scope()) { 1531 declaration_scope->is_module_scope()) {
1530 // Declare the variable in the function scope. 1532 // Declare the variable in the function scope.
1531 var = declaration_scope->LocalLookup(name); 1533 var = declaration_scope->LocalLookup(name);
1532 if (var == NULL) { 1534 if (var == NULL) {
1533 // Declare the name. 1535 // Declare the name.
1534 var = declaration_scope->DeclareLocal(name, mode, init_flag); 1536 var = declaration_scope->DeclareLocal(
1537 name, mode, declaration->initialization());
1535 } else { 1538 } else {
1536 // The name was declared in this scope before; check for conflicting 1539 // The name was declared in this scope before; check for conflicting
1537 // re-declarations. We have a conflict if either of the declarations is 1540 // re-declarations. We have a conflict if either of the declarations is
1538 // not a var. There is similar code in runtime.cc in the Declare 1541 // not a var. There is similar code in runtime.cc in the Declare
1539 // functions. The function CheckNonConflictingScope checks for conflicting 1542 // functions. The function CheckNonConflictingScope checks for conflicting
1540 // var and let bindings from different scopes whereas this is a check for 1543 // var and let bindings from different scopes whereas this is a check for
1541 // conflicting declarations within the same scope. This check also covers 1544 // conflicting declarations within the same scope. This check also covers
1542 // 1545 //
1543 // function () { let x; { var x; } } 1546 // function () { let x; { var x; } }
1544 // 1547 //
1545 // because the var declaration is hoisted to the function scope where 'x' 1548 // because the var declaration is hoisted to the function scope where 'x'
1546 // is already bound. 1549 // is already bound.
1547 if ((mode != VAR) || (var->mode() != VAR)) { 1550 if ((mode != VAR) || (var->mode() != VAR)) {
1548 // We only have vars, consts and lets in declarations. 1551 // We only have vars, consts and lets in declarations.
1549 ASSERT(var->mode() == VAR || 1552 ASSERT(var->mode() == VAR ||
1550 var->mode() == CONST || 1553 var->mode() == CONST ||
1551 var->mode() == CONST_HARMONY || 1554 var->mode() == CONST_HARMONY ||
1552 var->mode() == LET); 1555 var->mode() == LET);
1553 if (is_extended_mode()) { 1556 if (is_extended_mode()) {
1554 // In harmony mode we treat re-declarations as early errors. See 1557 // In harmony mode we treat re-declarations as early errors. See
1555 // ES5 16 for a definition of early errors. 1558 // ES5 16 for a definition of early errors.
1556 SmartArrayPointer<char> c_string = name->ToCString(DISALLOW_NULLS); 1559 SmartArrayPointer<char> c_string = name->ToCString(DISALLOW_NULLS);
1557 const char* elms[2] = { "Variable", *c_string }; 1560 const char* elms[2] = { "Variable", *c_string };
1558 Vector<const char*> args(elms, 2); 1561 Vector<const char*> args(elms, 2);
1559 ReportMessage("redeclaration", args); 1562 ReportMessage("redeclaration", args);
1560 *ok = false; 1563 *ok = false;
1561 return NULL; 1564 return;
1562 } 1565 }
1563 const char* type = (var->mode() == VAR) 1566 const char* type = (var->mode() == VAR)
1564 ? "var" : var->is_const_mode() ? "const" : "let"; 1567 ? "var" : var->is_const_mode() ? "const" : "let";
1565 Handle<String> type_string = 1568 Handle<String> type_string =
1566 isolate()->factory()->NewStringFromUtf8(CStrVector(type), TENURED); 1569 isolate()->factory()->NewStringFromUtf8(CStrVector(type), TENURED);
1567 Expression* expression = 1570 Expression* expression =
1568 NewThrowTypeError(isolate()->factory()->redeclaration_symbol(), 1571 NewThrowTypeError(isolate()->factory()->redeclaration_symbol(),
1569 type_string, name); 1572 type_string, name);
1570 declaration_scope->SetIllegalRedeclaration(expression); 1573 declaration_scope->SetIllegalRedeclaration(expression);
1571 } 1574 }
1572 } 1575 }
1573 } 1576 }
1574 1577
1575 // We add a declaration node for every declaration. The compiler 1578 // We add a declaration node for every declaration. The compiler
1576 // will only generate code if necessary. In particular, declarations 1579 // will only generate code if necessary. In particular, declarations
1577 // for inner local variables that do not represent functions won't 1580 // for inner local variables that do not represent functions won't
1578 // result in any generated code. 1581 // result in any generated code.
1579 // 1582 //
1580 // Note that we always add an unresolved proxy even if it's not 1583 // Note that we always add an unresolved proxy even if it's not
1581 // used, simply because we don't know in this method (w/o extra 1584 // used, simply because we don't know in this method (w/o extra
1582 // parameters) if the proxy is needed or not. The proxy will be 1585 // parameters) if the proxy is needed or not. The proxy will be
1583 // bound during variable resolution time unless it was pre-bound 1586 // bound during variable resolution time unless it was pre-bound
1584 // below. 1587 // below.
1585 // 1588 //
1586 // WARNING: This will lead to multiple declaration nodes for the 1589 // WARNING: This will lead to multiple declaration nodes for the
1587 // same variable if it is declared several times. This is not a 1590 // same variable if it is declared several times. This is not a
1588 // semantic issue as long as we keep the source order, but it may be 1591 // semantic issue as long as we keep the source order, but it may be
1589 // a performance issue since it may lead to repeated 1592 // a performance issue since it may lead to repeated
1590 // Runtime::DeclareContextSlot() calls. 1593 // Runtime::DeclareContextSlot() calls.
1591 VariableProxy* proxy = declaration_scope->NewUnresolved( 1594 declaration_scope->AddDeclaration(declaration);
1592 factory(), name, scanner().location().beg_pos);
1593 declaration_scope->AddDeclaration(
1594 factory()->NewVariableDeclaration(proxy, mode, fun, top_scope_));
1595 1595
1596 if ((mode == CONST || mode == CONST_HARMONY) && 1596 if ((mode == CONST || mode == CONST_HARMONY) &&
1597 declaration_scope->is_global_scope()) { 1597 declaration_scope->is_global_scope()) {
1598 // For global const variables we bind the proxy to a variable. 1598 // For global const variables we bind the proxy to a variable.
1599 ASSERT(resolve); // should be set by all callers 1599 ASSERT(resolve); // should be set by all callers
1600 Variable::Kind kind = Variable::NORMAL; 1600 Variable::Kind kind = Variable::NORMAL;
1601 var = new(zone()) Variable(declaration_scope, 1601 var = new(zone()) Variable(declaration_scope,
1602 name, 1602 name,
1603 mode, 1603 mode,
1604 true, 1604 true,
1605 kind, 1605 kind,
1606 kNeedsInitialization); 1606 kNeedsInitialization);
1607 } else if (declaration_scope->is_eval_scope() && 1607 } else if (declaration_scope->is_eval_scope() &&
1608 declaration_scope->is_classic_mode()) { 1608 declaration_scope->is_classic_mode()) {
1609 // For variable declarations in a non-strict eval scope the proxy is bound 1609 // For variable declarations in a non-strict eval scope the proxy is bound
1610 // to a lookup variable to force a dynamic declaration using the 1610 // to a lookup variable to force a dynamic declaration using the
1611 // DeclareContextSlot runtime function. 1611 // DeclareContextSlot runtime function.
1612 Variable::Kind kind = Variable::NORMAL; 1612 Variable::Kind kind = Variable::NORMAL;
1613 var = new(zone()) Variable(declaration_scope, 1613 var = new(zone()) Variable(declaration_scope,
1614 name, 1614 name,
1615 mode, 1615 mode,
1616 true, 1616 true,
1617 kind, 1617 kind,
1618 init_flag); 1618 declaration->initialization());
1619 var->AllocateTo(Variable::LOOKUP, -1); 1619 var->AllocateTo(Variable::LOOKUP, -1);
1620 resolve = true; 1620 resolve = true;
1621 } 1621 }
1622 1622
1623 // If requested and we have a local variable, bind the proxy to the variable 1623 // If requested and we have a local variable, bind the proxy to the variable
1624 // at parse-time. This is used for functions (and consts) declared inside 1624 // at parse-time. This is used for functions (and consts) declared inside
1625 // statements: the corresponding function (or const) variable must be in the 1625 // statements: the corresponding function (or const) variable must be in the
1626 // function scope and not a statement-local scope, e.g. as provided with a 1626 // function scope and not a statement-local scope, e.g. as provided with a
1627 // 'with' statement: 1627 // 'with' statement:
1628 // 1628 //
1629 // with (obj) { 1629 // with (obj) {
1630 // function f() {} 1630 // function f() {}
1631 // } 1631 // }
1632 // 1632 //
1633 // which is translated into: 1633 // which is translated into:
1634 // 1634 //
1635 // with (obj) { 1635 // with (obj) {
1636 // // in this case this is not: 'var f; f = function () {};' 1636 // // in this case this is not: 'var f; f = function () {};'
1637 // var f = function () {}; 1637 // var f = function () {};
1638 // } 1638 // }
1639 // 1639 //
1640 // Note that if 'f' is accessed from inside the 'with' statement, it 1640 // Note that if 'f' is accessed from inside the 'with' statement, it
1641 // will be allocated in the context (because we must be able to look 1641 // will be allocated in the context (because we must be able to look
1642 // it up dynamically) but it will also be accessed statically, i.e., 1642 // it up dynamically) but it will also be accessed statically, i.e.,
1643 // with a context slot index and a context chain length for this 1643 // with a context slot index and a context chain length for this
1644 // initialization code. Thus, inside the 'with' statement, we need 1644 // initialization code. Thus, inside the 'with' statement, we need
1645 // both access to the static and the dynamic context chain; the 1645 // both access to the static and the dynamic context chain; the
1646 // runtime needs to provide both. 1646 // runtime needs to provide both.
1647 if (resolve && var != NULL) proxy->BindTo(var); 1647 if (resolve && var != NULL) declaration->proxy()->BindTo(var);
1648
1649 return proxy;
1650 } 1648 }
1651 1649
1652 1650
1653 // Language extension which is only enabled for source files loaded 1651 // Language extension which is only enabled for source files loaded
1654 // through the API's extension mechanism. A native function 1652 // through the API's extension mechanism. A native function
1655 // declaration is resolved by looking up the function through a 1653 // declaration is resolved by looking up the function through a
1656 // callback provided by the extension. 1654 // callback provided by the extension.
1657 Statement* Parser::ParseNativeDeclaration(bool* ok) { 1655 Statement* Parser::ParseNativeDeclaration(bool* ok) {
1658 Expect(Token::FUNCTION, CHECK_OK); 1656 Expect(Token::FUNCTION, CHECK_OK);
1659 Handle<String> name = ParseIdentifier(CHECK_OK); 1657 Handle<String> name = ParseIdentifier(CHECK_OK);
1660 Expect(Token::LPAREN, CHECK_OK); 1658 Expect(Token::LPAREN, CHECK_OK);
1661 bool done = (peek() == Token::RPAREN); 1659 bool done = (peek() == Token::RPAREN);
1662 while (!done) { 1660 while (!done) {
1663 ParseIdentifier(CHECK_OK); 1661 ParseIdentifier(CHECK_OK);
1664 done = (peek() == Token::RPAREN); 1662 done = (peek() == Token::RPAREN);
1665 if (!done) { 1663 if (!done) {
1666 Expect(Token::COMMA, CHECK_OK); 1664 Expect(Token::COMMA, CHECK_OK);
1667 } 1665 }
1668 } 1666 }
1669 Expect(Token::RPAREN, CHECK_OK); 1667 Expect(Token::RPAREN, CHECK_OK);
1670 Expect(Token::SEMICOLON, CHECK_OK); 1668 Expect(Token::SEMICOLON, CHECK_OK);
1671 1669
1672 // Make sure that the function containing the native declaration 1670 // Make sure that the function containing the native declaration
1673 // isn't lazily compiled. The extension structures are only 1671 // isn't lazily compiled. The extension structures are only
1674 // accessible while parsing the first time not when reparsing 1672 // accessible while parsing the first time not when reparsing
1675 // because of lazy compilation. 1673 // because of lazy compilation.
1676 top_scope_->DeclarationScope()->ForceEagerCompilation(); 1674 DeclarationScope(VAR)->ForceEagerCompilation();
1677 1675
1678 // Compute the function template for the native function. 1676 // Compute the function template for the native function.
1679 v8::Handle<v8::FunctionTemplate> fun_template = 1677 v8::Handle<v8::FunctionTemplate> fun_template =
1680 extension_->GetNativeFunction(v8::Utils::ToLocal(name)); 1678 extension_->GetNativeFunction(v8::Utils::ToLocal(name));
1681 ASSERT(!fun_template.IsEmpty()); 1679 ASSERT(!fun_template.IsEmpty());
1682 1680
1683 // Instantiate the function and create a shared function info from it. 1681 // Instantiate the function and create a shared function info from it.
1684 Handle<JSFunction> fun = Utils::OpenHandle(*fun_template->GetFunction()); 1682 Handle<JSFunction> fun = Utils::OpenHandle(*fun_template->GetFunction());
1685 const int literals = fun->NumberOfLiterals(); 1683 const int literals = fun->NumberOfLiterals();
1686 Handle<Code> code = Handle<Code>(fun->shared()->code()); 1684 Handle<Code> code = Handle<Code>(fun->shared()->code());
1687 Handle<Code> construct_stub = Handle<Code>(fun->shared()->construct_stub()); 1685 Handle<Code> construct_stub = Handle<Code>(fun->shared()->construct_stub());
1688 Handle<SharedFunctionInfo> shared = 1686 Handle<SharedFunctionInfo> shared =
1689 isolate()->factory()->NewSharedFunctionInfo(name, literals, code, 1687 isolate()->factory()->NewSharedFunctionInfo(name, literals, code,
1690 Handle<ScopeInfo>(fun->shared()->scope_info())); 1688 Handle<ScopeInfo>(fun->shared()->scope_info()));
1691 shared->set_construct_stub(*construct_stub); 1689 shared->set_construct_stub(*construct_stub);
1692 1690
1693 // Copy the function data to the shared function info. 1691 // Copy the function data to the shared function info.
1694 shared->set_function_data(fun->shared()->function_data()); 1692 shared->set_function_data(fun->shared()->function_data());
1695 int parameters = fun->shared()->formal_parameter_count(); 1693 int parameters = fun->shared()->formal_parameter_count();
1696 shared->set_formal_parameter_count(parameters); 1694 shared->set_formal_parameter_count(parameters);
1697 1695
1698 // TODO(1240846): It's weird that native function declarations are 1696 // TODO(1240846): It's weird that native function declarations are
1699 // introduced dynamically when we meet their declarations, whereas 1697 // introduced dynamically when we meet their declarations, whereas
1700 // other functions are set up when entering the surrounding scope. 1698 // other functions are set up when entering the surrounding scope.
1699 VariableProxy* proxy = NewUnresolved(name, VAR);
1700 Declaration* declaration =
1701 factory()->NewVariableDeclaration(proxy, VAR, top_scope_);
1702 Declare(declaration, true, CHECK_OK);
1701 SharedFunctionInfoLiteral* lit = 1703 SharedFunctionInfoLiteral* lit =
1702 factory()->NewSharedFunctionInfoLiteral(shared); 1704 factory()->NewSharedFunctionInfoLiteral(shared);
1703 VariableProxy* var = Declare(name, VAR, NULL, true, CHECK_OK);
1704 return factory()->NewExpressionStatement( 1705 return factory()->NewExpressionStatement(
1705 factory()->NewAssignment( 1706 factory()->NewAssignment(
1706 Token::INIT_VAR, var, lit, RelocInfo::kNoPosition)); 1707 Token::INIT_VAR, proxy, lit, RelocInfo::kNoPosition));
1707 } 1708 }
1708 1709
1709 1710
1710 Statement* Parser::ParseFunctionDeclaration(bool* ok) { 1711 Statement* Parser::ParseFunctionDeclaration(bool* ok) {
1711 // FunctionDeclaration :: 1712 // FunctionDeclaration ::
1712 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}' 1713 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}'
1713 Expect(Token::FUNCTION, CHECK_OK); 1714 Expect(Token::FUNCTION, CHECK_OK);
1714 int function_token_position = scanner().location().beg_pos; 1715 int function_token_position = scanner().location().beg_pos;
1715 bool is_strict_reserved = false; 1716 bool is_strict_reserved = false;
1716 Handle<String> name = ParseIdentifierOrStrictReservedWord( 1717 Handle<String> name = ParseIdentifierOrStrictReservedWord(
1717 &is_strict_reserved, CHECK_OK); 1718 &is_strict_reserved, CHECK_OK);
1718 FunctionLiteral* fun = ParseFunctionLiteral(name, 1719 FunctionLiteral* fun = ParseFunctionLiteral(name,
1719 is_strict_reserved, 1720 is_strict_reserved,
1720 function_token_position, 1721 function_token_position,
1721 FunctionLiteral::DECLARATION, 1722 FunctionLiteral::DECLARATION,
1722 CHECK_OK); 1723 CHECK_OK);
1723 // Even if we're not at the top-level of the global or a function 1724 // Even if we're not at the top-level of the global or a function
1724 // scope, we treat is as such and introduce the function with it's 1725 // scope, we treat is as such and introduce the function with it's
1725 // initial value upon entering the corresponding scope. 1726 // initial value upon entering the corresponding scope.
1726 VariableMode mode = is_extended_mode() ? LET : VAR; 1727 VariableMode mode = is_extended_mode() ? LET : VAR;
1727 Declare(name, mode, fun, true, CHECK_OK); 1728 VariableProxy* proxy = NewUnresolved(name, mode);
1729 Declaration* declaration =
1730 factory()->NewFunctionDeclaration(proxy, mode, fun, top_scope_);
1731 Declare(declaration, true, CHECK_OK);
1728 return factory()->NewEmptyStatement(); 1732 return factory()->NewEmptyStatement();
1729 } 1733 }
1730 1734
1731 1735
1732 Block* Parser::ParseBlock(ZoneStringList* labels, bool* ok) { 1736 Block* Parser::ParseBlock(ZoneStringList* labels, bool* ok) {
1733 if (top_scope_->is_extended_mode()) return ParseScopedBlock(labels, ok); 1737 if (top_scope_->is_extended_mode()) return ParseScopedBlock(labels, ok);
1734 1738
1735 // Block :: 1739 // Block ::
1736 // '{' Statement* '}' 1740 // '{' Statement* '}'
1737 1741
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
1895 *ok = false; 1899 *ok = false;
1896 return NULL; 1900 return NULL;
1897 } 1901 }
1898 mode = LET; 1902 mode = LET;
1899 needs_init = true; 1903 needs_init = true;
1900 init_op = Token::INIT_LET; 1904 init_op = Token::INIT_LET;
1901 } else { 1905 } else {
1902 UNREACHABLE(); // by current callers 1906 UNREACHABLE(); // by current callers
1903 } 1907 }
1904 1908
1905 Scope* declaration_scope = (mode == LET || mode == CONST_HARMONY) 1909 Scope* declaration_scope = DeclarationScope(mode);
1906 ? top_scope_ : top_scope_->DeclarationScope(); 1910
1907 // The scope of a var/const declared variable anywhere inside a function 1911 // The scope of a var/const declared variable anywhere inside a function
1908 // is the entire function (ECMA-262, 3rd, 10.1.3, and 12.2). Thus we can 1912 // is the entire function (ECMA-262, 3rd, 10.1.3, and 12.2). Thus we can
1909 // transform a source-level var/const declaration into a (Function) 1913 // transform a source-level var/const declaration into a (Function)
1910 // Scope declaration, and rewrite the source-level initialization into an 1914 // Scope declaration, and rewrite the source-level initialization into an
1911 // assignment statement. We use a block to collect multiple assignments. 1915 // assignment statement. We use a block to collect multiple assignments.
1912 // 1916 //
1913 // We mark the block as initializer block because we don't want the 1917 // We mark the block as initializer block because we don't want the
1914 // rewriter to add a '.result' assignment to such a block (to get compliant 1918 // rewriter to add a '.result' assignment to such a block (to get compliant
1915 // behavior for code such as print(eval('var x = 7')), and for cosmetic 1919 // behavior for code such as print(eval('var x = 7')), and for cosmetic
1916 // reasons when pretty-printing. Also, unless an assignment (initialization) 1920 // reasons when pretty-printing. Also, unless an assignment (initialization)
(...skipping 26 matching lines...) Expand all
1943 // which the variable or constant is declared. Only function variables have 1947 // which the variable or constant is declared. Only function variables have
1944 // an initial value in the declaration (because they are initialized upon 1948 // an initial value in the declaration (because they are initialized upon
1945 // entering the function). 1949 // entering the function).
1946 // 1950 //
1947 // If we have a const declaration, in an inner scope, the proxy is always 1951 // If we have a const declaration, in an inner scope, the proxy is always
1948 // bound to the declared variable (independent of possibly surrounding with 1952 // bound to the declared variable (independent of possibly surrounding with
1949 // statements). 1953 // statements).
1950 // For let/const declarations in harmony mode, we can also immediately 1954 // For let/const declarations in harmony mode, we can also immediately
1951 // pre-resolve the proxy because it resides in the same scope as the 1955 // pre-resolve the proxy because it resides in the same scope as the
1952 // declaration. 1956 // declaration.
1953 VariableProxy* proxy = Declare(name, mode, NULL, mode != VAR, CHECK_OK); 1957 VariableProxy* proxy = NewUnresolved(name, mode);
1958 Declaration* declaration =
1959 factory()->NewVariableDeclaration(proxy, mode, top_scope_);
1960 Declare(declaration, mode != VAR, CHECK_OK);
1954 nvars++; 1961 nvars++;
1955 if (declaration_scope->num_var_or_const() > kMaxNumFunctionLocals) { 1962 if (declaration_scope->num_var_or_const() > kMaxNumFunctionLocals) {
1956 ReportMessageAt(scanner().location(), "too_many_variables", 1963 ReportMessageAt(scanner().location(), "too_many_variables",
1957 Vector<const char*>::empty()); 1964 Vector<const char*>::empty());
1958 *ok = false; 1965 *ok = false;
1959 return NULL; 1966 return NULL;
1960 } 1967 }
1961 1968
1962 // Parse initialization expression if present and/or needed. A 1969 // Parse initialization expression if present and/or needed. A
1963 // declaration of the form: 1970 // declaration of the form:
(...skipping 3838 matching lines...) Expand 10 before | Expand all | Expand 10 after
5802 ASSERT(info->isolate()->has_pending_exception()); 5809 ASSERT(info->isolate()->has_pending_exception());
5803 } else { 5810 } else {
5804 result = parser.ParseProgram(info); 5811 result = parser.ParseProgram(info);
5805 } 5812 }
5806 } 5813 }
5807 info->SetFunction(result); 5814 info->SetFunction(result);
5808 return (result != NULL); 5815 return (result != NULL);
5809 } 5816 }
5810 5817
5811 } } // namespace v8::internal 5818 } } // namespace v8::internal
OLDNEW
« src/ast.h ('K') | « src/parser.h ('k') | src/prettyprinter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698