| 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 17 matching lines...) Expand all Loading... |
| 28 #ifndef V8_SCOPES_H_ | 28 #ifndef V8_SCOPES_H_ |
| 29 #define V8_SCOPES_H_ | 29 #define V8_SCOPES_H_ |
| 30 | 30 |
| 31 #include "ast.h" | 31 #include "ast.h" |
| 32 #include "hashmap.h" | 32 #include "hashmap.h" |
| 33 | 33 |
| 34 namespace v8 { | 34 namespace v8 { |
| 35 namespace internal { | 35 namespace internal { |
| 36 | 36 |
| 37 | 37 |
| 38 // A hash map to support fast local variable declaration and lookup. | 38 // A hash map to support fast variable declaration and lookup. |
| 39 class LocalsMap: public HashMap { | 39 class VariableMap: public HashMap { |
| 40 public: | 40 public: |
| 41 LocalsMap(); | 41 VariableMap(); |
| 42 | 42 |
| 43 // Dummy constructor. This constructor doesn't set up the map | 43 // Dummy constructor. This constructor doesn't set up the map |
| 44 // properly so don't use it unless you have a good reason. | 44 // properly so don't use it unless you have a good reason. |
| 45 explicit LocalsMap(bool gotta_love_static_overloading); | 45 explicit VariableMap(bool gotta_love_static_overloading); |
| 46 | 46 |
| 47 virtual ~LocalsMap(); | 47 virtual ~VariableMap(); |
| 48 | 48 |
| 49 Variable* Declare(Scope* scope, Handle<String> name, Variable::Mode mode, | 49 Variable* Declare(Scope* scope, |
| 50 bool is_valid_LHS, Variable::Kind kind); | 50 Handle<String> name, |
| 51 Variable::Mode mode, |
| 52 bool is_valid_lhs, |
| 53 Variable::Kind kind); |
| 51 | 54 |
| 52 Variable* Lookup(Handle<String> name); | 55 Variable* Lookup(Handle<String> name); |
| 53 }; | 56 }; |
| 54 | 57 |
| 55 | 58 |
| 56 // The dynamic scope part holds hash maps for the variables that will | 59 // The dynamic scope part holds hash maps for the variables that will |
| 57 // be looked up dynamically from within eval and with scopes. The objects | 60 // be looked up dynamically from within eval and with scopes. The objects |
| 58 // are allocated on-demand from Scope::NonLocal to avoid wasting memory | 61 // are allocated on-demand from Scope::NonLocal to avoid wasting memory |
| 59 // and setup time for scopes that don't need them. | 62 // and setup time for scopes that don't need them. |
| 60 class DynamicScopePart : public ZoneObject { | 63 class DynamicScopePart : public ZoneObject { |
| 61 public: | 64 public: |
| 62 LocalsMap* GetMap(Variable::Mode mode) { | 65 VariableMap* GetMap(Variable::Mode mode) { |
| 63 int index = mode - Variable::DYNAMIC; | 66 int index = mode - Variable::DYNAMIC; |
| 64 ASSERT(index >= 0 && index < 3); | 67 ASSERT(index >= 0 && index < 3); |
| 65 return &maps_[index]; | 68 return &maps_[index]; |
| 66 } | 69 } |
| 67 | 70 |
| 68 private: | 71 private: |
| 69 LocalsMap maps_[3]; | 72 VariableMap maps_[3]; |
| 70 }; | 73 }; |
| 71 | 74 |
| 72 | 75 |
| 73 // Global invariants after AST construction: Each reference (i.e. identifier) | 76 // Global invariants after AST construction: Each reference (i.e. identifier) |
| 74 // to a JavaScript variable (including global properties) is represented by a | 77 // to a JavaScript variable (including global properties) is represented by a |
| 75 // VariableProxy node. Immediately after AST construction and before variable | 78 // VariableProxy node. Immediately after AST construction and before variable |
| 76 // allocation, most VariableProxy nodes are "unresolved", i.e. not bound to a | 79 // allocation, most VariableProxy nodes are "unresolved", i.e. not bound to a |
| 77 // corresponding variable (though some are bound during parse time). Variable | 80 // corresponding variable (though some are bound during parse time). Variable |
| 78 // allocation binds each unresolved VariableProxy to one Variable and assigns | 81 // allocation binds each unresolved VariableProxy to one Variable and assigns |
| 79 // a location. Note that many VariableProxy nodes may refer to the same Java- | 82 // a location. Note that many VariableProxy nodes may refer to the same Java- |
| (...skipping 18 matching lines...) Expand all Loading... |
| 98 // The scope name is only used for printing/debugging. | 101 // The scope name is only used for printing/debugging. |
| 99 void SetScopeName(Handle<String> scope_name) { scope_name_ = scope_name; } | 102 void SetScopeName(Handle<String> scope_name) { scope_name_ = scope_name; } |
| 100 | 103 |
| 101 void Initialize(bool inside_with); | 104 void Initialize(bool inside_with); |
| 102 | 105 |
| 103 | 106 |
| 104 // --------------------------------------------------------------------------- | 107 // --------------------------------------------------------------------------- |
| 105 // Declarations | 108 // Declarations |
| 106 | 109 |
| 107 // Lookup a variable in this scope. Returns the variable or NULL if not found. | 110 // Lookup a variable in this scope. Returns the variable or NULL if not found. |
| 108 virtual Variable* LookupLocal(Handle<String> name); | 111 virtual Variable* LocalLookup(Handle<String> name); |
| 109 | 112 |
| 110 // Lookup a variable in this scope or outer scopes. | 113 // Lookup a variable in this scope or outer scopes. |
| 111 // Returns the variable or NULL if not found. | 114 // Returns the variable or NULL if not found. |
| 112 virtual Variable* Lookup(Handle<String> name); | 115 virtual Variable* Lookup(Handle<String> name); |
| 113 | 116 |
| 114 // Declare the function variable for a function literal. This variable | 117 // Declare the function variable for a function literal. This variable |
| 115 // is in an intermediate scope between this function scope and the the | 118 // is in an intermediate scope between this function scope and the the |
| 116 // outer scope. Only possible for function scopes; at most one variable. | 119 // outer scope. Only possible for function scopes; at most one variable. |
| 117 Variable* DeclareFunctionVar(Handle<String> name); | 120 Variable* DeclareFunctionVar(Handle<String> name); |
| 118 | 121 |
| 119 // Declare a variable in this scope. If the variable has been | 122 // Declare a local variable in this scope. If the variable has been |
| 120 // declared before, the previously declared variable is returned. | 123 // declared before, the previously declared variable is returned. |
| 121 virtual Variable* Declare(Handle<String> name, Variable::Mode mode); | 124 virtual Variable* DeclareLocal(Handle<String> name, Variable::Mode mode); |
| 125 |
| 126 // Declare an implicit global variable in this scope which must be a |
| 127 // global scope. The variable was introduced (possibly from an inner |
| 128 // scope) by a reference to an unresolved variable with no intervening |
| 129 // with statements or eval calls. |
| 130 Variable* DeclareGlobal(Handle<String> name); |
| 122 | 131 |
| 123 // Add a parameter to the parameter list. The parameter must have been | 132 // Add a parameter to the parameter list. The parameter must have been |
| 124 // declared via Declare. The same parameter may occur more then once in | 133 // declared via Declare. The same parameter may occur more then once in |
| 125 // the parameter list; they must be added in source order, from left to | 134 // the parameter list; they must be added in source order, from left to |
| 126 // right. | 135 // right. |
| 127 void AddParameter(Variable* var); | 136 void AddParameter(Variable* var); |
| 128 | 137 |
| 129 // Create a new unresolved variable. | 138 // Create a new unresolved variable. |
| 130 virtual VariableProxy* NewUnresolved(Handle<String> name, bool inside_with); | 139 virtual VariableProxy* NewUnresolved(Handle<String> name, bool inside_with); |
| 131 | 140 |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 Scope* outer_scope_; // the immediately enclosing outer scope, or NULL | 290 Scope* outer_scope_; // the immediately enclosing outer scope, or NULL |
| 282 ZoneList<Scope*> inner_scopes_; // the immediately enclosed inner scopes | 291 ZoneList<Scope*> inner_scopes_; // the immediately enclosed inner scopes |
| 283 | 292 |
| 284 // The scope type. | 293 // The scope type. |
| 285 Type type_; | 294 Type type_; |
| 286 | 295 |
| 287 // Debugging support. | 296 // Debugging support. |
| 288 Handle<String> scope_name_; | 297 Handle<String> scope_name_; |
| 289 | 298 |
| 290 // The variables declared in this scope: | 299 // The variables declared in this scope: |
| 291 // all user-declared variables (incl. parameters) | 300 // |
| 292 LocalsMap locals_; | 301 // All user-declared variables (incl. parameters). For global scopes |
| 293 // compiler-allocated (user-invisible) temporaries | 302 // variables may be implicitly 'declared' by being used (possibly in |
| 303 // an inner scope) with no intervening with statements or eval calls. |
| 304 VariableMap variables_; |
| 305 // Compiler-allocated (user-invisible) temporaries. |
| 294 ZoneList<Variable*> temps_; | 306 ZoneList<Variable*> temps_; |
| 295 // parameter list in source order | 307 // Parameter list in source order. |
| 296 ZoneList<Variable*> params_; | 308 ZoneList<Variable*> params_; |
| 297 // variables that must be looked up dynamically | 309 // Variables that must be looked up dynamically. |
| 298 DynamicScopePart* dynamics_; | 310 DynamicScopePart* dynamics_; |
| 299 // unresolved variables referred to from this scope | 311 // Unresolved variables referred to from this scope. |
| 300 ZoneList<VariableProxy*> unresolved_; | 312 ZoneList<VariableProxy*> unresolved_; |
| 301 // declarations | 313 // Declarations. |
| 302 ZoneList<Declaration*> decls_; | 314 ZoneList<Declaration*> decls_; |
| 303 // convenience variable | 315 // Convenience variable. |
| 304 VariableProxy* receiver_; | 316 VariableProxy* receiver_; |
| 305 // function variable, if any; function scopes only | 317 // Function variable, if any; function scopes only. |
| 306 Variable* function_; | 318 Variable* function_; |
| 307 // convenience variable; function scopes only | 319 // Convenience variable; function scopes only. |
| 308 VariableProxy* arguments_; | 320 VariableProxy* arguments_; |
| 309 // convenience variable; function scopes only | 321 // Convenience variable; function scopes only. |
| 310 VariableProxy* arguments_shadow_; | 322 VariableProxy* arguments_shadow_; |
| 311 | 323 |
| 312 // Illegal redeclaration. | 324 // Illegal redeclaration. |
| 313 Expression* illegal_redecl_; | 325 Expression* illegal_redecl_; |
| 314 | 326 |
| 315 // Scope-specific information. | 327 // Scope-specific information. |
| 316 bool scope_inside_with_; // this scope is inside a 'with' of some outer scope | 328 bool scope_inside_with_; // this scope is inside a 'with' of some outer scope |
| 317 bool scope_contains_with_; // this scope contains a 'with' statement | 329 bool scope_contains_with_; // this scope contains a 'with' statement |
| 318 bool scope_calls_eval_; // this scope contains an 'eval' call | 330 bool scope_calls_eval_; // this scope contains an 'eval' call |
| 319 | 331 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 374 virtual VariableProxy* NewUnresolved(Handle<String> name, bool inside_with) { | 386 virtual VariableProxy* NewUnresolved(Handle<String> name, bool inside_with) { |
| 375 return NULL; | 387 return NULL; |
| 376 } | 388 } |
| 377 virtual VariableProxy* NewTemporary(Handle<String> name) { return NULL; } | 389 virtual VariableProxy* NewTemporary(Handle<String> name) { return NULL; } |
| 378 }; | 390 }; |
| 379 | 391 |
| 380 | 392 |
| 381 } } // namespace v8::internal | 393 } } // namespace v8::internal |
| 382 | 394 |
| 383 #endif // V8_SCOPES_H_ | 395 #endif // V8_SCOPES_H_ |
| OLD | NEW |