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

Side by Side Diff: pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart

Issue 831133004: Use closure conversion in new dart2js backend. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 11 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 tree_ir_tracer; 5 library tree_ir_tracer;
6 6
7 import 'dart:async' show EventSink; 7 import 'dart:async' show EventSink;
8 import '../tracer.dart'; 8 import '../tracer.dart';
9 import 'tree_ir_nodes.dart'; 9 import 'tree_ir_nodes.dart';
10 import 'optimization/optimization.dart'; 10 import 'optimization/optimization.dart';
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 visitExpressionStatement(ExpressionStatement node) { 144 visitExpressionStatement(ExpressionStatement node) {
145 _addStatement(node); 145 _addStatement(node);
146 visitStatement(node.next); 146 visitStatement(node.next);
147 } 147 }
148 148
149 visitFunctionDeclaration(FunctionDeclaration node) { 149 visitFunctionDeclaration(FunctionDeclaration node) {
150 _addStatement(node); 150 _addStatement(node);
151 visitStatement(node.next); 151 visitStatement(node.next);
152 } 152 }
153 153
154 visitSetField(SetField node) {
155 _addStatement(node);
156 visitStatement(node.next);
157 }
158
154 } 159 }
155 160
156 class TreeTracer extends TracerUtil with StatementVisitor, PassMixin { 161 class TreeTracer extends TracerUtil with StatementVisitor, PassMixin {
157 final EventSink<String> output; 162 final EventSink<String> output;
158 163
159 TreeTracer(this.output); 164 TreeTracer(this.output);
160 165
161 Names names; 166 Names names;
162 BlockCollector collector; 167 BlockCollector collector;
163 int statementCounter; 168 int statementCounter;
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 } 275 }
271 276
272 visitExpressionStatement(ExpressionStatement node) { 277 visitExpressionStatement(ExpressionStatement node) {
273 printStatement(null, expr(node.expression)); 278 printStatement(null, expr(node.expression));
274 } 279 }
275 280
276 visitFunctionDeclaration(FunctionDeclaration node) { 281 visitFunctionDeclaration(FunctionDeclaration node) {
277 printStatement(null, 'function ${node.definition.element.name}'); 282 printStatement(null, 'function ${node.definition.element.name}');
278 } 283 }
279 284
285 visitSetField(SetField node) {
286 String object = expr(node.object);
287 String field = node.field.name;
288 String value = expr(node.value);
289 if (SubexpressionVisitor.usesInfixNotation(node.object)) {
floitsch 2015/01/08 18:29:37 Does this capture `(-x).abs` ?
asgerf 2015/01/12 13:15:43 The IR tracer does not currently use unary pre/pos
290 object = '($object)';
291 }
292 printStatement(null, '$object.$field = $value');
293 }
294
280 String expr(Expression e) { 295 String expr(Expression e) {
281 return e.accept(new SubexpressionVisitor(names)); 296 return e.accept(new SubexpressionVisitor(names));
282 } 297 }
283 } 298 }
284 299
285 class SubexpressionVisitor extends ExpressionVisitor<String> { 300 class SubexpressionVisitor extends ExpressionVisitor<String> {
286 Names names; 301 Names names;
287 302
288 SubexpressionVisitor(this.names); 303 SubexpressionVisitor(this.names);
289 304
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 } 376 }
362 377
363 String visitThis(This node) { 378 String visitThis(This node) {
364 return "this"; 379 return "this";
365 } 380 }
366 381
367 String visitReifyTypeVar(ReifyTypeVar node) { 382 String visitReifyTypeVar(ReifyTypeVar node) {
368 return "typevar [${node.typeVariable.name}]"; 383 return "typevar [${node.typeVariable.name}]";
369 } 384 }
370 385
371 bool usesInfixNotation(Expression node) { 386 static bool usesInfixNotation(Expression node) {
372 return node is Conditional || node is LogicalOperator; 387 return node is Conditional || node is LogicalOperator;
373 } 388 }
374 389
375 String visitConditional(Conditional node) { 390 String visitConditional(Conditional node) {
376 String condition = visitExpression(node.condition); 391 String condition = visitExpression(node.condition);
377 String thenExpr = visitExpression(node.thenExpression); 392 String thenExpr = visitExpression(node.thenExpression);
378 String elseExpr = visitExpression(node.elseExpression); 393 String elseExpr = visitExpression(node.elseExpression);
379 return "$condition ? $thenExpr : $elseExpr"; 394 return "$condition ? $thenExpr : $elseExpr";
380 } 395 }
381 396
(...skipping 28 matching lines...) Expand all
410 } 425 }
411 426
412 String visitFieldInitializer(FieldInitializer node) { 427 String visitFieldInitializer(FieldInitializer node) {
413 throw "$node should not be visited by $this"; 428 throw "$node should not be visited by $this";
414 } 429 }
415 430
416 String visitSuperInitializer(SuperInitializer node) { 431 String visitSuperInitializer(SuperInitializer node) {
417 throw "$node should not be visited by $this"; 432 throw "$node should not be visited by $this";
418 } 433 }
419 434
435 String visitGetField(GetField node) {
436 String object = visitExpression(node.object);
437 String field = node.field.name;
438 if (usesInfixNotation(node.object)) {
439 object = '($object)';
440 }
441 return '$object.$field';
442 }
443
444 String visitCreateBox(CreateBox node) {
445 return 'CreateBox';
446 }
447
448 String visitCreateClosureClass(CreateClosureClass node) {
449 String className = node.classElement.name;
450 String arguments = node.arguments.map(visitExpression).join(', ');
451 return 'CreateClosure $className($arguments)';
452 }
453
420 } 454 }
421 455
422 /** 456 /**
423 * Invents (and remembers) names for Variables that do not have an associated 457 * Invents (and remembers) names for Variables that do not have an associated
424 * identifier. 458 * identifier.
425 * 459 *
426 * In case a variable is named v0, v1, etc, it may be assigned a different 460 * In case a variable is named v0, v1, etc, it may be assigned a different
427 * name to avoid clashing with a previously synthesized variable name. 461 * name to avoid clashing with a previously synthesized variable name.
428 */ 462 */
429 class Names { 463 class Names {
430 final Map<Variable, String> _names = {}; 464 final Map<Variable, String> _names = {};
431 final Set<String> _usedNames = new Set(); 465 final Set<String> _usedNames = new Set();
432 int _counter = 0; 466 int _counter = 0;
433 467
434 String varName(Variable v) { 468 String varName(Variable v) {
435 String name = _names[v]; 469 String name = _names[v];
436 if (name == null) { 470 if (name == null) {
437 String prefix = v.element == null ? 'v' : '${v.element.name}_'; 471 String prefix = v.element == null ? 'v' : '${v.element.name}_';
438 while (name == null || _usedNames.contains(name)) { 472 while (name == null || _usedNames.contains(name)) {
439 name = "$prefix${_counter++}"; 473 name = "$prefix${_counter++}";
440 } 474 }
441 _names[v] = name; 475 _names[v] = name;
442 _usedNames.add(name); 476 _usedNames.add(name);
443 } 477 }
444 return name; 478 return name;
445 } 479 }
446 } 480 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698