OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/ast/scopes.h" | 5 #include "src/ast/scopes.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/ast/scopeinfo.h" | 8 #include "src/ast/scopeinfo.h" |
9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/messages.h" | 10 #include "src/messages.h" |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
301 AstNodeFactory ast_node_factory(info->ast_value_factory()); | 301 AstNodeFactory ast_node_factory(info->ast_value_factory()); |
302 if (!top->AllocateVariables(info, &ast_node_factory)) { | 302 if (!top->AllocateVariables(info, &ast_node_factory)) { |
303 DCHECK(top->pending_error_handler_.has_pending_error()); | 303 DCHECK(top->pending_error_handler_.has_pending_error()); |
304 top->pending_error_handler_.ThrowPendingError(info->isolate(), | 304 top->pending_error_handler_.ThrowPendingError(info->isolate(), |
305 info->script()); | 305 info->script()); |
306 return false; | 306 return false; |
307 } | 307 } |
308 } | 308 } |
309 | 309 |
310 #ifdef DEBUG | 310 #ifdef DEBUG |
311 bool native = info->isolate()->bootstrapper()->IsActive(); | 311 if (info->script_is_native() ? FLAG_print_builtin_scopes |
312 if (!info->shared_info().is_null()) { | 312 : FLAG_print_scopes) { |
313 Object* script = info->shared_info()->script(); | 313 scope->Print(); |
314 native = script->IsScript() && | |
315 Script::cast(script)->type() == Script::TYPE_NATIVE; | |
316 } | 314 } |
317 | |
318 if (native ? FLAG_print_builtin_scopes : FLAG_print_scopes) scope->Print(); | |
319 #endif | 315 #endif |
320 | 316 |
321 info->set_scope(scope); | 317 info->set_scope(scope); |
322 return true; | 318 return true; |
323 } | 319 } |
324 | 320 |
325 | 321 |
326 void Scope::Initialize() { | 322 void Scope::Initialize() { |
327 DCHECK(!already_resolved()); | 323 DCHECK(!already_resolved()); |
328 | 324 |
(...skipping 825 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1154 AstNodeFactory* factory) { | 1150 AstNodeFactory* factory) { |
1155 DCHECK(info->script_scope()->is_script_scope()); | 1151 DCHECK(info->script_scope()->is_script_scope()); |
1156 | 1152 |
1157 // If the proxy is already resolved there's nothing to do | 1153 // If the proxy is already resolved there's nothing to do |
1158 // (functions and consts may be resolved by the parser). | 1154 // (functions and consts may be resolved by the parser). |
1159 if (proxy->is_resolved()) return true; | 1155 if (proxy->is_resolved()) return true; |
1160 | 1156 |
1161 // Otherwise, try to resolve the variable. | 1157 // Otherwise, try to resolve the variable. |
1162 BindingKind binding_kind; | 1158 BindingKind binding_kind; |
1163 Variable* var = LookupRecursive(proxy, &binding_kind, factory); | 1159 Variable* var = LookupRecursive(proxy, &binding_kind, factory); |
| 1160 |
| 1161 #ifdef DEBUG |
| 1162 if (info->script_is_native()) { |
| 1163 // To avoid polluting the global object in native scripts |
| 1164 // - Variables must not be allocated to the global scope. |
| 1165 CHECK_NOT_NULL(outer_scope()); |
| 1166 // - Variables must be bound locally or unallocated. |
| 1167 CHECK_EQ(BOUND, binding_kind); |
| 1168 VariableLocation location = var->location(); |
| 1169 CHECK(location == VariableLocation::LOCAL || |
| 1170 location == VariableLocation::CONTEXT || |
| 1171 location == VariableLocation::PARAMETER || |
| 1172 location == VariableLocation::UNALLOCATED); |
| 1173 } |
| 1174 #endif |
| 1175 |
1164 switch (binding_kind) { | 1176 switch (binding_kind) { |
1165 case BOUND: | 1177 case BOUND: |
1166 // We found a variable binding. | 1178 // We found a variable binding. |
1167 if (is_strong(language_mode())) { | 1179 if (is_strong(language_mode())) { |
1168 if (!CheckStrongModeDeclaration(proxy, var)) return false; | 1180 if (!CheckStrongModeDeclaration(proxy, var)) return false; |
1169 } | 1181 } |
1170 break; | 1182 break; |
1171 | 1183 |
1172 case BOUND_EVAL_SHADOWED: | 1184 case BOUND_EVAL_SHADOWED: |
1173 // We either found a variable binding that might be shadowed by eval or | 1185 // We either found a variable binding that might be shadowed by eval or |
(...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1665 function_ != NULL && function_->proxy()->var()->IsContextSlot(); | 1677 function_ != NULL && function_->proxy()->var()->IsContextSlot(); |
1666 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() - | 1678 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() - |
1667 (is_function_var_in_context ? 1 : 0); | 1679 (is_function_var_in_context ? 1 : 0); |
1668 } | 1680 } |
1669 | 1681 |
1670 | 1682 |
1671 int Scope::ContextGlobalCount() const { return num_global_slots(); } | 1683 int Scope::ContextGlobalCount() const { return num_global_slots(); } |
1672 | 1684 |
1673 } // namespace internal | 1685 } // namespace internal |
1674 } // namespace v8 | 1686 } // namespace v8 |
OLD | NEW |