| 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 |
| 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)); |
| 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 |