Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(503)

Side by Side Diff: runtime/vm/ast.h

Issue 1308163006: Reduce the number of captured variables in async code, by only capturing local (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: address comments Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | runtime/vm/ast_printer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_AST_H_ 5 #ifndef VM_AST_H_
6 #define VM_AST_H_ 6 #define VM_AST_H_
7 7
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/allocation.h" 9 #include "vm/allocation.h"
10 #include "vm/growable_array.h" 10 #include "vm/growable_array.h"
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 }; 158 };
159 159
160 160
161 class AwaitNode : public AstNode { 161 class AwaitNode : public AstNode {
162 public: 162 public:
163 AwaitNode(intptr_t token_pos, 163 AwaitNode(intptr_t token_pos,
164 AstNode* expr, 164 AstNode* expr,
165 LocalVariable* saved_try_ctx, 165 LocalVariable* saved_try_ctx,
166 LocalVariable* async_saved_try_ctx, 166 LocalVariable* async_saved_try_ctx,
167 LocalVariable* outer_saved_try_ctx, 167 LocalVariable* outer_saved_try_ctx,
168 LocalVariable* outer_async_saved_try_ctx) 168 LocalVariable* outer_async_saved_try_ctx,
169 LocalScope* scope)
169 : AstNode(token_pos), 170 : AstNode(token_pos),
170 expr_(expr), 171 expr_(expr),
171 saved_try_ctx_(saved_try_ctx), 172 saved_try_ctx_(saved_try_ctx),
172 async_saved_try_ctx_(async_saved_try_ctx), 173 async_saved_try_ctx_(async_saved_try_ctx),
173 outer_saved_try_ctx_(outer_saved_try_ctx), 174 outer_saved_try_ctx_(outer_saved_try_ctx),
174 outer_async_saved_try_ctx_(outer_async_saved_try_ctx) { } 175 outer_async_saved_try_ctx_(outer_async_saved_try_ctx),
176 scope_(scope) { }
175 177
176 void VisitChildren(AstNodeVisitor* visitor) const { 178 void VisitChildren(AstNodeVisitor* visitor) const {
177 expr_->Visit(visitor); 179 expr_->Visit(visitor);
178 } 180 }
179 181
180 AstNode* expr() const { return expr_; } 182 AstNode* expr() const { return expr_; }
181 LocalVariable* saved_try_ctx() const { return saved_try_ctx_; } 183 LocalVariable* saved_try_ctx() const { return saved_try_ctx_; }
182 LocalVariable* async_saved_try_ctx() const { return async_saved_try_ctx_; } 184 LocalVariable* async_saved_try_ctx() const { return async_saved_try_ctx_; }
183 LocalVariable* outer_saved_try_ctx() const { return outer_saved_try_ctx_; } 185 LocalVariable* outer_saved_try_ctx() const { return outer_saved_try_ctx_; }
184 LocalVariable* outer_async_saved_try_ctx() const { 186 LocalVariable* outer_async_saved_try_ctx() const {
185 return outer_async_saved_try_ctx_; 187 return outer_async_saved_try_ctx_;
186 } 188 }
189 LocalScope* scope() const { return scope_; }
187 190
188 DECLARE_COMMON_NODE_FUNCTIONS(AwaitNode); 191 DECLARE_COMMON_NODE_FUNCTIONS(AwaitNode);
189 192
190 private: 193 private:
191 AstNode* expr_; 194 AstNode* expr_;
192 LocalVariable* saved_try_ctx_; 195 LocalVariable* saved_try_ctx_;
193 LocalVariable* async_saved_try_ctx_; 196 LocalVariable* async_saved_try_ctx_;
194 LocalVariable* outer_saved_try_ctx_; 197 LocalVariable* outer_saved_try_ctx_;
195 LocalVariable* outer_async_saved_try_ctx_; 198 LocalVariable* outer_async_saved_try_ctx_;
199 LocalScope* scope_;
196 200
197 DISALLOW_COPY_AND_ASSIGN(AwaitNode); 201 DISALLOW_COPY_AND_ASSIGN(AwaitNode);
198 }; 202 };
199 203
200 204
201 // AwaitMarker nodes are used to generate markers that the FlowGraphBuilder 205 // AwaitMarker nodes are used to generate markers that the FlowGraphBuilder
202 // relies on. A marker indicates that a new await state needs to be 206 // relies on. A marker indicates that a new await state needs to be
203 // added to a function preamble. This type also triggers storing of the 207 // added to a function preamble. This type also triggers storing of the
204 // current context. 208 // current context.
205 // 209 //
206 // It is expected (ASSERT) that an AwaitMarker is followed by 210 // It is expected (ASSERT) that an AwaitMarker is followed by
207 // a return node of kind kContinuationTarget. That is: 211 // a return node of kind kContinuationTarget. That is:
208 // <AwaitMarker> -> <other nodes> -> <kContinuationTarget> -> <other nodes> -> 212 // <AwaitMarker> -> <other nodes> -> <kContinuationTarget> -> <other nodes> ->
209 // <AwaitMarker> -> ... 213 // <AwaitMarker> -> ...
210 class AwaitMarkerNode : public AstNode { 214 class AwaitMarkerNode : public AstNode {
211 public: 215 public:
212 AwaitMarkerNode() : AstNode(Scanner::kNoSourcePos) { } 216 AwaitMarkerNode(LocalScope* async_scope, LocalScope* await_scope)
217 : AstNode(Scanner::kNoSourcePos),
218 async_scope_(async_scope),
219 await_scope_(await_scope) {
220 ASSERT(async_scope != NULL);
221 ASSERT(await_scope != NULL);
222 await_scope->CaptureLocalVariables(async_scope);
223 }
213 224
214 void VisitChildren(AstNodeVisitor* visitor) const { } 225 void VisitChildren(AstNodeVisitor* visitor) const { }
215 226
216 LocalScope* scope() const { return scope_; } 227 LocalScope* async_scope() const { return async_scope_; }
217 void set_scope(LocalScope* scope) { scope_ = scope; } 228 LocalScope* await_scope() const { return await_scope_; }
218 229
219 DECLARE_COMMON_NODE_FUNCTIONS(AwaitMarkerNode); 230 DECLARE_COMMON_NODE_FUNCTIONS(AwaitMarkerNode);
220 231
221 private: 232 private:
222 LocalScope* scope_; 233 LocalScope* async_scope_;
234 LocalScope* await_scope_;
223 235
224 DISALLOW_COPY_AND_ASSIGN(AwaitMarkerNode); 236 DISALLOW_COPY_AND_ASSIGN(AwaitMarkerNode);
225 }; 237 };
226 238
227 239
228 class SequenceNode : public AstNode { 240 class SequenceNode : public AstNode {
229 public: 241 public:
230 SequenceNode(intptr_t token_pos, LocalScope* scope) 242 SequenceNode(intptr_t token_pos, LocalScope* scope)
231 : AstNode(token_pos), 243 : AstNode(token_pos),
232 scope_(scope), 244 scope_(scope),
(...skipping 1783 matching lines...) Expand 10 before | Expand all | Expand 10 after
2016 const intptr_t try_index_; 2028 const intptr_t try_index_;
2017 2029
2018 DISALLOW_IMPLICIT_CONSTRUCTORS(InlinedFinallyNode); 2030 DISALLOW_IMPLICIT_CONSTRUCTORS(InlinedFinallyNode);
2019 }; 2031 };
2020 2032
2021 } // namespace dart 2033 } // namespace dart
2022 2034
2023 #undef DECLARE_COMMON_NODE_FUNCTIONS 2035 #undef DECLARE_COMMON_NODE_FUNCTIONS
2024 2036
2025 #endif // VM_AST_H_ 2037 #endif // VM_AST_H_
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/ast_printer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698