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

Side by Side Diff: src/ast/scopes.cc

Issue 2158393002: Make the Scope constructors less reliant on SetDefaults to magically set flags (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Reupload Created 4 years, 5 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/ast/scopes.h ('k') | no next file » | 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/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 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 Vector* delegates = static_cast<Vector*>(p->value); 77 Vector* delegates = static_cast<Vector*>(p->value);
78 delegates->push_back(stmt); 78 delegates->push_back(stmt);
79 } 79 }
80 80
81 81
82 // ---------------------------------------------------------------------------- 82 // ----------------------------------------------------------------------------
83 // Implementation of Scope 83 // Implementation of Scope
84 84
85 Scope::Scope(Zone* zone, Scope* outer_scope, ScopeType scope_type, 85 Scope::Scope(Zone* zone, Scope* outer_scope, ScopeType scope_type,
86 FunctionKind function_kind) 86 FunctionKind function_kind)
87 : inner_scopes_(4, zone), 87 : outer_scope_(outer_scope),
88 inner_scopes_(4, zone),
89 scope_type_(scope_type),
90 function_kind_(function_kind),
88 variables_(zone), 91 variables_(zone),
89 temps_(4, zone), 92 temps_(4, zone),
90 params_(4, zone), 93 params_(4, zone),
91 unresolved_(nullptr),
92 decls_(4, zone), 94 decls_(4, zone),
93 module_descriptor_(scope_type == MODULE_SCOPE ? new (zone) 95 module_descriptor_(scope_type == MODULE_SCOPE ? new (zone)
94 ModuleDescriptor(zone) 96 ModuleDescriptor(zone)
95 : NULL), 97 : NULL),
96 sloppy_block_function_map_(zone), 98 sloppy_block_function_map_(zone),
97 already_resolved_(false), 99 already_resolved_(false) {
98 zone_(zone) { 100 SetDefaults();
99 SetDefaults(scope_type, outer_scope, Handle<ScopeInfo>::null(), 101 if (outer_scope != nullptr) {
100 function_kind); 102 asm_function_ = outer_scope_->asm_module_;
103 // Inherit the language mode from the parent scope unless we're a module
104 // scope.
105 if (!is_module_scope()) language_mode_ = outer_scope->language_mode_;
106 force_context_allocation_ =
107 !is_function_scope() && outer_scope->has_forced_context_allocation();
108 }
109
101 // The outermost scope must be a script scope. 110 // The outermost scope must be a script scope.
102 DCHECK(scope_type == SCRIPT_SCOPE || outer_scope != NULL); 111 DCHECK(scope_type == SCRIPT_SCOPE || outer_scope != nullptr);
103 } 112 }
104 113
105 Scope::Scope(Zone* zone, Scope* inner_scope, ScopeType scope_type, 114 Scope::Scope(Zone* zone, Scope* inner_scope, ScopeType scope_type,
106 Handle<ScopeInfo> scope_info) 115 Handle<ScopeInfo> scope_info)
107 : inner_scopes_(4, zone), 116 : outer_scope_(nullptr),
117 inner_scopes_(4, zone),
118 scope_type_(scope_type),
119 function_kind_(scope_info.is_null() ? kNormalFunction
120 : scope_info->function_kind()),
108 variables_(zone), 121 variables_(zone),
109 temps_(4, zone), 122 temps_(4, zone),
110 params_(4, zone), 123 params_(4, zone),
111 unresolved_(nullptr),
112 decls_(4, zone), 124 decls_(4, zone),
113 module_descriptor_(NULL), 125 module_descriptor_(nullptr),
114 sloppy_block_function_map_(zone), 126 sloppy_block_function_map_(zone),
115 already_resolved_(true), 127 already_resolved_(true),
116 zone_(zone) { 128 scope_info_(scope_info) {
117 SetDefaults(scope_type, NULL, scope_info); 129 SetDefaults();
118 if (!scope_info.is_null()) { 130 if (!scope_info.is_null()) {
131 scope_calls_eval_ = scope_info->CallsEval();
132 language_mode_ = scope_info->language_mode();
133 is_declaration_scope_ = scope_info->is_declaration_scope();
119 num_heap_slots_ = scope_info_->ContextLength(); 134 num_heap_slots_ = scope_info_->ContextLength();
120 } 135 }
121 // Ensure at least MIN_CONTEXT_SLOTS to indicate a materialized context. 136 // Ensure at least MIN_CONTEXT_SLOTS to indicate a materialized context.
122 num_heap_slots_ = Max(num_heap_slots_, 137 num_heap_slots_ = Max(num_heap_slots_,
123 static_cast<int>(Context::MIN_CONTEXT_SLOTS)); 138 static_cast<int>(Context::MIN_CONTEXT_SLOTS));
124 AddInnerScope(inner_scope); 139 AddInnerScope(inner_scope);
125 } 140 }
126 141
127 Scope::Scope(Zone* zone, Scope* inner_scope, 142 Scope::Scope(Zone* zone, Scope* inner_scope,
128 const AstRawString* catch_variable_name) 143 const AstRawString* catch_variable_name)
129 : inner_scopes_(1, zone), 144 : outer_scope_(nullptr),
145 inner_scopes_(1, zone),
146 scope_type_(CATCH_SCOPE),
147 function_kind_(kNormalFunction),
130 variables_(zone), 148 variables_(zone),
131 temps_(0, zone), 149 temps_(0, zone),
132 params_(0, zone), 150 params_(0, zone),
133 unresolved_(nullptr),
134 decls_(0, zone), 151 decls_(0, zone),
135 module_descriptor_(NULL), 152 module_descriptor_(nullptr),
136 sloppy_block_function_map_(zone), 153 sloppy_block_function_map_(zone),
137 already_resolved_(true), 154 already_resolved_(true) {
138 zone_(zone) { 155 SetDefaults();
139 SetDefaults(CATCH_SCOPE, NULL, Handle<ScopeInfo>::null());
140 AddInnerScope(inner_scope); 156 AddInnerScope(inner_scope);
141 ++num_var_; 157 ++num_var_;
142 num_heap_slots_ = Context::MIN_CONTEXT_SLOTS; 158 num_heap_slots_ = Context::MIN_CONTEXT_SLOTS;
143 Variable* variable = variables_.Declare(this, 159 Variable* variable = variables_.Declare(this,
144 catch_variable_name, 160 catch_variable_name,
145 VAR, 161 VAR,
146 Variable::NORMAL, 162 Variable::NORMAL,
147 kCreatedInitialized); 163 kCreatedInitialized);
148 AllocateHeapSlot(variable); 164 AllocateHeapSlot(variable);
149 } 165 }
150 166
151 167 void Scope::SetDefaults() {
152 void Scope::SetDefaults(ScopeType scope_type, Scope* outer_scope,
153 Handle<ScopeInfo> scope_info,
154 FunctionKind function_kind) {
155 outer_scope_ = outer_scope;
156 scope_type_ = scope_type;
157 is_declaration_scope_ = 168 is_declaration_scope_ =
158 is_eval_scope() || is_function_scope() || 169 is_eval_scope() || is_function_scope() ||
159 is_module_scope() || is_script_scope(); 170 is_module_scope() || is_script_scope();
160 function_kind_ = function_kind; 171 unresolved_ = nullptr;
161 scope_name_ = nullptr; 172 scope_name_ = nullptr;
162 dynamics_ = nullptr; 173 dynamics_ = nullptr;
163 receiver_ = nullptr; 174 receiver_ = nullptr;
164 new_target_ = nullptr; 175 new_target_ = nullptr;
165 function_ = nullptr; 176 function_ = nullptr;
166 arguments_ = nullptr; 177 arguments_ = nullptr;
167 this_function_ = nullptr; 178 this_function_ = nullptr;
168 scope_inside_with_ = false; 179 scope_inside_with_ = false;
169 scope_calls_eval_ = false; 180 scope_calls_eval_ = false;
170 scope_uses_arguments_ = false; 181 scope_uses_arguments_ = false;
171 scope_uses_super_property_ = false; 182 scope_uses_super_property_ = false;
172 asm_module_ = false; 183 asm_module_ = false;
173 asm_function_ = outer_scope != NULL && outer_scope->asm_module_; 184 asm_function_ = false;
174 // Inherit the language mode from the parent scope. 185 language_mode_ = is_module_scope() ? STRICT : SLOPPY;
175 language_mode_ =
176 is_module_scope()
177 ? STRICT
178 : (outer_scope != NULL ? outer_scope->language_mode_ : SLOPPY);
179 outer_scope_calls_sloppy_eval_ = false; 186 outer_scope_calls_sloppy_eval_ = false;
180 inner_scope_calls_eval_ = false; 187 inner_scope_calls_eval_ = false;
181 scope_nonlinear_ = false; 188 scope_nonlinear_ = false;
182 force_eager_compilation_ = false; 189 force_eager_compilation_ = false;
183 force_context_allocation_ = (outer_scope != NULL && !is_function_scope()) 190 force_context_allocation_ = false;
184 ? outer_scope->has_forced_context_allocation() : false;
185 num_var_ = 0; 191 num_var_ = 0;
186 num_stack_slots_ = 0; 192 num_stack_slots_ = 0;
187 num_heap_slots_ = 0; 193 num_heap_slots_ = 0;
188 num_global_slots_ = 0; 194 num_global_slots_ = 0;
189 arity_ = 0; 195 arity_ = 0;
190 has_simple_parameters_ = true; 196 has_simple_parameters_ = true;
191 rest_parameter_ = NULL; 197 rest_parameter_ = NULL;
192 rest_index_ = -1; 198 rest_index_ = -1;
193 scope_info_ = scope_info;
194 start_position_ = kNoSourcePosition; 199 start_position_ = kNoSourcePosition;
195 end_position_ = kNoSourcePosition; 200 end_position_ = kNoSourcePosition;
196 is_hidden_ = false; 201 is_hidden_ = false;
197 if (!scope_info.is_null()) {
198 scope_calls_eval_ = scope_info->CallsEval();
199 language_mode_ = scope_info->language_mode();
200 is_declaration_scope_ = scope_info->is_declaration_scope();
201 function_kind_ = scope_info->function_kind();
202 }
203 } 202 }
204 203
205 Scope* Scope::DeserializeScopeChain(Isolate* isolate, Zone* zone, 204 Scope* Scope::DeserializeScopeChain(Isolate* isolate, Zone* zone,
206 Context* context, Scope* script_scope, 205 Context* context, Scope* script_scope,
207 AstValueFactory* ast_value_factory) { 206 AstValueFactory* ast_value_factory) {
208 // Reconstruct the outer scope chain from a closure's context chain. 207 // Reconstruct the outer scope chain from a closure's context chain.
209 Scope* current_scope = NULL; 208 Scope* current_scope = NULL;
210 Scope* innermost_scope = NULL; 209 Scope* innermost_scope = NULL;
211 while (!context->IsNativeContext()) { 210 while (!context->IsNativeContext()) {
212 if (context->IsWithContext() || context->IsDebugEvaluateContext()) { 211 if (context->IsWithContext() || context->IsDebugEvaluateContext()) {
(...skipping 1333 matching lines...) Expand 10 before | Expand all | Expand 10 after
1546 function_ != NULL && function_->proxy()->var()->IsContextSlot(); 1545 function_ != NULL && function_->proxy()->var()->IsContextSlot();
1547 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() - 1546 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() -
1548 (is_function_var_in_context ? 1 : 0); 1547 (is_function_var_in_context ? 1 : 0);
1549 } 1548 }
1550 1549
1551 1550
1552 int Scope::ContextGlobalCount() const { return num_global_slots(); } 1551 int Scope::ContextGlobalCount() const { return num_global_slots(); }
1553 1552
1554 } // namespace internal 1553 } // namespace internal
1555 } // namespace v8 1554 } // namespace v8
OLDNEW
« no previous file with comments | « src/ast/scopes.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698