Chromium Code Reviews| Index: src/parser.cc |
| diff --git a/src/parser.cc b/src/parser.cc |
| index 249c9ced35309b935b441a8d917f149c017f5ef5..685b4d93d3d08e9cb17cedb8393d310f20b91d62 100644 |
| --- a/src/parser.cc |
| +++ b/src/parser.cc |
| @@ -1634,34 +1634,49 @@ Block* Parser::ParseVariableDeclarations(bool accept_IN, |
| if (top_scope_->is_global_scope()) { |
| // Compute the arguments for the runtime call. |
| - ZoneList<Expression*>* arguments = new ZoneList<Expression*>(2); |
| - // Be careful not to assign a value to the global variable if |
| - // we're in a with. The initialization value should not |
| - // necessarily be stored in the global object in that case, |
| - // which is why we need to generate a separate assignment node. |
| + ZoneList<Expression*>* arguments = new ZoneList<Expression*>(3); |
| arguments->Add(new Literal(name)); // we have at least 1 parameter |
| - if (is_const || (value != NULL && !inside_with())) { |
| - arguments->Add(value); |
| - value = NULL; // zap the value to avoid the unnecessary assignment |
| - } |
| - // Construct the call to Runtime::DeclareGlobal{Variable,Const}Locally |
| - // and add it to the initialization statement block. Note that |
| - // this function does different things depending on if we have |
| - // 1 or 2 parameters. |
| CallRuntime* initialize; |
| + |
| if (is_const) { |
| + arguments->Add(value); |
| + value = NULL; // zap the value to avoid the unnecessary assignment |
| + |
|
Martin Maly
2011/02/27 23:04:04
Handling const and var in different code paths sin
|
| + // Construct the call to Runtime_InitializeConstGlobal |
| + // and add it to the initialization statement block. |
| + // Note that the function does different things depending on |
| + // the number of arguments (1 or 2). |
| initialize = |
| - new CallRuntime( |
| - Factory::InitializeConstGlobal_symbol(), |
| - Runtime::FunctionForId(Runtime::kInitializeConstGlobal), |
| - arguments); |
| + new CallRuntime( |
| + Factory::InitializeConstGlobal_symbol(), |
| + Runtime::FunctionForId(Runtime::kInitializeConstGlobal), |
| + arguments); |
| } else { |
| + // Add strict mode. |
| + // We may want to pass singleton to avoid Literal allocations. |
| + arguments->Add(NewNumberLiteral( |
| + 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
|
| + |
| + // Be careful not to assign a value to the global variable if |
| + // we're in a with. The initialization value should not |
| + // necessarily be stored in the global object in that case, |
| + // which is why we need to generate a separate assignment node. |
| + if (value != NULL && !inside_with()) { |
| + arguments->Add(value); |
| + value = NULL; // zap the value to avoid the unnecessary assignment |
| + } |
| + |
| + // Construct the call to Runtime_InitializeVarGlobal |
| + // and add it to the initialization statement block. |
| + // Note that the function does different things depending on |
| + // the number of arguments (2 or 3). |
| initialize = |
| - new CallRuntime( |
| - Factory::InitializeVarGlobal_symbol(), |
| - Runtime::FunctionForId(Runtime::kInitializeVarGlobal), |
| - arguments); |
| + new CallRuntime( |
| + Factory::InitializeVarGlobal_symbol(), |
| + Runtime::FunctionForId(Runtime::kInitializeVarGlobal), |
| + arguments); |
| } |
| + |
| block->AddStatement(new ExpressionStatement(initialize)); |
| } |