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