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

Side by Side Diff: pkg/kernel/lib/transformations/closure/converter.dart

Issue 3000333002: Fix several bugs in closure conversion. (Closed)
Patch Set: Comments. Created 3 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 | pkg/kernel/lib/transformations/closure/invalidate_closures.dart » ('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) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 library kernel.transformations.closure.converter; 5 library kernel.transformations.closure.converter;
6 6
7 import '../../ast.dart' 7 import '../../ast.dart'
8 show 8 show
9 AsyncMarker,
9 Arguments, 10 Arguments,
10 Block, 11 Block,
11 Catch, 12 Catch,
12 Class, 13 Class,
13 ClosureCreation, 14 ClosureCreation,
14 Constructor, 15 Constructor,
15 DartType, 16 DartType,
17 DoStatement,
16 EmptyStatement, 18 EmptyStatement,
17 Expression, 19 Expression,
18 ExpressionStatement, 20 ExpressionStatement,
19 Field, 21 Field,
20 ForInStatement, 22 ForInStatement,
21 ForStatement, 23 ForStatement,
22 FunctionDeclaration, 24 FunctionDeclaration,
23 FunctionExpression, 25 FunctionExpression,
24 FunctionNode, 26 FunctionNode,
25 FunctionType, 27 FunctionType,
(...skipping 19 matching lines...) Expand all
45 ThisExpression, 47 ThisExpression,
46 Transformer, 48 Transformer,
47 TreeNode, 49 TreeNode,
48 TypeParameter, 50 TypeParameter,
49 TypeParameterType, 51 TypeParameterType,
50 VariableDeclaration, 52 VariableDeclaration,
51 VariableGet, 53 VariableGet,
52 VariableSet, 54 VariableSet,
53 VectorCreation, 55 VectorCreation,
54 VectorType, 56 VectorType,
57 WhileStatement,
55 transformList; 58 transformList;
56 59
57 import '../../frontend/accessors.dart' show VariableAccessor; 60 import '../../frontend/accessors.dart' show VariableAccessor;
58 61
59 import '../../clone.dart' show CloneVisitor; 62 import '../../clone.dart' show CloneVisitor;
60 63
61 import '../../core_types.dart' show CoreTypes; 64 import '../../core_types.dart' show CoreTypes;
62 65
63 import '../../type_algebra.dart' show substitute; 66 import '../../type_algebra.dart' show substitute;
64 67
65 import 'clone_without_body.dart' show CloneWithoutBody; 68 import 'clone_without_body.dart' show CloneWithoutBody;
66 69
67 import 'context.dart' show Context, NoContext, LocalContext; 70 import 'context.dart' show Context, NoContext, LocalContext;
68 71
69 import 'info.dart' show ClosureInfo; 72 import 'info.dart' show ClosureInfo;
70 73
71 import 'rewriter.dart' show AstRewriter, BlockRewriter, InitializerListRewriter; 74 import 'rewriter.dart' show AstRewriter, BlockRewriter, InitializerListRewriter;
72 75
76 bool isLoop(TreeNode node) {
77 return node is WhileStatement ||
78 node is DoStatement ||
79 node is ForStatement ||
80 node is ForInStatement;
81 }
82
73 class ClosureConverter extends Transformer { 83 class ClosureConverter extends Transformer {
74 final CoreTypes coreTypes; 84 final CoreTypes coreTypes;
75 85
76 final Set<VariableDeclaration> capturedVariables; 86 final Set<VariableDeclaration> capturedVariables;
77 87
78 // This map pairs variables that are captured with flags indicating whether 88 // This map pairs variables that are captured with flags indicating whether
79 // they are used inside or outside an initializer. See 89 // they are used inside or outside an initializer. See
80 // [ClosureInfo.parameterUses]. 90 // [ClosureInfo.parameterUses].
81 final Map<VariableDeclaration, int> parameterUses; 91 final Map<VariableDeclaration, int> parameterUses;
82 92
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 TreeNode visitField(Field node) { 350 TreeNode visitField(Field node) {
341 currentMember = node; 351 currentMember = node;
342 context = new NoContext(this); 352 context = new NoContext(this);
343 node = super.visitField(node); 353 node = super.visitField(node);
344 context = null; 354 context = null;
345 currentMember = null; 355 currentMember = null;
346 return node; 356 return node;
347 } 357 }
348 358
349 Expression handleLocalFunction(FunctionNode function) { 359 Expression handleLocalFunction(FunctionNode function) {
360 if (function.asyncMarker == AsyncMarker.SyncYielding) {
361 function.transformChildren(this);
362 return new FunctionExpression(function);
363 }
350 FunctionNode enclosingFunction = currentFunction; 364 FunctionNode enclosingFunction = currentFunction;
351 Map<TypeParameter, DartType> enclosingTypeSubstitution = typeSubstitution; 365 Map<TypeParameter, DartType> enclosingTypeSubstitution = typeSubstitution;
352 currentFunction = function; 366 currentFunction = function;
353 Statement body = function.body; 367 Statement body = function.body;
354 assert(body != null); 368 assert(body != null);
355 369
356 rewriter = makeRewriterForBody(function); 370 rewriter = makeRewriterForBody(function);
357 371
358 VariableDeclaration contextVariable = 372 VariableDeclaration contextVariable =
359 new VariableDeclaration("#contextParameter", type: const VectorType()); 373 new VariableDeclaration("#contextParameter", type: const VectorType());
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
547 .forEach(extendContextConditionally(inInitializer: false)); 561 .forEach(extendContextConditionally(inInitializer: false));
548 assert(node.body != null); 562 assert(node.body != null);
549 node.body = node.body.accept(this); 563 node.body = node.body.accept(this);
550 node.body.parent = node; 564 node.body.parent = node;
551 return node; 565 return node;
552 } 566 }
553 567
554 TreeNode visitBlock(Block node) { 568 TreeNode visitBlock(Block node) {
555 return saveContext(() { 569 return saveContext(() {
556 BlockRewriter blockRewriter = rewriter = rewriter.forNestedBlock(node); 570 BlockRewriter blockRewriter = rewriter = rewriter.forNestedBlock(node);
571 if (node.parent is Statement &&
572 isLoop(node.parent) &&
573 context is! NoContext) {
574 context = context.toNestedContext();
575 }
557 blockRewriter.transformStatements(this); 576 blockRewriter.transformStatements(this);
558 return node; 577 return node;
559 }); 578 });
560 } 579 }
561 580
562 TreeNode visitVariableDeclaration(VariableDeclaration node) { 581 TreeNode visitVariableDeclaration(VariableDeclaration node) {
563 node.transformChildren(this); 582 node.transformChildren(this);
564 583
565 if (!capturedVariables.contains(node)) return node; 584 if (!capturedVariables.contains(node)) return node;
566 if (node.initializer == null && node.parent is FunctionNode) { 585 if (node.initializer == null && node.parent is FunctionNode) {
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
820 copy.function.body.parent = copy.function; 839 copy.function.body.parent = copy.function;
821 return copy; 840 return copy;
822 } 841 }
823 842
824 void addGetterForwarder(Name name, Procedure getter) { 843 void addGetterForwarder(Name name, Procedure getter) {
825 assert(getter.isGetter); 844 assert(getter.isGetter);
826 newClassMembers 845 newClassMembers
827 .add(copyWithBody(getter, forwardToThisProperty(getter))..name = name); 846 .add(copyWithBody(getter, forwardToThisProperty(getter))..name = name);
828 } 847 }
829 } 848 }
OLDNEW
« no previous file with comments | « no previous file | pkg/kernel/lib/transformations/closure/invalidate_closures.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698