Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(109)

Side by Side Diff: src/scopes.cc

Issue 974213002: Extract ParseInfo from CompilationInfo. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/scopes.h ('k') | src/serialize.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/scopes.h"
8
9 #include "src/accessors.h" 7 #include "src/accessors.h"
10 #include "src/bootstrapper.h" 8 #include "src/bootstrapper.h"
11 #include "src/compiler.h"
12 #include "src/messages.h" 9 #include "src/messages.h"
10 #include "src/parser.h"
13 #include "src/scopeinfo.h" 11 #include "src/scopeinfo.h"
12 #include "src/scopes.h"
14 13
15 namespace v8 { 14 namespace v8 {
16 namespace internal { 15 namespace internal {
17 16
18 // ---------------------------------------------------------------------------- 17 // ----------------------------------------------------------------------------
19 // Implementation of LocalsMap 18 // Implementation of LocalsMap
20 // 19 //
21 // Note: We are storing the handle locations as key values in the hash map. 20 // Note: We are storing the handle locations as key values in the hash map.
22 // When inserting a new variable via Declare(), we rely on the fact that 21 // When inserting a new variable via Declare(), we rely on the fact that
23 // the handle location remains alive for the duration of that variable 22 // the handle location remains alive for the duration of that variable
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 } 240 }
242 context = context->previous(); 241 context = context->previous();
243 } 242 }
244 243
245 script_scope->AddInnerScope(current_scope); 244 script_scope->AddInnerScope(current_scope);
246 script_scope->PropagateScopeInfo(false); 245 script_scope->PropagateScopeInfo(false);
247 return (innermost_scope == NULL) ? script_scope : innermost_scope; 246 return (innermost_scope == NULL) ? script_scope : innermost_scope;
248 } 247 }
249 248
250 249
251 bool Scope::Analyze(CompilationInfo* info) { 250 bool Scope::Analyze(ParseInfo* info) {
252 DCHECK(info->function() != NULL); 251 DCHECK(info->function() != NULL);
252 DCHECK(info->scope() == NULL);
253 Scope* scope = info->function()->scope(); 253 Scope* scope = info->function()->scope();
254 Scope* top = scope; 254 Scope* top = scope;
255 255
256 // Traverse the scope tree up to the first unresolved scope or the global 256 // Traverse the scope tree up to the first unresolved scope or the global
257 // scope and start scope resolution and variable allocation from that scope. 257 // scope and start scope resolution and variable allocation from that scope.
258 while (!top->is_script_scope() && 258 while (!top->is_script_scope() &&
259 !top->outer_scope()->already_resolved()) { 259 !top->outer_scope()->already_resolved()) {
260 top = top->outer_scope(); 260 top = top->outer_scope();
261 } 261 }
262 262
263 // Allocate the variables. 263 // Allocate the variables.
264 { 264 {
265 AstNodeFactory ast_node_factory(info->ast_value_factory()); 265 AstNodeFactory ast_node_factory(info->ast_value_factory());
266 if (!top->AllocateVariables(info, &ast_node_factory)) { 266 if (!top->AllocateVariables(info, &ast_node_factory)) {
267 DCHECK(top->pending_error_handler_.has_pending_error()); 267 DCHECK(top->pending_error_handler_.has_pending_error());
268 top->pending_error_handler_.ThrowPendingError(info->isolate(), 268 top->pending_error_handler_.ThrowPendingError(info->isolate(),
269 info->script()); 269 info->script());
270 return false; 270 return false;
271 } 271 }
272 } 272 }
273 273
274 #ifdef DEBUG 274 #ifdef DEBUG
275 if (info->isolate()->bootstrapper()->IsActive() 275 if (info->isolate()->bootstrapper()->IsActive()
276 ? FLAG_print_builtin_scopes 276 ? FLAG_print_builtin_scopes
277 : FLAG_print_scopes) { 277 : FLAG_print_scopes) {
278 scope->Print(); 278 scope->Print();
279 } 279 }
280 #endif 280 #endif
281 281
282 info->PrepareForCompilation(scope); 282 info->set_scope(scope);
283 return true; 283 return true;
284 } 284 }
285 285
286 286
287 void Scope::Initialize(bool subclass_constructor) { 287 void Scope::Initialize(bool subclass_constructor) {
288 DCHECK(!already_resolved()); 288 DCHECK(!already_resolved());
289 289
290 // Add this scope as a new inner scope of the outer scope. 290 // Add this scope as a new inner scope of the outer scope.
291 if (outer_scope_ != NULL) { 291 if (outer_scope_ != NULL) {
292 outer_scope_->inner_scopes_.Add(this, zone()); 292 outer_scope_->inner_scopes_.Add(this, zone());
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 Variable* var = vars[i].var(); 632 Variable* var = vars[i].var();
633 if (var->IsStackLocal()) { 633 if (var->IsStackLocal()) {
634 stack_locals->Add(var, zone()); 634 stack_locals->Add(var, zone());
635 } else if (var->IsContextSlot()) { 635 } else if (var->IsContextSlot()) {
636 context_locals->Add(var, zone()); 636 context_locals->Add(var, zone());
637 } 637 }
638 } 638 }
639 } 639 }
640 640
641 641
642 bool Scope::AllocateVariables(CompilationInfo* info, AstNodeFactory* factory) { 642 bool Scope::AllocateVariables(ParseInfo* info, AstNodeFactory* factory) {
643 // 1) Propagate scope information. 643 // 1) Propagate scope information.
644 bool outer_scope_calls_sloppy_eval = false; 644 bool outer_scope_calls_sloppy_eval = false;
645 if (outer_scope_ != NULL) { 645 if (outer_scope_ != NULL) {
646 outer_scope_calls_sloppy_eval = 646 outer_scope_calls_sloppy_eval =
647 outer_scope_->outer_scope_calls_sloppy_eval() | 647 outer_scope_->outer_scope_calls_sloppy_eval() |
648 outer_scope_->calls_sloppy_eval(); 648 outer_scope_->calls_sloppy_eval();
649 } 649 }
650 PropagateScopeInfo(outer_scope_calls_sloppy_eval); 650 PropagateScopeInfo(outer_scope_calls_sloppy_eval);
651 651
652 // 2) Allocate module instances. 652 // 2) Allocate module instances.
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after
1048 if (*binding_kind == BOUND) { 1048 if (*binding_kind == BOUND) {
1049 *binding_kind = BOUND_EVAL_SHADOWED; 1049 *binding_kind = BOUND_EVAL_SHADOWED;
1050 } else if (*binding_kind == UNBOUND) { 1050 } else if (*binding_kind == UNBOUND) {
1051 *binding_kind = UNBOUND_EVAL_SHADOWED; 1051 *binding_kind = UNBOUND_EVAL_SHADOWED;
1052 } 1052 }
1053 } 1053 }
1054 return var; 1054 return var;
1055 } 1055 }
1056 1056
1057 1057
1058 bool Scope::ResolveVariable(CompilationInfo* info, VariableProxy* proxy, 1058 bool Scope::ResolveVariable(ParseInfo* info, VariableProxy* proxy,
1059 AstNodeFactory* factory) { 1059 AstNodeFactory* factory) {
1060 DCHECK(info->script_scope()->is_script_scope()); 1060 DCHECK(info->script_scope()->is_script_scope());
1061 1061
1062 // If the proxy is already resolved there's nothing to do 1062 // If the proxy is already resolved there's nothing to do
1063 // (functions and consts may be resolved by the parser). 1063 // (functions and consts may be resolved by the parser).
1064 if (proxy->is_resolved()) return true; 1064 if (proxy->is_resolved()) return true;
1065 1065
1066 // Otherwise, try to resolve the variable. 1066 // Otherwise, try to resolve the variable.
1067 BindingKind binding_kind; 1067 BindingKind binding_kind;
1068 Variable* var = LookupRecursive(proxy, &binding_kind, factory); 1068 Variable* var = LookupRecursive(proxy, &binding_kind, factory);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1130 1130
1131 DCHECK(var != NULL); 1131 DCHECK(var != NULL);
1132 if (proxy->is_assigned()) var->set_maybe_assigned(); 1132 if (proxy->is_assigned()) var->set_maybe_assigned();
1133 1133
1134 proxy->BindTo(var); 1134 proxy->BindTo(var);
1135 1135
1136 return true; 1136 return true;
1137 } 1137 }
1138 1138
1139 1139
1140 bool Scope::ResolveVariablesRecursively(CompilationInfo* info, 1140 bool Scope::ResolveVariablesRecursively(ParseInfo* info,
1141 AstNodeFactory* factory) { 1141 AstNodeFactory* factory) {
1142 DCHECK(info->script_scope()->is_script_scope()); 1142 DCHECK(info->script_scope()->is_script_scope());
1143 1143
1144 // Resolve unresolved variables for this scope. 1144 // Resolve unresolved variables for this scope.
1145 for (int i = 0; i < unresolved_.length(); i++) { 1145 for (int i = 0; i < unresolved_.length(); i++) {
1146 if (!ResolveVariable(info, unresolved_[i], factory)) return false; 1146 if (!ResolveVariable(info, unresolved_[i], factory)) return false;
1147 } 1147 }
1148 1148
1149 // Resolve unresolved variables for inner scopes. 1149 // Resolve unresolved variables for inner scopes.
1150 for (int i = 0; i < inner_scopes_.length(); i++) { 1150 for (int i = 0; i < inner_scopes_.length(); i++) {
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
1425 } 1425 }
1426 1426
1427 1427
1428 int Scope::ContextLocalCount() const { 1428 int Scope::ContextLocalCount() const {
1429 if (num_heap_slots() == 0) return 0; 1429 if (num_heap_slots() == 0) return 0;
1430 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - 1430 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS -
1431 (function_ != NULL && function_->proxy()->var()->IsContextSlot() ? 1 : 0); 1431 (function_ != NULL && function_->proxy()->var()->IsContextSlot() ? 1 : 0);
1432 } 1432 }
1433 1433
1434 } } // namespace v8::internal 1434 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/scopes.h ('k') | src/serialize.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698