Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 70 // A named slot in a heap context. name() is the variable name in the | 70 // A named slot in a heap context. name() is the variable name in the |
| 71 // context object on the heap, with lookup starting at the current | 71 // context object on the heap, with lookup starting at the current |
| 72 // context. index() is invalid. | 72 // context. index() is invalid. |
| 73 LOOKUP | 73 LOOKUP |
| 74 }; | 74 }; |
| 75 | 75 |
| 76 Variable(Scope* scope, | 76 Variable(Scope* scope, |
| 77 Handle<String> name, | 77 Handle<String> name, |
| 78 VariableMode mode, | 78 VariableMode mode, |
| 79 bool is_valid_lhs, | 79 bool is_valid_lhs, |
| 80 Kind kind); | 80 Kind kind, |
| 81 InitializationFlag initialization_flag_); | |
|
Jakob Kummerow
2011/10/31 12:44:34
nit: no trailing underscore
Steven
2011/10/31 14:28:29
Done.
| |
| 81 | 82 |
| 82 // Printing support | 83 // Printing support |
| 83 static const char* Mode2String(VariableMode mode); | 84 static const char* Mode2String(VariableMode mode); |
| 84 | 85 |
| 85 bool IsValidLeftHandSide() { return is_valid_LHS_; } | 86 bool IsValidLeftHandSide() { return is_valid_LHS_; } |
| 86 | 87 |
| 87 // The source code for an eval() call may refer to a variable that is | 88 // The source code for an eval() call may refer to a variable that is |
| 88 // in an outer scope about which we don't know anything (it may not | 89 // in an outer scope about which we don't know anything (it may not |
| 89 // be the global scope). scope() is NULL in that case. Currently the | 90 // be the global scope). scope() is NULL in that case. Currently the |
| 90 // scope is only used to follow the context chain length. | 91 // scope is only used to follow the context chain length. |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 116 bool is_dynamic() const { | 117 bool is_dynamic() const { |
| 117 return (mode_ == DYNAMIC || | 118 return (mode_ == DYNAMIC || |
| 118 mode_ == DYNAMIC_GLOBAL || | 119 mode_ == DYNAMIC_GLOBAL || |
| 119 mode_ == DYNAMIC_LOCAL); | 120 mode_ == DYNAMIC_LOCAL); |
| 120 } | 121 } |
| 121 bool is_const_mode() const { | 122 bool is_const_mode() const { |
| 122 return (mode_ == CONST || | 123 return (mode_ == CONST || |
| 123 mode_ == CONST_HARMONY); | 124 mode_ == CONST_HARMONY); |
| 124 } | 125 } |
| 125 bool binding_needs_init() const { | 126 bool binding_needs_init() const { |
| 126 return (mode_ == LET || | 127 return initialization_flag_ == NEEDS_INITIALIZATION; |
| 127 mode_ == CONST || | |
| 128 mode_ == CONST_HARMONY); | |
| 129 } | 128 } |
| 130 | 129 |
| 131 bool is_global() const; | 130 bool is_global() const; |
| 132 bool is_this() const { return kind_ == THIS; } | 131 bool is_this() const { return kind_ == THIS; } |
| 133 bool is_arguments() const { return kind_ == ARGUMENTS; } | 132 bool is_arguments() const { return kind_ == ARGUMENTS; } |
| 134 | 133 |
| 135 // True if the variable is named eval and not known to be shadowed. | 134 // True if the variable is named eval and not known to be shadowed. |
| 136 bool is_possibly_eval() const { | 135 bool is_possibly_eval() const { |
| 137 return IsVariable(FACTORY->eval_symbol()); | 136 return IsVariable(FACTORY->eval_symbol()); |
| 138 } | 137 } |
| 139 | 138 |
| 140 Variable* local_if_not_shadowed() const { | 139 Variable* local_if_not_shadowed() const { |
| 141 ASSERT(mode_ == DYNAMIC_LOCAL && local_if_not_shadowed_ != NULL); | 140 ASSERT(mode_ == DYNAMIC_LOCAL && local_if_not_shadowed_ != NULL); |
| 142 return local_if_not_shadowed_; | 141 return local_if_not_shadowed_; |
| 143 } | 142 } |
| 144 | 143 |
| 145 void set_local_if_not_shadowed(Variable* local) { | 144 void set_local_if_not_shadowed(Variable* local) { |
| 146 local_if_not_shadowed_ = local; | 145 local_if_not_shadowed_ = local; |
| 147 } | 146 } |
| 148 | 147 |
| 149 Location location() const { return location_; } | 148 Location location() const { return location_; } |
| 150 int index() const { return index_; } | 149 int index() const { return index_; } |
| 150 InitializationFlag initialization_flag() const { | |
| 151 return initialization_flag_; | |
| 152 } | |
| 151 | 153 |
| 152 void AllocateTo(Location location, int index) { | 154 void AllocateTo(Location location, int index) { |
| 153 location_ = location; | 155 location_ = location; |
| 154 index_ = index; | 156 index_ = index; |
| 155 } | 157 } |
| 156 | 158 |
| 157 private: | 159 private: |
| 158 Scope* scope_; | 160 Scope* scope_; |
| 159 Handle<String> name_; | 161 Handle<String> name_; |
| 160 VariableMode mode_; | 162 VariableMode mode_; |
| 161 Kind kind_; | 163 Kind kind_; |
| 162 Location location_; | 164 Location location_; |
| 163 int index_; | 165 int index_; |
| 164 | 166 |
| 165 // If this field is set, this variable references the stored locally bound | 167 // If this field is set, this variable references the stored locally bound |
| 166 // variable, but it might be shadowed by variable bindings introduced by | 168 // variable, but it might be shadowed by variable bindings introduced by |
| 167 // non-strict 'eval' calls between the reference scope (inclusive) and the | 169 // non-strict 'eval' calls between the reference scope (inclusive) and the |
| 168 // binding scope (exclusive). | 170 // binding scope (exclusive). |
| 169 Variable* local_if_not_shadowed_; | 171 Variable* local_if_not_shadowed_; |
| 170 | 172 |
| 171 // Valid as a LHS? (const and this are not valid LHS, for example) | 173 // Valid as a LHS? (const and this are not valid LHS, for example) |
| 172 bool is_valid_LHS_; | 174 bool is_valid_LHS_; |
| 173 | 175 |
| 174 // Usage info. | 176 // Usage info. |
| 175 bool is_accessed_from_inner_scope_; // set by variable resolver | 177 bool is_accessed_from_inner_scope_; // set by variable resolver |
| 176 bool is_used_; | 178 bool is_used_; |
| 179 InitializationFlag initialization_flag_; | |
| 177 }; | 180 }; |
| 178 | 181 |
| 179 | 182 |
| 180 } } // namespace v8::internal | 183 } } // namespace v8::internal |
| 181 | 184 |
| 182 #endif // V8_VARIABLES_H_ | 185 #endif // V8_VARIABLES_H_ |
| OLD | NEW |