| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 if (is_function_scope()) { | 177 if (is_function_scope()) { |
| 178 // Declare 'arguments' variable which exists in all functions. | 178 // Declare 'arguments' variable which exists in all functions. |
| 179 // Note that it may never be accessed, in which case it won't | 179 // Note that it may never be accessed, in which case it won't |
| 180 // be allocated during variable allocation. | 180 // be allocated during variable allocation. |
| 181 Declare(Factory::arguments_symbol(), Variable::VAR); | 181 Declare(Factory::arguments_symbol(), Variable::VAR); |
| 182 } | 182 } |
| 183 } | 183 } |
| 184 | 184 |
| 185 | 185 |
| 186 | 186 |
| 187 Variable* Scope::LookupLocal(Handle<String> name) { |
| 188 return locals_.Lookup(name); |
| 189 } |
| 190 |
| 191 |
| 187 Variable* Scope::Lookup(Handle<String> name) { | 192 Variable* Scope::Lookup(Handle<String> name) { |
| 188 return locals_.Lookup(name); | 193 for (Scope* scope = this; |
| 194 scope != NULL; |
| 195 scope = scope->outer_scope()) { |
| 196 Variable* var = scope->LookupLocal(name); |
| 197 if (var != NULL) return var; |
| 198 } |
| 199 return NULL; |
| 189 } | 200 } |
| 190 | 201 |
| 191 | 202 |
| 192 Variable* Scope::DeclareFunctionVar(Handle<String> name) { | 203 Variable* Scope::DeclareFunctionVar(Handle<String> name) { |
| 193 ASSERT(is_function_scope() && function_ == NULL); | 204 ASSERT(is_function_scope() && function_ == NULL); |
| 194 function_ = new Variable(this, name, Variable::CONST, true, false); | 205 function_ = new Variable(this, name, Variable::CONST, true, false); |
| 195 return function_; | 206 return function_; |
| 196 } | 207 } |
| 197 | 208 |
| 198 | 209 |
| 199 Variable* Scope::Declare(Handle<String> name, Variable::Mode mode) { | 210 Variable* Scope::Declare(Handle<String> name, Variable::Mode mode) { |
| 200 // DYNAMIC variables are introduces during variable allocation, | 211 // DYNAMIC variables are introduces during variable allocation, |
| 201 // INTERNAL variables are allocated explicitly, and TEMPORARY | 212 // INTERNAL variables are allocated explicitly, and TEMPORARY |
| 202 // variables are allocated via NewTemporary(). | 213 // variables are allocated via NewTemporary(). |
| 203 ASSERT(mode == Variable::VAR || mode == Variable::CONST); | 214 ASSERT(mode == Variable::VAR || mode == Variable::CONST); |
| 204 return locals_.Declare(this, name, mode, true, false); | 215 return locals_.Declare(this, name, mode, true, false); |
| 205 } | 216 } |
| 206 | 217 |
| 207 | 218 |
| 208 void Scope::AddParameter(Variable* var) { | 219 void Scope::AddParameter(Variable* var) { |
| 209 ASSERT(is_function_scope()); | 220 ASSERT(is_function_scope()); |
| 210 ASSERT(Lookup(var->name()) == var); | 221 ASSERT(LookupLocal(var->name()) == var); |
| 211 params_.Add(var); | 222 params_.Add(var); |
| 212 } | 223 } |
| 213 | 224 |
| 214 | 225 |
| 215 VariableProxy* Scope::NewUnresolved(Handle<String> name, bool inside_with) { | 226 VariableProxy* Scope::NewUnresolved(Handle<String> name, bool inside_with) { |
| 216 // Note that we must not share the unresolved variables with | 227 // Note that we must not share the unresolved variables with |
| 217 // the same name because they may be removed selectively via | 228 // the same name because they may be removed selectively via |
| 218 // RemoveUnresolved(). | 229 // RemoveUnresolved(). |
| 219 VariableProxy* proxy = new VariableProxy(name, false, inside_with); | 230 VariableProxy* proxy = new VariableProxy(name, false, inside_with); |
| 220 unresolved_.Add(proxy); | 231 unresolved_.Add(proxy); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 251 void Scope::SetIllegalRedeclaration(Expression* expression) { | 262 void Scope::SetIllegalRedeclaration(Expression* expression) { |
| 252 // Only set the illegal redeclaration expression the | 263 // Only set the illegal redeclaration expression the |
| 253 // first time the function is called. | 264 // first time the function is called. |
| 254 if (!HasIllegalRedeclaration()) { | 265 if (!HasIllegalRedeclaration()) { |
| 255 illegal_redecl_ = expression; | 266 illegal_redecl_ = expression; |
| 256 } | 267 } |
| 257 ASSERT(HasIllegalRedeclaration()); | 268 ASSERT(HasIllegalRedeclaration()); |
| 258 } | 269 } |
| 259 | 270 |
| 260 | 271 |
| 261 void Scope::VisitIllegalRedeclaration(Visitor* visitor) { | 272 void Scope::VisitIllegalRedeclaration(AstVisitor* visitor) { |
| 262 ASSERT(HasIllegalRedeclaration()); | 273 ASSERT(HasIllegalRedeclaration()); |
| 263 illegal_redecl_->Accept(visitor); | 274 illegal_redecl_->Accept(visitor); |
| 264 } | 275 } |
| 265 | 276 |
| 266 | 277 |
| 267 template<class Allocator> | 278 template<class Allocator> |
| 268 void Scope::CollectUsedVariables(List<Variable*, Allocator>* locals) { | 279 void Scope::CollectUsedVariables(List<Variable*, Allocator>* locals) { |
| 269 // Collect variables in this scope. | 280 // Collect variables in this scope. |
| 270 // Note that the function_ variable - if present - is not | 281 // Note that the function_ variable - if present - is not |
| 271 // collected here but handled separately in ScopeInfo | 282 // collected here but handled separately in ScopeInfo |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 // variable that is introduced dynamically via an 'eval' call or a 'with' | 517 // variable that is introduced dynamically via an 'eval' call or a 'with' |
| 507 // statement). | 518 // statement). |
| 508 Variable* Scope::LookupRecursive(Handle<String> name, bool inner_lookup) { | 519 Variable* Scope::LookupRecursive(Handle<String> name, bool inner_lookup) { |
| 509 // If we find a variable, but the current scope calls 'eval', the found | 520 // If we find a variable, but the current scope calls 'eval', the found |
| 510 // variable may not be the correct one (the 'eval' may introduce a | 521 // variable may not be the correct one (the 'eval' may introduce a |
| 511 // property with the same name). In that case, remember that the variable | 522 // property with the same name). In that case, remember that the variable |
| 512 // found is just a guess. | 523 // found is just a guess. |
| 513 bool guess = scope_calls_eval_; | 524 bool guess = scope_calls_eval_; |
| 514 | 525 |
| 515 // Try to find the variable in this scope. | 526 // Try to find the variable in this scope. |
| 516 Variable* var = Lookup(name); | 527 Variable* var = LookupLocal(name); |
| 517 | 528 |
| 518 if (var != NULL) { | 529 if (var != NULL) { |
| 519 // We found a variable. If this is not an inner lookup, we are done. | 530 // We found a variable. If this is not an inner lookup, we are done. |
| 520 // (Even if there is an 'eval' in this scope which introduces the | 531 // (Even if there is an 'eval' in this scope which introduces the |
| 521 // same variable again, the resulting variable remains the same. | 532 // same variable again, the resulting variable remains the same. |
| 522 // Note that enclosing 'with' statements are handled at the call site.) | 533 // Note that enclosing 'with' statements are handled at the call site.) |
| 523 if (!inner_lookup) | 534 if (!inner_lookup) |
| 524 return var; | 535 return var; |
| 525 | 536 |
| 526 } else { | 537 } else { |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 700 } | 711 } |
| 701 | 712 |
| 702 | 713 |
| 703 void Scope::AllocateHeapSlot(Variable* var) { | 714 void Scope::AllocateHeapSlot(Variable* var) { |
| 704 var->rewrite_ = new Slot(var, Slot::CONTEXT, num_heap_slots_++); | 715 var->rewrite_ = new Slot(var, Slot::CONTEXT, num_heap_slots_++); |
| 705 } | 716 } |
| 706 | 717 |
| 707 | 718 |
| 708 void Scope::AllocateParameterLocals() { | 719 void Scope::AllocateParameterLocals() { |
| 709 ASSERT(is_function_scope()); | 720 ASSERT(is_function_scope()); |
| 710 Variable* arguments = Lookup(Factory::arguments_symbol()); | 721 Variable* arguments = LookupLocal(Factory::arguments_symbol()); |
| 711 ASSERT(arguments != NULL); // functions have 'arguments' declared implicitly | 722 ASSERT(arguments != NULL); // functions have 'arguments' declared implicitly |
| 712 if (MustAllocate(arguments) && !HasArgumentsParameter()) { | 723 if (MustAllocate(arguments) && !HasArgumentsParameter()) { |
| 713 // 'arguments' is used. Unless there is also a parameter called | 724 // 'arguments' is used. Unless there is also a parameter called |
| 714 // 'arguments', we must be conservative and access all parameters via | 725 // 'arguments', we must be conservative and access all parameters via |
| 715 // the arguments object: The i'th parameter is rewritten into | 726 // the arguments object: The i'th parameter is rewritten into |
| 716 // '.arguments[i]' (*). If we have a parameter named 'arguments', a | 727 // '.arguments[i]' (*). If we have a parameter named 'arguments', a |
| 717 // (new) value is always assigned to it via the function | 728 // (new) value is always assigned to it via the function |
| 718 // invocation. Then 'arguments' denotes that specific parameter value | 729 // invocation. Then 'arguments' denotes that specific parameter value |
| 719 // and cannot be used to access the parameters, which is why we don't | 730 // and cannot be used to access the parameters, which is why we don't |
| 720 // need to rewrite in that case. | 731 // need to rewrite in that case. |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 886 if (num_heap_slots_ == Context::MIN_CONTEXT_SLOTS && | 897 if (num_heap_slots_ == Context::MIN_CONTEXT_SLOTS && |
| 887 !must_have_local_context) { | 898 !must_have_local_context) { |
| 888 num_heap_slots_ = 0; | 899 num_heap_slots_ = 0; |
| 889 } | 900 } |
| 890 | 901 |
| 891 // Allocation done. | 902 // Allocation done. |
| 892 ASSERT(num_heap_slots_ == 0 || num_heap_slots_ >= Context::MIN_CONTEXT_SLOTS); | 903 ASSERT(num_heap_slots_ == 0 || num_heap_slots_ >= Context::MIN_CONTEXT_SLOTS); |
| 893 } | 904 } |
| 894 | 905 |
| 895 } } // namespace v8::internal | 906 } } // namespace v8::internal |
| OLD | NEW |