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

Side by Side Diff: pkg/compiler/lib/src/js/rewrite_async.dart

Issue 1916863002: dart2js: Avoid empty else clauses in generators. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 4 years, 7 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 | no next file » | 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) 2015, the Dart project authors. Please see the AUTHORS file 1 tra// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
sigurdm 2016/04/26 05:15:05 This looks like a mistake
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 rewrite_async; 5 library rewrite_async;
6 6
7 import "dart:math" show max; 7 import "dart:math" show max;
8 import 'dart:collection'; 8 import 'dart:collection';
9 9
10 import 'package:js_runtime/shared/async_await_error_codes.dart' as error_codes; 10 import 'package:js_runtime/shared/async_await_error_codes.dart' as error_codes;
11 11
(...skipping 948 matching lines...) Expand 10 before | Expand all | Expand 10 after
960 960
961 @override 961 @override
962 void visitDefault(js.Default node) => unreachable(node); 962 void visitDefault(js.Default node) => unreachable(node);
963 963
964 @override 964 @override
965 void visitDo(js.Do node) { 965 void visitDo(js.Do node) {
966 if (!shouldTransform(node)) { 966 if (!shouldTransform(node)) {
967 bool oldInsideUntranslatedBreakable = insideUntranslatedBreakable; 967 bool oldInsideUntranslatedBreakable = insideUntranslatedBreakable;
968 insideUntranslatedBreakable = true; 968 insideUntranslatedBreakable = true;
969 addStatement(js.js.statement('do {#} while (#)', 969 addStatement(js.js.statement('do {#} while (#)',
970 [translateInBlock(node.body), visitExpression(node.condition)])); 970 [translateToStatement(node.body), visitExpression(node.condition)]));
971 insideUntranslatedBreakable = oldInsideUntranslatedBreakable; 971 insideUntranslatedBreakable = oldInsideUntranslatedBreakable;
972 return; 972 return;
973 } 973 }
974 int startLabel = newLabel("do body"); 974 int startLabel = newLabel("do body");
975 975
976 int continueLabel = newLabel("do condition"); 976 int continueLabel = newLabel("do condition");
977 continueLabels[node] = continueLabel; 977 continueLabels[node] = continueLabel;
978 978
979 int afterLabel = newLabel("after do"); 979 int afterLabel = newLabel("after do");
980 breakLabels[node] = afterLabel; 980 breakLabels[node] = afterLabel;
(...skipping 25 matching lines...) Expand all
1006 @override 1006 @override
1007 void visitFor(js.For node) { 1007 void visitFor(js.For node) {
1008 if (!shouldTransform(node)) { 1008 if (!shouldTransform(node)) {
1009 bool oldInsideUntranslated = insideUntranslatedBreakable; 1009 bool oldInsideUntranslated = insideUntranslatedBreakable;
1010 insideUntranslatedBreakable = true; 1010 insideUntranslatedBreakable = true;
1011 // Note that node.init, node.condition, node.update all can be null, but 1011 // Note that node.init, node.condition, node.update all can be null, but
1012 // withExpressions handles that. 1012 // withExpressions handles that.
1013 withExpressions([node.init, node.condition, node.update], 1013 withExpressions([node.init, node.condition, node.update],
1014 (List<js.Expression> transformed) { 1014 (List<js.Expression> transformed) {
1015 addStatement(new js.For(transformed[0], transformed[1], transformed[2], 1015 addStatement(new js.For(transformed[0], transformed[1], transformed[2],
1016 translateInBlock(node.body))); 1016 translateToStatement(node.body)));
1017 }); 1017 });
1018 insideUntranslatedBreakable = oldInsideUntranslated; 1018 insideUntranslatedBreakable = oldInsideUntranslated;
1019 return; 1019 return;
1020 } 1020 }
1021 1021
1022 if (node.init != null) { 1022 if (node.init != null) {
1023 visitExpressionIgnoreResult(node.init); 1023 visitExpressionIgnoreResult(node.init);
1024 } 1024 }
1025 int startLabel = newLabel("for condition"); 1025 int startLabel = newLabel("for condition");
1026 // If there is no update, continuing the loop is the same as going to the 1026 // If there is no update, continuing the loop is the same as going to the
(...skipping 30 matching lines...) Expand all
1057 // The dart output currently never uses for-in loops. 1057 // The dart output currently never uses for-in loops.
1058 throw "Javascript for-in not implemented yet in the await transformation"; 1058 throw "Javascript for-in not implemented yet in the await transformation";
1059 } 1059 }
1060 1060
1061 @override 1061 @override
1062 void visitFunctionDeclaration(js.FunctionDeclaration node) { 1062 void visitFunctionDeclaration(js.FunctionDeclaration node) {
1063 unsupported(node); 1063 unsupported(node);
1064 } 1064 }
1065 1065
1066 // Only used for code where `!shouldTransform(node)`. 1066 // Only used for code where `!shouldTransform(node)`.
1067 js.Block translateInBlock(js.Statement node) { 1067 js.Block translateToStatement(js.Statement node) {
sigurdm 2016/04/26 05:15:04 I think the return type should be `js.Statement` n
1068 assert(!shouldTransform(node)); 1068 assert(!shouldTransform(node));
1069 List<js.Statement> oldBuffer = currentStatementBuffer; 1069 List<js.Statement> oldBuffer = currentStatementBuffer;
1070 currentStatementBuffer = new List(); 1070 currentStatementBuffer = new List();
1071 List<js.Statement> resultBuffer = currentStatementBuffer; 1071 List<js.Statement> resultBuffer = currentStatementBuffer;
1072 visitStatement(node); 1072 visitStatement(node);
1073 currentStatementBuffer = oldBuffer; 1073 currentStatementBuffer = oldBuffer;
1074 if (resultBuffer.length == 1)
1075 return resultBuffer.single;
sigurdm 2016/04/26 05:15:04 Either put the return on the same line as the if,
sigurdm 2016/04/26 05:15:05 For the case where `node` is an empty block (can t
1074 return new js.Block(resultBuffer); 1076 return new js.Block(resultBuffer);
1075 } 1077 }
1076 1078
1077 @override 1079 @override
1078 void visitIf(js.If node) { 1080 void visitIf(js.If node) {
1079 if (!shouldTransform(node.then) && !shouldTransform(node.otherwise)) { 1081 if (!shouldTransform(node.then) && !shouldTransform(node.otherwise)) {
1080 withExpression(node.condition, (js.Expression condition) { 1082 withExpression(node.condition, (js.Expression condition) {
1081 addStatement(new js.If(condition, translateInBlock(node.then), 1083 js.Ast translatedThen = translateToStatement(node.then);
1082 translateInBlock(node.otherwise))); 1084 js.Ast translatedElse = translateToStatement(node.otherwise);
1085 addStatement(new js.If(condition, translatedThen, translatedElse));
1083 }, store: false); 1086 }, store: false);
1084 return; 1087 return;
1085 } 1088 }
1086 int thenLabel = newLabel("then"); 1089 int thenLabel = newLabel("then");
1087 int joinLabel = newLabel("join"); 1090 int joinLabel = newLabel("join");
1088 int elseLabel = 1091 int elseLabel =
1089 (node.otherwise is js.EmptyStatement) ? joinLabel : newLabel("else"); 1092 (node.otherwise is js.EmptyStatement) ? joinLabel : newLabel("else");
1090 1093
1091 withExpression(node.condition, (js.Expression condition) { 1094 withExpression(node.condition, (js.Expression condition) {
1092 addExpressionStatement(new js.Assignment( 1095 addExpressionStatement(new js.Assignment(
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1130 1133
1131 @override 1134 @override
1132 visitInterpolatedStatement(js.InterpolatedStatement node) { 1135 visitInterpolatedStatement(js.InterpolatedStatement node) {
1133 return unsupported(node); 1136 return unsupported(node);
1134 } 1137 }
1135 1138
1136 @override 1139 @override
1137 void visitLabeledStatement(js.LabeledStatement node) { 1140 void visitLabeledStatement(js.LabeledStatement node) {
1138 if (!shouldTransform(node)) { 1141 if (!shouldTransform(node)) {
1139 addStatement( 1142 addStatement(
1140 new js.LabeledStatement(node.label, translateInBlock(node.body))); 1143 new js.LabeledStatement(node.label, translateToStatement(node.body)));
1141 return; 1144 return;
1142 } 1145 }
1143 // `continue label` is really continuing the nested loop. 1146 // `continue label` is really continuing the nested loop.
1144 // This is set up in [PreTranslationAnalysis.visitContinue]. 1147 // This is set up in [PreTranslationAnalysis.visitContinue].
1145 // Here we only need a breakLabel: 1148 // Here we only need a breakLabel:
1146 int breakLabel = newLabel("break ${node.label}"); 1149 int breakLabel = newLabel("break ${node.label}");
1147 breakLabels[node] = breakLabel; 1150 breakLabels[node] = breakLabel;
1148 1151
1149 jumpTargets.add(node); 1152 jumpTargets.add(node);
1150 visitStatement(node.body); 1153 visitStatement(node.body);
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1295 @override 1298 @override
1296 void visitSwitch(js.Switch node) { 1299 void visitSwitch(js.Switch node) {
1297 if (!node.cases.any(shouldTransform)) { 1300 if (!node.cases.any(shouldTransform)) {
1298 // If only the key has an await, translation can be simplified. 1301 // If only the key has an await, translation can be simplified.
1299 bool oldInsideUntranslated = insideUntranslatedBreakable; 1302 bool oldInsideUntranslated = insideUntranslatedBreakable;
1300 insideUntranslatedBreakable = true; 1303 insideUntranslatedBreakable = true;
1301 withExpression(node.key, (js.Expression key) { 1304 withExpression(node.key, (js.Expression key) {
1302 List<js.SwitchClause> cases = node.cases.map((js.SwitchClause clause) { 1305 List<js.SwitchClause> cases = node.cases.map((js.SwitchClause clause) {
1303 if (clause is js.Case) { 1306 if (clause is js.Case) {
1304 return new js.Case( 1307 return new js.Case(
1305 clause.expression, translateInBlock(clause.body)); 1308 clause.expression, translateToStatement(clause.body));
1306 } else if (clause is js.Default) { 1309 } else if (clause is js.Default) {
1307 return new js.Default(translateInBlock(clause.body)); 1310 return new js.Default(translateToStatement(clause.body));
1308 } 1311 }
1309 }).toList(); 1312 }).toList();
1310 addStatement(new js.Switch(key, cases)); 1313 addStatement(new js.Switch(key, cases));
1311 }, store: false); 1314 }, store: false);
1312 insideUntranslatedBreakable = oldInsideUntranslated; 1315 insideUntranslatedBreakable = oldInsideUntranslated;
1313 return; 1316 return;
1314 } 1317 }
1315 int before = newLabel("switch"); 1318 int before = newLabel("switch");
1316 int after = newLabel("after switch"); 1319 int after = newLabel("after switch");
1317 breakLabels[node] = after; 1320 breakLabels[node] = after;
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1419 if (finallyLabel != null) { 1422 if (finallyLabel != null) {
1420 result.add(finallyLabel); 1423 result.add(finallyLabel);
1421 } 1424 }
1422 } 1425 }
1423 return result.reversed.toList(); 1426 return result.reversed.toList();
1424 } 1427 }
1425 1428
1426 /// See the comments of [rewriteFunction] for more explanation. 1429 /// See the comments of [rewriteFunction] for more explanation.
1427 void visitTry(js.Try node) { 1430 void visitTry(js.Try node) {
1428 if (!shouldTransform(node)) { 1431 if (!shouldTransform(node)) {
1429 js.Block body = translateInBlock(node.body); 1432 js.Block body = translateToStatement(node.body);
sigurdm 2016/04/26 05:15:04 This would also become a `js.Statement`
1430 js.Catch catchPart = (node.catchPart == null) 1433 js.Catch catchPart = (node.catchPart == null)
1431 ? null 1434 ? null
1432 : new js.Catch(node.catchPart.declaration, 1435 : new js.Catch(node.catchPart.declaration,
1433 translateInBlock(node.catchPart.body)); 1436 translateToStatement(node.catchPart.body));
1434 js.Block finallyPart = (node.finallyPart == null) 1437 js.Block finallyPart = (node.finallyPart == null)
1435 ? null 1438 ? null
1436 : translateInBlock(node.finallyPart); 1439 : translateToStatement(node.finallyPart);
1437 addStatement(new js.Try(body, catchPart, finallyPart)); 1440 addStatement(new js.Try(body, catchPart, finallyPart));
1438 return; 1441 return;
1439 } 1442 }
1440 1443
1441 hasTryBlocks = true; 1444 hasTryBlocks = true;
1442 int uncaughtLabel = newLabel("uncaught"); 1445 int uncaughtLabel = newLabel("uncaught");
1443 int handlerLabel = 1446 int handlerLabel =
1444 (node.catchPart == null) ? uncaughtLabel : newLabel("catch"); 1447 (node.catchPart == null) ? uncaughtLabel : newLabel("catch");
1445 1448
1446 int finallyLabel = newLabel("finally"); 1449 int finallyLabel = newLabel("finally");
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1569 if (renaming == null) return node; 1572 if (renaming == null) return node;
1570 return new js.VariableUse(renaming.b); 1573 return new js.VariableUse(renaming.b);
1571 } 1574 }
1572 1575
1573 @override 1576 @override
1574 void visitWhile(js.While node) { 1577 void visitWhile(js.While node) {
1575 if (!shouldTransform(node)) { 1578 if (!shouldTransform(node)) {
1576 bool oldInsideUntranslated = insideUntranslatedBreakable; 1579 bool oldInsideUntranslated = insideUntranslatedBreakable;
1577 insideUntranslatedBreakable = true; 1580 insideUntranslatedBreakable = true;
1578 withExpression(node.condition, (js.Expression condition) { 1581 withExpression(node.condition, (js.Expression condition) {
1579 addStatement(new js.While(condition, translateInBlock(node.body))); 1582 addStatement(new js.While(condition, translateToStatement(node.body)));
1580 }, store: false); 1583 }, store: false);
1581 insideUntranslatedBreakable = oldInsideUntranslated; 1584 insideUntranslatedBreakable = oldInsideUntranslated;
1582 return; 1585 return;
1583 } 1586 }
1584 int continueLabel = newLabel("while condition"); 1587 int continueLabel = newLabel("while condition");
1585 continueLabels[node] = continueLabel; 1588 continueLabels[node] = continueLabel;
1586 beginLabel(continueLabel); 1589 beginLabel(continueLabel);
1587 1590
1588 int afterLabel = newLabel("after while"); 1591 int afterLabel = newLabel("after while");
1589 breakLabels[node] = afterLabel; 1592 breakLabels[node] = afterLabel;
(...skipping 987 matching lines...) Expand 10 before | Expand all | Expand 10 after
2577 return condition || body; 2580 return condition || body;
2578 } 2581 }
2579 2582
2580 @override 2583 @override
2581 bool visitDartYield(js.DartYield node) { 2584 bool visitDartYield(js.DartYield node) {
2582 hasYield = true; 2585 hasYield = true;
2583 visit(node.expression); 2586 visit(node.expression);
2584 return true; 2587 return true;
2585 } 2588 }
2586 } 2589 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698