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

Side by Side Diff: sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart

Issue 366853007: dart2dart: Support for inner functions in new IR. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: SVN rebase Created 6 years, 5 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 dart_backend.tracer; 5 library dart_backend.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 'dart_tree.dart'; 9 import 'dart_tree.dart';
10 10
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 visitStatement(node.next); 128 visitStatement(node.next);
129 129
130 ifTargets[node.body] = bodyBlock; 130 ifTargets[node.body] = bodyBlock;
131 ifTargets[node.next] = nextBlock; 131 ifTargets[node.next] = nextBlock;
132 } 132 }
133 133
134 visitExpressionStatement(ExpressionStatement node) { 134 visitExpressionStatement(ExpressionStatement node) {
135 _addStatement(node); 135 _addStatement(node);
136 visitStatement(node.next); 136 visitStatement(node.next);
137 } 137 }
138
139 visitFunctionDeclaration(FunctionDeclaration node) {
140 _addStatement(node);
141 visitStatement(node.next);
142 }
138 } 143 }
139 144
140 class TreeTracer extends TracerUtil with StatementVisitor { 145 class TreeTracer extends TracerUtil with StatementVisitor {
141 final EventSink<String> output; 146 final EventSink<String> output;
142 147
143 TreeTracer(this.output); 148 TreeTracer(this.output);
144 149
145 Names names; 150 Names names;
146 BlockCollector collector; 151 BlockCollector collector;
147 int statementCounter; 152 int statementCounter;
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 String nextTarget = collector.ifTargets[node.next].name; 248 String nextTarget = collector.ifTargets[node.next].name;
244 printStatement(null, "while ${expr(node.condition)}"); 249 printStatement(null, "while ${expr(node.condition)}");
245 printStatement(null, "do $bodyTarget"); 250 printStatement(null, "do $bodyTarget");
246 printStatement(null, "then $nextTarget" ); 251 printStatement(null, "then $nextTarget" );
247 } 252 }
248 253
249 visitExpressionStatement(ExpressionStatement node) { 254 visitExpressionStatement(ExpressionStatement node) {
250 printStatement(null, expr(node.expression)); 255 printStatement(null, expr(node.expression));
251 } 256 }
252 257
258 visitFunctionDeclaration(FunctionDeclaration node) {
259 printStatement(null, 'function ${node.definition.element.name}');
260 }
261
253 String expr(Expression e) { 262 String expr(Expression e) {
254 return e.accept(new SubexpressionVisitor(names)); 263 return e.accept(new SubexpressionVisitor(names));
255 } 264 }
256 } 265 }
257 266
258 class SubexpressionVisitor extends ExpressionVisitor<String> { 267 class SubexpressionVisitor extends ExpressionVisitor<String> {
259 Names names; 268 Names names;
260 269
261 SubexpressionVisitor(this.names); 270 SubexpressionVisitor(this.names);
262 271
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 340
332 String visitConstant(Constant node) { 341 String visitConstant(Constant node) {
333 return "${node.value}"; 342 return "${node.value}";
334 } 343 }
335 344
336 String visitThis(This node) { 345 String visitThis(This node) {
337 return "this"; 346 return "this";
338 } 347 }
339 348
340 String visitReifyTypeVar(ReifyTypeVar node) { 349 String visitReifyTypeVar(ReifyTypeVar node) {
341 return "typevar [${node.element.name}]"; 350 return "typevar [${node.typeVariable.name}]";
342 } 351 }
343 352
344 bool usesInfixNotation(Expression node) { 353 bool usesInfixNotation(Expression node) {
345 return node is Conditional || node is LogicalOperator; 354 return node is Conditional || node is LogicalOperator;
346 } 355 }
347 356
348 String visitConditional(Conditional node) { 357 String visitConditional(Conditional node) {
349 String condition = visitExpression(node.condition); 358 String condition = visitExpression(node.condition);
350 String thenExpr = visitExpression(node.thenExpression); 359 String thenExpr = visitExpression(node.thenExpression);
351 String elseExpr = visitExpression(node.elseExpression); 360 String elseExpr = visitExpression(node.elseExpression);
(...skipping 19 matching lines...) Expand all
371 } 380 }
372 381
373 String visitNot(Not node) { 382 String visitNot(Not node) {
374 String operand = visitExpression(node.operand); 383 String operand = visitExpression(node.operand);
375 if (usesInfixNotation(node.operand)) { 384 if (usesInfixNotation(node.operand)) {
376 operand = '($operand)'; 385 operand = '($operand)';
377 } 386 }
378 return '!$operand'; 387 return '!$operand';
379 } 388 }
380 389
390 String visitFunctionExpression(FunctionExpression node) {
391 return "function ${node.definition.element.name}";
392 }
393
381 } 394 }
382 395
383 /** 396 /**
384 * Invents (and remembers) names for Variables that do not have an associated 397 * Invents (and remembers) names for Variables that do not have an associated
385 * identifier. 398 * identifier.
386 * 399 *
387 * In case a variable is named v0, v1, etc, it may be assigned a different 400 * In case a variable is named v0, v1, etc, it may be assigned a different
388 * name to avoid clashing with a previously synthesized variable name. 401 * name to avoid clashing with a previously synthesized variable name.
389 */ 402 */
390 class Names { 403 class Names {
391 final Map<Variable, String> _names = {}; 404 final Map<Variable, String> _names = {};
392 final Set<String> _usedNames = new Set(); 405 final Set<String> _usedNames = new Set();
393 int _counter = 0; 406 int _counter = 0;
394 407
395 String varName(Variable v) { 408 String varName(Variable v) {
396 String name = _names[v]; 409 String name = _names[v];
397 if (name == null) { 410 if (name == null) {
398 String prefix = v.element == null ? 'v' : '${v.element.name}_'; 411 String prefix = v.element == null ? 'v' : '${v.element.name}_';
399 while (name == null || _usedNames.contains(name)) { 412 while (name == null || _usedNames.contains(name)) {
400 name = "$prefix${_counter++}"; 413 name = "$prefix${_counter++}";
401 } 414 }
402 _names[v] = name; 415 _names[v] = name;
403 _usedNames.add(name); 416 _usedNames.add(name);
404 } 417 }
405 return name; 418 return name;
406 } 419 }
407 } 420 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698