| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef VM_SCOPES_H_ | 5 #ifndef VM_SCOPES_H_ |
| 6 #define VM_SCOPES_H_ | 6 #define VM_SCOPES_H_ |
| 7 | 7 |
| 8 #include "vm/allocation.h" | 8 #include "vm/allocation.h" |
| 9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
| 10 #include "vm/growable_array.h" | 10 #include "vm/growable_array.h" |
| 11 | 11 |
| 12 namespace dart { | 12 namespace dart { |
| 13 | 13 |
| 14 class BitVector; | 14 class BitVector; |
| 15 class JoinEntryInstr; | 15 class JoinEntryInstr; |
| 16 class LocalScope; | 16 class LocalScope; |
| 17 class LocalVariable; | 17 class LocalVariable; |
| 18 class SourceLabel; | 18 class SourceLabel; |
| 19 | 19 |
| 20 | 20 |
| 21 class LocalVariable : public ZoneAllocated { | 21 class LocalVariable : public ZoneAllocated { |
| 22 public: | 22 public: |
| 23 LocalVariable(intptr_t token_index, | 23 LocalVariable(intptr_t token_pos, |
| 24 const String& name, | 24 const String& name, |
| 25 const AbstractType& type) | 25 const AbstractType& type) |
| 26 : token_index_(token_index), | 26 : token_pos_(token_pos), |
| 27 name_(name), | 27 name_(name), |
| 28 owner_(NULL), | 28 owner_(NULL), |
| 29 type_(type), | 29 type_(type), |
| 30 is_final_(false), | 30 is_final_(false), |
| 31 is_captured_(false), | 31 is_captured_(false), |
| 32 is_invisible_(false), | 32 is_invisible_(false), |
| 33 index_(LocalVariable::kUnitializedIndex) { | 33 index_(LocalVariable::kUnitializedIndex) { |
| 34 ASSERT(type.IsZoneHandle()); | 34 ASSERT(type.IsZoneHandle()); |
| 35 ASSERT(type.IsFinalized()); | 35 ASSERT(type.IsFinalized()); |
| 36 } | 36 } |
| 37 | 37 |
| 38 intptr_t token_index() const { return token_index_; } | 38 intptr_t token_pos() const { return token_pos_; } |
| 39 const String& name() const { return name_; } | 39 const String& name() const { return name_; } |
| 40 LocalScope* owner() const { return owner_; } | 40 LocalScope* owner() const { return owner_; } |
| 41 void set_owner(LocalScope* owner) { | 41 void set_owner(LocalScope* owner) { |
| 42 ASSERT(owner_ == NULL); | 42 ASSERT(owner_ == NULL); |
| 43 owner_ = owner; | 43 owner_ = owner; |
| 44 } | 44 } |
| 45 | 45 |
| 46 const AbstractType& type() const { return type_; } | 46 const AbstractType& type() const { return type_; } |
| 47 | 47 |
| 48 bool is_final() const { return is_final_; } | 48 bool is_final() const { return is_final_; } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 78 // all parameters. | 78 // all parameters. |
| 79 int BitIndexIn(intptr_t var_count) const; | 79 int BitIndexIn(intptr_t var_count) const; |
| 80 | 80 |
| 81 // Name of the internal variable that is used to save the context chain | 81 // Name of the internal variable that is used to save the context chain |
| 82 // on function entry. | 82 // on function entry. |
| 83 static const char* kSavedContextVarName; | 83 static const char* kSavedContextVarName; |
| 84 | 84 |
| 85 private: | 85 private: |
| 86 static const int kUnitializedIndex = INT_MIN; | 86 static const int kUnitializedIndex = INT_MIN; |
| 87 | 87 |
| 88 const intptr_t token_index_; | 88 const intptr_t token_pos_; |
| 89 const String& name_; | 89 const String& name_; |
| 90 LocalScope* owner_; // Local scope declaring this variable. | 90 LocalScope* owner_; // Local scope declaring this variable. |
| 91 | 91 |
| 92 const AbstractType& type_; // Declaration type of local variable. | 92 const AbstractType& type_; // Declaration type of local variable. |
| 93 | 93 |
| 94 bool is_final_; // If true, this variable is readonly. | 94 bool is_final_; // If true, this variable is readonly. |
| 95 bool is_captured_; // If true, this variable lives in the context, otherwise | 95 bool is_captured_; // If true, this variable lives in the context, otherwise |
| 96 // in the stack frame. | 96 // in the stack frame. |
| 97 bool is_invisible_; | 97 bool is_invisible_; |
| 98 int index_; // Allocation index in words relative to frame pointer (if not | 98 int index_; // Allocation index in words relative to frame pointer (if not |
| (...skipping 11 matching lines...) Expand all Loading... |
| 110 kWhile, | 110 kWhile, |
| 111 kDoWhile, | 111 kDoWhile, |
| 112 kSwitch, | 112 kSwitch, |
| 113 kCase, | 113 kCase, |
| 114 kTry, | 114 kTry, |
| 115 kCatch, | 115 kCatch, |
| 116 kForward, | 116 kForward, |
| 117 kStatement // Any statement other than the above | 117 kStatement // Any statement other than the above |
| 118 }; | 118 }; |
| 119 | 119 |
| 120 SourceLabel(intptr_t token_index, const String& name, Kind kind) | 120 SourceLabel(intptr_t token_pos, const String& name, Kind kind) |
| 121 : token_index_(token_index), | 121 : token_pos_(token_pos), |
| 122 name_(name), | 122 name_(name), |
| 123 owner_(NULL), | 123 owner_(NULL), |
| 124 kind_(kind), | 124 kind_(kind), |
| 125 continue_label_(), | 125 continue_label_(), |
| 126 break_label_(), | 126 break_label_(), |
| 127 join_for_break_(NULL), | 127 join_for_break_(NULL), |
| 128 join_for_continue_(NULL), | 128 join_for_continue_(NULL), |
| 129 is_continue_target_(false) { | 129 is_continue_target_(false) { |
| 130 } | 130 } |
| 131 | 131 |
| 132 static SourceLabel* New(intptr_t token_index, String* name, Kind kind) { | 132 static SourceLabel* New(intptr_t token_pos, String* name, Kind kind) { |
| 133 if (name != NULL) { | 133 if (name != NULL) { |
| 134 return new SourceLabel(token_index, *name, kind); | 134 return new SourceLabel(token_pos, *name, kind); |
| 135 } else { | 135 } else { |
| 136 return new SourceLabel(token_index, | 136 return new SourceLabel(token_pos, |
| 137 String::ZoneHandle(String::New(kDefaultLabelName)), | 137 String::ZoneHandle(String::New(kDefaultLabelName)), |
| 138 kind); | 138 kind); |
| 139 } | 139 } |
| 140 } | 140 } |
| 141 | 141 |
| 142 intptr_t token_index() const { return token_index_; } | 142 intptr_t token_pos() const { return token_pos_; } |
| 143 const String& name() const { return name_; } | 143 const String& name() const { return name_; } |
| 144 LocalScope* owner() const { return owner_; } | 144 LocalScope* owner() const { return owner_; } |
| 145 void set_owner(LocalScope* owner) { | 145 void set_owner(LocalScope* owner) { |
| 146 ASSERT(owner_ == NULL); | 146 ASSERT(owner_ == NULL); |
| 147 owner_ = owner; | 147 owner_ = owner; |
| 148 } | 148 } |
| 149 | 149 |
| 150 Kind kind() const { return kind_; } | 150 Kind kind() const { return kind_; } |
| 151 Label* break_label() { return &break_label_; } | 151 Label* break_label() { return &break_label_; } |
| 152 Label* continue_label() { return &continue_label_; } | 152 Label* continue_label() { return &continue_label_; } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 171 JoinEntryInstr* join_for_break() const { | 171 JoinEntryInstr* join_for_break() const { |
| 172 return join_for_break_; | 172 return join_for_break_; |
| 173 } | 173 } |
| 174 | 174 |
| 175 // Returns the function level of the scope in which the label is defined. | 175 // Returns the function level of the scope in which the label is defined. |
| 176 int FunctionLevel() const; | 176 int FunctionLevel() const; |
| 177 | 177 |
| 178 void ResolveForwardReference() { kind_ = kCase; } | 178 void ResolveForwardReference() { kind_ = kCase; } |
| 179 | 179 |
| 180 private: | 180 private: |
| 181 const intptr_t token_index_; | 181 const intptr_t token_pos_; |
| 182 const String& name_; | 182 const String& name_; |
| 183 LocalScope* owner_; // Local scope declaring this label. | 183 LocalScope* owner_; // Local scope declaring this label. |
| 184 | 184 |
| 185 Kind kind_; | 185 Kind kind_; |
| 186 Label continue_label_; | 186 Label continue_label_; |
| 187 Label break_label_; | 187 Label break_label_; |
| 188 JoinEntryInstr* join_for_break_; | 188 JoinEntryInstr* join_for_break_; |
| 189 JoinEntryInstr* join_for_continue_; | 189 JoinEntryInstr* join_for_continue_; |
| 190 bool is_continue_target_; // Needed for CaseNode. | 190 bool is_continue_target_; // Needed for CaseNode. |
| 191 static const char* kDefaultLabelName; | 191 static const char* kDefaultLabelName; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 215 int context_level() const { | 215 int context_level() const { |
| 216 ASSERT(HasContextLevel()); | 216 ASSERT(HasContextLevel()); |
| 217 return context_level_; | 217 return context_level_; |
| 218 } | 218 } |
| 219 void set_context_level(int context_level) { | 219 void set_context_level(int context_level) { |
| 220 ASSERT(!HasContextLevel()); | 220 ASSERT(!HasContextLevel()); |
| 221 ASSERT(context_level != kUnitializedContextLevel); | 221 ASSERT(context_level != kUnitializedContextLevel); |
| 222 context_level_ = context_level; | 222 context_level_ = context_level; |
| 223 } | 223 } |
| 224 | 224 |
| 225 intptr_t begin_token_index() const { return begin_token_index_; } | 225 intptr_t begin_token_pos() const { return begin_token_pos_; } |
| 226 void set_begin_token_index(intptr_t value) { begin_token_index_ = value; } | 226 void set_begin_token_pos(intptr_t value) { begin_token_pos_ = value; } |
| 227 | 227 |
| 228 intptr_t end_token_index() const { return end_token_index_; } | 228 intptr_t end_token_pos() const { return end_token_pos_; } |
| 229 void set_end_token_index(intptr_t value) { end_token_index_ = value; } | 229 void set_end_token_pos(intptr_t value) { end_token_pos_ = value; } |
| 230 | 230 |
| 231 // The number of variables allocated in the context and belonging to this | 231 // The number of variables allocated in the context and belonging to this |
| 232 // scope and to its children at the same loop level. | 232 // scope and to its children at the same loop level. |
| 233 int num_context_variables() const { return num_context_variables_; } | 233 int num_context_variables() const { return num_context_variables_; } |
| 234 | 234 |
| 235 // Add a variable to the scope. Returns false if a variable with the | 235 // Add a variable to the scope. Returns false if a variable with the |
| 236 // same name is already present. | 236 // same name is already present. |
| 237 bool AddVariable(LocalVariable* variable); | 237 bool AddVariable(LocalVariable* variable); |
| 238 | 238 |
| 239 // Add a label to the scope. Returns false if a label with the same name | 239 // Add a label to the scope. Returns false if a label with the same name |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 333 void CollectLocalVariables(GrowableArray<VarDesc>* vars, int16_t* scope_id); | 333 void CollectLocalVariables(GrowableArray<VarDesc>* vars, int16_t* scope_id); |
| 334 | 334 |
| 335 static const int kUnitializedContextLevel = INT_MIN; | 335 static const int kUnitializedContextLevel = INT_MIN; |
| 336 LocalScope* parent_; | 336 LocalScope* parent_; |
| 337 LocalScope* child_; | 337 LocalScope* child_; |
| 338 LocalScope* sibling_; | 338 LocalScope* sibling_; |
| 339 int function_level_; // Reflects the nesting level of local functions. | 339 int function_level_; // Reflects the nesting level of local functions. |
| 340 int loop_level_; // Reflects the loop nesting level. | 340 int loop_level_; // Reflects the loop nesting level. |
| 341 int context_level_; // Reflects the level of the runtime context. | 341 int context_level_; // Reflects the level of the runtime context. |
| 342 int num_context_variables_; // Only set if this scope is a context owner. | 342 int num_context_variables_; // Only set if this scope is a context owner. |
| 343 intptr_t begin_token_index_; // Token index of beginning of scope. | 343 intptr_t begin_token_pos_; // Token index of beginning of scope. |
| 344 intptr_t end_token_index_; // Token index of end of scope. | 344 intptr_t end_token_pos_; // Token index of end of scope. |
| 345 GrowableArray<LocalVariable*> variables_; | 345 GrowableArray<LocalVariable*> variables_; |
| 346 GrowableArray<SourceLabel*> labels_; | 346 GrowableArray<SourceLabel*> labels_; |
| 347 | 347 |
| 348 DISALLOW_COPY_AND_ASSIGN(LocalScope); | 348 DISALLOW_COPY_AND_ASSIGN(LocalScope); |
| 349 }; | 349 }; |
| 350 | 350 |
| 351 } // namespace dart | 351 } // namespace dart |
| 352 | 352 |
| 353 #endif // VM_SCOPES_H_ | 353 #endif // VM_SCOPES_H_ |
| OLD | NEW |