OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 1831 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1842 new(zone()) CallRuntime( | 1842 new(zone()) CallRuntime( |
1843 isolate(), | 1843 isolate(), |
1844 isolate()->factory()->InitializeVarGlobal_symbol(), | 1844 isolate()->factory()->InitializeVarGlobal_symbol(), |
1845 Runtime::FunctionForId(Runtime::kInitializeVarGlobal), | 1845 Runtime::FunctionForId(Runtime::kInitializeVarGlobal), |
1846 arguments); | 1846 arguments); |
1847 } | 1847 } |
1848 | 1848 |
1849 block->AddStatement(new(zone()) ExpressionStatement(initialize)); | 1849 block->AddStatement(new(zone()) ExpressionStatement(initialize)); |
1850 } | 1850 } |
1851 | 1851 |
1852 // Add an assignment node to the initialization statement block if | 1852 // Add an assignment node to the initialization statement block if we still |
1853 // we still have a pending initialization value. We must distinguish | 1853 // have a pending initialization value. We must distinguish between |
1854 // between variables and constants: Variable initializations are simply | 1854 // different kinds of declarations: 'var' initializations are simply |
1855 // assignments (with all the consequences if they are inside a 'with' | 1855 // assignments (with all the consequences if they are inside a 'with' |
1856 // statement - they may change a 'with' object property). Constant | 1856 // statement - they may change a 'with' object property). Constant |
1857 // initializations always assign to the declared constant which is | 1857 // initializations always assign to the declared constant which is |
1858 // always at the function scope level. This is only relevant for | 1858 // always at the function scope level. This is only relevant for |
1859 // dynamically looked-up variables and constants (the start context | 1859 // dynamically looked-up variables and constants (the start context |
1860 // for constant lookups is always the function context, while it is | 1860 // for constant lookups is always the function context, while it is |
1861 // the top context for variables). Sigh... | 1861 // the top context for var declared variables). Sigh... |
| 1862 // For 'let' declared variables the initialization is in the same scope |
| 1863 // as the declaration. Thus dynamic lookups are unnecessary even if the |
| 1864 // block scope is inside a with. |
1862 if (value != NULL) { | 1865 if (value != NULL) { |
1863 bool in_with = is_const ? false : inside_with(); | 1866 bool in_with = mode == Variable::VAR ? inside_with() : false; |
1864 VariableProxy* proxy = | 1867 VariableProxy* proxy = |
1865 initialization_scope->NewUnresolved(name, in_with); | 1868 initialization_scope->NewUnresolved(name, in_with); |
1866 Assignment* assignment = | 1869 Assignment* assignment = |
1867 new(zone()) Assignment(isolate(), init_op, proxy, value, position); | 1870 new(zone()) Assignment(isolate(), init_op, proxy, value, position); |
1868 if (block) { | 1871 if (block) { |
1869 block->AddStatement(new(zone()) ExpressionStatement(assignment)); | 1872 block->AddStatement(new(zone()) ExpressionStatement(assignment)); |
1870 } | 1873 } |
1871 } | 1874 } |
1872 | 1875 |
1873 if (fni_ != NULL) fni_->Leave(); | 1876 if (fni_ != NULL) fni_->Leave(); |
(...skipping 3366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5240 result = parser.ParseProgram(source, | 5243 result = parser.ParseProgram(source, |
5241 info->is_global(), | 5244 info->is_global(), |
5242 info->StrictMode()); | 5245 info->StrictMode()); |
5243 } | 5246 } |
5244 } | 5247 } |
5245 info->SetFunction(result); | 5248 info->SetFunction(result); |
5246 return (result != NULL); | 5249 return (result != NULL); |
5247 } | 5250 } |
5248 | 5251 |
5249 } } // namespace v8::internal | 5252 } } // namespace v8::internal |
OLD | NEW |