| 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 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 // The AST refers to variables via VariableProxies - placeholders for the actual | 106 // The AST refers to variables via VariableProxies - placeholders for the actual |
| 107 // variables. Variables themselves are never directly referred to from the AST, | 107 // variables. Variables themselves are never directly referred to from the AST, |
| 108 // they are maintained by scopes, and referred to from VariableProxies and Slots | 108 // they are maintained by scopes, and referred to from VariableProxies and Slots |
| 109 // after binding and variable allocation. | 109 // after binding and variable allocation. |
| 110 | 110 |
| 111 class Variable: public ZoneObject { | 111 class Variable: public ZoneObject { |
| 112 public: | 112 public: |
| 113 enum Mode { | 113 enum Mode { |
| 114 // User declared variables: | 114 // User declared variables: |
| 115 VAR, // declared via 'var', and 'function' declarations | 115 VAR, // declared via 'var', and 'function' declarations |
| 116 | |
| 117 CONST, // declared via 'const' declarations | 116 CONST, // declared via 'const' declarations |
| 118 | 117 |
| 119 // Variables introduced by the compiler: | 118 // Variables introduced by the compiler: |
| 120 DYNAMIC, // always require dynamic lookup (we don't know | 119 DYNAMIC, // always require dynamic lookup (we don't know the declaration) |
| 121 // the declaration) | 120 INTERNAL, // like VAR, but not user-visible (may or may not be in a |
| 122 | 121 // context) |
| 123 DYNAMIC_GLOBAL, // requires dynamic lookup, but we know that the | 122 TEMPORARY // temporary variables (not user-visible), never in a context |
| 124 // variable is global unless it has been shadowed | |
| 125 // by an eval-introduced variable | |
| 126 | |
| 127 DYNAMIC_LOCAL, // requires dynamic lookup, but we know that the | |
| 128 // variable is local and where it is unless it | |
| 129 // has been shadowed by an eval-introduced | |
| 130 // variable | |
| 131 | |
| 132 INTERNAL, // like VAR, but not user-visible (may or may not | |
| 133 // be in a context) | |
| 134 | |
| 135 TEMPORARY // temporary variables (not user-visible), never | |
| 136 // in a context | |
| 137 }; | 123 }; |
| 138 | 124 |
| 139 // Printing support | 125 // Printing support |
| 140 static const char* Mode2String(Mode mode); | 126 static const char* Mode2String(Mode mode); |
| 141 | 127 |
| 142 // Type testing & conversion | 128 // Type testing & conversion |
| 143 Property* AsProperty(); | 129 Property* AsProperty(); |
| 144 Variable* AsVariable(); | 130 Variable* AsVariable(); |
| 145 bool IsValidLeftHandSide() { return is_valid_LHS_; } | 131 bool IsValidLeftHandSide() { return is_valid_LHS_; } |
| 146 | 132 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 157 bool is_accessed_from_inner_scope() const { | 143 bool is_accessed_from_inner_scope() const { |
| 158 return is_accessed_from_inner_scope_; | 144 return is_accessed_from_inner_scope_; |
| 159 } | 145 } |
| 160 UseCount* var_uses() { return &var_uses_; } | 146 UseCount* var_uses() { return &var_uses_; } |
| 161 UseCount* obj_uses() { return &obj_uses_; } | 147 UseCount* obj_uses() { return &obj_uses_; } |
| 162 | 148 |
| 163 bool IsVariable(Handle<String> n) { | 149 bool IsVariable(Handle<String> n) { |
| 164 return !is_this() && name().is_identical_to(n); | 150 return !is_this() && name().is_identical_to(n); |
| 165 } | 151 } |
| 166 | 152 |
| 167 bool is_dynamic() const { | |
| 168 return (mode_ == DYNAMIC || | |
| 169 mode_ == DYNAMIC_GLOBAL || | |
| 170 mode_ == DYNAMIC_LOCAL); | |
| 171 } | |
| 172 | |
| 173 bool is_global() const; | 153 bool is_global() const; |
| 174 bool is_this() const { return is_this_; } | 154 bool is_this() const { return is_this_; } |
| 175 | 155 |
| 176 Variable* local_if_not_shadowed() const { | |
| 177 ASSERT(mode_ == DYNAMIC_LOCAL && local_if_not_shadowed_ != NULL); | |
| 178 return local_if_not_shadowed_; | |
| 179 } | |
| 180 | |
| 181 void set_local_if_not_shadowed(Variable* local) { | |
| 182 local_if_not_shadowed_ = local; | |
| 183 } | |
| 184 | |
| 185 Expression* rewrite() const { return rewrite_; } | 156 Expression* rewrite() const { return rewrite_; } |
| 186 Slot* slot() const; | 157 Slot* slot() const; |
| 187 | 158 |
| 188 StaticType* type() { return &type_; } | 159 StaticType* type() { return &type_; } |
| 189 | 160 |
| 190 private: | 161 private: |
| 191 Variable(Scope* scope, Handle<String> name, Mode mode, bool is_valid_LHS, | 162 Variable(Scope* scope, Handle<String> name, Mode mode, bool is_valid_LHS, |
| 192 bool is_this); | 163 bool is_this); |
| 193 | 164 |
| 194 Scope* scope_; | 165 Scope* scope_; |
| 195 Handle<String> name_; | 166 Handle<String> name_; |
| 196 Mode mode_; | 167 Mode mode_; |
| 197 bool is_valid_LHS_; | 168 bool is_valid_LHS_; |
| 198 bool is_this_; | 169 bool is_this_; |
| 199 | 170 |
| 200 Variable* local_if_not_shadowed_; | |
| 201 | |
| 202 // Usage info. | 171 // Usage info. |
| 203 bool is_accessed_from_inner_scope_; // set by variable resolver | 172 bool is_accessed_from_inner_scope_; // set by variable resolver |
| 204 UseCount var_uses_; // uses of the variable value | 173 UseCount var_uses_; // uses of the variable value |
| 205 UseCount obj_uses_; // uses of the object the variable points to | 174 UseCount obj_uses_; // uses of the object the variable points to |
| 206 | 175 |
| 207 // Static type information | 176 // Static type information |
| 208 StaticType type_; | 177 StaticType type_; |
| 209 | 178 |
| 210 // Code generation. | 179 // Code generation. |
| 211 // rewrite_ is usually a Slot or a Property, but maybe any expression. | 180 // rewrite_ is usually a Slot or a Property, but maybe any expression. |
| 212 Expression* rewrite_; | 181 Expression* rewrite_; |
| 213 | 182 |
| 214 friend class VariableProxy; | 183 friend class VariableProxy; |
| 215 friend class Scope; | 184 friend class Scope; |
| 216 friend class LocalsMap; | 185 friend class LocalsMap; |
| 217 friend class AstBuildingParser; | 186 friend class AstBuildingParser; |
| 218 }; | 187 }; |
| 219 | 188 |
| 220 | 189 |
| 221 } } // namespace v8::internal | 190 } } // namespace v8::internal |
| 222 | 191 |
| 223 #endif // V8_VARIABLES_H_ | 192 #endif // V8_VARIABLES_H_ |
| OLD | NEW |