OLD | NEW |
---|---|
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 1616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1627 // guarantee to give the global object a "local" variable; a | 1627 // guarantee to give the global object a "local" variable; a |
1628 // variable defined in the global object and not in any | 1628 // variable defined in the global object and not in any |
1629 // prototype. This way, global variable declarations can shadow | 1629 // prototype. This way, global variable declarations can shadow |
1630 // properties in the prototype chain, but only after the variable | 1630 // properties in the prototype chain, but only after the variable |
1631 // declaration statement has been executed. This is important in | 1631 // declaration statement has been executed. This is important in |
1632 // browsers where the global object (window) has lots of | 1632 // browsers where the global object (window) has lots of |
1633 // properties defined in prototype objects. | 1633 // properties defined in prototype objects. |
1634 | 1634 |
1635 if (top_scope_->is_global_scope()) { | 1635 if (top_scope_->is_global_scope()) { |
1636 // Compute the arguments for the runtime call. | 1636 // Compute the arguments for the runtime call. |
1637 ZoneList<Expression*>* arguments = new ZoneList<Expression*>(2); | 1637 ZoneList<Expression*>* arguments = new ZoneList<Expression*>(3); |
1638 // Be careful not to assign a value to the global variable if | |
1639 // we're in a with. The initialization value should not | |
1640 // necessarily be stored in the global object in that case, | |
1641 // which is why we need to generate a separate assignment node. | |
1642 arguments->Add(new Literal(name)); // we have at least 1 parameter | 1638 arguments->Add(new Literal(name)); // we have at least 1 parameter |
1643 if (is_const || (value != NULL && !inside_with())) { | 1639 CallRuntime* initialize; |
1640 | |
1641 if (is_const) { | |
1644 arguments->Add(value); | 1642 arguments->Add(value); |
1645 value = NULL; // zap the value to avoid the unnecessary assignment | 1643 value = NULL; // zap the value to avoid the unnecessary assignment |
1644 | |
Martin Maly
2011/02/27 23:04:04
Handling const and var in different code paths sin
| |
1645 // Construct the call to Runtime_InitializeConstGlobal | |
1646 // and add it to the initialization statement block. | |
1647 // Note that the function does different things depending on | |
1648 // the number of arguments (1 or 2). | |
1649 initialize = | |
1650 new CallRuntime( | |
1651 Factory::InitializeConstGlobal_symbol(), | |
1652 Runtime::FunctionForId(Runtime::kInitializeConstGlobal), | |
1653 arguments); | |
1654 } else { | |
1655 // Add strict mode. | |
1656 // We may want to pass singleton to avoid Literal allocations. | |
1657 arguments->Add(NewNumberLiteral( | |
1658 temp_scope_->StrictMode() ? kStrictMode : kNonStrictMode)); | |
Martin Maly
2011/02/27 23:04:04
Is it worth passing some singleton object here? tr
Lasse Reichstein
2011/02/28 11:18:30
I don't think so. The NumberLiteral will hold a sm
| |
1659 | |
1660 // Be careful not to assign a value to the global variable if | |
1661 // we're in a with. The initialization value should not | |
1662 // necessarily be stored in the global object in that case, | |
1663 // which is why we need to generate a separate assignment node. | |
1664 if (value != NULL && !inside_with()) { | |
1665 arguments->Add(value); | |
1666 value = NULL; // zap the value to avoid the unnecessary assignment | |
1667 } | |
1668 | |
1669 // Construct the call to Runtime_InitializeVarGlobal | |
1670 // and add it to the initialization statement block. | |
1671 // Note that the function does different things depending on | |
1672 // the number of arguments (2 or 3). | |
1673 initialize = | |
1674 new CallRuntime( | |
1675 Factory::InitializeVarGlobal_symbol(), | |
1676 Runtime::FunctionForId(Runtime::kInitializeVarGlobal), | |
1677 arguments); | |
1646 } | 1678 } |
1647 // Construct the call to Runtime::DeclareGlobal{Variable,Const}Locally | 1679 |
1648 // and add it to the initialization statement block. Note that | |
1649 // this function does different things depending on if we have | |
1650 // 1 or 2 parameters. | |
1651 CallRuntime* initialize; | |
1652 if (is_const) { | |
1653 initialize = | |
1654 new CallRuntime( | |
1655 Factory::InitializeConstGlobal_symbol(), | |
1656 Runtime::FunctionForId(Runtime::kInitializeConstGlobal), | |
1657 arguments); | |
1658 } else { | |
1659 initialize = | |
1660 new CallRuntime( | |
1661 Factory::InitializeVarGlobal_symbol(), | |
1662 Runtime::FunctionForId(Runtime::kInitializeVarGlobal), | |
1663 arguments); | |
1664 } | |
1665 block->AddStatement(new ExpressionStatement(initialize)); | 1680 block->AddStatement(new ExpressionStatement(initialize)); |
1666 } | 1681 } |
1667 | 1682 |
1668 // Add an assignment node to the initialization statement block if | 1683 // Add an assignment node to the initialization statement block if |
1669 // we still have a pending initialization value. We must distinguish | 1684 // we still have a pending initialization value. We must distinguish |
1670 // between variables and constants: Variable initializations are simply | 1685 // between variables and constants: Variable initializations are simply |
1671 // assignments (with all the consequences if they are inside a 'with' | 1686 // assignments (with all the consequences if they are inside a 'with' |
1672 // statement - they may change a 'with' object property). Constant | 1687 // statement - they may change a 'with' object property). Constant |
1673 // initializations always assign to the declared constant which is | 1688 // initializations always assign to the declared constant which is |
1674 // always at the function scope level. This is only relevant for | 1689 // always at the function scope level. This is only relevant for |
(...skipping 3439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5114 info->is_global(), | 5129 info->is_global(), |
5115 info->StrictMode()); | 5130 info->StrictMode()); |
5116 } | 5131 } |
5117 } | 5132 } |
5118 | 5133 |
5119 info->SetFunction(result); | 5134 info->SetFunction(result); |
5120 return (result != NULL); | 5135 return (result != NULL); |
5121 } | 5136 } |
5122 | 5137 |
5123 } } // namespace v8::internal | 5138 } } // namespace v8::internal |
OLD | NEW |