| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_AST_VARIABLES_H_ | 5 #ifndef V8_AST_VARIABLES_H_ |
| 6 #define V8_AST_VARIABLES_H_ | 6 #define V8_AST_VARIABLES_H_ |
| 7 | 7 |
| 8 #include "src/ast/ast-value-factory.h" | 8 #include "src/ast/ast-value-factory.h" |
| 9 #include "src/zone.h" | 9 #include "src/zone.h" |
| 10 | 10 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 bool binding_needs_init() const { | 75 bool binding_needs_init() const { |
| 76 DCHECK(initialization_flag_ != kNeedsInitialization || | 76 DCHECK(initialization_flag_ != kNeedsInitialization || |
| 77 IsLexicalVariableMode(mode_)); | 77 IsLexicalVariableMode(mode_)); |
| 78 return initialization_flag_ == kNeedsInitialization; | 78 return initialization_flag_ == kNeedsInitialization; |
| 79 } | 79 } |
| 80 | 80 |
| 81 bool is_function() const { return kind_ == FUNCTION; } | 81 bool is_function() const { return kind_ == FUNCTION; } |
| 82 bool is_this() const { return kind_ == THIS; } | 82 bool is_this() const { return kind_ == THIS; } |
| 83 bool is_arguments() const { return kind_ == ARGUMENTS; } | 83 bool is_arguments() const { return kind_ == ARGUMENTS; } |
| 84 | 84 |
| 85 // True if the variable is named eval and not known to be shadowed. | |
| 86 bool is_possibly_eval(Isolate* isolate, | |
| 87 HandleDereferenceMode deref_mode = | |
| 88 HandleDereferenceMode::kAllowed) const { | |
| 89 // Note: it is safe to dereference isolate->factory()->eval_string() here | |
| 90 // regardless of |deref_mode| because it is a constant root and so will | |
| 91 // never be updated or moved. | |
| 92 return !is_this() && | |
| 93 name_is_identical_to(isolate->factory()->eval_string(), deref_mode); | |
| 94 } | |
| 95 | |
| 96 Variable* local_if_not_shadowed() const { | 85 Variable* local_if_not_shadowed() const { |
| 97 DCHECK(mode_ == DYNAMIC_LOCAL && local_if_not_shadowed_ != NULL); | 86 DCHECK(mode_ == DYNAMIC_LOCAL && local_if_not_shadowed_ != NULL); |
| 98 return local_if_not_shadowed_; | 87 return local_if_not_shadowed_; |
| 99 } | 88 } |
| 100 | 89 |
| 101 void set_local_if_not_shadowed(Variable* local) { | 90 void set_local_if_not_shadowed(Variable* local) { |
| 102 local_if_not_shadowed_ = local; | 91 local_if_not_shadowed_ = local; |
| 103 } | 92 } |
| 104 | 93 |
| 105 VariableLocation location() const { return location_; } | 94 VariableLocation location() const { return location_; } |
| 106 int index() const { return index_; } | 95 int index() const { return index_; } |
| 107 InitializationFlag initialization_flag() const { | 96 InitializationFlag initialization_flag() const { |
| 108 return initialization_flag_; | 97 return initialization_flag_; |
| 109 } | 98 } |
| 110 | 99 |
| 111 void AllocateTo(VariableLocation location, int index) { | 100 void AllocateTo(VariableLocation location, int index) { |
| 112 location_ = location; | 101 location_ = location; |
| 113 index_ = index; | 102 index_ = index; |
| 114 } | 103 } |
| 115 | 104 |
| 116 static int CompareIndex(Variable* const* v, Variable* const* w); | 105 static int CompareIndex(Variable* const* v, Variable* const* w); |
| 117 | 106 |
| 118 private: | 107 private: |
| 119 bool name_is_identical_to(Handle<Object> object, | |
| 120 HandleDereferenceMode deref_mode) const { | |
| 121 if (deref_mode == HandleDereferenceMode::kAllowed) { | |
| 122 return *name() == *object; | |
| 123 } else { | |
| 124 // If handle dereference isn't allowed use the handle address for | |
| 125 // identity. This depends on the variable name being internalized in a | |
| 126 // CanonicalHandleScope, so that all handles created during the | |
| 127 // internalization with identical values have identical locations, and any | |
| 128 // handles created which point to roots have the root handle's location. | |
| 129 return name().address() == object.address(); | |
| 130 } | |
| 131 } | |
| 132 | |
| 133 Scope* scope_; | 108 Scope* scope_; |
| 134 const AstRawString* name_; | 109 const AstRawString* name_; |
| 135 VariableMode mode_; | 110 VariableMode mode_; |
| 136 Kind kind_; | 111 Kind kind_; |
| 137 VariableLocation location_; | 112 VariableLocation location_; |
| 138 int index_; | 113 int index_; |
| 139 int initializer_position_; | 114 int initializer_position_; |
| 140 | 115 |
| 141 // If this field is set, this variable references the stored locally bound | 116 // If this field is set, this variable references the stored locally bound |
| 142 // variable, but it might be shadowed by variable bindings introduced by | 117 // variable, but it might be shadowed by variable bindings introduced by |
| 143 // sloppy 'eval' calls between the reference scope (inclusive) and the | 118 // sloppy 'eval' calls between the reference scope (inclusive) and the |
| 144 // binding scope (exclusive). | 119 // binding scope (exclusive). |
| 145 Variable* local_if_not_shadowed_; | 120 Variable* local_if_not_shadowed_; |
| 146 | 121 |
| 147 // Usage info. | 122 // Usage info. |
| 148 bool force_context_allocation_; // set by variable resolver | 123 bool force_context_allocation_; // set by variable resolver |
| 149 bool is_used_; | 124 bool is_used_; |
| 150 InitializationFlag initialization_flag_; | 125 InitializationFlag initialization_flag_; |
| 151 MaybeAssignedFlag maybe_assigned_; | 126 MaybeAssignedFlag maybe_assigned_; |
| 152 }; | 127 }; |
| 153 } // namespace internal | 128 } // namespace internal |
| 154 } // namespace v8 | 129 } // namespace v8 |
| 155 | 130 |
| 156 #endif // V8_AST_VARIABLES_H_ | 131 #endif // V8_AST_VARIABLES_H_ |
| OLD | NEW |