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 "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "platform/globals.h" | 9 #include "platform/globals.h" |
10 #include "vm/allocation.h" | 10 #include "vm/allocation.h" |
11 #include "vm/growable_array.h" | 11 #include "vm/growable_array.h" |
12 #include "vm/object.h" | 12 #include "vm/object.h" |
13 #include "vm/raw_object.h" | 13 #include "vm/raw_object.h" |
14 #include "vm/symbols.h" | 14 #include "vm/symbols.h" |
15 #include "vm/token.h" | 15 #include "vm/token.h" |
16 | 16 |
17 namespace dart { | 17 namespace dart { |
18 | 18 |
19 class JoinEntryInstr; | |
20 class LocalScope; | 19 class LocalScope; |
21 | 20 |
22 | 21 |
23 class LocalVariable : public ZoneAllocated { | 22 class LocalVariable : public ZoneAllocated { |
24 public: | 23 public: |
25 LocalVariable(intptr_t token_pos, | 24 LocalVariable(intptr_t token_pos, |
26 const String& name, | 25 const String& name, |
27 const AbstractType& type) | 26 const AbstractType& type) |
28 : token_pos_(token_pos), | 27 : token_pos_(token_pos), |
29 name_(name), | 28 name_(name), |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 kTry, | 143 kTry, |
145 kCatch, | 144 kCatch, |
146 kForward, | 145 kForward, |
147 kStatement // Any statement other than the above | 146 kStatement // Any statement other than the above |
148 }; | 147 }; |
149 | 148 |
150 SourceLabel(intptr_t token_pos, const String& name, Kind kind) | 149 SourceLabel(intptr_t token_pos, const String& name, Kind kind) |
151 : token_pos_(token_pos), | 150 : token_pos_(token_pos), |
152 name_(name), | 151 name_(name), |
153 owner_(NULL), | 152 owner_(NULL), |
154 kind_(kind), | 153 kind_(kind) { |
155 join_for_break_(NULL), | |
156 join_for_continue_(NULL), | |
157 is_continue_target_(false) { | |
158 } | 154 } |
159 | 155 |
160 static SourceLabel* New(intptr_t token_pos, String* name, Kind kind) { | 156 static SourceLabel* New(intptr_t token_pos, String* name, Kind kind) { |
161 if (name != NULL) { | 157 if (name != NULL) { |
162 return new SourceLabel(token_pos, *name, kind); | 158 return new SourceLabel(token_pos, *name, kind); |
163 } else { | 159 } else { |
164 return new SourceLabel(token_pos, | 160 return new SourceLabel(token_pos, |
165 Symbols::DefaultLabel(), | 161 Symbols::DefaultLabel(), |
166 kind); | 162 kind); |
167 } | 163 } |
168 } | 164 } |
169 | 165 |
170 intptr_t token_pos() const { return token_pos_; } | 166 intptr_t token_pos() const { return token_pos_; } |
171 const String& name() const { return name_; } | 167 const String& name() const { return name_; } |
172 LocalScope* owner() const { return owner_; } | 168 LocalScope* owner() const { return owner_; } |
173 void set_owner(LocalScope* owner) { | 169 void set_owner(LocalScope* owner) { |
174 ASSERT(owner_ == NULL); | 170 ASSERT(owner_ == NULL); |
175 owner_ = owner; | 171 owner_ = owner; |
176 } | 172 } |
177 | 173 |
178 Kind kind() const { return kind_; } | 174 Kind kind() const { return kind_; } |
179 | 175 |
180 void set_join_for_continue(JoinEntryInstr* join) { | |
181 ASSERT(join_for_continue_ == NULL); | |
182 join_for_continue_ = join; | |
183 } | |
184 | |
185 JoinEntryInstr* join_for_continue() const { | |
186 return join_for_continue_; | |
187 } | |
188 | |
189 bool is_continue_target() const { return is_continue_target_; } | |
190 void set_is_continue_target(bool value) { is_continue_target_ = value; } | |
191 | |
192 void set_join_for_break(JoinEntryInstr* join) { | |
193 ASSERT(join_for_break_ == NULL); | |
194 join_for_break_ = join; | |
195 } | |
196 | |
197 JoinEntryInstr* join_for_break() const { | |
198 return join_for_break_; | |
199 } | |
200 | |
201 // Returns the function level of the scope in which the label is defined. | 176 // Returns the function level of the scope in which the label is defined. |
202 int FunctionLevel() const; | 177 int FunctionLevel() const; |
203 | 178 |
204 void ResolveForwardReference() { kind_ = kCase; } | 179 void ResolveForwardReference() { kind_ = kCase; } |
205 | 180 |
206 private: | 181 private: |
207 // TODO(zerny): Remove this hack when the builder no longer stores state in | |
208 // the ast/scopes. | |
209 friend class SourceLabelResetter; | |
210 | |
211 const intptr_t token_pos_; | 182 const intptr_t token_pos_; |
212 const String& name_; | 183 const String& name_; |
213 LocalScope* owner_; // Local scope declaring this label. | 184 LocalScope* owner_; // Local scope declaring this label. |
214 | 185 |
215 Kind kind_; | 186 Kind kind_; |
216 JoinEntryInstr* join_for_break_; | |
217 JoinEntryInstr* join_for_continue_; | |
218 bool is_continue_target_; // Needed for CaseNode. | |
219 | 187 |
220 DISALLOW_COPY_AND_ASSIGN(SourceLabel); | 188 DISALLOW_COPY_AND_ASSIGN(SourceLabel); |
221 }; | 189 }; |
222 | 190 |
223 | 191 |
224 class LocalScope : public ZoneAllocated { | 192 class LocalScope : public ZoneAllocated { |
225 public: | 193 public: |
226 LocalScope(LocalScope* parent, int function_level, int loop_level); | 194 LocalScope(LocalScope* parent, int function_level, int loop_level); |
227 | 195 |
228 LocalScope* parent() const { return parent_; } | 196 LocalScope* parent() const { return parent_; } |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 // List of names referenced in this scope and its children that | 353 // List of names referenced in this scope and its children that |
386 // are not resolved to local variables. | 354 // are not resolved to local variables. |
387 GrowableArray<NameReference*> referenced_; | 355 GrowableArray<NameReference*> referenced_; |
388 | 356 |
389 DISALLOW_COPY_AND_ASSIGN(LocalScope); | 357 DISALLOW_COPY_AND_ASSIGN(LocalScope); |
390 }; | 358 }; |
391 | 359 |
392 } // namespace dart | 360 } // namespace dart |
393 | 361 |
394 #endif // VM_SCOPES_H_ | 362 #endif // VM_SCOPES_H_ |
OLD | NEW |