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

Side by Side Diff: src/scopes.cc

Issue 6266007: Properly create variables to access outer arguments and function names. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fix line length Created 9 years, 11 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 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 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 params_(4), 147 params_(4),
148 unresolved_(16), 148 unresolved_(16),
149 decls_(4) { 149 decls_(4) {
150 ASSERT(scope_info != NULL); 150 ASSERT(scope_info != NULL);
151 SetDefaults(FUNCTION_SCOPE, inner_scope->outer_scope(), scope_info); 151 SetDefaults(FUNCTION_SCOPE, inner_scope->outer_scope(), scope_info);
152 ASSERT(resolved()); 152 ASSERT(resolved());
153 InsertAfterScope(inner_scope); 153 InsertAfterScope(inner_scope);
154 if (scope_info->HasHeapAllocatedLocals()) { 154 if (scope_info->HasHeapAllocatedLocals()) {
155 num_heap_slots_ = scope_info_->NumberOfContextSlots(); 155 num_heap_slots_ = scope_info_->NumberOfContextSlots();
156 } 156 }
157
158 // arguments shadow would be saved to the list of context slots
159 // only if inner scopes access some parameters. Prepare to
160 // this situation by allocating arguments_shadow_ object
161 // and thread access to this scope's parameters via arguments shadow.
Kevin Millikin (Chromium) 2011/01/19 07:39:57 Suggested rewording, something like: This scope's
antonm 2011/01/19 08:18:19 Done.
162 Variable::Mode mode;
163 int arguments_shadow_index =
164 scope_info_->ContextSlotIndex(Heap::arguments_shadow_symbol(), &mode);
165 if (arguments_shadow_index >= 0) {
166 ASSERT(mode == Variable::INTERNAL);
167 arguments_shadow_ = new Variable(this,
168 Factory::arguments_shadow_symbol(),
169 Variable::INTERNAL,
170 true,
171 Variable::ARGUMENTS);
172 arguments_shadow_->set_rewrite(
173 new Slot(arguments_shadow_, Slot::CONTEXT, arguments_shadow_index));
174 arguments_shadow_->set_is_used(true);
175 }
157 } 176 }
158 177
159 178
160 179
161 bool Scope::Analyze(CompilationInfo* info) { 180 bool Scope::Analyze(CompilationInfo* info) {
162 ASSERT(info->function() != NULL); 181 ASSERT(info->function() != NULL);
163 Scope* top = info->function()->scope(); 182 Scope* top = info->function()->scope();
164 183
165 // If we have a serialized scope info, reuse it. 184 // If we have a serialized scope info, reuse it.
166 if (!info->closure().is_null()) { 185 if (!info->closure().is_null()) {
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 251
233 252
234 Variable* Scope::LocalLookup(Handle<String> name) { 253 Variable* Scope::LocalLookup(Handle<String> name) {
235 Variable* result = variables_.Lookup(name); 254 Variable* result = variables_.Lookup(name);
236 if (result != NULL || !resolved()) { 255 if (result != NULL || !resolved()) {
237 return result; 256 return result;
238 } 257 }
239 // If the scope is resolved, we can find a variable in serialized scope info. 258 // If the scope is resolved, we can find a variable in serialized scope info.
240 259
241 // We should never lookup 'arguments' in this scope 260 // We should never lookup 'arguments' in this scope
242 // as it is impllicitly present in any scope. 261 // as it is impllicitly present in any scope.
Kevin Millikin (Chromium) 2011/01/19 07:39:57 Could you fix the spelling of "implicitly"?
antonm 2011/01/19 08:18:19 Done.
243 ASSERT(*name != *Factory::arguments_symbol()); 262 ASSERT(*name != *Factory::arguments_symbol());
244 263
245 // Check context slot lookup. 264 // Check context slot lookup.
246 Variable::Mode mode; 265 Variable::Mode mode;
247 int index = scope_info_->ContextSlotIndex(*name, &mode); 266 int index = scope_info_->ContextSlotIndex(*name, &mode);
248 if (index < 0) { 267 if (index >= 0) {
249 return NULL; 268 // Check that there is no local slot with the given name.
269 ASSERT(scope_info_->StackSlotIndex(*name) < 0);
Kevin Millikin (Chromium) 2011/01/19 07:39:57 This assert could be lifted higher (up to the prev
antonm 2011/01/19 08:18:19 Done.
270 Variable* var =
271 variables_.Declare(this, name, mode, true, Variable::NORMAL);
272 var->set_rewrite(new Slot(var, Slot::CONTEXT, index));
273 return var;
250 } 274 }
251 275
252 // Check that there is no local slot with the given name. 276 index = scope_info_->ParameterIndex(*name);
253 ASSERT(scope_info_->StackSlotIndex(*name) < 0); 277 if (index >= 0) {
254 Variable* var = variables_.Declare(this, name, mode, true, Variable::NORMAL); 278 // ".arguments" must be present in context slots.
255 var->set_rewrite(new Slot(var, Slot::CONTEXT, index)); 279 ASSERT(arguments_shadow_ != NULL);
256 return var; 280 // Check that there is no local slot with the given name.
281 ASSERT(scope_info_->StackSlotIndex(*name) < 0);
282 Variable* var =
283 variables_.Declare(this, name, Variable::VAR, true, Variable::NORMAL);
284 Property* rewrite =
285 new Property(new VariableProxy(arguments_shadow_),
286 new Literal(Handle<Object>(Smi::FromInt(index))),
Kevin Millikin (Chromium) 2011/01/19 07:39:57 Indentation is a bit off here.
antonm 2011/01/19 08:18:19 Done.
287 RelocInfo::kNoPosition,
288 Property::SYNTHETIC);
289 rewrite->set_is_arguments_access(true);
290 var->set_rewrite(rewrite);
291 return var;
292 }
293
294 index = scope_info_->FunctionContextSlotIndex(*name);
295 if (index >= 0) {
296 // Check that there is no local slot with the given name.
297 ASSERT(scope_info_->StackSlotIndex(*name) < 0);
298 Variable* var =
299 variables_.Declare(this, name, mode, true, Variable::NORMAL);
Kevin Millikin (Chromium) 2011/01/19 07:39:57 Will this be the right mode?
antonm 2011/01/19 08:18:19 Oops, thanks a lot for spotting this. Now passing
300 var->set_rewrite(new Slot(var, Slot::CONTEXT, index));
301 return var;
302 }
303
304 return NULL;
257 } 305 }
258 306
259 307
260 Variable* Scope::Lookup(Handle<String> name) { 308 Variable* Scope::Lookup(Handle<String> name) {
261 for (Scope* scope = this; 309 for (Scope* scope = this;
262 scope != NULL; 310 scope != NULL;
263 scope = scope->outer_scope()) { 311 scope = scope->outer_scope()) {
264 Variable* var = scope->LocalLookup(name); 312 Variable* var = scope->LocalLookup(name);
265 if (var != NULL) return var; 313 if (var != NULL) return var;
266 } 314 }
(...skipping 742 matching lines...) Expand 10 before | Expand all | Expand 10 after
1009 if (num_heap_slots_ == Context::MIN_CONTEXT_SLOTS && 1057 if (num_heap_slots_ == Context::MIN_CONTEXT_SLOTS &&
1010 !must_have_local_context) { 1058 !must_have_local_context) {
1011 num_heap_slots_ = 0; 1059 num_heap_slots_ = 0;
1012 } 1060 }
1013 1061
1014 // Allocation done. 1062 // Allocation done.
1015 ASSERT(num_heap_slots_ == 0 || num_heap_slots_ >= Context::MIN_CONTEXT_SLOTS); 1063 ASSERT(num_heap_slots_ == 0 || num_heap_slots_ >= Context::MIN_CONTEXT_SLOTS);
1016 } 1064 }
1017 1065
1018 } } // namespace v8::internal 1066 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698