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 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 temps_(4, zone), | 111 temps_(4, zone), |
112 params_(4, zone), | 112 params_(4, zone), |
113 unresolved_(16, zone), | 113 unresolved_(16, zone), |
114 decls_(4, zone), | 114 decls_(4, zone), |
115 interface_(FLAG_harmony_modules && | 115 interface_(FLAG_harmony_modules && |
116 (type == MODULE_SCOPE || type == GLOBAL_SCOPE) | 116 (type == MODULE_SCOPE || type == GLOBAL_SCOPE) |
117 ? Interface::NewModule(zone) : NULL), | 117 ? Interface::NewModule(zone) : NULL), |
118 already_resolved_(false), | 118 already_resolved_(false), |
119 zone_(zone) { | 119 zone_(zone) { |
120 SetDefaults(type, outer_scope, Handle<ScopeInfo>::null()); | 120 SetDefaults(type, outer_scope, Handle<ScopeInfo>::null()); |
121 // At some point we might want to provide outer scopes to | 121 // The outermost scope must be a global scope. |
122 // eval scopes (by walking the stack and reading the scope info). | 122 ASSERT(type == GLOBAL_SCOPE || outer_scope != NULL); |
123 // In that case, the ASSERT below needs to be adjusted. | |
124 ASSERT_EQ(type == GLOBAL_SCOPE, outer_scope == NULL); | |
125 ASSERT(!HasIllegalRedeclaration()); | 123 ASSERT(!HasIllegalRedeclaration()); |
126 } | 124 } |
127 | 125 |
128 | 126 |
129 Scope::Scope(Scope* inner_scope, | 127 Scope::Scope(Scope* inner_scope, |
130 ScopeType type, | 128 ScopeType type, |
131 Handle<ScopeInfo> scope_info, | 129 Handle<ScopeInfo> scope_info, |
132 Zone* zone) | 130 Zone* zone) |
133 : isolate_(Isolate::Current()), | 131 : isolate_(Isolate::Current()), |
134 inner_scopes_(4, zone), | 132 inner_scopes_(4, zone), |
(...skipping 899 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1034 switch (binding_kind) { | 1032 switch (binding_kind) { |
1035 case BOUND: | 1033 case BOUND: |
1036 // We found a variable binding. | 1034 // We found a variable binding. |
1037 break; | 1035 break; |
1038 | 1036 |
1039 case BOUND_EVAL_SHADOWED: | 1037 case BOUND_EVAL_SHADOWED: |
1040 // We either found a variable binding that might be shadowed by eval or | 1038 // We either found a variable binding that might be shadowed by eval or |
1041 // gave up on it (e.g. by encountering a local with the same in the outer | 1039 // gave up on it (e.g. by encountering a local with the same in the outer |
1042 // scope which was not promoted to a context, this can happen if we use | 1040 // scope which was not promoted to a context, this can happen if we use |
1043 // debugger to evaluate arbitrary expressions at a break point). | 1041 // debugger to evaluate arbitrary expressions at a break point). |
1044 if (var->is_global()) { | 1042 if (var->IsGlobalObjectProperty()) { |
1045 var = NonLocal(proxy->name(), DYNAMIC_GLOBAL); | 1043 var = NonLocal(proxy->name(), DYNAMIC_GLOBAL); |
1046 } else if (var->is_dynamic()) { | 1044 } else if (var->is_dynamic()) { |
1047 var = NonLocal(proxy->name(), DYNAMIC); | 1045 var = NonLocal(proxy->name(), DYNAMIC); |
1048 } else { | 1046 } else { |
1049 Variable* invalidated = var; | 1047 Variable* invalidated = var; |
1050 var = NonLocal(proxy->name(), DYNAMIC_LOCAL); | 1048 var = NonLocal(proxy->name(), DYNAMIC_LOCAL); |
1051 var->set_local_if_not_shadowed(invalidated); | 1049 var->set_local_if_not_shadowed(invalidated); |
1052 } | 1050 } |
1053 break; | 1051 break; |
1054 | 1052 |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1155 // Give var a read/write use if there is a chance it might be accessed | 1153 // Give var a read/write use if there is a chance it might be accessed |
1156 // via an eval() call. This is only possible if the variable has a | 1154 // via an eval() call. This is only possible if the variable has a |
1157 // visible name. | 1155 // visible name. |
1158 if ((var->is_this() || var->name()->length() > 0) && | 1156 if ((var->is_this() || var->name()->length() > 0) && |
1159 (var->has_forced_context_allocation() || | 1157 (var->has_forced_context_allocation() || |
1160 scope_calls_eval_ || | 1158 scope_calls_eval_ || |
1161 inner_scope_calls_eval_ || | 1159 inner_scope_calls_eval_ || |
1162 scope_contains_with_ || | 1160 scope_contains_with_ || |
1163 is_catch_scope() || | 1161 is_catch_scope() || |
1164 is_block_scope() || | 1162 is_block_scope() || |
1165 is_module_scope())) { | 1163 is_module_scope() || |
| 1164 is_global_scope())) { |
1166 var->set_is_used(true); | 1165 var->set_is_used(true); |
1167 } | 1166 } |
1168 // Global variables do not need to be allocated. | 1167 // Global variables do not need to be allocated. |
1169 return !var->is_global() && var->is_used(); | 1168 return !var->IsGlobalObjectProperty() && var->is_used(); |
1170 } | 1169 } |
1171 | 1170 |
1172 | 1171 |
1173 bool Scope::MustAllocateInContext(Variable* var) { | 1172 bool Scope::MustAllocateInContext(Variable* var) { |
1174 // If var is accessed from an inner scope, or if there is a possibility | 1173 // If var is accessed from an inner scope, or if there is a possibility |
1175 // that it might be accessed from the current or an inner scope (through | 1174 // that it might be accessed from the current or an inner scope (through |
1176 // an eval() call or a runtime with lookup), it must be allocated in the | 1175 // an eval() call or a runtime with lookup), it must be allocated in the |
1177 // context. | 1176 // context. |
1178 // | 1177 // |
1179 // Exceptions: temporary variables are never allocated in a context; | 1178 // Exceptions: temporary variables are never allocated in a context; |
1180 // catch-bound variables are always allocated in a context. | 1179 // catch-bound variables are always allocated in a context. |
1181 if (var->mode() == TEMPORARY) return false; | 1180 if (var->mode() == TEMPORARY) return false; |
1182 if (is_catch_scope() || is_block_scope() || is_module_scope()) return true; | 1181 if (is_catch_scope() || is_block_scope() || is_module_scope()) return true; |
| 1182 if (is_global_scope() && (var->mode() == LET || var->mode() == CONST_HARMONY)) |
| 1183 return true; |
1183 return var->has_forced_context_allocation() || | 1184 return var->has_forced_context_allocation() || |
1184 scope_calls_eval_ || | 1185 scope_calls_eval_ || |
1185 inner_scope_calls_eval_ || | 1186 inner_scope_calls_eval_ || |
1186 scope_contains_with_ || | 1187 scope_contains_with_; |
1187 var->is_global(); | |
1188 } | 1188 } |
1189 | 1189 |
1190 | 1190 |
1191 bool Scope::HasArgumentsParameter() { | 1191 bool Scope::HasArgumentsParameter() { |
1192 for (int i = 0; i < params_.length(); i++) { | 1192 for (int i = 0; i < params_.length(); i++) { |
1193 if (params_[i]->name().is_identical_to( | 1193 if (params_[i]->name().is_identical_to( |
1194 isolate_->factory()->arguments_symbol())) { | 1194 isolate_->factory()->arguments_symbol())) { |
1195 return true; | 1195 return true; |
1196 } | 1196 } |
1197 } | 1197 } |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1425 for (int i = 0; i < inner_scopes_.length(); i++) { | 1425 for (int i = 0; i < inner_scopes_.length(); i++) { |
1426 Scope* inner_scope = inner_scopes_.at(i); | 1426 Scope* inner_scope = inner_scopes_.at(i); |
1427 if (inner_scope->is_module_scope()) { | 1427 if (inner_scope->is_module_scope()) { |
1428 inner_scope->LinkModules(info); | 1428 inner_scope->LinkModules(info); |
1429 } | 1429 } |
1430 } | 1430 } |
1431 } | 1431 } |
1432 | 1432 |
1433 | 1433 |
1434 } } // namespace v8::internal | 1434 } } // namespace v8::internal |
OLD | NEW |