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

Side by Side Diff: pkg/compiler/lib/src/js_model/locals.dart

Issue 3009463002: Handle labelled continue statements (Closed)
Patch Set: Update comment Created 3 years, 4 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 | « pkg/compiler/lib/src/elements/modelx.dart ('k') | pkg/compiler/lib/src/resolution/members.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) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, 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 dart2js.js_model.locals; 5 library dart2js.js_model.locals;
6 6
7 import 'package:kernel/ast.dart' as ir; 7 import 'package:kernel/ast.dart' as ir;
8 8
9 import '../closure.dart'; 9 import '../closure.dart';
10 import '../common.dart'; 10 import '../common.dart';
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 ir.TreeNode search = node; 210 ir.TreeNode search = node;
211 bool needsLabel = false; 211 bool needsLabel = false;
212 while (search != node.target) { 212 while (search != node.target) {
213 if (_canBeBreakTarget(search)) { 213 if (_canBeBreakTarget(search)) {
214 needsLabel = search != body; 214 needsLabel = search != body;
215 break; 215 break;
216 } 216 }
217 search = search.parent; 217 search = search.parent;
218 } 218 }
219 if (needsLabel) { 219 if (needsLabel) {
220 target.addLabel(node.target, 'label${labelIndex++}', 220 if (target.labels.isEmpty) {
Siggi Cherem (dart-lang) 2017/08/25 00:38:50 nit: consider adding a helper function instead to
Johnni Winther 2017/08/25 07:11:51 Done.
221 isBreakTarget: true); 221 target.addLabel(node.target, 'label${labelIndex++}',
222 isBreakTarget: true);
223 } else {
224 JLabelDefinition label = target.labels.single;
225 label.isBreakTarget = true;
226 }
222 } 227 }
223 } else if (_canBeContinueTarget(parent)) { 228 } else if (_canBeContinueTarget(parent)) {
224 // We have code like 229 // We have code like
225 // 230 //
226 // for (int i = 0; i < 10; i++) l1: { 231 // for (int i = 0; i < 10; i++) l1: {
227 // break l1: 232 // break l1:
228 // } 233 // }
229 // 234 //
230 // and can therefore use the for loop as a continue target. 235 // and can therefore use the for loop as a continue target.
231 target = _getJumpTarget(parent); 236 target = _getJumpTarget(parent);
232 target.isContinueTarget = true; 237 target.isContinueTarget = true;
233 breaksAsContinue.add(node); 238 breaksAsContinue.add(node);
239 ir.TreeNode search = node;
240 bool needsLabel = false;
241 while (search != node.target) {
242 if (_canBeContinueTarget(search)) {
243 needsLabel = search != body;
244 break;
245 }
246 search = search.parent;
247 }
248 if (needsLabel) {
249 if (target.labels.isEmpty) {
250 target.addLabel(node.target, 'label${labelIndex++}',
251 isContinueTarget: true);
252 } else {
253 JLabelDefinition label = target.labels.single;
254 label.isContinueTarget = true;
255 }
256 }
234 } else { 257 } else {
235 target = _getJumpTarget(node.target); 258 target = _getJumpTarget(node.target);
236 target.isBreakTarget = true; 259 target.isBreakTarget = true;
237 } 260 }
238 jumpTargetMap[node] = target; 261 jumpTargetMap[node] = target;
239 super.visitBreakStatement(node); 262 super.visitBreakStatement(node);
240 } 263 }
241 } 264 }
242 265
243 class JJumpTarget extends JumpTarget<ir.Node> { 266 class JJumpTarget extends JumpTarget<ir.Node> {
244 final MemberEntity memberContext; 267 final MemberEntity memberContext;
245 final int nestingLevel; 268 final int nestingLevel;
246 List<LabelDefinition<ir.Node>> _labels; 269 List<LabelDefinition<ir.Node>> _labels;
270 final bool isSwitch;
271 final bool isSwitchCase;
247 272
248 JJumpTarget(this.memberContext, this.nestingLevel); 273 JJumpTarget(this.memberContext, this.nestingLevel,
274 {this.isSwitch: false, this.isSwitchCase: false});
249 275
250 bool isBreakTarget = false; 276 bool isBreakTarget = false;
251 bool isContinueTarget = false; 277 bool isContinueTarget = false;
252 bool isSwitch = false;
253 278
254 @override 279 @override
255 Entity get executableContext => memberContext; 280 Entity get executableContext => memberContext;
256 281
257 @override 282 @override
258 LabelDefinition<ir.Node> addLabel(ir.Node label, String labelName, 283 LabelDefinition<ir.Node> addLabel(ir.Node label, String labelName,
259 {bool isBreakTarget: false}) { 284 {bool isBreakTarget: false, bool isContinueTarget: false}) {
260 _labels ??= <LabelDefinition<ir.Node>>[]; 285 _labels ??= <LabelDefinition<ir.Node>>[];
261 LabelDefinition<ir.Node> labelDefinition = new JLabelDefinition( 286 LabelDefinition<ir.Node> labelDefinition = new JLabelDefinition(
262 this, label, labelName, 287 this, labelName,
263 isBreakTarget: isBreakTarget); 288 isBreakTarget: isBreakTarget, isContinueTarget: isContinueTarget);
264 _labels.add(labelDefinition); 289 _labels.add(labelDefinition);
265 return labelDefinition; 290 return labelDefinition;
266 } 291 }
267 292
268 @override 293 @override
269 List<LabelDefinition<ir.Node>> get labels { 294 List<LabelDefinition<ir.Node>> get labels {
270 return _labels ?? const <LabelDefinition<ir.Node>>[]; 295 return _labels ?? const <LabelDefinition<ir.Node>>[];
271 } 296 }
272 297
273 @override 298 @override
(...skipping 16 matching lines...) Expand all
290 sb.write(',labels='); 315 sb.write(',labels=');
291 sb.write(_labels); 316 sb.write(_labels);
292 } 317 }
293 sb.write(')'); 318 sb.write(')');
294 return sb.toString(); 319 return sb.toString();
295 } 320 }
296 } 321 }
297 322
298 class JLabelDefinition extends LabelDefinition<ir.Node> { 323 class JLabelDefinition extends LabelDefinition<ir.Node> {
299 final JumpTarget<ir.Node> target; 324 final JumpTarget<ir.Node> target;
300 final ir.Node label;
301 final String labelName; 325 final String labelName;
302 final bool isBreakTarget; 326 bool isBreakTarget;
303 final bool isContinueTarget; 327 bool isContinueTarget;
304 328
305 JLabelDefinition(this.target, this.label, this.labelName, 329 JLabelDefinition(this.target, this.labelName,
306 {this.isBreakTarget: false, this.isContinueTarget: false}); 330 {this.isBreakTarget: false, this.isContinueTarget: false});
307 331
308 @override 332 @override
309 String get name => labelName; 333 String get name => labelName;
310 String toString() { 334 String toString() {
311 StringBuffer sb = new StringBuffer(); 335 StringBuffer sb = new StringBuffer();
312 sb.write('JLabelDefinition('); 336 sb.write('JLabelDefinition(');
313 sb.write('label=');
314 sb.write(label);
315 sb.write(',labelName='); 337 sb.write(',labelName=');
316 sb.write(labelName); 338 sb.write(labelName);
317 sb.write(',isBreakTarget='); 339 sb.write(',isBreakTarget=');
318 sb.write(isBreakTarget); 340 sb.write(isBreakTarget);
319 sb.write(',isContinueTarget='); 341 sb.write(',isContinueTarget=');
320 sb.write(isContinueTarget); 342 sb.write(isContinueTarget);
321 sb.write(')'); 343 sb.write(')');
322 return sb.toString(); 344 return sb.toString();
323 } 345 }
324 } 346 }
(...skipping 18 matching lines...) Expand all
343 sb.write(memberContext.enclosingClass.name); 365 sb.write(memberContext.enclosingClass.name);
344 sb.write('.'); 366 sb.write('.');
345 } 367 }
346 sb.write(memberContext.name); 368 sb.write(memberContext.name);
347 sb.write('#'); 369 sb.write('#');
348 sb.write(name); 370 sb.write(name);
349 sb.write(')'); 371 sb.write(')');
350 return sb.toString(); 372 return sb.toString();
351 } 373 }
352 } 374 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/elements/modelx.dart ('k') | pkg/compiler/lib/src/resolution/members.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698